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