Annotation of mandoc/roff.h, Revision 1.43
1.43 ! schwarze 1: /* $Id: roff.h,v 1.42 2017/04/29 12:45:42 schwarze Exp $ */
1.1 kristaps 2: /*
1.28 schwarze 3: * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
1.38 schwarze 4: * Copyright (c) 2013, 2014, 2015, 2017 Ingo Schwarze <schwarze@openbsd.org>
1.1 kristaps 5: *
6: * Permission to use, copy, modify, and distribute this software for any
1.12 kristaps 7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
1.1 kristaps 9: *
1.28 schwarze 10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
1.12 kristaps 11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1.28 schwarze 12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
1.12 kristaps 13: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1.1 kristaps 17: */
18:
1.42 schwarze 19: struct ohash;
1.29 schwarze 20: struct mdoc_arg;
21: union mdoc_data;
22:
1.32 schwarze 23: enum roff_macroset {
24: MACROSET_NONE = 0,
25: MACROSET_MDOC,
26: MACROSET_MAN
27: };
28:
1.29 schwarze 29: enum roff_sec {
30: SEC_NONE = 0,
31: SEC_NAME,
32: SEC_LIBRARY,
33: SEC_SYNOPSIS,
34: SEC_DESCRIPTION,
35: SEC_CONTEXT,
36: SEC_IMPLEMENTATION, /* IMPLEMENTATION NOTES */
37: SEC_RETURN_VALUES,
38: SEC_ENVIRONMENT,
39: SEC_FILES,
40: SEC_EXIT_STATUS,
41: SEC_EXAMPLES,
42: SEC_DIAGNOSTICS,
43: SEC_COMPATIBILITY,
44: SEC_ERRORS,
45: SEC_SEE_ALSO,
46: SEC_STANDARDS,
47: SEC_HISTORY,
48: SEC_AUTHORS,
49: SEC_CAVEATS,
50: SEC_BUGS,
51: SEC_SECURITY,
52: SEC_CUSTOM,
53: SEC__MAX
54: };
55:
1.28 schwarze 56: enum roff_type {
57: ROFFT_ROOT,
58: ROFFT_BLOCK,
59: ROFFT_HEAD,
60: ROFFT_BODY,
61: ROFFT_TAIL,
62: ROFFT_ELEM,
63: ROFFT_TEXT,
64: ROFFT_TBL,
65: ROFFT_EQN
1.29 schwarze 66: };
67:
1.41 schwarze 68: enum roff_tok {
1.43 ! schwarze 69: ROFF_br = 0,
! 70: ROFF_MAX,
! 71: ROFF_ab,
1.41 schwarze 72: ROFF_ad,
73: ROFF_af,
74: ROFF_aln,
75: ROFF_als,
76: ROFF_am,
77: ROFF_am1,
78: ROFF_ami,
79: ROFF_ami1,
80: ROFF_as,
81: ROFF_as1,
82: ROFF_asciify,
83: ROFF_backtrace,
84: ROFF_bd,
85: ROFF_bleedat,
86: ROFF_blm,
87: ROFF_box,
88: ROFF_boxa,
89: ROFF_bp,
90: ROFF_BP,
91: ROFF_break,
92: ROFF_breakchar,
93: ROFF_brnl,
94: ROFF_brp,
95: ROFF_brpnl,
96: ROFF_c2,
97: ROFF_cc,
98: ROFF_ce,
99: ROFF_cf,
100: ROFF_cflags,
101: ROFF_ch,
102: ROFF_char,
103: ROFF_chop,
104: ROFF_class,
105: ROFF_close,
106: ROFF_CL,
107: ROFF_color,
108: ROFF_composite,
109: ROFF_continue,
110: ROFF_cp,
111: ROFF_cropat,
112: ROFF_cs,
113: ROFF_cu,
114: ROFF_da,
115: ROFF_dch,
116: ROFF_Dd,
117: ROFF_de,
118: ROFF_de1,
119: ROFF_defcolor,
120: ROFF_dei,
121: ROFF_dei1,
122: ROFF_device,
123: ROFF_devicem,
124: ROFF_di,
125: ROFF_do,
126: ROFF_ds,
127: ROFF_ds1,
128: ROFF_dwh,
129: ROFF_dt,
130: ROFF_ec,
131: ROFF_ecr,
132: ROFF_ecs,
133: ROFF_el,
134: ROFF_em,
135: ROFF_EN,
136: ROFF_eo,
137: ROFF_EP,
138: ROFF_EQ,
139: ROFF_errprint,
140: ROFF_ev,
141: ROFF_evc,
142: ROFF_ex,
143: ROFF_fallback,
144: ROFF_fam,
145: ROFF_fc,
146: ROFF_fchar,
147: ROFF_fcolor,
148: ROFF_fdeferlig,
149: ROFF_feature,
150: /* MAN_fi; ignored in mdoc(7) */
151: ROFF_fkern,
152: ROFF_fl,
153: ROFF_flig,
154: ROFF_fp,
155: ROFF_fps,
156: ROFF_fschar,
157: ROFF_fspacewidth,
158: ROFF_fspecial,
159: /* MAN_ft; ignored in mdoc(7) */
160: ROFF_ftr,
161: ROFF_fzoom,
162: ROFF_gcolor,
163: ROFF_hc,
164: ROFF_hcode,
165: ROFF_hidechar,
166: ROFF_hla,
167: ROFF_hlm,
168: ROFF_hpf,
169: ROFF_hpfa,
170: ROFF_hpfcode,
171: ROFF_hw,
172: ROFF_hy,
173: ROFF_hylang,
174: ROFF_hylen,
175: ROFF_hym,
176: ROFF_hypp,
177: ROFF_hys,
178: ROFF_ie,
179: ROFF_if,
180: ROFF_ig,
181: /* MAN_in; ignored in mdoc(7) */
182: ROFF_index,
183: ROFF_it,
184: ROFF_itc,
185: ROFF_IX,
186: ROFF_kern,
187: ROFF_kernafter,
188: ROFF_kernbefore,
189: ROFF_kernpair,
190: ROFF_lc,
191: ROFF_lc_ctype,
192: ROFF_lds,
193: ROFF_length,
194: ROFF_letadj,
195: ROFF_lf,
196: ROFF_lg,
197: ROFF_lhang,
198: ROFF_linetabs,
199: /* MAN_ll, MDOC_ll */
200: ROFF_lnr,
201: ROFF_lnrf,
202: ROFF_lpfx,
203: ROFF_ls,
204: ROFF_lsm,
205: ROFF_lt,
206: ROFF_mc,
207: ROFF_mediasize,
208: ROFF_minss,
209: ROFF_mk,
210: ROFF_mso,
211: ROFF_na,
212: ROFF_ne,
213: /* MAN_nf; ignored in mdoc(7) */
214: ROFF_nh,
215: ROFF_nhychar,
216: ROFF_nm,
217: ROFF_nn,
218: ROFF_nop,
219: ROFF_nr,
220: ROFF_nrf,
221: ROFF_nroff,
222: ROFF_ns,
223: ROFF_nx,
224: ROFF_open,
225: ROFF_opena,
226: ROFF_os,
227: ROFF_output,
228: ROFF_padj,
229: ROFF_papersize,
230: ROFF_pc,
231: ROFF_pev,
232: ROFF_pi,
233: ROFF_PI,
234: ROFF_pl,
235: ROFF_pm,
236: ROFF_pn,
237: ROFF_pnr,
238: ROFF_po,
239: ROFF_ps,
240: ROFF_psbb,
241: ROFF_pshape,
242: ROFF_pso,
243: ROFF_ptr,
244: ROFF_pvs,
245: ROFF_rchar,
246: ROFF_rd,
247: ROFF_recursionlimit,
248: ROFF_return,
249: ROFF_rfschar,
250: ROFF_rhang,
251: ROFF_rj,
252: ROFF_rm,
253: ROFF_rn,
254: ROFF_rnn,
255: ROFF_rr,
256: ROFF_rs,
257: ROFF_rt,
258: ROFF_schar,
259: ROFF_sentchar,
260: ROFF_shc,
261: ROFF_shift,
262: ROFF_sizes,
263: ROFF_so,
264: /* MAN_sp, MDOC_sp */
265: ROFF_spacewidth,
266: ROFF_special,
267: ROFF_spreadwarn,
268: ROFF_ss,
269: ROFF_sty,
270: ROFF_substring,
271: ROFF_sv,
272: ROFF_sy,
273: ROFF_T_,
274: ROFF_ta,
275: ROFF_tc,
276: ROFF_TE,
277: ROFF_TH,
278: ROFF_ti,
279: ROFF_tkf,
280: ROFF_tl,
281: ROFF_tm,
282: ROFF_tm1,
283: ROFF_tmc,
284: ROFF_tr,
285: ROFF_track,
286: ROFF_transchar,
287: ROFF_trf,
288: ROFF_trimat,
289: ROFF_trin,
290: ROFF_trnt,
291: ROFF_troff,
292: ROFF_TS,
293: ROFF_uf,
294: ROFF_ul,
295: ROFF_unformat,
296: ROFF_unwatch,
297: ROFF_unwatchn,
298: ROFF_vpt,
299: ROFF_vs,
300: ROFF_warn,
301: ROFF_warnscale,
302: ROFF_watch,
303: ROFF_watchlength,
304: ROFF_watchn,
305: ROFF_wh,
306: ROFF_while,
307: ROFF_write,
308: ROFF_writec,
309: ROFF_writem,
310: ROFF_xflag,
311: ROFF_cblock,
312: ROFF_USERDEF,
313: TOKEN_NONE,
314: MDOC_Dd,
315: MDOC_Dt,
316: MDOC_Os,
317: MDOC_Sh,
318: MDOC_Ss,
319: MDOC_Pp,
320: MDOC_D1,
321: MDOC_Dl,
322: MDOC_Bd,
323: MDOC_Ed,
324: MDOC_Bl,
325: MDOC_El,
326: MDOC_It,
327: MDOC_Ad,
328: MDOC_An,
329: MDOC_Ap,
330: MDOC_Ar,
331: MDOC_Cd,
332: MDOC_Cm,
333: MDOC_Dv,
334: MDOC_Er,
335: MDOC_Ev,
336: MDOC_Ex,
337: MDOC_Fa,
338: MDOC_Fd,
339: MDOC_Fl,
340: MDOC_Fn,
341: MDOC_Ft,
342: MDOC_Ic,
343: MDOC_In,
344: MDOC_Li,
345: MDOC_Nd,
346: MDOC_Nm,
347: MDOC_Op,
348: MDOC_Ot,
349: MDOC_Pa,
350: MDOC_Rv,
351: MDOC_St,
352: MDOC_Va,
353: MDOC_Vt,
354: MDOC_Xr,
355: MDOC__A,
356: MDOC__B,
357: MDOC__D,
358: MDOC__I,
359: MDOC__J,
360: MDOC__N,
361: MDOC__O,
362: MDOC__P,
363: MDOC__R,
364: MDOC__T,
365: MDOC__V,
366: MDOC_Ac,
367: MDOC_Ao,
368: MDOC_Aq,
369: MDOC_At,
370: MDOC_Bc,
371: MDOC_Bf,
372: MDOC_Bo,
373: MDOC_Bq,
374: MDOC_Bsx,
375: MDOC_Bx,
376: MDOC_Db,
377: MDOC_Dc,
378: MDOC_Do,
379: MDOC_Dq,
380: MDOC_Ec,
381: MDOC_Ef,
382: MDOC_Em,
383: MDOC_Eo,
384: MDOC_Fx,
385: MDOC_Ms,
386: MDOC_No,
387: MDOC_Ns,
388: MDOC_Nx,
389: MDOC_Ox,
390: MDOC_Pc,
391: MDOC_Pf,
392: MDOC_Po,
393: MDOC_Pq,
394: MDOC_Qc,
395: MDOC_Ql,
396: MDOC_Qo,
397: MDOC_Qq,
398: MDOC_Re,
399: MDOC_Rs,
400: MDOC_Sc,
401: MDOC_So,
402: MDOC_Sq,
403: MDOC_Sm,
404: MDOC_Sx,
405: MDOC_Sy,
406: MDOC_Tn,
407: MDOC_Ux,
408: MDOC_Xc,
409: MDOC_Xo,
410: MDOC_Fo,
411: MDOC_Fc,
412: MDOC_Oo,
413: MDOC_Oc,
414: MDOC_Bk,
415: MDOC_Ek,
416: MDOC_Bt,
417: MDOC_Hf,
418: MDOC_Fr,
419: MDOC_Ud,
420: MDOC_Lb,
421: MDOC_Lp,
422: MDOC_Lk,
423: MDOC_Mt,
424: MDOC_Brq,
425: MDOC_Bro,
426: MDOC_Brc,
427: MDOC__C,
428: MDOC_Es,
429: MDOC_En,
430: MDOC_Dx,
431: MDOC__Q,
432: MDOC_sp,
433: MDOC__U,
434: MDOC_Ta,
435: MDOC_ll,
436: MDOC_MAX,
437: MAN_TH,
438: MAN_SH,
439: MAN_SS,
440: MAN_TP,
441: MAN_LP,
442: MAN_PP,
443: MAN_P,
444: MAN_IP,
445: MAN_HP,
446: MAN_SM,
447: MAN_SB,
448: MAN_BI,
449: MAN_IB,
450: MAN_BR,
451: MAN_RB,
452: MAN_R,
453: MAN_B,
454: MAN_I,
455: MAN_IR,
456: MAN_RI,
457: MAN_sp,
458: MAN_nf,
459: MAN_fi,
460: MAN_RE,
461: MAN_RS,
462: MAN_DT,
463: MAN_UC,
464: MAN_PD,
465: MAN_AT,
466: MAN_in,
467: MAN_ft,
468: MAN_OP,
469: MAN_EX,
470: MAN_EE,
471: MAN_UR,
472: MAN_UE,
473: MAN_ll,
474: MAN_MAX
475: };
476:
1.31 schwarze 477: enum roff_next {
478: ROFF_NEXT_SIBLING = 0,
479: ROFF_NEXT_CHILD
480: };
481:
1.29 schwarze 482: /*
483: * Indicates that a BODY's formatting has ended, but
484: * the scope is still open. Used for badly nested blocks.
485: */
486: enum mdoc_endbody {
487: ENDBODY_NOT = 0,
1.40 schwarze 488: ENDBODY_SPACE /* Is broken: append a space. */
1.29 schwarze 489: };
490:
491: struct roff_node {
492: struct roff_node *parent; /* Parent AST node. */
493: struct roff_node *child; /* First child AST node. */
494: struct roff_node *last; /* Last child AST node. */
495: struct roff_node *next; /* Sibling AST node. */
496: struct roff_node *prev; /* Prior sibling AST node. */
497: struct roff_node *head; /* BLOCK */
498: struct roff_node *body; /* BLOCK/ENDBODY */
499: struct roff_node *tail; /* BLOCK */
500: struct mdoc_arg *args; /* BLOCK/ELEM */
501: union mdoc_data *norm; /* Normalized arguments. */
502: char *string; /* TEXT */
503: const struct tbl_span *span; /* TBL */
504: const struct eqn *eqn; /* EQN */
505: int line; /* Input file line number. */
506: int pos; /* Input file column number. */
507: int flags;
1.39 schwarze 508: #define NODE_VALID (1 << 0) /* Has been validated. */
509: #define NODE_ENDED (1 << 1) /* Gone past body end mark. */
510: #define NODE_EOS (1 << 2) /* At sentence boundary. */
511: #define NODE_LINE (1 << 3) /* First macro/text on line. */
512: #define NODE_SYNPRETTY (1 << 4) /* SYNOPSIS-style formatting. */
513: #define NODE_BROKEN (1 << 5) /* Must validate parent when ending. */
514: #define NODE_DELIMO (1 << 6)
515: #define NODE_DELIMC (1 << 7)
1.38 schwarze 516: #define NODE_NOSRC (1 << 8) /* Generated node, not in input file. */
517: #define NODE_NOPRT (1 << 9) /* Shall not print anything. */
1.29 schwarze 518: int prev_font; /* Before entering this node. */
519: int aux; /* Decoded node data, type-dependent. */
1.41 schwarze 520: enum roff_tok tok; /* Request or macro ID. */
1.29 schwarze 521: enum roff_type type; /* AST node type. */
522: enum roff_sec sec; /* Current named section. */
523: enum mdoc_endbody end; /* BODY */
1.28 schwarze 524: };
1.30 schwarze 525:
526: struct roff_meta {
527: char *msec; /* Manual section, usually a digit. */
528: char *vol; /* Manual volume title. */
529: char *os; /* Operating system. */
530: char *arch; /* Machine architecture. */
531: char *title; /* Manual title, usually CAPS. */
532: char *name; /* Leading manual name. */
533: char *date; /* Normalized date. */
534: int hasbody; /* Document is not empty. */
1.31 schwarze 535: };
536:
537: struct roff_man {
538: struct roff_meta meta; /* Document meta-data. */
539: struct mparse *parse; /* Parse pointer. */
540: struct roff *roff; /* Roff parser state data. */
1.42 schwarze 541: struct ohash *mdocmac; /* Mdoc macro lookup table. */
542: struct ohash *manmac; /* Man macro lookup table. */
1.31 schwarze 543: const char *defos; /* Default operating system. */
544: struct roff_node *first; /* The first node parsed. */
545: struct roff_node *last; /* The last node parsed. */
546: struct roff_node *last_es; /* The most recent Es node. */
547: int quick; /* Abort parse early. */
548: int flags; /* Parse flags. */
549: #define MDOC_LITERAL (1 << 1) /* In a literal scope. */
550: #define MDOC_PBODY (1 << 2) /* In the document body. */
551: #define MDOC_NEWLINE (1 << 3) /* First macro/text in a line. */
1.35 schwarze 552: #define MDOC_PHRASE (1 << 4) /* In a Bl -column phrase. */
553: #define MDOC_PHRASELIT (1 << 5) /* Literal within a phrase. */
1.31 schwarze 554: #define MDOC_FREECOL (1 << 6) /* `It' invocation should close. */
555: #define MDOC_SYNOPSIS (1 << 7) /* SYNOPSIS-style formatting. */
556: #define MDOC_KEEP (1 << 8) /* In a word keep. */
557: #define MDOC_SMOFF (1 << 9) /* Spacing is off. */
558: #define MDOC_NODELIMC (1 << 10) /* Disable closing delimiter handling. */
559: #define MAN_ELINE (1 << 11) /* Next-line element scope. */
560: #define MAN_BLINE (1 << 12) /* Next-line block scope. */
1.35 schwarze 561: #define MDOC_PHRASEQF (1 << 13) /* Quote first word encountered. */
562: #define MDOC_PHRASEQL (1 << 14) /* Quote last word of this phrase. */
563: #define MDOC_PHRASEQN (1 << 15) /* Quote first word of the next phrase. */
1.31 schwarze 564: #define MAN_LITERAL MDOC_LITERAL
565: #define MAN_NEWLINE MDOC_NEWLINE
1.32 schwarze 566: enum roff_macroset macroset; /* Kind of high-level macros used. */
1.31 schwarze 567: enum roff_sec lastsec; /* Last section seen. */
568: enum roff_sec lastnamed; /* Last standard section seen. */
569: enum roff_next next; /* Where to put the next node. */
1.30 schwarze 570: };
1.34 schwarze 571:
1.41 schwarze 572: extern const char *const *roff_name;
1.34 schwarze 573:
1.42 schwarze 574:
1.34 schwarze 575: void deroff(char **, const struct roff_node *);
1.42 schwarze 576: struct ohash *roffhash_alloc(enum roff_tok, enum roff_tok);
577: enum roff_tok roffhash_find(struct ohash *, const char *, size_t);
578: void roffhash_free(struct ohash *);
CVSweb