Return to mandoc.h CVS log | Up to [cvsweb.bsd.lv] / mandoc |
version 1.94, 2011/07/23 18:41:18 | version 1.121, 2014/06/20 17:24:00 | ||
---|---|---|---|
|
|
||
/* $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, /* no TH macro in document */ | ||
MANDOCERR_UPPERCASE, /* document title should be all caps */ | MANDOCERR_TITLE_CASE, /* document title should be all caps */ | ||
MANDOCERR_BADMSEC, /* unknown manual section */ | MANDOCERR_MSEC_BAD, /* unknown manual section */ | ||
MANDOCERR_NODATE, /* date missing, using today's date */ | MANDOCERR_ARCH_BAD, /* unknown manual volume or arch */ | ||
MANDOCERR_BADDATE, /* cannot parse date, using it verbatim */ | MANDOCERR_DATE_MISSING, /* date missing, using today's date */ | ||
MANDOCERR_PROLOGOOO, /* prologue macros out of order */ | MANDOCERR_DATE_BAD, /* cannot parse date, using it verbatim */ | ||
MANDOCERR_PROLOGREP, /* duplicate prologue macro */ | MANDOCERR_PROLOG_ORDER, /* prologue macros out of order */ | ||
MANDOCERR_BADPROLOG, /* macro not allowed in prologue */ | MANDOCERR_PROLOG_REP, /* duplicate prologue macro */ | ||
MANDOCERR_BADBODY, /* macro not allowed in body */ | MANDOCERR_PROLOG_BAD, /* macro not allowed in prologue */ | ||
MANDOCERR_PROLOG_ONLY, /* macro not allowed in body */ | |||
/* 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) */ | ||
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_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; | ||
|
|
||
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; | ||
|
|
||
enum eqn_pilet { | enum eqn_pilet { | ||
EQNPILE_NONE = 0, | EQNPILE_NONE = 0, | ||
EQNPILE_PILE, | |||
EQNPILE_CPILE, | EQNPILE_CPILE, | ||
EQNPILE_RPILE, | EQNPILE_RPILE, | ||
EQNPILE_LPILE, | EQNPILE_LPILE, | ||
EQNPILE_COL, | |||
EQNPILE_CCOL, | EQNPILE_CCOL, | ||
EQNPILE_RCOL, | EQNPILE_RCOL, | ||
EQNPILE_LCOL, | EQNPILE_LCOL, | ||
|
|
||
/* | /* | ||
* 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 | ||
enum mandoc_esc mandoc_escape(const char **, const char **, int *); | |||
struct mchars *mchars_alloc(void); | |||
void mchars_free(struct mchars *); | |||
char mchars_num2char(const char *, size_t); | |||
int mchars_num2uc(const char *, size_t); | |||
int mchars_spec2cp(const struct mchars *, | |||
const char *, size_t); | |||
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_free(struct mparse *); | ||
void mparse_reset(struct mparse *); | void mparse_keep(struct mparse *); | ||
struct mparse *mparse_alloc(enum mparset, | |||
enum mandoclevel, mandocmsg, void *); | |||
enum mandoclevel mparse_readfd(struct mparse *, int, const char *); | enum mandoclevel mparse_readfd(struct mparse *, int, const char *); | ||
void mparse_result(struct mparse *, struct mdoc **, struct man **); | 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_strerror(enum mandocerr); | ||
const char *mparse_strlevel(enum mandoclevel); | 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 *); | |||
char *mandoc_strndup(const char *, size_t); | |||
enum mandoc_esc mandoc_escape(const char **, const char **, int *); | |||
struct mchars *mchars_alloc(void); | |||
char mchars_num2char(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(struct mchars *, const char *, size_t); | |||
void mchars_free(struct mchars *); | |||
__END_DECLS | __END_DECLS | ||