Annotation of texi2mdoc/extern.h, Revision 1.13
1.13 ! kristaps 1: /* $Id: extern.h,v 1.12 2015/02/24 20:06:32 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,
1.13 ! kristaps 109: TEXICMD_EURO,
1.1 kristaps 110: TEXICMD_EXAMPLE,
1.12 kristaps 111: TEXICMD_EXCLAMDOWN,
1.2 kristaps 112: TEXICMD_EXDENT,
1.1 kristaps 113: TEXICMD_EXPANSION,
114: TEXICMD_FILE,
115: TEXICMD_FINALOUT,
116: TEXICMD_FINDEX,
1.7 kristaps 117: TEXICMD_FOOTNOTE,
1.1 kristaps 118: TEXICMD_FTABLE,
119: TEXICMD_FORMAT,
1.13 ! kristaps 120: TEXICMD_GEQ,
1.1 kristaps 121: TEXICMD_GRAVE,
122: TEXICMD_GROUP,
1.13 ! kristaps 123: TEXICMD_GUILLEMETLEFT,
! 124: TEXICMD_GUILLEMETRIGHT,
! 125: TEXICMD_GUILLEMOTLEFT,
! 126: TEXICMD_GUILLEMOTRIGHT,
! 127: TEXICMD_GUILSINGLLEFT,
! 128: TEXICMD_GUILSINGLRIGHT,
1.12 kristaps 129: TEXICMD_H,
1.1 kristaps 130: TEXICMD_HEADING,
131: TEXICMD_HEADINGS,
132: TEXICMD_HEADITEM,
1.2 kristaps 133: TEXICMD_HTML,
1.1 kristaps 134: TEXICMD_HYPHEN,
135: TEXICMD_I,
136: TEXICMD_IFCLEAR,
137: TEXICMD_IFDOCBOOK,
138: TEXICMD_IFHTML,
139: TEXICMD_IFINFO,
140: TEXICMD_IFNOTDOCBOOK,
141: TEXICMD_IFNOTHTML,
142: TEXICMD_IFNOTINFO,
143: TEXICMD_IFNOTPLAINTEXT,
144: TEXICMD_IFNOTTEX,
145: TEXICMD_IFNOTXML,
146: TEXICMD_IFPLAINTEXT,
147: TEXICMD_IFTEX,
148: TEXICMD_IFSET,
149: TEXICMD_IFXML,
150: TEXICMD_IGNORE,
151: TEXICMD_IMAGE,
152: TEXICMD_INCLUDE,
153: TEXICMD_INDENTBLOCK,
1.9 kristaps 154: TEXICMD_INFOREF,
1.1 kristaps 155: TEXICMD_INSERTCOPYING,
156: TEXICMD_ITEM,
157: TEXICMD_ITEMIZE,
158: TEXICMD_ITEMX,
159: TEXICMD_KBD,
160: TEXICMD_KEY,
161: TEXICMD_KINDEX,
1.12 kristaps 162: TEXICMD_L,
1.1 kristaps 163: TEXICMD_LATEX,
1.13 ! kristaps 164: TEXICMD_LEQ,
1.1 kristaps 165: TEXICMD_LOWERSECTIONS,
1.12 kristaps 166: TEXICMD_LSMALL,
1.5 kristaps 167: TEXICMD_MACRO,
1.12 kristaps 168: TEXICMD_MACRON,
1.1 kristaps 169: TEXICMD_MATH,
170: TEXICMD_MENU,
1.2 kristaps 171: TEXICMD_MINUS,
1.1 kristaps 172: TEXICMD_MULTITABLE,
173: TEXICMD_NEED,
174: TEXICMD_NEWLINE,
175: TEXICMD_NODE,
176: TEXICMD_NOINDENT,
1.12 kristaps 177: TEXICMD_O,
178: TEXICMD_OE,
179: TEXICMD_OESMALL,
180: TEXICMD_OGONEK,
1.1 kristaps 181: TEXICMD_OPTION,
1.12 kristaps 182: TEXICMD_ORDF,
183: TEXICMD_ORDM,
184: TEXICMD_OSMALL,
1.1 kristaps 185: TEXICMD_PAGE,
186: TEXICMD_PARINDENT,
1.2 kristaps 187: TEXICMD_PERIOD,
1.4 kristaps 188: TEXICMD_PINDEX,
1.13 ! kristaps 189: TEXICMD_POUNDS,
1.1 kristaps 190: TEXICMD_PRINTINDEX,
1.12 kristaps 191: TEXICMD_PXREF,
192: TEXICMD_QUESTIONDOWN,
193: TEXICMD_QUESTIONMARK,
194: TEXICMD_QUOTATION,
1.13 ! kristaps 195: TEXICMD_QUOTEDBLBASE,
! 196: TEXICMD_QUOTEDBLLEFT,
! 197: TEXICMD_QUOTEDBLRIGHT,
! 198: TEXICMD_QUOTESINGLBASE,
! 199: TEXICMD_QUOTELEFT,
! 200: TEXICMD_QUOTERIGHT,
1.1 kristaps 201: TEXICMD_R,
202: TEXICMD_RAISESECTIONS,
203: TEXICMD_REF,
1.4 kristaps 204: TEXICMD_REFILL,
1.13 ! kristaps 205: TEXICMD_REGISTEREDSYMBOL,
1.1 kristaps 206: TEXICMD_RESULT,
1.12 kristaps 207: TEXICMD_RINGACCENT,
1.1 kristaps 208: TEXICMD_SAMP,
209: TEXICMD_SANSSERIF,
210: TEXICMD_SC,
211: TEXICMD_SECTION,
212: TEXICMD_SET,
213: TEXICMD_SETCHAPNEWPAGE,
1.10 kristaps 214: TEXICMD_SETCONTENTSAFTER,
1.1 kristaps 215: TEXICMD_SETFILENAME,
216: TEXICMD_SETTITLE,
1.2 kristaps 217: TEXICMD_SHORTCONTENTS,
1.1 kristaps 218: TEXICMD_SLANTED,
1.9 kristaps 219: TEXICMD_SLASH,
1.1 kristaps 220: TEXICMD_SP,
221: TEXICMD_SPACE,
222: TEXICMD_SMALLBOOK,
223: TEXICMD_SMALLDISPLAY,
224: TEXICMD_SMALLEXAMPLE,
225: TEXICMD_SMALLFORMAT,
226: TEXICMD_SMALLINDENTBLOCK,
227: TEXICMD_SQUIGGLE_LEFT,
228: TEXICMD_SQUIGGLE_RIGHT,
1.10 kristaps 229: TEXICMD_SS,
1.1 kristaps 230: TEXICMD_STRONG,
231: TEXICMD_SUBHEADING,
232: TEXICMD_SUBSECTION,
1.4 kristaps 233: TEXICMD_SUBSUBHEADING,
1.1 kristaps 234: TEXICMD_SUBSUBSECTION,
235: TEXICMD_SUBTITLE,
1.2 kristaps 236: TEXICMD_SUMMARYCONTENTS,
1.3 kristaps 237: TEXICMD_SYNINDEX,
1.1 kristaps 238: TEXICMD_SYNCODEINDEX,
239: TEXICMD_T,
240: TEXICMD_TAB,
241: TEXICMD_TABSYM,
242: TEXICMD_TABLE,
243: TEXICMD_TEX,
244: TEXICMD_TEXSYM,
1.13 ! kristaps 245: TEXICMD_TEXTDEGREE,
1.12 kristaps 246: TEXICMD_TH,
247: TEXICMD_THSMALL,
1.10 kristaps 248: TEXICMD_TIE,
1.12 kristaps 249: TEXICMD_TIEACCENT,
1.1 kristaps 250: TEXICMD_TILDE,
1.2 kristaps 251: TEXICMD_TINDEX,
1.1 kristaps 252: TEXICMD_TITLE,
253: TEXICMD_TITLEFONT,
254: TEXICMD_TITLEPAGE,
255: TEXICMD_TOP,
1.12 kristaps 256: TEXICMD_U,
257: TEXICMD_UBARACCENT,
258: TEXICMD_UDOTACCENT,
1.1 kristaps 259: TEXICMD_UMLAUT,
260: TEXICMD_UNNUMBERED,
261: TEXICMD_UNNUMBEREDSEC,
262: TEXICMD_UNNUMBEREDSUBSEC,
263: TEXICMD_UNNUMBEREDSUBSUBSEC,
264: TEXICMD_UREF,
265: TEXICMD_URL,
1.9 kristaps 266: TEXICMD_USER_INDEX,
1.12 kristaps 267: TEXICMD_V,
1.1 kristaps 268: TEXICMD_VALUE,
269: TEXICMD_VAR,
1.8 kristaps 270: TEXICMD_VERB,
1.2 kristaps 271: TEXICMD_VERBATIM,
1.1 kristaps 272: TEXICMD_VERBATIMINCLUDE,
273: TEXICMD_VINDEX,
274: TEXICMD_VSKIP,
275: TEXICMD_VTABLE,
276: TEXICMD_W,
277: TEXICMD_XREF,
278: TEXICMD__MAX
279: };
280:
1.11 kristaps 281: enum texisrc {
282: TEXISRC_FILE,
283: TEXISRC_STDIN
284: };
285:
1.1 kristaps 286: /*
287: * The file currently being parsed.
288: * This keeps track of our location within that file.
289: */
290: struct texifile {
1.11 kristaps 291: enum texisrc type; /* type of file */
1.1 kristaps 292: const char *name; /* name of the file */
293: size_t line; /* current line (from zero) */
294: size_t col; /* current column in line (from zero) */
1.11 kristaps 295: char *map; /* mmap'd file OR allocated buffer */
1.1 kristaps 296: size_t mapsz; /* size of mmap */
297: };
298:
299: struct texi;
300:
301: /*
302: * Callback for functions implementing texi commands.
303: */
304: typedef void (*texicmdfp)(struct texi *,
305: enum texicmd, const char *, size_t, size_t *);
306:
307: /*
308: * Describes Texinfo commands, whether native or overriden.
309: */
310: struct texitok {
311: texicmdfp fp; /* callback (or NULL if none) */
312: const char *tok; /* name of the token */
313: size_t len; /* strlen(tok) */
314: };
315:
1.11 kristaps 316: /*
317: * These values instruct us on whether a list (or table) of some type is
318: * currently being parsed.
319: */
1.1 kristaps 320: enum texilist {
321: TEXILIST_NONE = 0,
322: TEXILIST_ITEM,
323: TEXILIST_NOITEM,
324: TEXILIST_TABLE
325: };
326:
1.11 kristaps 327: /*
328: * Hold values assigned with @set and retrieved with @value.
329: * These values can contain arbitrary Texinfo.
330: */
1.1 kristaps 331: struct texivalue {
1.11 kristaps 332: char *key; /* the nil-terminated value name */
333: char *value; /* the nil-terminated value */
1.1 kristaps 334: };
335:
1.11 kristaps 336: /*
337: * Macros are (possibly-recursive) Texinfo sequences created with @macro
338: * and filled in by arguments when invoked.
339: */
1.5 kristaps 340: struct teximacro {
1.11 kristaps 341: char *key; /* nil-terminated macro name */
342: char *value; /* nil-terminated value */
343: char **args; /* array of argument names (or NULL) */
344: size_t argsz; /* array size */
1.5 kristaps 345: };
346:
1.1 kristaps 347: /*
348: * The main parse structure.
349: * This keeps any necessary information handy.
350: */
351: struct texi {
352: struct texifile files[64]; /* stack of open files */
353: size_t filepos; /* number of open files */
1.4 kristaps 354: const char *valstack[64]; /* stack of opened values */
355: size_t valstackpos; /* position in valstack */
1.1 kristaps 356: size_t outcol; /* column in output line */
357: char **dirs; /* texi directories */
358: size_t dirsz; /* number of texi directories */
359: char *title; /* title of document */
360: char *subtitle; /* subtitle of document */
361: int secoffs; /* see sectioner() */
1.3 kristaps 362: char **indexs; /* @defindex indices */
363: size_t indexsz; /* entries in indexs */
364: struct texivalue *vals; /* @value entries */
365: size_t valsz; /* entries in vals */
1.11 kristaps 366: struct teximacro *macros; /* @macro entries */
367: size_t macrosz; /* entries in macros */
1.1 kristaps 368: /*
369: * The following control what we output to the screen.
370: * The complexity is required to accomodate for mdoc(7).
371: */
372: enum texilist list; /* current list (set recursively) */
373: int outmacro; /* if >0, output is in line macro */
374: int seenws; /* ws has been seen (and ignored) */
375: int seenvs; /* newline has been Pp'd */
376: int ign; /* if >0, don't print anything */
377: int literal; /* if >0, literal context */
378: };
379:
380: #define isws(_x) \
381: (' ' == (_x) || '\t' == (_x))
382: #define ismspace(_x) \
383: (isws((_x)) || '\n' == (_x))
384:
385: __BEGIN_DECLS
386:
387: void advance(struct texi *, const char *, size_t *);
388: size_t advanceeoln(struct texi *, const char *, size_t, size_t *, int);
389: void advanceto(struct texi *, const char *, size_t *, size_t);
390:
1.6 kristaps 391: char **argparse(struct texi *, const char *, size_t, size_t *, size_t *, size_t);
1.5 kristaps 392:
1.1 kristaps 393: int parsearg(struct texi *, const char *, size_t, size_t *, size_t);
394: void parsebracket(struct texi *, const char *, size_t, size_t *);
1.11 kristaps 395: void parsestdin(struct texi *);
1.1 kristaps 396: void parsefile(struct texi *, const char *, int);
397: int parselinearg(struct texi *, const char *, size_t, size_t *);
398: void parseeof(struct texi *, const char *, size_t);
1.6 kristaps 399: void parsemembuf(struct texi *, const char *, size_t);
1.1 kristaps 400: void parseeoln(struct texi *, const char *, size_t, size_t *);
401: void parsesingle(struct texi *, const char *, size_t, size_t *);
402: void parseto(struct texi *, const char *, size_t, size_t *, const char *);
403:
1.3 kristaps 404: void texiabort(struct texi *, const char *)
405: __attribute__((noreturn));
1.1 kristaps 406: enum texicmd
1.5 kristaps 407: texicmd(struct texi *, const char *, size_t, size_t,
408: size_t *, struct teximacro **);
1.1 kristaps 409: void texierr(struct texi *, const char *, ...)
1.3 kristaps 410: __attribute__((format(printf, 2, 3)))
411: __attribute__((noreturn));
1.1 kristaps 412: void texiexit(struct texi *p);
413: void texifilepop(struct texi *);
414: void teximacro(struct texi *, const char *);
415: void teximacroclose(struct texi *);
416: void teximacroopen(struct texi *, const char *);
417: void texipunctuate(struct texi *, const char *, size_t, size_t *);
1.9 kristaps 418: void texiputbuf(struct texi *p, const char *, size_t, size_t);
1.1 kristaps 419: void texiputchar(struct texi *p, char);
420: void texiputchars(struct texi *, const char *);
421: void texivspace(struct texi *);
422: void texiwarn(const struct texi *, const char *, ...)
423: __attribute__((format(printf, 2, 3)));
1.2 kristaps 424:
425: void valueadd(struct texi *, char *, char *);
426: const char *
427: valueblookup(struct texi *, const char *, size_t, size_t *);
428: void valuelclear(struct texi *, const char *, size_t, size_t *);
429: const char *
430: valuellookup(struct texi *, const char *, size_t, size_t *);
1.1 kristaps 431:
432: extern const struct texitok *const texitoks;
433:
434: __END_DECLS
435:
436: #endif
CVSweb