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