Return to mandoc.h CVS log | Up to [cvsweb.bsd.lv] / mandoc |
version 1.85, 2011/07/21 13:18:24 | version 1.118, 2014/03/23 11:25:26 | ||
---|---|---|---|
|
|
||
/* $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_NOTITLE, /* no title in document */ | MANDOCERR_NOTITLE, /* no title in document */ | ||
MANDOCERR_UPPERCASE, /* document title should be all caps */ | MANDOCERR_UPPERCASE, /* document title should be all caps */ | ||
MANDOCERR_BADMSEC, /* unknown manual section */ | MANDOCERR_BADMSEC, /* unknown manual section */ | ||
MANDOCERR_BADVOLARCH, /* unknown manual volume or arch */ | |||
MANDOCERR_NODATE, /* date missing, using today's date */ | MANDOCERR_NODATE, /* date missing, using today's date */ | ||
MANDOCERR_BADDATE, /* cannot parse date, using it verbatim */ | MANDOCERR_BADDATE, /* cannot parse date, using it verbatim */ | ||
MANDOCERR_PROLOGOOO, /* prologue macros out of order */ | MANDOCERR_PROLOGOOO, /* prologue macros out of order */ | ||
|
|
||
MANDOCERR_SO, /* .so is fragile, better use ln(1) */ | MANDOCERR_SO, /* .so is fragile, better use ln(1) */ | ||
MANDOCERR_NAMESECFIRST, /* NAME section must come first */ | MANDOCERR_NAMESECFIRST, /* NAME section must come first */ | ||
MANDOCERR_BADNAMESEC, /* bad NAME section contents */ | MANDOCERR_BADNAMESEC, /* bad NAME section contents */ | ||
MANDOCERR_NONAME, /* manual name not yet set */ | |||
MANDOCERR_SECOOO, /* sections out of conventional order */ | MANDOCERR_SECOOO, /* sections out of conventional order */ | ||
MANDOCERR_SECREP, /* duplicate section name */ | MANDOCERR_SECREP, /* duplicate section name */ | ||
MANDOCERR_SECMSEC, /* section not in conventional manual section */ | MANDOCERR_SECMSEC, /* section header suited to sections ... */ | ||
/* 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_ERROR, /* ===== start of errors ===== */ | MANDOCERR_ERROR, /* ===== start of errors ===== */ | ||
/* related to equations */ | /* related to equations */ | ||
MANDOCERR_EQNARGS, /* bad equation macro arguments */ | |||
MANDOCERR_EQNNEST, /* too many nested equation defines */ | |||
MANDOCERR_EQNNSCOPE, /* unexpected equation scope closure*/ | MANDOCERR_EQNNSCOPE, /* unexpected equation scope closure*/ | ||
MANDOCERR_EQNSCOPE, /* equation scope open on exit */ | MANDOCERR_EQNSCOPE, /* equation scope open on exit */ | ||
MANDOCERR_EQNBADSCOPE, /* overlapping equation scopes */ | |||
MANDOCERR_EQNEOF, /* unexpected end of equation */ | |||
MANDOCERR_EQNSYNT, /* equation syntax error */ | |||
/* related to tables */ | /* related to tables */ | ||
MANDOCERR_TBL, /* bad table syntax */ | MANDOCERR_TBL, /* bad table syntax */ | ||
|
|
||
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_NONAME, /* manual name not yet set */ | |||
MANDOCERR_NOTEXT, /* skipping text before the first section header */ | MANDOCERR_NOTEXT, /* skipping text before the 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_BODYLOST, /* body argument(s) will be lost */ | ||
MANDOCERR_FATAL, /* ===== start of fatal errors ===== */ | MANDOCERR_FATAL, /* ===== start of fatal errors ===== */ | ||
MANDOCERR_TOOLARGE, /* input too large */ | |||
MANDOCERR_NOTMANUAL, /* manual isn't really a manual */ | MANDOCERR_NOTMANUAL, /* manual isn't really 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_NODOCBODY, /* no document body */ | MANDOCERR_NODOCBODY, /* no document body */ | ||
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; | ||
|
|
||
* 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; | ||
|
|
||
enum eqn_boxt { | enum eqn_boxt { | ||
EQN_ROOT, /* root of parse tree */ | EQN_ROOT, /* root of parse tree */ | ||
EQN_TEXT, /* text (number, variable, whatever) */ | EQN_TEXT, /* text (number, variable, whatever) */ | ||
EQN_SUBEXPR /* nested subexpression */ | EQN_SUBEXPR, /* nested `eqn' subexpression */ | ||
EQN_LIST, /* subexpressions list */ | |||
EQN_MATRIX /* matrix subexpression */ | |||
}; | }; | ||
enum eqn_markt { | enum eqn_markt { | ||
|
|
||
EQNMARK__MAX | EQNMARK__MAX | ||
}; | }; | ||
/* | enum eqn_fontt { | ||
EQNFONT_NONE = 0, | |||
EQNFONT_ROMAN, | |||
EQNFONT_BOLD, | |||
EQNFONT_FAT, | |||
EQNFONT_ITALIC, | |||
EQNFONT__MAX | |||
}; | |||
enum eqn_post { | |||
EQNPOS_NONE = 0, | |||
EQNPOS_OVER, | |||
EQNPOS_SUP, | |||
EQNPOS_SUB, | |||
EQNPOS_TO, | |||
EQNPOS_FROM, | |||
EQNPOS__MAX | |||
}; | |||
enum eqn_pilet { | |||
EQNPILE_NONE = 0, | |||
EQNPILE_PILE, | |||
EQNPILE_CPILE, | |||
EQNPILE_RPILE, | |||
EQNPILE_LPILE, | |||
EQNPILE_COL, | |||
EQNPILE_CCOL, | |||
EQNPILE_RCOL, | |||
EQNPILE_LCOL, | |||
EQNPILE__MAX | |||
}; | |||
/* | |||
* A "box" is a parsed mathematical expression as defined by the eqn.7 | * A "box" is a parsed mathematical expression as defined by the eqn.7 | ||
* grammar. | * grammar. | ||
*/ | */ | ||
struct eqn_box { | struct eqn_box { | ||
int size; /* font size of expression */ | |||
#define EQN_DEFSIZE INT_MIN | |||
enum eqn_boxt type; /* type of node */ | enum eqn_boxt type; /* type of node */ | ||
struct eqn_box *child; /* child node */ | struct eqn_box *first; /* first child node */ | ||
struct eqn_box *next; /* next in tree */ | struct eqn_box *last; /* last child node */ | ||
struct eqn_box *next; /* node sibling */ | |||
struct eqn_box *parent; /* node sibling */ | |||
char *text; /* text (or NULL) */ | char *text; /* text (or NULL) */ | ||
enum eqn_markt mark; /* whether 'marked' */ | char *left; | ||
char *right; | |||
enum eqn_post pos; /* position of next box */ | |||
enum eqn_markt mark; /* a mark about the box */ | |||
enum eqn_fontt font; /* font of box */ | |||
enum eqn_pilet pile; /* equation piling */ | |||
}; | }; | ||
/* | |||
* An equation consists of a tree of expressions starting at a given | |||
* line and position. | |||
*/ | |||
struct eqn { | struct eqn { | ||
char *name; /* identifier (or NULL) */ | |||
struct eqn_box *root; /* root mathematical expression */ | struct eqn_box *root; /* root mathematical expression */ | ||
int ln; /* invocation line */ | int ln; /* invocation line */ | ||
int pos; /* invocation position */ | int pos; /* invocation position */ | ||
}; | }; | ||
/* | /* | ||
* 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 mparse_free(struct mparse *); | |||
void mparse_reset(struct mparse *); | |||
struct mparse *mparse_alloc(enum mparset, | |||
enum mandoclevel, mandocmsg, void *); | |||
enum mandoclevel mparse_readfd(struct mparse *, int, const char *); | |||
void mparse_result(struct mparse *, struct mdoc **, struct man **); | |||
const char *mparse_strerror(enum mandocerr); | |||
const char *mparse_strlevel(enum mandoclevel); | |||
void *mandoc_calloc(size_t, size_t); | |||
void *mandoc_malloc(size_t); | |||
void *mandoc_realloc(void *, size_t); | |||
char *mandoc_strdup(const char *); | |||
enum mandoc_esc mandoc_escape(const char **, const char **, int *); | enum mandoc_esc mandoc_escape(const char **, const char **, int *); | ||
struct mchars *mchars_alloc(void); | struct mchars *mchars_alloc(void); | ||
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); | ||
const char *mchars_spec2str(struct mchars *, const char *, size_t, size_t *); | int mchars_spec2cp(const struct mchars *, | ||
int mchars_spec2cp(struct mchars *, const char *, size_t); | const char *, size_t); | ||
void mchars_free(struct mchars *); | const char *mchars_spec2str(const struct mchars *, | ||
const char *, size_t, size_t *); | |||
struct mparse *mparse_alloc(int, enum mandoclevel, mandocmsg, char *); | |||
void mparse_free(struct mparse *); | |||
void mparse_keep(struct mparse *); | |||
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_result(struct mparse *, | |||
struct mdoc **, struct man **, char **); | |||
const char *mparse_getkeep(const struct mparse *); | |||
const char *mparse_strerror(enum mandocerr); | |||
const char *mparse_strlevel(enum mandoclevel); | |||
__END_DECLS | __END_DECLS | ||