Return to mandoc.h CVS log | Up to [cvsweb.bsd.lv] / mandoc |
version 1.96, 2011/10/06 22:29:12 | version 1.125, 2014/07/01 22:37:15 | ||
---|---|---|---|
|
|
||
/* $Id$ */ | /* $Id$ */ | ||
/* | /* | ||
* Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> | * Copyright (c) 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> | ||
* Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org> | |||
* | * | ||
* Permission to use, copy, modify, and distribute this software for any | * Permission to use, copy, modify, and distribute this software for any | ||
* purpose with or without fee is hereby granted, provided that the above | * purpose with or without fee is hereby granted, provided that the above | ||
|
|
||
#define ASCII_NBRSP 31 /* non-breaking space */ | #define ASCII_NBRSP 31 /* non-breaking space */ | ||
#define ASCII_HYPH 30 /* breakable hyphen */ | #define ASCII_HYPH 30 /* breakable hyphen */ | ||
#define ASCII_BREAK 29 /* breakable zero-width space */ | |||
/* | /* | ||
* Status level. This refers to both internal status (i.e., whilst | * Status level. This refers to both internal status (i.e., whilst | ||
|
|
||
MANDOCERR_WARNING, /* ===== start of warnings ===== */ | MANDOCERR_WARNING, /* ===== start of warnings ===== */ | ||
/* related to the prologue */ | /* related to the prologue */ | ||
MANDOCERR_NOTITLE, /* no title in document */ | MANDOCERR_TH_MISSING, /* missing .TH macro, using "unknown 1" */ | ||
MANDOCERR_UPPERCASE, /* document title should be all caps */ | MANDOCERR_TITLE_CASE, /* lower case character in document title */ | ||
MANDOCERR_BADMSEC, /* unknown manual section */ | MANDOCERR_MSEC_BAD, /* unknown manual section: section */ | ||
MANDOCERR_NODATE, /* date missing, using today's date */ | MANDOCERR_ARCH_BAD, /* unknown manual volume or arch: volume */ | ||
MANDOCERR_BADDATE, /* cannot parse date, using it verbatim */ | MANDOCERR_DATE_MISSING, /* missing date, using today's date */ | ||
MANDOCERR_PROLOGOOO, /* prologue macros out of order */ | MANDOCERR_DATE_BAD, /* cannot parse date, using it verbatim: date */ | ||
MANDOCERR_PROLOGREP, /* duplicate prologue macro */ | MANDOCERR_PROLOG_ORDER, /* prologue macros out of order: macro */ | ||
MANDOCERR_BADPROLOG, /* macro not allowed in prologue */ | MANDOCERR_PROLOG_REP, /* duplicate prologue macro: macro */ | ||
MANDOCERR_BADBODY, /* macro not allowed in body */ | MANDOCERR_PROLOG_BAD, /* incomplete prologue, terminated by: macro */ | ||
MANDOCERR_PROLOG_ONLY, /* skipping prologue macro in body: macro */ | |||
/* related to document structure */ | /* related to document structure */ | ||
MANDOCERR_SO, /* .so is fragile, better use ln(1) */ | MANDOCERR_SO, /* .so is fragile, better use ln(1): .so path */ | ||
MANDOCERR_NAMESECFIRST, /* NAME section must come first */ | MANDOCERR_DOC_EMPTY, /* no document body */ | ||
MANDOCERR_BADNAMESEC, /* bad NAME section contents */ | MANDOCERR_SEC_BEFORE, /* content before first section header: macro */ | ||
MANDOCERR_NONAME, /* manual name not yet set */ | MANDOCERR_NAMESEC_FIRST, /* first section is not "NAME": title */ | ||
MANDOCERR_SECOOO, /* sections out of conventional order */ | MANDOCERR_NAMESEC_BAD, /* bad NAME section contents: macro */ | ||
MANDOCERR_SECREP, /* duplicate section name */ | MANDOCERR_SEC_ORDER, /* sections out of conventional order: title */ | ||
MANDOCERR_SECMSEC, /* section not in conventional manual section */ | MANDOCERR_SEC_REP, /* duplicate section title: title */ | ||
MANDOCERR_SEC_MSEC, /* unexpected section: title for ... only */ | |||
/* related to macros and nesting */ | /* related to macros and nesting */ | ||
MANDOCERR_MACROOBS, /* skipping obsolete macro */ | MANDOCERR_MACROOBS, /* skipping obsolete macro */ | ||
MANDOCERR_IGNPAR, /* skipping paragraph macro */ | MANDOCERR_IGNPAR, /* skipping paragraph macro */ | ||
MANDOCERR_MOVEPAR, /* moving paragraph macro out of list */ | |||
MANDOCERR_IGNNS, /* skipping no-space macro */ | MANDOCERR_IGNNS, /* skipping no-space macro */ | ||
MANDOCERR_SCOPENEST, /* blocks badly nested */ | MANDOCERR_SCOPENEST, /* blocks badly nested */ | ||
MANDOCERR_CHILD, /* child violates parent syntax */ | MANDOCERR_CHILD, /* child violates parent syntax */ | ||
|
|
||
MANDOCERR_BADTAB, /* tab in non-literal context */ | MANDOCERR_BADTAB, /* tab in non-literal context */ | ||
MANDOCERR_EOLNSPACE, /* end of line whitespace */ | MANDOCERR_EOLNSPACE, /* end of line whitespace */ | ||
MANDOCERR_BADCOMMENT, /* bad comment style */ | MANDOCERR_BADCOMMENT, /* bad comment style */ | ||
MANDOCERR_BADESCAPE, /* unknown escape sequence */ | MANDOCERR_BADESCAPE, /* bad escape sequence */ | ||
MANDOCERR_BADQUOTE, /* unterminated quoted string */ | MANDOCERR_BADQUOTE, /* unterminated quoted string */ | ||
/* related to equations */ | |||
MANDOCERR_EQNQUOTE, /* unexpected literal in equation */ | |||
MANDOCERR_ERROR, /* ===== start of errors ===== */ | MANDOCERR_ERROR, /* ===== start of errors ===== */ | ||
/* related to equations */ | /* related to equations */ | ||
|
|
||
MANDOCERR_ROFFLOOP, /* input stack limit exceeded, infinite loop? */ | MANDOCERR_ROFFLOOP, /* input stack limit exceeded, infinite loop? */ | ||
MANDOCERR_BADCHAR, /* skipping bad character */ | MANDOCERR_BADCHAR, /* skipping bad character */ | ||
MANDOCERR_NAMESC, /* escaped character not allowed in a name */ | MANDOCERR_NAMESC, /* escaped character not allowed in a name */ | ||
MANDOCERR_NOTEXT, /* skipping text before the first section header */ | MANDOCERR_NONAME, /* manual name not yet set */ | ||
MANDOCERR_NOTEXT, /* skipping text before first section header */ | |||
MANDOCERR_MACRO, /* skipping unknown macro */ | MANDOCERR_MACRO, /* skipping unknown macro */ | ||
MANDOCERR_REQUEST, /* NOT IMPLEMENTED: skipping request */ | MANDOCERR_REQUEST, /* NOT IMPLEMENTED: skipping request */ | ||
MANDOCERR_ARGCOUNT, /* argument count wrong */ | MANDOCERR_ARGCOUNT, /* argument count wrong */ | ||
MANDOCERR_STRAYTA, /* skipping column outside column list */ | |||
MANDOCERR_NOSCOPE, /* skipping end of block that is not open */ | MANDOCERR_NOSCOPE, /* skipping end of block that is not open */ | ||
MANDOCERR_SCOPEBROKEN, /* missing end of block */ | MANDOCERR_SCOPEBROKEN, /* missing end of block */ | ||
MANDOCERR_SCOPEEXIT, /* scope open on exit */ | MANDOCERR_SCOPEEXIT, /* scope open on exit */ | ||
|
|
||
MANDOCERR_NOARGS, /* macro requires line argument(s) */ | MANDOCERR_NOARGS, /* macro requires line argument(s) */ | ||
MANDOCERR_NOBODY, /* macro requires body argument(s) */ | MANDOCERR_NOBODY, /* macro requires body argument(s) */ | ||
MANDOCERR_NOARGV, /* macro requires argument(s) */ | MANDOCERR_NOARGV, /* macro requires argument(s) */ | ||
MANDOCERR_NUMERIC, /* request requires a numeric argument */ | |||
MANDOCERR_LISTTYPE, /* missing list type */ | MANDOCERR_LISTTYPE, /* missing list type */ | ||
MANDOCERR_ARGSLOST, /* line argument(s) will be lost */ | MANDOCERR_ARGSLOST, /* line argument(s) will be lost */ | ||
MANDOCERR_BODYLOST, /* body argument(s) will be lost */ | |||
MANDOCERR_FATAL, /* ===== start of fatal errors ===== */ | MANDOCERR_FATAL, /* ===== start of fatal errors ===== */ | ||
MANDOCERR_NOTMANUAL, /* manual isn't really a manual */ | MANDOCERR_TOOLARGE, /* input too large */ | ||
MANDOCERR_NOTMANUAL, /* not a manual */ | |||
MANDOCERR_COLUMNS, /* column syntax is inconsistent */ | MANDOCERR_COLUMNS, /* column syntax is inconsistent */ | ||
MANDOCERR_BADDISP, /* NOT IMPLEMENTED: .Bd -file */ | MANDOCERR_BADDISP, /* NOT IMPLEMENTED: .Bd -file */ | ||
MANDOCERR_SYNTLINESCOPE, /* line scope broken, syntax violated */ | |||
MANDOCERR_SYNTARGVCOUNT, /* argument count wrong, violates syntax */ | MANDOCERR_SYNTARGVCOUNT, /* argument count wrong, violates syntax */ | ||
MANDOCERR_SYNTCHILD, /* child violates parent syntax */ | MANDOCERR_SYNTCHILD, /* child violates parent syntax */ | ||
MANDOCERR_SYNTARGCOUNT, /* argument count wrong, violates syntax */ | MANDOCERR_SYNTARGCOUNT, /* argument count wrong, violates syntax */ | ||
MANDOCERR_SOPATH, /* NOT IMPLEMENTED: .so with absolute path or ".." */ | MANDOCERR_SO_PATH, /* NOT IMPLEMENTED: .so with absolute path or ".." */ | ||
MANDOCERR_NODOCBODY, /* no document body */ | MANDOCERR_SO_FAIL, /* .so request failed */ | ||
MANDOCERR_NODOCPROLOG, /* no document prologue */ | MANDOCERR_NODOCPROLOG, /* no document prologue */ | ||
MANDOCERR_MEM, /* static buffer exhausted */ | MANDOCERR_MEM, /* static buffer exhausted */ | ||
/* ===== system errors ===== */ | |||
MANDOCERR_SYSOPEN, /* cannot open file */ | |||
MANDOCERR_SYSSTAT, /* cannot stat file */ | |||
MANDOCERR_SYSREAD, /* cannot read file */ | |||
MANDOCERR_MAX | MANDOCERR_MAX | ||
}; | }; | ||
struct tbl { | struct tbl_opts { | ||
char tab; /* cell-separator */ | char tab; /* cell-separator */ | ||
char decimal; /* decimal point */ | char decimal; /* decimal point */ | ||
int linesize; | int linesize; | ||
|
|
||
int cols; /* number of columns */ | int cols; /* number of columns */ | ||
}; | }; | ||
enum tbl_headt { | |||
TBL_HEAD_DATA, /* plug in data from tbl_dat */ | |||
TBL_HEAD_VERT, /* vertical spacer */ | |||
TBL_HEAD_DVERT /* double-vertical spacer */ | |||
}; | |||
/* | /* | ||
* The head of a table specifies all of its columns. When formatting a | * The head of a table specifies all of its columns. When formatting a | ||
* tbl_span, iterate over these and plug in data from the tbl_span when | * tbl_span, iterate over these and plug in data from the tbl_span when | ||
* appropriate, using tbl_cell as a guide to placement. | * appropriate, using tbl_cell as a guide to placement. | ||
*/ | */ | ||
struct tbl_head { | struct tbl_head { | ||
enum tbl_headt pos; | |||
int ident; /* 0 <= unique id < cols */ | int ident; /* 0 <= unique id < cols */ | ||
int vert; /* width of preceding vertical line */ | |||
struct tbl_head *next; | struct tbl_head *next; | ||
struct tbl_head *prev; | struct tbl_head *prev; | ||
}; | }; | ||
|
|
||
TBL_CELL_DOWN, /* ^ */ | TBL_CELL_DOWN, /* ^ */ | ||
TBL_CELL_HORIZ, /* _, - */ | TBL_CELL_HORIZ, /* _, - */ | ||
TBL_CELL_DHORIZ, /* = */ | TBL_CELL_DHORIZ, /* = */ | ||
TBL_CELL_VERT, /* | */ | |||
TBL_CELL_DVERT, /* || */ | |||
TBL_CELL_MAX | TBL_CELL_MAX | ||
}; | }; | ||
|
|
||
*/ | */ | ||
struct tbl_cell { | struct tbl_cell { | ||
struct tbl_cell *next; | struct tbl_cell *next; | ||
int vert; /* width of preceding vertical line */ | |||
enum tbl_cellt pos; | enum tbl_cellt pos; | ||
size_t spacing; | size_t spacing; | ||
int flags; | int flags; | ||
|
|
||
struct tbl_row *next; | struct tbl_row *next; | ||
struct tbl_cell *first; | struct tbl_cell *first; | ||
struct tbl_cell *last; | struct tbl_cell *last; | ||
int vert; /* trailing vertical line */ | |||
}; | }; | ||
enum tbl_datt { | enum tbl_datt { | ||
|
|
||
* A row of data in a table. | * A row of data in a table. | ||
*/ | */ | ||
struct tbl_span { | struct tbl_span { | ||
struct tbl *tbl; | struct tbl_opts *opts; | ||
struct tbl_head *head; | struct tbl_head *head; | ||
struct tbl_row *layout; /* layout row */ | struct tbl_row *layout; /* layout row */ | ||
struct tbl_dat *first; | struct tbl_dat *first; | ||
|
|
||
/* | /* | ||
* An equation consists of a tree of expressions starting at a given | * An equation consists of a tree of expressions starting at a given | ||
* line and position. | * line and position. | ||
*/ | */ | ||
struct eqn { | struct eqn { | ||
char *name; /* identifier (or NULL) */ | char *name; /* identifier (or NULL) */ | ||
|
|
||
}; | }; | ||
/* | /* | ||
* The type of parse sequence. This value is usually passed via the | * Parse options. | ||
* mandoc(1) command line of -man and -mdoc. It's almost exclusively | |||
* -mandoc but the others have been retained for compatibility. | |||
*/ | */ | ||
enum mparset { | #define MPARSE_MDOC 1 /* assume -mdoc */ | ||
MPARSE_AUTO, /* magically determine the document type */ | #define MPARSE_MAN 2 /* assume -man */ | ||
MPARSE_MDOC, /* assume -mdoc */ | #define MPARSE_SO 4 /* honour .so requests */ | ||
MPARSE_MAN /* assume -man */ | #define MPARSE_QUICK 8 /* abort the parse early */ | ||
}; | |||
enum mandoc_esc { | enum mandoc_esc { | ||
ESCAPE_ERROR = 0, /* bail! unparsable escape */ | ESCAPE_ERROR = 0, /* bail! unparsable escape */ | ||
|
|
||
ESCAPE_FONT, /* a generic font mode */ | ESCAPE_FONT, /* a generic font mode */ | ||
ESCAPE_FONTBOLD, /* bold font mode */ | ESCAPE_FONTBOLD, /* bold font mode */ | ||
ESCAPE_FONTITALIC, /* italic font mode */ | ESCAPE_FONTITALIC, /* italic font mode */ | ||
ESCAPE_FONTBI, /* bold italic font mode */ | |||
ESCAPE_FONTROMAN, /* roman font mode */ | ESCAPE_FONTROMAN, /* roman font mode */ | ||
ESCAPE_FONTPREV, /* previous font mode */ | ESCAPE_FONTPREV, /* previous font mode */ | ||
ESCAPE_NUMBERED, /* a numbered glyph */ | ESCAPE_NUMBERED, /* a numbered glyph */ | ||
ESCAPE_UNICODE, /* a unicode codepoint */ | ESCAPE_UNICODE, /* a unicode codepoint */ | ||
ESCAPE_NOSPACE /* suppress space if the last on a line */ | ESCAPE_NOSPACE, /* suppress space if the last on a line */ | ||
ESCAPE_SKIPCHAR /* skip the next character */ | |||
}; | }; | ||
typedef void (*mandocmsg)(enum mandocerr, enum mandoclevel, | typedef void (*mandocmsg)(enum mandocerr, enum mandoclevel, | ||
|
|
||
__BEGIN_DECLS | __BEGIN_DECLS | ||
void *mandoc_calloc(size_t, size_t); | |||
enum mandoc_esc mandoc_escape(const char **, const char **, int *); | enum mandoc_esc mandoc_escape(const char **, const char **, int *); | ||
void *mandoc_malloc(size_t); | |||
void *mandoc_realloc(void *, size_t); | |||
char *mandoc_strdup(const char *); | |||
char *mandoc_strndup(const char *, size_t); | |||
struct mchars *mchars_alloc(void); | struct mchars *mchars_alloc(void); | ||
void mchars_free(struct mchars *); | void mchars_free(struct mchars *); | ||
char mchars_num2char(const char *, size_t); | char mchars_num2char(const char *, size_t); | ||
int mchars_num2uc(const char *, size_t); | int mchars_num2uc(const char *, size_t); | ||
int mchars_spec2cp(struct mchars *, | int mchars_spec2cp(const struct mchars *, | ||
const char *, size_t); | const char *, size_t); | ||
const char *mchars_spec2str(struct mchars *, | const char *mchars_spec2str(const struct mchars *, | ||
const char *, size_t, size_t *); | const char *, size_t, size_t *); | ||
struct mparse *mparse_alloc(enum mparset, | struct mparse *mparse_alloc(int, enum mandoclevel, mandocmsg, char *); | ||
enum mandoclevel, mandocmsg, void *); | |||
void mparse_free(struct mparse *); | void mparse_free(struct mparse *); | ||
void mparse_keep(struct mparse *); | void mparse_keep(struct mparse *); | ||
enum mandoclevel mparse_readfd(struct mparse *, int, const char *); | enum mandoclevel mparse_readfd(struct mparse *, int, const char *); | ||
enum mandoclevel mparse_readmem(struct mparse *, const void *, size_t, | |||
const char *); | |||
void mparse_reset(struct mparse *); | void mparse_reset(struct mparse *); | ||
void mparse_result(struct mparse *, | void mparse_result(struct mparse *, | ||
struct mdoc **, struct man **); | struct mdoc **, struct man **, char **); | ||
const char *mparse_getkeep(const struct mparse *); | const char *mparse_getkeep(const struct mparse *); | ||
const char *mparse_strerror(enum mandocerr); | const char *mparse_strerror(enum mandocerr); | ||
const char *mparse_strlevel(enum mandoclevel); | const char *mparse_strlevel(enum mandoclevel); |