version 1.10, 2008/12/10 17:31:57 |
version 1.39, 2017/01/10 13:47:00 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se> |
* Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> |
|
* Copyright (c) 2013, 2014, 2015, 2017 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 |
* purpose with or without fee is hereby granted, provided that the above |
* above copyright notice and this permission notice appear in all |
* copyright notice and this permission notice appear in all copies. |
* copies. |
|
* |
* |
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL |
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES |
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED |
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE |
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR |
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL |
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR |
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
* PERFORMANCE OF THIS SOFTWARE. |
|
*/ |
*/ |
#ifndef ROFF_H |
|
#define ROFF_H |
|
|
|
enum roffd { |
struct mdoc_arg; |
ROFF_ENTER = 0, |
union mdoc_data; |
ROFF_EXIT |
|
|
enum roff_macroset { |
|
MACROSET_NONE = 0, |
|
MACROSET_MDOC, |
|
MACROSET_MAN |
}; |
}; |
|
|
enum rofftype { |
enum roff_sec { |
ROFF_COMMENT, |
SEC_NONE = 0, |
ROFF_TEXT, |
SEC_NAME, |
ROFF_LAYOUT, |
SEC_LIBRARY, |
ROFF_SPECIAL |
SEC_SYNOPSIS, |
|
SEC_DESCRIPTION, |
|
SEC_CONTEXT, |
|
SEC_IMPLEMENTATION, /* IMPLEMENTATION NOTES */ |
|
SEC_RETURN_VALUES, |
|
SEC_ENVIRONMENT, |
|
SEC_FILES, |
|
SEC_EXIT_STATUS, |
|
SEC_EXAMPLES, |
|
SEC_DIAGNOSTICS, |
|
SEC_COMPATIBILITY, |
|
SEC_ERRORS, |
|
SEC_SEE_ALSO, |
|
SEC_STANDARDS, |
|
SEC_HISTORY, |
|
SEC_AUTHORS, |
|
SEC_CAVEATS, |
|
SEC_BUGS, |
|
SEC_SECURITY, |
|
SEC_CUSTOM, |
|
SEC__MAX |
}; |
}; |
|
|
struct rofftree; |
enum roff_type { |
|
ROFFT_ROOT, |
|
ROFFT_BLOCK, |
|
ROFFT_HEAD, |
|
ROFFT_BODY, |
|
ROFFT_TAIL, |
|
ROFFT_ELEM, |
|
ROFFT_TEXT, |
|
ROFFT_TBL, |
|
ROFFT_EQN |
|
}; |
|
|
#define ROFFCALL_ARGS \ |
enum roff_next { |
int tok, struct rofftree *tree, \ |
ROFF_NEXT_SIBLING = 0, |
char *argv[], enum roffd type |
ROFF_NEXT_CHILD |
|
}; |
|
|
struct rofftok { |
/* |
int (*cb)(ROFFCALL_ARGS); /* Callback. */ |
* Indicates that a BODY's formatting has ended, but |
const enum roffmsec *sections; |
* the scope is still open. Used for badly nested blocks. |
const int *args; /* Args (or NULL). */ |
*/ |
const int *parents; /* Limit to parents. */ |
enum mdoc_endbody { |
const int *children; /* Limit to kids. */ |
ENDBODY_NOT = 0, |
int ctx; /* Blk-close node. */ |
ENDBODY_SPACE, /* Is broken: append a space. */ |
enum rofftype type; /* Type of macro. */ |
ENDBODY_NOSPACE /* Is broken: don't append a space. */ |
int flags; |
|
#define ROFF_PARSED (1 << 0) /* "Parsed". */ |
|
#define ROFF_CALLABLE (1 << 1) /* "Callable". */ |
|
#define ROFF_SHALLOW (1 << 2) /* Nesting block. */ |
|
#define ROFF_LSCOPE (1 << 3) /* Line scope. */ |
|
}; |
}; |
|
|
__BEGIN_DECLS |
struct roff_node { |
|
struct roff_node *parent; /* Parent AST node. */ |
|
struct roff_node *child; /* First child AST node. */ |
|
struct roff_node *last; /* Last child AST node. */ |
|
struct roff_node *next; /* Sibling AST node. */ |
|
struct roff_node *prev; /* Prior sibling AST node. */ |
|
struct roff_node *head; /* BLOCK */ |
|
struct roff_node *body; /* BLOCK/ENDBODY */ |
|
struct roff_node *tail; /* BLOCK */ |
|
struct mdoc_arg *args; /* BLOCK/ELEM */ |
|
union mdoc_data *norm; /* Normalized arguments. */ |
|
char *string; /* TEXT */ |
|
const struct tbl_span *span; /* TBL */ |
|
const struct eqn *eqn; /* EQN */ |
|
int line; /* Input file line number. */ |
|
int pos; /* Input file column number. */ |
|
int tok; /* Request or macro ID. */ |
|
#define TOKEN_NONE (-1) /* No request or macro. */ |
|
int flags; |
|
#define NODE_VALID (1 << 0) /* Has been validated. */ |
|
#define NODE_ENDED (1 << 1) /* Gone past body end mark. */ |
|
#define NODE_EOS (1 << 2) /* At sentence boundary. */ |
|
#define NODE_LINE (1 << 3) /* First macro/text on line. */ |
|
#define NODE_SYNPRETTY (1 << 4) /* SYNOPSIS-style formatting. */ |
|
#define NODE_BROKEN (1 << 5) /* Must validate parent when ending. */ |
|
#define NODE_DELIMO (1 << 6) |
|
#define NODE_DELIMC (1 << 7) |
|
#define NODE_NOSRC (1 << 8) /* Generated node, not in input file. */ |
|
#define NODE_NOPRT (1 << 9) /* Shall not print anything. */ |
|
int prev_font; /* Before entering this node. */ |
|
int aux; /* Decoded node data, type-dependent. */ |
|
enum roff_type type; /* AST node type. */ |
|
enum roff_sec sec; /* Current named section. */ |
|
enum mdoc_endbody end; /* BODY */ |
|
}; |
|
|
static int roff_Dd(ROFFCALL_ARGS); /* FIXME: deprecate. */ |
struct roff_meta { |
static int roff_Dt(ROFFCALL_ARGS); /* FIXME: deprecate. */ |
char *msec; /* Manual section, usually a digit. */ |
static int roff_Os(ROFFCALL_ARGS); /* FIXME: deprecate. */ |
char *vol; /* Manual volume title. */ |
static int roff_Ns(ROFFCALL_ARGS); /* FIXME: deprecate. */ |
char *os; /* Operating system. */ |
static int roff_layout(ROFFCALL_ARGS); |
char *arch; /* Machine architecture. */ |
static int roff_text(ROFFCALL_ARGS); |
char *title; /* Manual title, usually CAPS. */ |
static int roff_noop(ROFFCALL_ARGS); |
char *name; /* Leading manual name. */ |
static int roff_depr(ROFFCALL_ARGS); |
char *date; /* Normalized date. */ |
static int roff_ordered(ROFFCALL_ARGS); |
int hasbody; /* Document is not empty. */ |
|
}; |
|
|
static const int roffarg_An[] = { ROFF_Split, ROFF_Nosplit, |
struct roff_man { |
ROFF_ARGMAX }; |
struct roff_meta meta; /* Document meta-data. */ |
static const int roffarg_Bd[] = { ROFF_Ragged, ROFF_Unfilled, |
struct mparse *parse; /* Parse pointer. */ |
ROFF_Literal, ROFF_File, ROFF_Offset, ROFF_Filled, ROFF_Compact, |
struct roff *roff; /* Roff parser state data. */ |
ROFF_ARGMAX }; |
const char *defos; /* Default operating system. */ |
static const int roffarg_Bk[] = { ROFF_Words, ROFF_ARGMAX }; |
struct roff_node *first; /* The first node parsed. */ |
static const int roffarg_Ex[] = { ROFF_Std, ROFF_ARGMAX }; |
struct roff_node *last; /* The last node parsed. */ |
static const int roffarg_Rv[] = { ROFF_Std, ROFF_ARGMAX }; |
struct roff_node *last_es; /* The most recent Es node. */ |
static const int roffarg_Bl[] = { ROFF_Bullet, ROFF_Dash, ROFF_Hyphen, |
int quick; /* Abort parse early. */ |
ROFF_Item, ROFF_Enum, ROFF_Tag, ROFF_Diag, ROFF_Hang, |
int flags; /* Parse flags. */ |
ROFF_Ohang, ROFF_Inset, ROFF_Column, ROFF_Offset, ROFF_Width, |
#define MDOC_LITERAL (1 << 1) /* In a literal scope. */ |
ROFF_Compact, ROFF_ARGMAX }; |
#define MDOC_PBODY (1 << 2) /* In the document body. */ |
static const int roffarg_St[] = { ROFF_p1003_1_88, ROFF_p1003_1_90, |
#define MDOC_NEWLINE (1 << 3) /* First macro/text in a line. */ |
ROFF_p1003_1_96, ROFF_p1003_1_2001, ROFF_p1003_1_2004, |
#define MDOC_PHRASE (1 << 4) /* In a Bl -column phrase. */ |
ROFF_p1003_1, ROFF_p1003_1b, ROFF_p1003_1b_93, ROFF_p1003_1c_95, |
#define MDOC_PHRASELIT (1 << 5) /* Literal within a phrase. */ |
ROFF_p1003_1g_2000, ROFF_p1003_2_92, ROFF_p1387_2_95, |
#define MDOC_FREECOL (1 << 6) /* `It' invocation should close. */ |
ROFF_p1003_2, ROFF_p1387_2, ROFF_isoC_90, ROFF_isoC_amd1, |
#define MDOC_SYNOPSIS (1 << 7) /* SYNOPSIS-style formatting. */ |
ROFF_isoC_tcor1, ROFF_isoC_tcor2, ROFF_isoC_99, ROFF_ansiC, |
#define MDOC_KEEP (1 << 8) /* In a word keep. */ |
ROFF_ansiC_89, ROFF_ansiC_99, ROFF_ieee754, ROFF_iso8802_3, |
#define MDOC_SMOFF (1 << 9) /* Spacing is off. */ |
ROFF_xpg3, ROFF_xpg4, ROFF_xpg4_2, ROFF_xpg4_3, ROFF_xbd5, |
#define MDOC_NODELIMC (1 << 10) /* Disable closing delimiter handling. */ |
ROFF_xcu5, ROFF_xsh5, ROFF_xns5, ROFF_xns5_2d2_0, |
#define MAN_ELINE (1 << 11) /* Next-line element scope. */ |
ROFF_xcurses4_2, ROFF_susv2, ROFF_susv3, ROFF_svid4, |
#define MAN_BLINE (1 << 12) /* Next-line block scope. */ |
ROFF_ARGMAX }; |
#define MDOC_PHRASEQF (1 << 13) /* Quote first word encountered. */ |
|
#define MDOC_PHRASEQL (1 << 14) /* Quote last word of this phrase. */ |
|
#define MDOC_PHRASEQN (1 << 15) /* Quote first word of the next phrase. */ |
|
#define MAN_LITERAL MDOC_LITERAL |
|
#define MAN_NEWLINE MDOC_NEWLINE |
|
enum roff_macroset macroset; /* Kind of high-level macros used. */ |
|
enum roff_sec lastsec; /* Last section seen. */ |
|
enum roff_sec lastnamed; /* Last standard section seen. */ |
|
enum roff_next next; /* Where to put the next node. */ |
|
}; |
|
|
static const int roffchild_Bl[] = { ROFF_It, ROFF_El, ROFF_MAX }; |
|
static const int roffchild_Fo[] = { ROFF_Fa, ROFF_Fc, ROFF_MAX }; |
|
static const int roffchild_Rs[] = { ROFF_Re, ROFF__A, ROFF__B, ROFF__D, |
|
ROFF__I, ROFF__J, ROFF__N, ROFF__O, ROFF__P, ROFF__R, ROFF__T, |
|
ROFF__V, ROFF_MAX }; |
|
|
|
static const enum roffmsec roffmsec_Cd[] = { ROFF_MSEC_4, |
void deroff(char **, const struct roff_node *); |
ROFF_MSEC_MAX }; |
|
static const enum roffmsec roffmsec_Er[] = { ROFF_MSEC_2, |
|
ROFF_MSEC_MAX }; |
|
static const enum roffmsec roffmsec_Ex[] = { ROFF_MSEC_1, |
|
ROFF_MSEC_6, ROFF_MSEC_8, ROFF_MSEC_MAX }; |
|
static const enum roffmsec roffmsec_Rv[] = { ROFF_MSEC_2, |
|
ROFF_MSEC_3, ROFF_MSEC_MAX }; |
|
|
|
static const int roffparent_El[] = { ROFF_Bl, ROFF_It, ROFF_MAX }; |
|
static const int roffparent_Fc[] = { ROFF_Fo, ROFF_Fa, ROFF_MAX }; |
|
static const int roffparent_Oc[] = { ROFF_Oo, ROFF_MAX }; |
|
static const int roffparent_It[] = { ROFF_Bl, ROFF_It, ROFF_MAX }; |
|
static const int roffparent_Re[] = { ROFF_Rs, ROFF_MAX }; |
|
|
|
static const struct rofftok tokens[ROFF_MAX] = { |
|
{ roff_noop, NULL, NULL, NULL, NULL, 0, ROFF_COMMENT, 0 }, /* \" */ |
|
{ roff_Dd, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Dd */ |
|
{ roff_Dt, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Dt */ |
|
{ roff_Os, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Os */ |
|
{ roff_layout, NULL, NULL, NULL, NULL, ROFF_Sh, ROFF_LAYOUT, 0 }, /* Sh */ |
|
{ roff_layout, NULL, NULL, NULL, NULL, ROFF_Ss, ROFF_LAYOUT, 0 }, /* Ss */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Pp */ /* XXX 0 args */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_LSCOPE }, /* D1 */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_LSCOPE }, /* Dl */ |
|
{ roff_layout, NULL, roffarg_Bd, NULL, NULL, 0, ROFF_LAYOUT, 0 }, /* Bd */ |
|
{ roff_noop, NULL, NULL, NULL, NULL, ROFF_Bd, ROFF_LAYOUT, 0 }, /* Ed */ |
|
{ roff_layout, NULL, roffarg_Bl, NULL, roffchild_Bl, 0, ROFF_LAYOUT, 0 }, /* Bl */ |
|
{ roff_noop, NULL, NULL, roffparent_El, NULL, ROFF_Bl, ROFF_LAYOUT, 0 }, /* El */ |
|
{ roff_layout, NULL, NULL, roffparent_It, NULL, ROFF_It, ROFF_LAYOUT, ROFF_PARSED | ROFF_SHALLOW }, /* It */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ad */ /* FIXME */ |
|
{ roff_text, NULL, roffarg_An, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* An */ /* FIXME: args/no-args, yech. */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ar */ |
|
/*Ok*/ { roff_text, roffmsec_Cd, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Cd */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Cm */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Dv */ /* XXX needs arg */ |
|
/*Ok*/ { roff_text, roffmsec_Er, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Er */ /* XXX needs arg */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ev */ /* XXX needs arg */ |
|
/*Ok*/ {roff_ordered, roffmsec_Ex, roffarg_Ex, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Ex */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Fa */ /* XXX needs arg */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Fd */ /* FIXME: section/linebreak. */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Fl */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Fn */ /* FIXME: section/linebreak. */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ft */ /* FIXME: section/linebreak. */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ic */ /* FIXME: needs arg */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* In */ /* FIXME: section/linebreak. */ |
|
/*OK*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Li */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Nd */ /* FIXME: section. */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Nm */ /* FIXME: sections. */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE | ROFF_LSCOPE }, /* Op */ |
|
/*Ok*/ { roff_depr, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Ot */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Pa */ |
|
/*Ok*/ {roff_ordered, roffmsec_Rv, roffarg_Rv, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Rv */ |
|
/*Ok*/ {roff_ordered, NULL, roffarg_St, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* St */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Va */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Vt */ /* FIXME: section/linebreak. */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Xr */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* %A */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE}, /* %B */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* %D */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE}, /* %I */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE}, /* %J */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* %N */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* %O */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* %P */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* %R */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* %T */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* %V */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ac */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ao */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE | ROFF_LSCOPE }, /* Aq */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* At */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Bc */ |
|
{ roff_layout, NULL, NULL, NULL, NULL, 0, ROFF_LAYOUT, 0 }, /* Bf */ /* FIXME */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Bo */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE | ROFF_LSCOPE }, /* Bq */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Bsx */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Bx */ |
|
{ NULL, NULL, NULL, NULL, NULL, 0, ROFF_SPECIAL, 0 }, /* Db */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Dc */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Do */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE | ROFF_LSCOPE }, /* Dq */ |
|
{ NULL, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ec */ |
|
{ roff_noop, NULL, NULL, NULL, NULL, ROFF_Bf, ROFF_LAYOUT, 0 }, /* Ef */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Em */ /* XXX needs arg */ |
|
{ NULL, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Eo */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Fx */ |
|
{ NULL, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ms */ |
|
{ NULL, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* No */ |
|
/*Ok*/ { roff_Ns, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ns */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Nx */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ox */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Pc */ |
|
{ NULL, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Pf */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Po */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE | ROFF_LSCOPE }, /* Pq */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Qc */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Ql */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Qo */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE | ROFF_LSCOPE }, /* Qq */ |
|
{ roff_noop, NULL, NULL, roffparent_Re, NULL, ROFF_Rs, ROFF_LAYOUT, 0 }, /* Re */ |
|
{ roff_layout, NULL, NULL, NULL, roffchild_Rs, 0, ROFF_LAYOUT, 0 }, /* Rs */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sc */ |
|
{ roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* So */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE | ROFF_LSCOPE }, /* Sq */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Sm */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sx */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Sy */ |
|
/*Ok*/ { roff_text, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Tn */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED }, /* Ux */ |
|
{ NULL, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Xc */ |
|
{ NULL, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, ROFF_PARSED | ROFF_CALLABLE }, /* Xo */ |
|
/*Ok*/ { roff_layout, NULL, NULL, NULL, roffchild_Fo, 0, ROFF_LAYOUT, 0 }, /* Fo */ /* FIXME: section/linebreak. */ |
|
/*Ok*/ { roff_noop, NULL, NULL, roffparent_Fc, NULL, ROFF_Fo, ROFF_LAYOUT, 0 }, /* Fc */ /* FIXME: section/linebreak. */ |
|
/*Ok*/ { roff_layout, NULL, NULL, NULL, NULL, 0, ROFF_LAYOUT, 0 }, /* Oo */ |
|
/*Ok*/ { roff_noop, NULL, NULL, roffparent_Oc, NULL, ROFF_Oo, ROFF_LAYOUT, 0 }, /* Oc */ |
|
{ NULL, NULL, roffarg_Bk, NULL, NULL, 0, ROFF_LAYOUT, 0 }, /* Bk */ |
|
{ NULL, NULL, NULL, NULL, NULL, ROFF_Bk, ROFF_LAYOUT, 0 }, /* Ek */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Bt */ |
|
{ NULL, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Hf */ |
|
/*Ok*/ { roff_depr, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Fr */ |
|
/*Ok*/ {roff_ordered, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Ud */ |
|
}; |
|
|
|
#define ROFF_VALUE (1 << 0) |
|
|
|
static const int tokenargs[ROFF_ARGMAX] = { |
|
0, 0, 0, 0, |
|
0, ROFF_VALUE, ROFF_VALUE, 0, |
|
0, 0, 0, 0, |
|
0, 0, 0, 0, |
|
0, 0, ROFF_VALUE, 0, |
|
0, ROFF_VALUE, 0, 0, |
|
0, 0, 0, 0, |
|
0, 0, 0, 0, |
|
0, 0, 0, 0, |
|
0, 0, 0, 0, |
|
0, 0, 0, 0, |
|
0, 0, 0, 0, |
|
0, 0, 0, 0, |
|
0, 0, 0, 0, |
|
0, 0, 0, 0, |
|
}; |
|
|
|
const char *const toknamesp[ROFF_MAX] = { |
|
"\\\"", "Dd", "Dt", "Os", |
|
"Sh", "Ss", "Pp", "D1", |
|
"Dl", "Bd", "Ed", "Bl", |
|
"El", "It", "Ad", "An", |
|
"Ar", "Cd", "Cm", "Dv", |
|
"Er", "Ev", "Ex", "Fa", |
|
"Fd", "Fl", "Fn", "Ft", |
|
"Ic", "In", "Li", "Nd", |
|
"Nm", "Op", "Ot", "Pa", |
|
"Rv", "St", "Va", "Vt", |
|
/* LINTED */ |
|
"Xr", "\%A", "\%B", "\%D", |
|
/* LINTED */ |
|
"\%I", "\%J", "\%N", "\%O", |
|
/* LINTED */ |
|
"\%P", "\%R", "\%T", "\%V", |
|
"Ac", "Ao", "Aq", "At", |
|
"Bc", "Bf", "Bo", "Bq", |
|
"Bsx", "Bx", "Db", "Dc", |
|
"Do", "Dq", "Ec", "Ef", |
|
"Em", "Eo", "Fx", "Ms", |
|
"No", "Ns", "Nx", "Ox", |
|
"Pc", "Pf", "Po", "Pq", |
|
"Qc", "Ql", "Qo", "Qq", |
|
"Re", "Rs", "Sc", "So", |
|
"Sq", "Sm", "Sx", "Sy", |
|
"Tn", "Ux", "Xc", "Xo", |
|
"Fo", "Fc", "Oo", "Oc", |
|
"Bk", "Ek", "Bt", "Hf", |
|
"Fr", "Ud", |
|
}; |
|
|
|
const char *const tokargnamesp[ROFF_ARGMAX] = { |
|
"split", "nosplit", "ragged", |
|
"unfilled", "literal", "file", |
|
"offset", "bullet", "dash", |
|
"hyphen", "item", "enum", |
|
"tag", "diag", "hang", |
|
"ohang", "inset", "column", |
|
"width", "compact", "std", |
|
"p1003.1-88", "p1003.1-90", "p1003.1-96", |
|
"p1003.1-2001", "p1003.1-2004", "p1003.1", |
|
"p1003.1b", "p1003.1b-93", "p1003.1c-95", |
|
"p1003.1g-2000", "p1003.2-92", "p1387.2-95", |
|
"p1003.2", "p1387.2", "isoC-90", |
|
"isoC-amd1", "isoC-tcor1", "isoC-tcor2", |
|
"isoC-99", "ansiC", "ansiC-89", |
|
"ansiC-99", "ieee754", "iso8802-3", |
|
"xpg3", "xpg4", "xpg4.2", |
|
"xpg4.3", "xbd5", "xcu5", |
|
"xsh5", "xns5", "xns5.2d2.0", |
|
"xcurses4.2", "susv2", "susv3", |
|
"svid4", "filled", "words", |
|
}; |
|
|
|
const char *const *toknames = toknamesp; |
|
const char *const *tokargnames = tokargnamesp; |
|
|
|
__END_DECLS |
|
|
|
#endif /*!ROFF_H*/ |
|