/* $Id: extern.h,v 1.1 2015/02/20 09:58:50 kristaps Exp $ */ /* * Copyright (c) 2015 Kristaps Dzonsons * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef EXTERN_H #define EXTERN_H /* * This defines each one of the Texinfo commands that we understand. * Obviously this only refers to native commands; overriden names are a * different story. */ enum texicmd { TEXICMD_ACRONYM, TEXICMD_ACUTE, TEXICMD_A4PAPER, TEXICMD_ANCHOR, TEXICMD_APPENDIX, TEXICMD_APPENDIXSEC, TEXICMD_APPENDIXSUBSEC, TEXICMD_APPENDIXSUBSUBSEC, TEXICMD_ASTERISK, TEXICMD_AT, TEXICMD_AUTHOR, TEXICMD_B, TEXICMD_BANG, TEXICMD_BULLET, TEXICMD_BYE, TEXICMD_CENTER, TEXICMD_CHAPTER, TEXICMD_CINDEX, TEXICMD_CIRCUMFLEX, TEXICMD_CITE, TEXICMD_CLEAR, TEXICMD_CODE, TEXICMD_COLON, TEXICMD_COLUMNFRACTIONS, TEXICMD_COMMAND, TEXICMD_COMMENT, TEXICMD_COMMENT_LONG, TEXICMD_CONTENTS, TEXICMD_COPYING, TEXICMD_COPYRIGHT, TEXICMD_DEFFN, TEXICMD_DEFFNX, TEXICMD_DEFMAC, TEXICMD_DEFMACX, TEXICMD_DEFTP, TEXICMD_DEFTPX, TEXICMD_DEFTYPEFN, TEXICMD_DEFTYPEFNX, TEXICMD_DEFTYPEFUN, TEXICMD_DEFTYPEFUNX, TEXICMD_DEFTYPEVAR, TEXICMD_DEFTYPEVARX, TEXICMD_DEFTYPEVR, TEXICMD_DEFTYPEVRX, TEXICMD_DEFUN, TEXICMD_DEFUNX, TEXICMD_DEFVAR, TEXICMD_DEFVARX, TEXICMD_DEFVR, TEXICMD_DEFVRX, TEXICMD_DETAILMENU, TEXICMD_DFN, TEXICMD_DIRCATEGORY, TEXICMD_DIRENTRY, TEXICMD_DISPLAY, TEXICMD_DOTS, TEXICMD_EMAIL, TEXICMD_EMPH, TEXICMD_END, TEXICMD_ENUMERATE, TEXICMD_ENV, TEXICMD_ERROR, TEXICMD_EXAMPLE, TEXICMD_EXPANSION, TEXICMD_FILE, TEXICMD_FINALOUT, TEXICMD_FINDEX, TEXICMD_FTABLE, TEXICMD_FORMAT, TEXICMD_GRAVE, TEXICMD_GROUP, TEXICMD_HEADING, TEXICMD_HEADINGS, TEXICMD_HEADITEM, TEXICMD_HYPHEN, TEXICMD_I, TEXICMD_IFCLEAR, TEXICMD_IFDOCBOOK, TEXICMD_IFHTML, TEXICMD_IFINFO, TEXICMD_IFNOTDOCBOOK, TEXICMD_IFNOTHTML, TEXICMD_IFNOTINFO, TEXICMD_IFNOTPLAINTEXT, TEXICMD_IFNOTTEX, TEXICMD_IFNOTXML, TEXICMD_IFPLAINTEXT, TEXICMD_IFTEX, TEXICMD_IFSET, TEXICMD_IFXML, TEXICMD_IGNORE, TEXICMD_IMAGE, TEXICMD_INCLUDE, TEXICMD_INDENTBLOCK, TEXICMD_INSERTCOPYING, TEXICMD_ITEM, TEXICMD_ITEMIZE, TEXICMD_ITEMX, TEXICMD_KBD, TEXICMD_KEY, TEXICMD_KINDEX, TEXICMD_LATEX, TEXICMD_LOWERSECTIONS, TEXICMD_MATH, TEXICMD_MENU, TEXICMD_MULTITABLE, TEXICMD_NEED, TEXICMD_NEWLINE, TEXICMD_NODE, TEXICMD_NOINDENT, TEXICMD_OPTION, TEXICMD_PXREF, TEXICMD_QUESTIONMARK, TEXICMD_QUOTATION, TEXICMD_PAGE, TEXICMD_PARINDENT, TEXICMD_PRINTINDEX, TEXICMD_R, TEXICMD_RAISESECTIONS, TEXICMD_REF, TEXICMD_RESULT, TEXICMD_SAMP, TEXICMD_SANSSERIF, TEXICMD_SC, TEXICMD_SECTION, TEXICMD_SET, TEXICMD_SETCHAPNEWPAGE, TEXICMD_SETFILENAME, TEXICMD_SETTITLE, TEXICMD_SLANTED, TEXICMD_SP, TEXICMD_SPACE, TEXICMD_SMALLBOOK, TEXICMD_SMALLDISPLAY, TEXICMD_SMALLEXAMPLE, TEXICMD_SMALLFORMAT, TEXICMD_SMALLINDENTBLOCK, TEXICMD_SQUIGGLE_LEFT, TEXICMD_SQUIGGLE_RIGHT, TEXICMD_STRONG, TEXICMD_SUBHEADING, TEXICMD_SUBSECTION, TEXICMD_SUBSUBSECTION, TEXICMD_SUBTITLE, TEXICMD_SYNCODEINDEX, TEXICMD_T, TEXICMD_TAB, TEXICMD_TABSYM, TEXICMD_TABLE, TEXICMD_TEX, TEXICMD_TEXSYM, TEXICMD_TILDE, TEXICMD_TITLE, TEXICMD_TITLEFONT, TEXICMD_TITLEPAGE, TEXICMD_TOP, TEXICMD_UMLAUT, TEXICMD_UNNUMBERED, TEXICMD_UNNUMBEREDSEC, TEXICMD_UNNUMBEREDSUBSEC, TEXICMD_UNNUMBEREDSUBSUBSEC, TEXICMD_UREF, TEXICMD_URL, TEXICMD_VALUE, TEXICMD_VAR, TEXICMD_VERBATIMINCLUDE, TEXICMD_VINDEX, TEXICMD_VSKIP, TEXICMD_VTABLE, TEXICMD_W, TEXICMD_XREF, TEXICMD__MAX }; /* * The file currently being parsed. * This keeps track of our location within that file. */ struct texifile { const char *name; /* name of the file */ size_t line; /* current line (from zero) */ size_t col; /* current column in line (from zero) */ char *map; /* mmap'd file */ size_t mapsz; /* size of mmap */ }; struct texi; /* * Callback for functions implementing texi commands. */ typedef void (*texicmdfp)(struct texi *, enum texicmd, const char *, size_t, size_t *); /* * Describes Texinfo commands, whether native or overriden. */ struct texitok { texicmdfp fp; /* callback (or NULL if none) */ const char *tok; /* name of the token */ size_t len; /* strlen(tok) */ }; enum texilist { TEXILIST_NONE = 0, TEXILIST_ITEM, TEXILIST_NOITEM, TEXILIST_TABLE }; struct texivalue { char *key; char *value; }; /* * The main parse structure. * This keeps any necessary information handy. */ struct texi { struct texifile files[64]; /* stack of open files */ size_t filepos; /* number of open files */ size_t outcol; /* column in output line */ char **dirs; /* texi directories */ size_t dirsz; /* number of texi directories */ char *title; /* title of document */ char *subtitle; /* subtitle of document */ int secoffs; /* see sectioner() */ struct texivalue *vals; size_t valsz; /* * The following control what we output to the screen. * The complexity is required to accomodate for mdoc(7). */ enum texilist list; /* current list (set recursively) */ int outmacro; /* if >0, output is in line macro */ int seenws; /* ws has been seen (and ignored) */ int seenvs; /* newline has been Pp'd */ int ign; /* if >0, don't print anything */ int literal; /* if >0, literal context */ }; #define isws(_x) \ (' ' == (_x) || '\t' == (_x)) #define ismspace(_x) \ (isws((_x)) || '\n' == (_x)) __BEGIN_DECLS void advance(struct texi *, const char *, size_t *); size_t advanceeoln(struct texi *, const char *, size_t, size_t *, int); void advanceto(struct texi *, const char *, size_t *, size_t); int parsearg(struct texi *, const char *, size_t, size_t *, size_t); void parsebracket(struct texi *, const char *, size_t, size_t *); void parsefile(struct texi *, const char *, int); int parselinearg(struct texi *, const char *, size_t, size_t *); void parseeof(struct texi *, const char *, size_t); void parseeoln(struct texi *, const char *, size_t, size_t *); void parsesingle(struct texi *, const char *, size_t, size_t *); void parseto(struct texi *, const char *, size_t, size_t *, const char *); void texiabort(struct texi *, const char *); enum texicmd texicmd(struct texi *, const char *, size_t, size_t, size_t *); void texierr(struct texi *, const char *, ...) __attribute__((format(printf, 2, 3))); void texiexit(struct texi *p); void texifilepop(struct texi *); void teximacro(struct texi *, const char *); void teximacroclose(struct texi *); void teximacroopen(struct texi *, const char *); void texipunctuate(struct texi *, const char *, size_t, size_t *); void texiputchar(struct texi *p, char); void texiputchars(struct texi *, const char *); void texivspace(struct texi *); void texiwarn(const struct texi *, const char *, ...) __attribute__((format(printf, 2, 3))); extern const struct texitok *const texitoks; __END_DECLS #endif