Annotation of texi2mdoc/extern.h, Revision 1.3
1.3 ! kristaps 1: /* $Id: extern.h,v 1.2 2015/02/20 12:25:25 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,
42: TEXICMD_CENTER,
43: TEXICMD_CHAPTER,
44: TEXICMD_CINDEX,
45: TEXICMD_CIRCUMFLEX,
46: TEXICMD_CITE,
47: TEXICMD_CLEAR,
48: TEXICMD_CODE,
49: TEXICMD_COLON,
50: TEXICMD_COLUMNFRACTIONS,
51: TEXICMD_COMMAND,
52: TEXICMD_COMMENT,
53: TEXICMD_COMMENT_LONG,
54: TEXICMD_CONTENTS,
55: TEXICMD_COPYING,
56: TEXICMD_COPYRIGHT,
1.3 ! kristaps 57: TEXICMD_DEFCODEINDEX,
1.1 kristaps 58: TEXICMD_DEFFN,
59: TEXICMD_DEFFNX,
1.3 ! kristaps 60: TEXICMD_DEFINDEX,
1.1 kristaps 61: TEXICMD_DEFMAC,
62: TEXICMD_DEFMACX,
63: TEXICMD_DEFTP,
64: TEXICMD_DEFTPX,
65: TEXICMD_DEFTYPEFN,
66: TEXICMD_DEFTYPEFNX,
67: TEXICMD_DEFTYPEFUN,
68: TEXICMD_DEFTYPEFUNX,
69: TEXICMD_DEFTYPEVAR,
70: TEXICMD_DEFTYPEVARX,
71: TEXICMD_DEFTYPEVR,
72: TEXICMD_DEFTYPEVRX,
73: TEXICMD_DEFUN,
74: TEXICMD_DEFUNX,
75: TEXICMD_DEFVAR,
76: TEXICMD_DEFVARX,
77: TEXICMD_DEFVR,
78: TEXICMD_DEFVRX,
79: TEXICMD_DETAILMENU,
80: TEXICMD_DFN,
81: TEXICMD_DIRCATEGORY,
82: TEXICMD_DIRENTRY,
83: TEXICMD_DISPLAY,
84: TEXICMD_DOTS,
85: TEXICMD_EMAIL,
86: TEXICMD_EMPH,
87: TEXICMD_END,
88: TEXICMD_ENUMERATE,
89: TEXICMD_ENV,
90: TEXICMD_ERROR,
91: TEXICMD_EXAMPLE,
1.2 kristaps 92: TEXICMD_EXDENT,
1.1 kristaps 93: TEXICMD_EXPANSION,
94: TEXICMD_FILE,
95: TEXICMD_FINALOUT,
96: TEXICMD_FINDEX,
97: TEXICMD_FTABLE,
98: TEXICMD_FORMAT,
99: TEXICMD_GRAVE,
100: TEXICMD_GROUP,
101: TEXICMD_HEADING,
102: TEXICMD_HEADINGS,
103: TEXICMD_HEADITEM,
1.2 kristaps 104: TEXICMD_HTML,
1.1 kristaps 105: TEXICMD_HYPHEN,
106: TEXICMD_I,
107: TEXICMD_IFCLEAR,
108: TEXICMD_IFDOCBOOK,
109: TEXICMD_IFHTML,
110: TEXICMD_IFINFO,
111: TEXICMD_IFNOTDOCBOOK,
112: TEXICMD_IFNOTHTML,
113: TEXICMD_IFNOTINFO,
114: TEXICMD_IFNOTPLAINTEXT,
115: TEXICMD_IFNOTTEX,
116: TEXICMD_IFNOTXML,
117: TEXICMD_IFPLAINTEXT,
118: TEXICMD_IFTEX,
119: TEXICMD_IFSET,
120: TEXICMD_IFXML,
121: TEXICMD_IGNORE,
122: TEXICMD_IMAGE,
123: TEXICMD_INCLUDE,
124: TEXICMD_INDENTBLOCK,
1.3 ! kristaps 125: TEXICMD_INDEX,
1.1 kristaps 126: TEXICMD_INSERTCOPYING,
127: TEXICMD_ITEM,
128: TEXICMD_ITEMIZE,
129: TEXICMD_ITEMX,
130: TEXICMD_KBD,
131: TEXICMD_KEY,
132: TEXICMD_KINDEX,
133: TEXICMD_LATEX,
134: TEXICMD_LOWERSECTIONS,
135: TEXICMD_MATH,
136: TEXICMD_MENU,
1.2 kristaps 137: TEXICMD_MINUS,
1.1 kristaps 138: TEXICMD_MULTITABLE,
139: TEXICMD_NEED,
140: TEXICMD_NEWLINE,
141: TEXICMD_NODE,
142: TEXICMD_NOINDENT,
143: TEXICMD_OPTION,
144: TEXICMD_PXREF,
145: TEXICMD_QUESTIONMARK,
146: TEXICMD_QUOTATION,
147: TEXICMD_PAGE,
148: TEXICMD_PARINDENT,
1.2 kristaps 149: TEXICMD_PERIOD,
1.1 kristaps 150: TEXICMD_PRINTINDEX,
151: TEXICMD_R,
152: TEXICMD_RAISESECTIONS,
153: TEXICMD_REF,
154: TEXICMD_RESULT,
155: TEXICMD_SAMP,
156: TEXICMD_SANSSERIF,
157: TEXICMD_SC,
158: TEXICMD_SECTION,
159: TEXICMD_SET,
160: TEXICMD_SETCHAPNEWPAGE,
161: TEXICMD_SETFILENAME,
162: TEXICMD_SETTITLE,
1.2 kristaps 163: TEXICMD_SHORTCONTENTS,
1.1 kristaps 164: TEXICMD_SLANTED,
165: TEXICMD_SP,
166: TEXICMD_SPACE,
167: TEXICMD_SMALLBOOK,
168: TEXICMD_SMALLDISPLAY,
169: TEXICMD_SMALLEXAMPLE,
170: TEXICMD_SMALLFORMAT,
171: TEXICMD_SMALLINDENTBLOCK,
172: TEXICMD_SQUIGGLE_LEFT,
173: TEXICMD_SQUIGGLE_RIGHT,
174: TEXICMD_STRONG,
175: TEXICMD_SUBHEADING,
176: TEXICMD_SUBSECTION,
177: TEXICMD_SUBSUBSECTION,
178: TEXICMD_SUBTITLE,
1.2 kristaps 179: TEXICMD_SUMMARYCONTENTS,
1.3 ! kristaps 180: TEXICMD_SYNINDEX,
1.1 kristaps 181: TEXICMD_SYNCODEINDEX,
182: TEXICMD_T,
183: TEXICMD_TAB,
184: TEXICMD_TABSYM,
185: TEXICMD_TABLE,
186: TEXICMD_TEX,
187: TEXICMD_TEXSYM,
188: TEXICMD_TILDE,
1.2 kristaps 189: TEXICMD_TINDEX,
1.1 kristaps 190: TEXICMD_TITLE,
191: TEXICMD_TITLEFONT,
192: TEXICMD_TITLEPAGE,
193: TEXICMD_TOP,
194: TEXICMD_UMLAUT,
195: TEXICMD_UNNUMBERED,
196: TEXICMD_UNNUMBEREDSEC,
197: TEXICMD_UNNUMBEREDSUBSEC,
198: TEXICMD_UNNUMBEREDSUBSUBSEC,
199: TEXICMD_UREF,
200: TEXICMD_URL,
201: TEXICMD_VALUE,
202: TEXICMD_VAR,
1.2 kristaps 203: TEXICMD_VERBATIM,
1.1 kristaps 204: TEXICMD_VERBATIMINCLUDE,
205: TEXICMD_VINDEX,
206: TEXICMD_VSKIP,
207: TEXICMD_VTABLE,
208: TEXICMD_W,
209: TEXICMD_XREF,
210: TEXICMD__MAX
211: };
212:
213: /*
214: * The file currently being parsed.
215: * This keeps track of our location within that file.
216: */
217: struct texifile {
218: const char *name; /* name of the file */
219: size_t line; /* current line (from zero) */
220: size_t col; /* current column in line (from zero) */
221: char *map; /* mmap'd file */
222: size_t mapsz; /* size of mmap */
223: };
224:
225: struct texi;
226:
227: /*
228: * Callback for functions implementing texi commands.
229: */
230: typedef void (*texicmdfp)(struct texi *,
231: enum texicmd, const char *, size_t, size_t *);
232:
233: /*
234: * Describes Texinfo commands, whether native or overriden.
235: */
236: struct texitok {
237: texicmdfp fp; /* callback (or NULL if none) */
238: const char *tok; /* name of the token */
239: size_t len; /* strlen(tok) */
240: };
241:
242: enum texilist {
243: TEXILIST_NONE = 0,
244: TEXILIST_ITEM,
245: TEXILIST_NOITEM,
246: TEXILIST_TABLE
247: };
248:
249: struct texivalue {
250: char *key;
251: char *value;
252: };
253:
254: /*
255: * The main parse structure.
256: * This keeps any necessary information handy.
257: */
258: struct texi {
259: struct texifile files[64]; /* stack of open files */
260: size_t filepos; /* number of open files */
261: size_t outcol; /* column in output line */
262: char **dirs; /* texi directories */
263: size_t dirsz; /* number of texi directories */
264: char *title; /* title of document */
265: char *subtitle; /* subtitle of document */
266: int secoffs; /* see sectioner() */
1.3 ! kristaps 267: char **indexs; /* @defindex indices */
! 268: size_t indexsz; /* entries in indexs */
! 269: struct texivalue *vals; /* @value entries */
! 270: size_t valsz; /* entries in vals */
1.1 kristaps 271: /*
272: * The following control what we output to the screen.
273: * The complexity is required to accomodate for mdoc(7).
274: */
275: enum texilist list; /* current list (set recursively) */
276: int outmacro; /* if >0, output is in line macro */
277: int seenws; /* ws has been seen (and ignored) */
278: int seenvs; /* newline has been Pp'd */
279: int ign; /* if >0, don't print anything */
280: int literal; /* if >0, literal context */
281: };
282:
283: #define isws(_x) \
284: (' ' == (_x) || '\t' == (_x))
285: #define ismspace(_x) \
286: (isws((_x)) || '\n' == (_x))
287:
288: __BEGIN_DECLS
289:
290: void advance(struct texi *, const char *, size_t *);
291: size_t advanceeoln(struct texi *, const char *, size_t, size_t *, int);
292: void advanceto(struct texi *, const char *, size_t *, size_t);
293:
294: int parsearg(struct texi *, const char *, size_t, size_t *, size_t);
295: void parsebracket(struct texi *, const char *, size_t, size_t *);
296: void parsefile(struct texi *, const char *, int);
297: int parselinearg(struct texi *, const char *, size_t, size_t *);
298: void parseeof(struct texi *, const char *, size_t);
299: void parseeoln(struct texi *, const char *, size_t, size_t *);
300: void parsesingle(struct texi *, const char *, size_t, size_t *);
301: void parseto(struct texi *, const char *, size_t, size_t *, const char *);
302:
1.3 ! kristaps 303: void texiabort(struct texi *, const char *)
! 304: __attribute__((noreturn));
1.1 kristaps 305: enum texicmd
306: texicmd(struct texi *, const char *, size_t, size_t, size_t *);
307: void texierr(struct texi *, const char *, ...)
1.3 ! kristaps 308: __attribute__((format(printf, 2, 3)))
! 309: __attribute__((noreturn));
1.1 kristaps 310: void texiexit(struct texi *p);
311: void texifilepop(struct texi *);
312: void teximacro(struct texi *, const char *);
313: void teximacroclose(struct texi *);
314: void teximacroopen(struct texi *, const char *);
315: void texipunctuate(struct texi *, const char *, size_t, size_t *);
316: void texiputchar(struct texi *p, char);
317: void texiputchars(struct texi *, const char *);
318: void texivspace(struct texi *);
319: void texiwarn(const struct texi *, const char *, ...)
320: __attribute__((format(printf, 2, 3)));
1.2 kristaps 321:
322: void valueadd(struct texi *, char *, char *);
323: const char *
324: valueblookup(struct texi *, const char *, size_t, size_t *);
325: void valuelclear(struct texi *, const char *, size_t, size_t *);
326: const char *
327: valuellookup(struct texi *, const char *, size_t, size_t *);
1.1 kristaps 328:
329: extern const struct texitok *const texitoks;
330:
331: __END_DECLS
332:
333: #endif
CVSweb