Annotation of texi2mdoc/extern.h, Revision 1.8
1.8 ! kristaps 1: /* $Id: extern.h,v 1.7 2015/02/23 12:28:20 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,
1.3 kristaps 57: TEXICMD_DEFCODEINDEX,
1.1 kristaps 58: TEXICMD_DEFFN,
59: TEXICMD_DEFFNX,
1.3 kristaps 60: TEXICMD_DEFINDEX,
1.1 kristaps 61: TEXICMD_DEFMAC,
62: TEXICMD_DEFMACX,
63: TEXICMD_DEFTP,
64: TEXICMD_DEFTPX,
65: TEXICMD_DEFTYPEFN,
66: TEXICMD_DEFTYPEFNX,
67: TEXICMD_DEFTYPEFUN,
68: TEXICMD_DEFTYPEFUNX,
69: TEXICMD_DEFTYPEVAR,
70: TEXICMD_DEFTYPEVARX,
71: TEXICMD_DEFTYPEVR,
72: TEXICMD_DEFTYPEVRX,
73: TEXICMD_DEFUN,
74: TEXICMD_DEFUNX,
75: TEXICMD_DEFVAR,
76: TEXICMD_DEFVARX,
77: TEXICMD_DEFVR,
78: TEXICMD_DEFVRX,
79: TEXICMD_DETAILMENU,
80: TEXICMD_DFN,
81: TEXICMD_DIRCATEGORY,
82: TEXICMD_DIRENTRY,
83: TEXICMD_DISPLAY,
1.4 kristaps 84: TEXICMD_DMN,
1.1 kristaps 85: TEXICMD_DOTS,
86: TEXICMD_EMAIL,
87: TEXICMD_EMPH,
88: TEXICMD_END,
89: TEXICMD_ENUMERATE,
90: TEXICMD_ENV,
1.4 kristaps 91: TEXICMD_EQUIV,
1.1 kristaps 92: TEXICMD_ERROR,
93: TEXICMD_EXAMPLE,
1.2 kristaps 94: TEXICMD_EXDENT,
1.1 kristaps 95: TEXICMD_EXPANSION,
96: TEXICMD_FILE,
97: TEXICMD_FINALOUT,
98: TEXICMD_FINDEX,
1.7 kristaps 99: TEXICMD_FOOTNOTE,
1.1 kristaps 100: TEXICMD_FTABLE,
101: TEXICMD_FORMAT,
102: TEXICMD_GRAVE,
103: TEXICMD_GROUP,
104: TEXICMD_HEADING,
105: TEXICMD_HEADINGS,
106: TEXICMD_HEADITEM,
1.2 kristaps 107: TEXICMD_HTML,
1.1 kristaps 108: TEXICMD_HYPHEN,
109: TEXICMD_I,
110: TEXICMD_IFCLEAR,
111: TEXICMD_IFDOCBOOK,
112: TEXICMD_IFHTML,
113: TEXICMD_IFINFO,
114: TEXICMD_IFNOTDOCBOOK,
115: TEXICMD_IFNOTHTML,
116: TEXICMD_IFNOTINFO,
117: TEXICMD_IFNOTPLAINTEXT,
118: TEXICMD_IFNOTTEX,
119: TEXICMD_IFNOTXML,
120: TEXICMD_IFPLAINTEXT,
121: TEXICMD_IFTEX,
122: TEXICMD_IFSET,
123: TEXICMD_IFXML,
124: TEXICMD_IGNORE,
125: TEXICMD_IMAGE,
126: TEXICMD_INCLUDE,
127: TEXICMD_INDENTBLOCK,
1.5 kristaps 128: TEXICMD_USER_INDEX,
1.1 kristaps 129: TEXICMD_INSERTCOPYING,
130: TEXICMD_ITEM,
131: TEXICMD_ITEMIZE,
132: TEXICMD_ITEMX,
133: TEXICMD_KBD,
134: TEXICMD_KEY,
135: TEXICMD_KINDEX,
136: TEXICMD_LATEX,
137: TEXICMD_LOWERSECTIONS,
1.5 kristaps 138: TEXICMD_MACRO,
1.1 kristaps 139: TEXICMD_MATH,
140: TEXICMD_MENU,
1.2 kristaps 141: TEXICMD_MINUS,
1.1 kristaps 142: TEXICMD_MULTITABLE,
143: TEXICMD_NEED,
144: TEXICMD_NEWLINE,
145: TEXICMD_NODE,
146: TEXICMD_NOINDENT,
147: TEXICMD_OPTION,
148: TEXICMD_PXREF,
149: TEXICMD_QUESTIONMARK,
150: TEXICMD_QUOTATION,
151: TEXICMD_PAGE,
152: TEXICMD_PARINDENT,
1.2 kristaps 153: TEXICMD_PERIOD,
1.4 kristaps 154: TEXICMD_PINDEX,
1.1 kristaps 155: TEXICMD_PRINTINDEX,
156: TEXICMD_R,
157: TEXICMD_RAISESECTIONS,
158: TEXICMD_REF,
1.4 kristaps 159: TEXICMD_REFILL,
1.1 kristaps 160: TEXICMD_RESULT,
161: TEXICMD_SAMP,
162: TEXICMD_SANSSERIF,
163: TEXICMD_SC,
164: TEXICMD_SECTION,
165: TEXICMD_SET,
166: TEXICMD_SETCHAPNEWPAGE,
167: TEXICMD_SETFILENAME,
168: TEXICMD_SETTITLE,
1.2 kristaps 169: TEXICMD_SHORTCONTENTS,
1.1 kristaps 170: TEXICMD_SLANTED,
171: TEXICMD_SP,
172: TEXICMD_SPACE,
173: TEXICMD_SMALLBOOK,
174: TEXICMD_SMALLDISPLAY,
175: TEXICMD_SMALLEXAMPLE,
176: TEXICMD_SMALLFORMAT,
177: TEXICMD_SMALLINDENTBLOCK,
178: TEXICMD_SQUIGGLE_LEFT,
179: TEXICMD_SQUIGGLE_RIGHT,
180: TEXICMD_STRONG,
181: TEXICMD_SUBHEADING,
182: TEXICMD_SUBSECTION,
1.4 kristaps 183: TEXICMD_SUBSUBHEADING,
1.1 kristaps 184: TEXICMD_SUBSUBSECTION,
185: TEXICMD_SUBTITLE,
1.2 kristaps 186: TEXICMD_SUMMARYCONTENTS,
1.3 kristaps 187: TEXICMD_SYNINDEX,
1.1 kristaps 188: TEXICMD_SYNCODEINDEX,
189: TEXICMD_T,
190: TEXICMD_TAB,
191: TEXICMD_TABSYM,
192: TEXICMD_TABLE,
193: TEXICMD_TEX,
194: TEXICMD_TEXSYM,
195: TEXICMD_TILDE,
1.2 kristaps 196: TEXICMD_TINDEX,
1.1 kristaps 197: TEXICMD_TITLE,
198: TEXICMD_TITLEFONT,
199: TEXICMD_TITLEPAGE,
200: TEXICMD_TOP,
201: TEXICMD_UMLAUT,
202: TEXICMD_UNNUMBERED,
203: TEXICMD_UNNUMBEREDSEC,
204: TEXICMD_UNNUMBEREDSUBSEC,
205: TEXICMD_UNNUMBEREDSUBSUBSEC,
206: TEXICMD_UREF,
207: TEXICMD_URL,
208: TEXICMD_VALUE,
209: TEXICMD_VAR,
1.8 ! kristaps 210: TEXICMD_VERB,
1.2 kristaps 211: TEXICMD_VERBATIM,
1.1 kristaps 212: TEXICMD_VERBATIMINCLUDE,
213: TEXICMD_VINDEX,
214: TEXICMD_VSKIP,
215: TEXICMD_VTABLE,
216: TEXICMD_W,
217: TEXICMD_XREF,
218: TEXICMD__MAX
219: };
220:
221: /*
222: * The file currently being parsed.
223: * This keeps track of our location within that file.
224: */
225: struct texifile {
226: const char *name; /* name of the file */
227: size_t line; /* current line (from zero) */
228: size_t col; /* current column in line (from zero) */
229: char *map; /* mmap'd file */
230: size_t mapsz; /* size of mmap */
231: };
232:
233: struct texi;
234:
235: /*
236: * Callback for functions implementing texi commands.
237: */
238: typedef void (*texicmdfp)(struct texi *,
239: enum texicmd, const char *, size_t, size_t *);
240:
241: /*
242: * Describes Texinfo commands, whether native or overriden.
243: */
244: struct texitok {
245: texicmdfp fp; /* callback (or NULL if none) */
246: const char *tok; /* name of the token */
247: size_t len; /* strlen(tok) */
248: };
249:
250: enum texilist {
251: TEXILIST_NONE = 0,
252: TEXILIST_ITEM,
253: TEXILIST_NOITEM,
254: TEXILIST_TABLE
255: };
256:
257: struct texivalue {
258: char *key;
259: char *value;
260: };
261:
1.5 kristaps 262: struct teximacro {
263: char *key;
264: char *value;
265: char **args;
266: size_t argsz;
267: };
268:
1.1 kristaps 269: /*
270: * The main parse structure.
271: * This keeps any necessary information handy.
272: */
273: struct texi {
274: struct texifile files[64]; /* stack of open files */
275: size_t filepos; /* number of open files */
1.4 kristaps 276: const char *valstack[64]; /* stack of opened values */
277: size_t valstackpos; /* position in valstack */
1.1 kristaps 278: size_t outcol; /* column in output line */
279: char **dirs; /* texi directories */
280: size_t dirsz; /* number of texi directories */
281: char *title; /* title of document */
282: char *subtitle; /* subtitle of document */
283: int secoffs; /* see sectioner() */
1.3 kristaps 284: char **indexs; /* @defindex indices */
285: size_t indexsz; /* entries in indexs */
286: struct texivalue *vals; /* @value entries */
287: size_t valsz; /* entries in vals */
1.5 kristaps 288: struct teximacro *macros;
289: size_t macrosz;
1.1 kristaps 290: /*
291: * The following control what we output to the screen.
292: * The complexity is required to accomodate for mdoc(7).
293: */
294: enum texilist list; /* current list (set recursively) */
295: int outmacro; /* if >0, output is in line macro */
296: int seenws; /* ws has been seen (and ignored) */
297: int seenvs; /* newline has been Pp'd */
298: int ign; /* if >0, don't print anything */
299: int literal; /* if >0, literal context */
300: };
301:
302: #define isws(_x) \
303: (' ' == (_x) || '\t' == (_x))
304: #define ismspace(_x) \
305: (isws((_x)) || '\n' == (_x))
306:
307: __BEGIN_DECLS
308:
309: void advance(struct texi *, const char *, size_t *);
310: size_t advanceeoln(struct texi *, const char *, size_t, size_t *, int);
311: void advanceto(struct texi *, const char *, size_t *, size_t);
312:
1.6 kristaps 313: char **argparse(struct texi *, const char *, size_t, size_t *, size_t *, size_t);
1.5 kristaps 314:
1.1 kristaps 315: int parsearg(struct texi *, const char *, size_t, size_t *, size_t);
316: void parsebracket(struct texi *, const char *, size_t, size_t *);
317: void parsefile(struct texi *, const char *, int);
318: int parselinearg(struct texi *, const char *, size_t, size_t *);
319: void parseeof(struct texi *, const char *, size_t);
1.6 kristaps 320: void parsemembuf(struct texi *, const char *, size_t);
1.1 kristaps 321: void parseeoln(struct texi *, const char *, size_t, size_t *);
322: void parsesingle(struct texi *, const char *, size_t, size_t *);
323: void parseto(struct texi *, const char *, size_t, size_t *, const char *);
324:
1.3 kristaps 325: void texiabort(struct texi *, const char *)
326: __attribute__((noreturn));
1.1 kristaps 327: enum texicmd
1.5 kristaps 328: texicmd(struct texi *, const char *, size_t, size_t,
329: size_t *, struct teximacro **);
1.1 kristaps 330: void texierr(struct texi *, const char *, ...)
1.3 kristaps 331: __attribute__((format(printf, 2, 3)))
332: __attribute__((noreturn));
1.1 kristaps 333: void texiexit(struct texi *p);
334: void texifilepop(struct texi *);
335: void teximacro(struct texi *, const char *);
336: void teximacroclose(struct texi *);
337: void teximacroopen(struct texi *, const char *);
338: void texipunctuate(struct texi *, const char *, size_t, size_t *);
339: void texiputchar(struct texi *p, char);
340: void texiputchars(struct texi *, const char *);
341: void texivspace(struct texi *);
342: void texiwarn(const struct texi *, const char *, ...)
343: __attribute__((format(printf, 2, 3)));
1.2 kristaps 344:
345: void valueadd(struct texi *, char *, char *);
346: const char *
347: valueblookup(struct texi *, const char *, size_t, size_t *);
348: void valuelclear(struct texi *, const char *, size_t, size_t *);
349: const char *
350: valuellookup(struct texi *, const char *, size_t, size_t *);
1.1 kristaps 351:
352: extern const struct texitok *const texitoks;
353:
354: __END_DECLS
355:
356: #endif
CVSweb