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