Annotation of docbook2mdoc/node.h, Revision 1.2
1.2 ! schwarze 1: /* $Id: node.h,v 1.1 2019/03/26 18:32:07 schwarze Exp $ */
1.1 schwarze 2: /*
3: * Copyright (c) 2014 Kristaps Dzonsons <kristaps@bsd.lv>
4: * Copyright (c) 2019 Ingo Schwarze <schwarze@openbsd.org>
5: *
6: * Permission to use, copy, modify, and distribute this software for any
7: * purpose with or without fee is hereby granted, provided that the above
8: * copyright notice and this permission notice appear in all copies.
9: *
10: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
11: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
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.
17: */
18: #include <sys/queue.h>
19:
20: /*
21: * The interface of the DocBook syntax tree.
22: */
23:
24: /*
25: * All node types used for formatting purposes.
26: * More DocBook XML elements are recognized, but remapped or discarded.
27: */
28: enum nodeid {
1.2 ! schwarze 29: NODE_IGNORE = 0, /* Must come first. */
! 30: NODE_WARN,
1.1 schwarze 31: /* Alpha-ordered hereafter. */
32: NODE_ACRONYM,
33: NODE_AFFILIATION,
34: NODE_ANCHOR,
35: NODE_APPLICATION,
36: NODE_ARG,
37: NODE_AUTHOR,
38: NODE_AUTHORGROUP,
39: NODE_BLOCKQUOTE,
40: NODE_BOOK,
41: NODE_BOOKINFO,
42: NODE_CAUTION,
43: NODE_CITEREFENTRY,
44: NODE_CITETITLE,
45: NODE_CMDSYNOPSIS,
46: NODE_CODE,
47: NODE_COLSPEC,
48: NODE_COMMAND,
49: NODE_CONSTANT,
50: NODE_COPYRIGHT,
51: NODE_DATE,
52: NODE_EDITOR,
53: NODE_EMAIL,
54: NODE_EMPHASIS,
55: NODE_ENTRY,
56: NODE_ENVAR,
57: NODE_FIELDSYNOPSIS,
58: NODE_FILENAME,
59: NODE_FIRSTNAME,
60: NODE_FIRSTTERM,
61: NODE_FOOTNOTE,
62: NODE_FUNCDEF,
63: NODE_FUNCPROTOTYPE,
64: NODE_FUNCSYNOPSIS,
65: NODE_FUNCSYNOPSISINFO,
66: NODE_FUNCTION,
67: NODE_GLOSSTERM,
68: NODE_GROUP,
69: NODE_HOLDER,
70: NODE_INDEX,
71: NODE_INDEXTERM,
72: NODE_INFO,
73: NODE_INFORMALEQUATION,
74: NODE_INFORMALTABLE,
75: NODE_INLINEEQUATION,
76: NODE_ITEMIZEDLIST,
77: NODE_KEYSYM,
78: NODE_LEGALNOTICE,
79: NODE_LINK,
80: NODE_LISTITEM,
81: NODE_LITERAL,
82: NODE_LITERALLAYOUT,
83: NODE_MANVOLNUM,
84: NODE_MEMBER,
85: NODE_MML_MATH,
86: NODE_MML_MFENCED,
87: NODE_MML_MFRAC,
88: NODE_MML_MI,
89: NODE_MML_MN,
90: NODE_MML_MO,
91: NODE_MML_MROW,
92: NODE_MML_MSUB,
93: NODE_MML_MSUP,
94: NODE_MODIFIER,
95: NODE_NOTE,
96: NODE_OPTION,
97: NODE_ORDEREDLIST,
98: NODE_ORGNAME,
99: NODE_OTHERNAME,
100: NODE_PARA,
101: NODE_PARAMDEF,
102: NODE_PARAMETER,
103: NODE_PERSONNAME,
104: NODE_PHRASE,
105: NODE_PREFACE,
106: NODE_PRIMARY,
107: NODE_PROGRAMLISTING,
108: NODE_PROMPT,
109: NODE_QUOTE,
110: NODE_REFCLASS,
111: NODE_REFDESCRIPTOR,
112: NODE_REFENTRY,
113: NODE_REFENTRYINFO,
114: NODE_REFENTRYTITLE,
115: NODE_REFMETA,
116: NODE_REFMETAINFO,
117: NODE_REFMISCINFO,
118: NODE_REFNAME,
119: NODE_REFNAMEDIV,
120: NODE_REFPURPOSE,
121: NODE_REFSYNOPSISDIV,
122: NODE_RELEASEINFO,
123: NODE_REPLACEABLE,
124: NODE_ROW,
125: NODE_SBR,
126: NODE_SCREEN,
127: NODE_SECONDARY,
128: NODE_SECTION,
129: NODE_SGMLTAG,
130: NODE_SIMPLELIST,
131: NODE_SPANSPEC,
132: NODE_STRUCTNAME,
133: NODE_SUBTITLE,
134: NODE_SURNAME,
135: NODE_SYNOPSIS,
136: NODE_TABLE,
137: NODE_TBODY,
138: NODE_TERM,
139: NODE_TEXT,
140: NODE_TFOOT,
141: NODE_TGROUP,
142: NODE_THEAD,
143: NODE_TIP,
144: NODE_TITLE,
145: NODE_TRADEMARK,
146: NODE_TYPE,
147: NODE_ULINK,
148: NODE_USERINPUT,
149: NODE_VARIABLELIST,
150: NODE_VARLISTENTRY,
151: NODE_VARNAME,
152: NODE_WARNING,
153: NODE_WORDASWORD,
154: NODE_YEAR,
155: NODE__MAX
156: };
157:
158: /*
159: * All recognised attribute keys.
160: * Other attributes are discarded.
161: */
162: enum attrkey {
163: /* Alpha-order... */
164: ATTRKEY_CHOICE = 0,
165: ATTRKEY_CLASS,
166: ATTRKEY_CLOSE,
167: ATTRKEY_ID,
168: ATTRKEY_LINKEND,
169: ATTRKEY_OPEN,
170: ATTRKEY_REP,
171: ATTRKEY__MAX
172: };
173:
174: /*
175: * All explicitly recognised attribute values.
176: * If an attribute has ATTRVAL__MAX, it is treated as free-form.
177: */
178: enum attrval {
179: /* Alpha-order... */
180: ATTRVAL_MONOSPACED,
181: ATTRVAL_NOREPEAT,
182: ATTRVAL_OPT,
183: ATTRVAL_PLAIN,
184: ATTRVAL_REPEAT,
185: ATTRVAL_REQ,
186: ATTRVAL__MAX
187: };
188:
189: TAILQ_HEAD(pnodeq, pnode);
190: TAILQ_HEAD(pattrq, pattr);
191:
192: /*
193: * One DocBook XML element attribute.
194: */
195: struct pattr {
196: enum attrkey key;
197: enum attrval val;
198: char *rawval;
199: TAILQ_ENTRY(pattr) child;
200: };
201:
202: /*
203: * One DocBook XML element.
204: */
205: struct pnode {
206: enum nodeid node; /* Node type. */
207: char *b; /* String value. */
208: char *real; /* Storage for "b". */
209: size_t bsz; /* strlen(b) */
210: struct pnode *parent; /* Parent node or NULL. */
211: struct pnodeq childq; /* Queue of children. */
212: struct pattrq attrq; /* Attributes of the node. */
213: TAILQ_ENTRY(pnode) child;
214: };
215:
216: /*
217: * The parse result for one complete DocBook XML document.
218: */
219: struct ptree {
220: struct pnode *root; /* The document element. */
221: int flags;
222: #define TREE_FAIL (1 << 0) /* A fatal parse error occurred. */
223: #define TREE_EQN (1 << 1) /* The document needs inline eqn(7). */
224: };
225:
226:
227: enum attrkey attrkey_parse(const char *);
228: enum attrval attrval_parse(const char *);
229: void pnode_unlink(struct pnode *);
230: void pnode_unlinksub(struct pnode *);
231: enum attrval pnode_getattr(struct pnode *, enum attrkey);
232: const char *pnode_getattr_raw(struct pnode *, enum attrkey, const char *);
233: struct pnode *pnode_findfirst(struct pnode *, enum nodeid);
CVSweb