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