version 1.10, 2008/12/10 17:31:57 |
version 1.61, 2018/08/18 02:08:27 |
|
|
/* $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,2018 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 ohash; |
ROFF_ENTER = 0, |
struct mdoc_arg; |
ROFF_EXIT |
union mdoc_data; |
|
|
|
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_COMMENT, |
|
ROFFT_TBL, |
|
ROFFT_EQN |
|
}; |
|
|
#define ROFFCALL_ARGS \ |
enum roff_tok { |
int tok, struct rofftree *tree, \ |
ROFF_br = 0, |
char *argv[], enum roffd type |
ROFF_ce, |
|
ROFF_ft, |
|
ROFF_ll, |
|
ROFF_mc, |
|
ROFF_po, |
|
ROFF_rj, |
|
ROFF_sp, |
|
ROFF_ta, |
|
ROFF_ti, |
|
ROFF_MAX, |
|
ROFF_ab, |
|
ROFF_ad, |
|
ROFF_af, |
|
ROFF_aln, |
|
ROFF_als, |
|
ROFF_am, |
|
ROFF_am1, |
|
ROFF_ami, |
|
ROFF_ami1, |
|
ROFF_as, |
|
ROFF_as1, |
|
ROFF_asciify, |
|
ROFF_backtrace, |
|
ROFF_bd, |
|
ROFF_bleedat, |
|
ROFF_blm, |
|
ROFF_box, |
|
ROFF_boxa, |
|
ROFF_bp, |
|
ROFF_BP, |
|
ROFF_break, |
|
ROFF_breakchar, |
|
ROFF_brnl, |
|
ROFF_brp, |
|
ROFF_brpnl, |
|
ROFF_c2, |
|
ROFF_cc, |
|
ROFF_cf, |
|
ROFF_cflags, |
|
ROFF_ch, |
|
ROFF_char, |
|
ROFF_chop, |
|
ROFF_class, |
|
ROFF_close, |
|
ROFF_CL, |
|
ROFF_color, |
|
ROFF_composite, |
|
ROFF_continue, |
|
ROFF_cp, |
|
ROFF_cropat, |
|
ROFF_cs, |
|
ROFF_cu, |
|
ROFF_da, |
|
ROFF_dch, |
|
ROFF_Dd, |
|
ROFF_de, |
|
ROFF_de1, |
|
ROFF_defcolor, |
|
ROFF_dei, |
|
ROFF_dei1, |
|
ROFF_device, |
|
ROFF_devicem, |
|
ROFF_di, |
|
ROFF_do, |
|
ROFF_ds, |
|
ROFF_ds1, |
|
ROFF_dwh, |
|
ROFF_dt, |
|
ROFF_ec, |
|
ROFF_ecr, |
|
ROFF_ecs, |
|
ROFF_el, |
|
ROFF_em, |
|
ROFF_EN, |
|
ROFF_eo, |
|
ROFF_EP, |
|
ROFF_EQ, |
|
ROFF_errprint, |
|
ROFF_ev, |
|
ROFF_evc, |
|
ROFF_ex, |
|
ROFF_fallback, |
|
ROFF_fam, |
|
ROFF_fc, |
|
ROFF_fchar, |
|
ROFF_fcolor, |
|
ROFF_fdeferlig, |
|
ROFF_feature, |
|
/* MAN_fi; ignored in mdoc(7) */ |
|
ROFF_fkern, |
|
ROFF_fl, |
|
ROFF_flig, |
|
ROFF_fp, |
|
ROFF_fps, |
|
ROFF_fschar, |
|
ROFF_fspacewidth, |
|
ROFF_fspecial, |
|
ROFF_ftr, |
|
ROFF_fzoom, |
|
ROFF_gcolor, |
|
ROFF_hc, |
|
ROFF_hcode, |
|
ROFF_hidechar, |
|
ROFF_hla, |
|
ROFF_hlm, |
|
ROFF_hpf, |
|
ROFF_hpfa, |
|
ROFF_hpfcode, |
|
ROFF_hw, |
|
ROFF_hy, |
|
ROFF_hylang, |
|
ROFF_hylen, |
|
ROFF_hym, |
|
ROFF_hypp, |
|
ROFF_hys, |
|
ROFF_ie, |
|
ROFF_if, |
|
ROFF_ig, |
|
/* MAN_in; ignored in mdoc(7) */ |
|
ROFF_index, |
|
ROFF_it, |
|
ROFF_itc, |
|
ROFF_IX, |
|
ROFF_kern, |
|
ROFF_kernafter, |
|
ROFF_kernbefore, |
|
ROFF_kernpair, |
|
ROFF_lc, |
|
ROFF_lc_ctype, |
|
ROFF_lds, |
|
ROFF_length, |
|
ROFF_letadj, |
|
ROFF_lf, |
|
ROFF_lg, |
|
ROFF_lhang, |
|
ROFF_linetabs, |
|
ROFF_lnr, |
|
ROFF_lnrf, |
|
ROFF_lpfx, |
|
ROFF_ls, |
|
ROFF_lsm, |
|
ROFF_lt, |
|
ROFF_mediasize, |
|
ROFF_minss, |
|
ROFF_mk, |
|
ROFF_mso, |
|
ROFF_na, |
|
ROFF_ne, |
|
/* MAN_nf; ignored in mdoc(7) */ |
|
ROFF_nh, |
|
ROFF_nhychar, |
|
ROFF_nm, |
|
ROFF_nn, |
|
ROFF_nop, |
|
ROFF_nr, |
|
ROFF_nrf, |
|
ROFF_nroff, |
|
ROFF_ns, |
|
ROFF_nx, |
|
ROFF_open, |
|
ROFF_opena, |
|
ROFF_os, |
|
ROFF_output, |
|
ROFF_padj, |
|
ROFF_papersize, |
|
ROFF_pc, |
|
ROFF_pev, |
|
ROFF_pi, |
|
ROFF_PI, |
|
ROFF_pl, |
|
ROFF_pm, |
|
ROFF_pn, |
|
ROFF_pnr, |
|
ROFF_ps, |
|
ROFF_psbb, |
|
ROFF_pshape, |
|
ROFF_pso, |
|
ROFF_ptr, |
|
ROFF_pvs, |
|
ROFF_rchar, |
|
ROFF_rd, |
|
ROFF_recursionlimit, |
|
ROFF_return, |
|
ROFF_rfschar, |
|
ROFF_rhang, |
|
ROFF_rm, |
|
ROFF_rn, |
|
ROFF_rnn, |
|
ROFF_rr, |
|
ROFF_rs, |
|
ROFF_rt, |
|
ROFF_schar, |
|
ROFF_sentchar, |
|
ROFF_shc, |
|
ROFF_shift, |
|
ROFF_sizes, |
|
ROFF_so, |
|
ROFF_spacewidth, |
|
ROFF_special, |
|
ROFF_spreadwarn, |
|
ROFF_ss, |
|
ROFF_sty, |
|
ROFF_substring, |
|
ROFF_sv, |
|
ROFF_sy, |
|
ROFF_T_, |
|
ROFF_tc, |
|
ROFF_TE, |
|
ROFF_TH, |
|
ROFF_tkf, |
|
ROFF_tl, |
|
ROFF_tm, |
|
ROFF_tm1, |
|
ROFF_tmc, |
|
ROFF_tr, |
|
ROFF_track, |
|
ROFF_transchar, |
|
ROFF_trf, |
|
ROFF_trimat, |
|
ROFF_trin, |
|
ROFF_trnt, |
|
ROFF_troff, |
|
ROFF_TS, |
|
ROFF_uf, |
|
ROFF_ul, |
|
ROFF_unformat, |
|
ROFF_unwatch, |
|
ROFF_unwatchn, |
|
ROFF_vpt, |
|
ROFF_vs, |
|
ROFF_warn, |
|
ROFF_warnscale, |
|
ROFF_watch, |
|
ROFF_watchlength, |
|
ROFF_watchn, |
|
ROFF_wh, |
|
ROFF_while, |
|
ROFF_write, |
|
ROFF_writec, |
|
ROFF_writem, |
|
ROFF_xflag, |
|
ROFF_cblock, |
|
ROFF_RENAMED, |
|
ROFF_USERDEF, |
|
TOKEN_NONE, |
|
MDOC_Dd, |
|
MDOC_Dt, |
|
MDOC_Os, |
|
MDOC_Sh, |
|
MDOC_Ss, |
|
MDOC_Pp, |
|
MDOC_D1, |
|
MDOC_Dl, |
|
MDOC_Bd, |
|
MDOC_Ed, |
|
MDOC_Bl, |
|
MDOC_El, |
|
MDOC_It, |
|
MDOC_Ad, |
|
MDOC_An, |
|
MDOC_Ap, |
|
MDOC_Ar, |
|
MDOC_Cd, |
|
MDOC_Cm, |
|
MDOC_Dv, |
|
MDOC_Er, |
|
MDOC_Ev, |
|
MDOC_Ex, |
|
MDOC_Fa, |
|
MDOC_Fd, |
|
MDOC_Fl, |
|
MDOC_Fn, |
|
MDOC_Ft, |
|
MDOC_Ic, |
|
MDOC_In, |
|
MDOC_Li, |
|
MDOC_Nd, |
|
MDOC_Nm, |
|
MDOC_Op, |
|
MDOC_Ot, |
|
MDOC_Pa, |
|
MDOC_Rv, |
|
MDOC_St, |
|
MDOC_Va, |
|
MDOC_Vt, |
|
MDOC_Xr, |
|
MDOC__A, |
|
MDOC__B, |
|
MDOC__D, |
|
MDOC__I, |
|
MDOC__J, |
|
MDOC__N, |
|
MDOC__O, |
|
MDOC__P, |
|
MDOC__R, |
|
MDOC__T, |
|
MDOC__V, |
|
MDOC_Ac, |
|
MDOC_Ao, |
|
MDOC_Aq, |
|
MDOC_At, |
|
MDOC_Bc, |
|
MDOC_Bf, |
|
MDOC_Bo, |
|
MDOC_Bq, |
|
MDOC_Bsx, |
|
MDOC_Bx, |
|
MDOC_Db, |
|
MDOC_Dc, |
|
MDOC_Do, |
|
MDOC_Dq, |
|
MDOC_Ec, |
|
MDOC_Ef, |
|
MDOC_Em, |
|
MDOC_Eo, |
|
MDOC_Fx, |
|
MDOC_Ms, |
|
MDOC_No, |
|
MDOC_Ns, |
|
MDOC_Nx, |
|
MDOC_Ox, |
|
MDOC_Pc, |
|
MDOC_Pf, |
|
MDOC_Po, |
|
MDOC_Pq, |
|
MDOC_Qc, |
|
MDOC_Ql, |
|
MDOC_Qo, |
|
MDOC_Qq, |
|
MDOC_Re, |
|
MDOC_Rs, |
|
MDOC_Sc, |
|
MDOC_So, |
|
MDOC_Sq, |
|
MDOC_Sm, |
|
MDOC_Sx, |
|
MDOC_Sy, |
|
MDOC_Tn, |
|
MDOC_Ux, |
|
MDOC_Xc, |
|
MDOC_Xo, |
|
MDOC_Fo, |
|
MDOC_Fc, |
|
MDOC_Oo, |
|
MDOC_Oc, |
|
MDOC_Bk, |
|
MDOC_Ek, |
|
MDOC_Bt, |
|
MDOC_Hf, |
|
MDOC_Fr, |
|
MDOC_Ud, |
|
MDOC_Lb, |
|
MDOC_Lp, |
|
MDOC_Lk, |
|
MDOC_Mt, |
|
MDOC_Brq, |
|
MDOC_Bro, |
|
MDOC_Brc, |
|
MDOC__C, |
|
MDOC_Es, |
|
MDOC_En, |
|
MDOC_Dx, |
|
MDOC__Q, |
|
MDOC__U, |
|
MDOC_Ta, |
|
MDOC_MAX, |
|
MAN_TH, |
|
MAN_SH, |
|
MAN_SS, |
|
MAN_TP, |
|
MAN_TQ, |
|
MAN_LP, |
|
MAN_PP, |
|
MAN_P, |
|
MAN_IP, |
|
MAN_HP, |
|
MAN_SM, |
|
MAN_SB, |
|
MAN_BI, |
|
MAN_IB, |
|
MAN_BR, |
|
MAN_RB, |
|
MAN_R, |
|
MAN_B, |
|
MAN_I, |
|
MAN_IR, |
|
MAN_RI, |
|
MAN_nf, |
|
MAN_fi, |
|
MAN_RE, |
|
MAN_RS, |
|
MAN_DT, |
|
MAN_UC, |
|
MAN_PD, |
|
MAN_AT, |
|
MAN_in, |
|
MAN_SY, |
|
MAN_YS, |
|
MAN_OP, |
|
MAN_EX, |
|
MAN_EE, |
|
MAN_UR, |
|
MAN_UE, |
|
MAN_MT, |
|
MAN_ME, |
|
MAN_MAX |
|
}; |
|
|
struct rofftok { |
enum roff_next { |
int (*cb)(ROFFCALL_ARGS); /* Callback. */ |
ROFF_NEXT_SIBLING = 0, |
const enum roffmsec *sections; |
ROFF_NEXT_CHILD |
const int *args; /* Args (or NULL). */ |
|
const int *parents; /* Limit to parents. */ |
|
const int *children; /* Limit to kids. */ |
|
int ctx; /* Blk-close node. */ |
|
enum rofftype type; /* Type of macro. */ |
|
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 |
/* |
|
* Indicates that a BODY's formatting has ended, but |
|
* the scope is still open. Used for badly nested blocks. |
|
*/ |
|
enum mdoc_endbody { |
|
ENDBODY_NOT = 0, |
|
ENDBODY_SPACE /* Is broken: append a space. */ |
|
}; |
|
|
static int roff_Dd(ROFFCALL_ARGS); /* FIXME: deprecate. */ |
struct roff_node { |
static int roff_Dt(ROFFCALL_ARGS); /* FIXME: deprecate. */ |
struct roff_node *parent; /* Parent AST node. */ |
static int roff_Os(ROFFCALL_ARGS); /* FIXME: deprecate. */ |
struct roff_node *child; /* First child AST node. */ |
static int roff_Ns(ROFFCALL_ARGS); /* FIXME: deprecate. */ |
struct roff_node *last; /* Last child AST node. */ |
static int roff_layout(ROFFCALL_ARGS); |
struct roff_node *next; /* Sibling AST node. */ |
static int roff_text(ROFFCALL_ARGS); |
struct roff_node *prev; /* Prior sibling AST node. */ |
static int roff_noop(ROFFCALL_ARGS); |
struct roff_node *head; /* BLOCK */ |
static int roff_depr(ROFFCALL_ARGS); |
struct roff_node *body; /* BLOCK/ENDBODY */ |
static int roff_ordered(ROFFCALL_ARGS); |
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 */ |
|
struct eqn_box *eqn; /* EQN */ |
|
int line; /* Input file line number. */ |
|
int pos; /* Input file column number. */ |
|
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_tok tok; /* Request or macro ID. */ |
|
enum roff_type type; /* AST node type. */ |
|
enum roff_sec sec; /* Current named section. */ |
|
enum mdoc_endbody end; /* BODY */ |
|
}; |
|
|
static const int roffarg_An[] = { ROFF_Split, ROFF_Nosplit, |
struct roff_meta { |
ROFF_ARGMAX }; |
char *msec; /* Manual section, usually a digit. */ |
static const int roffarg_Bd[] = { ROFF_Ragged, ROFF_Unfilled, |
char *vol; /* Manual volume title. */ |
ROFF_Literal, ROFF_File, ROFF_Offset, ROFF_Filled, ROFF_Compact, |
char *os; /* Operating system. */ |
ROFF_ARGMAX }; |
char *arch; /* Machine architecture. */ |
static const int roffarg_Bk[] = { ROFF_Words, ROFF_ARGMAX }; |
char *title; /* Manual title, usually CAPS. */ |
static const int roffarg_Ex[] = { ROFF_Std, ROFF_ARGMAX }; |
char *name; /* Leading manual name. */ |
static const int roffarg_Rv[] = { ROFF_Std, ROFF_ARGMAX }; |
char *date; /* Normalized date. */ |
static const int roffarg_Bl[] = { ROFF_Bullet, ROFF_Dash, ROFF_Hyphen, |
int hasbody; /* Document is not empty. */ |
ROFF_Item, ROFF_Enum, ROFF_Tag, ROFF_Diag, ROFF_Hang, |
int rcsids; /* Bits indexed by enum mandoc_os. */ |
ROFF_Ohang, ROFF_Inset, ROFF_Column, ROFF_Offset, ROFF_Width, |
enum mandoc_os os_e; /* Operating system. */ |
ROFF_Compact, ROFF_ARGMAX }; |
}; |
static const int roffarg_St[] = { ROFF_p1003_1_88, ROFF_p1003_1_90, |
|
ROFF_p1003_1_96, ROFF_p1003_1_2001, ROFF_p1003_1_2004, |
|
ROFF_p1003_1, ROFF_p1003_1b, ROFF_p1003_1b_93, ROFF_p1003_1c_95, |
|
ROFF_p1003_1g_2000, ROFF_p1003_2_92, ROFF_p1387_2_95, |
|
ROFF_p1003_2, ROFF_p1387_2, ROFF_isoC_90, ROFF_isoC_amd1, |
|
ROFF_isoC_tcor1, ROFF_isoC_tcor2, ROFF_isoC_99, ROFF_ansiC, |
|
ROFF_ansiC_89, ROFF_ansiC_99, ROFF_ieee754, ROFF_iso8802_3, |
|
ROFF_xpg3, ROFF_xpg4, ROFF_xpg4_2, ROFF_xpg4_3, ROFF_xbd5, |
|
ROFF_xcu5, ROFF_xsh5, ROFF_xns5, ROFF_xns5_2d2_0, |
|
ROFF_xcurses4_2, ROFF_susv2, ROFF_susv3, ROFF_svid4, |
|
ROFF_ARGMAX }; |
|
|
|
static const int roffchild_Bl[] = { ROFF_It, ROFF_El, ROFF_MAX }; |
struct roff_man { |
static const int roffchild_Fo[] = { ROFF_Fa, ROFF_Fc, ROFF_MAX }; |
struct roff_meta meta; /* Document meta-data. */ |
static const int roffchild_Rs[] = { ROFF_Re, ROFF__A, ROFF__B, ROFF__D, |
struct mparse *parse; /* Parse pointer. */ |
ROFF__I, ROFF__J, ROFF__N, ROFF__O, ROFF__P, ROFF__R, ROFF__T, |
struct roff *roff; /* Roff parser state data. */ |
ROFF__V, ROFF_MAX }; |
struct ohash *mdocmac; /* Mdoc macro lookup table. */ |
|
struct ohash *manmac; /* Man macro lookup table. */ |
|
const char *os_s; /* Default operating system. */ |
|
struct roff_node *first; /* The first node parsed. */ |
|
struct roff_node *last; /* The last node parsed. */ |
|
struct roff_node *last_es; /* The most recent Es node. */ |
|
int quick; /* Abort parse early. */ |
|
int flags; /* Parse flags. */ |
|
#define MDOC_LITERAL (1 << 1) /* In a literal scope. */ |
|
#define MDOC_PBODY (1 << 2) /* In the document body. */ |
|
#define MDOC_NEWLINE (1 << 3) /* First macro/text in a line. */ |
|
#define MDOC_PHRASE (1 << 4) /* In a Bl -column phrase. */ |
|
#define MDOC_PHRASELIT (1 << 5) /* Literal within a phrase. */ |
|
#define MDOC_FREECOL (1 << 6) /* `It' invocation should close. */ |
|
#define MDOC_SYNOPSIS (1 << 7) /* SYNOPSIS-style formatting. */ |
|
#define MDOC_KEEP (1 << 8) /* In a word keep. */ |
|
#define MDOC_SMOFF (1 << 9) /* Spacing is off. */ |
|
#define MDOC_NODELIMC (1 << 10) /* Disable closing delimiter handling. */ |
|
#define MAN_ELINE (1 << 11) /* Next-line element scope. */ |
|
#define MAN_BLINE (1 << 12) /* Next-line block scope. */ |
|
#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 enum roffmsec roffmsec_Cd[] = { ROFF_MSEC_4, |
extern const char *const *roff_name; |
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] = { |
void deroff(char **, const struct roff_node *); |
{ roff_noop, NULL, NULL, NULL, NULL, 0, ROFF_COMMENT, 0 }, /* \" */ |
struct ohash *roffhash_alloc(enum roff_tok, enum roff_tok); |
{ roff_Dd, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Dd */ |
enum roff_tok roffhash_find(struct ohash *, const char *, size_t); |
{ roff_Dt, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Dt */ |
void roffhash_free(struct ohash *); |
{ roff_Os, NULL, NULL, NULL, NULL, 0, ROFF_TEXT, 0 }, /* Os */ |
void roff_validate(struct roff_man *); |
{ 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*/ |
|