Annotation of texi2mdoc/extern.h, Revision 1.2
1.2 ! kristaps 1: /* $Id: extern.h,v 1.1 2015/02/20 09:58:50 kristaps Exp $ */
1.1 kristaps 2: /*
3: * Copyright (c) 2015 Kristaps Dzonsons <kristaps@bsd.lv>
4: *
5: * Permission to use, copy, modify, and distribute this software for any
6: * purpose with or without fee is hereby granted, provided that the above
7: * copyright notice and this permission notice appear in all copies.
8: *
9: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16: */
17: #ifndef EXTERN_H
18: #define EXTERN_H
19:
20: /*
21: * This defines each one of the Texinfo commands that we understand.
22: * Obviously this only refers to native commands; overriden names are a
23: * different story.
24: */
25: enum texicmd {
26: TEXICMD_ACRONYM,
27: TEXICMD_ACUTE,
28: TEXICMD_A4PAPER,
29: TEXICMD_ANCHOR,
30: TEXICMD_APPENDIX,
31: TEXICMD_APPENDIXSEC,
32: TEXICMD_APPENDIXSUBSEC,
33: TEXICMD_APPENDIXSUBSUBSEC,
1.2 ! kristaps 34: TEXICMD_ASIS,
1.1 kristaps 35: TEXICMD_ASTERISK,
36: TEXICMD_AT,
37: TEXICMD_AUTHOR,
38: TEXICMD_B,
39: TEXICMD_BANG,
40: TEXICMD_BULLET,
41: TEXICMD_BYE,
42: TEXICMD_CENTER,
43: TEXICMD_CHAPTER,
44: TEXICMD_CINDEX,
45: TEXICMD_CIRCUMFLEX,
46: TEXICMD_CITE,
47: TEXICMD_CLEAR,
48: TEXICMD_CODE,
49: TEXICMD_COLON,
50: TEXICMD_COLUMNFRACTIONS,
51: TEXICMD_COMMAND,
52: TEXICMD_COMMENT,
53: TEXICMD_COMMENT_LONG,
54: TEXICMD_CONTENTS,
55: TEXICMD_COPYING,
56: TEXICMD_COPYRIGHT,
57: TEXICMD_DEFFN,
58: TEXICMD_DEFFNX,
59: TEXICMD_DEFMAC,
60: TEXICMD_DEFMACX,
61: TEXICMD_DEFTP,
62: TEXICMD_DEFTPX,
63: TEXICMD_DEFTYPEFN,
64: TEXICMD_DEFTYPEFNX,
65: TEXICMD_DEFTYPEFUN,
66: TEXICMD_DEFTYPEFUNX,
67: TEXICMD_DEFTYPEVAR,
68: TEXICMD_DEFTYPEVARX,
69: TEXICMD_DEFTYPEVR,
70: TEXICMD_DEFTYPEVRX,
71: TEXICMD_DEFUN,
72: TEXICMD_DEFUNX,
73: TEXICMD_DEFVAR,
74: TEXICMD_DEFVARX,
75: TEXICMD_DEFVR,
76: TEXICMD_DEFVRX,
77: TEXICMD_DETAILMENU,
78: TEXICMD_DFN,
79: TEXICMD_DIRCATEGORY,
80: TEXICMD_DIRENTRY,
81: TEXICMD_DISPLAY,
82: TEXICMD_DOTS,
83: TEXICMD_EMAIL,
84: TEXICMD_EMPH,
85: TEXICMD_END,
86: TEXICMD_ENUMERATE,
87: TEXICMD_ENV,
88: TEXICMD_ERROR,
89: TEXICMD_EXAMPLE,
1.2 ! kristaps 90: TEXICMD_EXDENT,
1.1 kristaps 91: TEXICMD_EXPANSION,
92: TEXICMD_FILE,
93: TEXICMD_FINALOUT,
94: TEXICMD_FINDEX,
95: TEXICMD_FTABLE,
96: TEXICMD_FORMAT,
97: TEXICMD_GRAVE,
98: TEXICMD_GROUP,
99: TEXICMD_HEADING,
100: TEXICMD_HEADINGS,
101: TEXICMD_HEADITEM,
1.2 ! kristaps 102: TEXICMD_HTML,
1.1 kristaps 103: TEXICMD_HYPHEN,
104: TEXICMD_I,
105: TEXICMD_IFCLEAR,
106: TEXICMD_IFDOCBOOK,
107: TEXICMD_IFHTML,
108: TEXICMD_IFINFO,
109: TEXICMD_IFNOTDOCBOOK,
110: TEXICMD_IFNOTHTML,
111: TEXICMD_IFNOTINFO,
112: TEXICMD_IFNOTPLAINTEXT,
113: TEXICMD_IFNOTTEX,
114: TEXICMD_IFNOTXML,
115: TEXICMD_IFPLAINTEXT,
116: TEXICMD_IFTEX,
117: TEXICMD_IFSET,
118: TEXICMD_IFXML,
119: TEXICMD_IGNORE,
120: TEXICMD_IMAGE,
121: TEXICMD_INCLUDE,
122: TEXICMD_INDENTBLOCK,
123: TEXICMD_INSERTCOPYING,
124: TEXICMD_ITEM,
125: TEXICMD_ITEMIZE,
126: TEXICMD_ITEMX,
127: TEXICMD_KBD,
128: TEXICMD_KEY,
129: TEXICMD_KINDEX,
130: TEXICMD_LATEX,
131: TEXICMD_LOWERSECTIONS,
132: TEXICMD_MATH,
133: TEXICMD_MENU,
1.2 ! kristaps 134: TEXICMD_MINUS,
1.1 kristaps 135: TEXICMD_MULTITABLE,
136: TEXICMD_NEED,
137: TEXICMD_NEWLINE,
138: TEXICMD_NODE,
139: TEXICMD_NOINDENT,
140: TEXICMD_OPTION,
141: TEXICMD_PXREF,
142: TEXICMD_QUESTIONMARK,
143: TEXICMD_QUOTATION,
144: TEXICMD_PAGE,
145: TEXICMD_PARINDENT,
1.2 ! kristaps 146: TEXICMD_PERIOD,
1.1 kristaps 147: TEXICMD_PRINTINDEX,
148: TEXICMD_R,
149: TEXICMD_RAISESECTIONS,
150: TEXICMD_REF,
151: TEXICMD_RESULT,
152: TEXICMD_SAMP,
153: TEXICMD_SANSSERIF,
154: TEXICMD_SC,
155: TEXICMD_SECTION,
156: TEXICMD_SET,
157: TEXICMD_SETCHAPNEWPAGE,
158: TEXICMD_SETFILENAME,
159: TEXICMD_SETTITLE,
1.2 ! kristaps 160: TEXICMD_SHORTCONTENTS,
1.1 kristaps 161: TEXICMD_SLANTED,
162: TEXICMD_SP,
163: TEXICMD_SPACE,
164: TEXICMD_SMALLBOOK,
165: TEXICMD_SMALLDISPLAY,
166: TEXICMD_SMALLEXAMPLE,
167: TEXICMD_SMALLFORMAT,
168: TEXICMD_SMALLINDENTBLOCK,
169: TEXICMD_SQUIGGLE_LEFT,
170: TEXICMD_SQUIGGLE_RIGHT,
171: TEXICMD_STRONG,
172: TEXICMD_SUBHEADING,
173: TEXICMD_SUBSECTION,
174: TEXICMD_SUBSUBSECTION,
175: TEXICMD_SUBTITLE,
1.2 ! kristaps 176: TEXICMD_SUMMARYCONTENTS,
1.1 kristaps 177: TEXICMD_SYNCODEINDEX,
178: TEXICMD_T,
179: TEXICMD_TAB,
180: TEXICMD_TABSYM,
181: TEXICMD_TABLE,
182: TEXICMD_TEX,
183: TEXICMD_TEXSYM,
184: TEXICMD_TILDE,
1.2 ! kristaps 185: TEXICMD_TINDEX,
1.1 kristaps 186: TEXICMD_TITLE,
187: TEXICMD_TITLEFONT,
188: TEXICMD_TITLEPAGE,
189: TEXICMD_TOP,
190: TEXICMD_UMLAUT,
191: TEXICMD_UNNUMBERED,
192: TEXICMD_UNNUMBEREDSEC,
193: TEXICMD_UNNUMBEREDSUBSEC,
194: TEXICMD_UNNUMBEREDSUBSUBSEC,
195: TEXICMD_UREF,
196: TEXICMD_URL,
197: TEXICMD_VALUE,
198: TEXICMD_VAR,
1.2 ! kristaps 199: TEXICMD_VERBATIM,
1.1 kristaps 200: TEXICMD_VERBATIMINCLUDE,
201: TEXICMD_VINDEX,
202: TEXICMD_VSKIP,
203: TEXICMD_VTABLE,
204: TEXICMD_W,
205: TEXICMD_XREF,
206: TEXICMD__MAX
207: };
208:
209: /*
210: * The file currently being parsed.
211: * This keeps track of our location within that file.
212: */
213: struct texifile {
214: const char *name; /* name of the file */
215: size_t line; /* current line (from zero) */
216: size_t col; /* current column in line (from zero) */
217: char *map; /* mmap'd file */
218: size_t mapsz; /* size of mmap */
219: };
220:
221: struct texi;
222:
223: /*
224: * Callback for functions implementing texi commands.
225: */
226: typedef void (*texicmdfp)(struct texi *,
227: enum texicmd, const char *, size_t, size_t *);
228:
229: /*
230: * Describes Texinfo commands, whether native or overriden.
231: */
232: struct texitok {
233: texicmdfp fp; /* callback (or NULL if none) */
234: const char *tok; /* name of the token */
235: size_t len; /* strlen(tok) */
236: };
237:
238: enum texilist {
239: TEXILIST_NONE = 0,
240: TEXILIST_ITEM,
241: TEXILIST_NOITEM,
242: TEXILIST_TABLE
243: };
244:
245: struct texivalue {
246: char *key;
247: char *value;
248: };
249:
250: /*
251: * The main parse structure.
252: * This keeps any necessary information handy.
253: */
254: struct texi {
255: struct texifile files[64]; /* stack of open files */
256: size_t filepos; /* number of open files */
257: size_t outcol; /* column in output line */
258: char **dirs; /* texi directories */
259: size_t dirsz; /* number of texi directories */
260: char *title; /* title of document */
261: char *subtitle; /* subtitle of document */
262: int secoffs; /* see sectioner() */
263: struct texivalue *vals;
264: size_t valsz;
265: /*
266: * The following control what we output to the screen.
267: * The complexity is required to accomodate for mdoc(7).
268: */
269: enum texilist list; /* current list (set recursively) */
270: int outmacro; /* if >0, output is in line macro */
271: int seenws; /* ws has been seen (and ignored) */
272: int seenvs; /* newline has been Pp'd */
273: int ign; /* if >0, don't print anything */
274: int literal; /* if >0, literal context */
275: };
276:
277: #define isws(_x) \
278: (' ' == (_x) || '\t' == (_x))
279: #define ismspace(_x) \
280: (isws((_x)) || '\n' == (_x))
281:
282: __BEGIN_DECLS
283:
284: void advance(struct texi *, const char *, size_t *);
285: size_t advanceeoln(struct texi *, const char *, size_t, size_t *, int);
286: void advanceto(struct texi *, const char *, size_t *, size_t);
287:
288: int parsearg(struct texi *, const char *, size_t, size_t *, size_t);
289: void parsebracket(struct texi *, const char *, size_t, size_t *);
290: void parsefile(struct texi *, const char *, int);
291: int parselinearg(struct texi *, const char *, size_t, size_t *);
292: void parseeof(struct texi *, const char *, size_t);
293: void parseeoln(struct texi *, const char *, size_t, size_t *);
294: void parsesingle(struct texi *, const char *, size_t, size_t *);
295: void parseto(struct texi *, const char *, size_t, size_t *, const char *);
296:
297: void texiabort(struct texi *, const char *);
298: enum texicmd
299: texicmd(struct texi *, const char *, size_t, size_t, size_t *);
300: void texierr(struct texi *, const char *, ...)
301: __attribute__((format(printf, 2, 3)));
302: void texiexit(struct texi *p);
303: void texifilepop(struct texi *);
304: void teximacro(struct texi *, const char *);
305: void teximacroclose(struct texi *);
306: void teximacroopen(struct texi *, const char *);
307: void texipunctuate(struct texi *, const char *, size_t, size_t *);
308: void texiputchar(struct texi *p, char);
309: void texiputchars(struct texi *, const char *);
310: void texivspace(struct texi *);
311: void texiwarn(const struct texi *, const char *, ...)
312: __attribute__((format(printf, 2, 3)));
1.2 ! kristaps 313:
! 314: void valueadd(struct texi *, char *, char *);
! 315: const char *
! 316: valueblookup(struct texi *, const char *, size_t, size_t *);
! 317: void valuelclear(struct texi *, const char *, size_t, size_t *);
! 318: const char *
! 319: valuellookup(struct texi *, const char *, size_t, size_t *);
1.1 kristaps 320:
321: extern const struct texitok *const texitoks;
322:
323: __END_DECLS
324:
325: #endif
CVSweb