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