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