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