=================================================================== RCS file: /cvs/texi2mdoc/extern.h,v retrieving revision 1.1 retrieving revision 1.11 diff -u -p -r1.1 -r1.11 --- texi2mdoc/extern.h 2015/02/20 09:58:50 1.1 +++ texi2mdoc/extern.h 2015/02/23 22:50:11 1.11 @@ -1,4 +1,4 @@ -/* $Id: extern.h,v 1.1 2015/02/20 09:58:50 kristaps Exp $ */ +/* $Id: extern.h,v 1.11 2015/02/23 22:50:11 kristaps Exp $ */ /* * Copyright (c) 2015 Kristaps Dzonsons * @@ -31,6 +31,7 @@ enum texicmd { TEXICMD_APPENDIXSEC, TEXICMD_APPENDIXSUBSEC, TEXICMD_APPENDIXSUBSUBSEC, + TEXICMD_ASIS, TEXICMD_ASTERISK, TEXICMD_AT, TEXICMD_AUTHOR, @@ -38,6 +39,8 @@ enum texicmd { TEXICMD_BANG, TEXICMD_BULLET, TEXICMD_BYE, + TEXICMD_CARTOUCHE, + TEXICMD_CEDILLA, TEXICMD_CENTER, TEXICMD_CHAPTER, TEXICMD_CINDEX, @@ -47,14 +50,17 @@ enum texicmd { TEXICMD_CODE, TEXICMD_COLON, TEXICMD_COLUMNFRACTIONS, + TEXICMD_COMMA, TEXICMD_COMMAND, TEXICMD_COMMENT, TEXICMD_COMMENT_LONG, TEXICMD_CONTENTS, TEXICMD_COPYING, TEXICMD_COPYRIGHT, + TEXICMD_DEFCODEINDEX, TEXICMD_DEFFN, TEXICMD_DEFFNX, + TEXICMD_DEFINDEX, TEXICMD_DEFMAC, TEXICMD_DEFMACX, TEXICMD_DEFTP, @@ -63,6 +69,8 @@ enum texicmd { TEXICMD_DEFTYPEFNX, TEXICMD_DEFTYPEFUN, TEXICMD_DEFTYPEFUNX, + TEXICMD_DEFTYPEMETHOD, + TEXICMD_DEFTYPEMETHODX, TEXICMD_DEFTYPEVAR, TEXICMD_DEFTYPEVARX, TEXICMD_DEFTYPEVR, @@ -78,18 +86,25 @@ enum texicmd { TEXICMD_DIRCATEGORY, TEXICMD_DIRENTRY, TEXICMD_DISPLAY, + TEXICMD_DMN, + TEXICMD_DOCUMENTDESCRPITION, + TEXICMD_DOCUMENTENCODING, TEXICMD_DOTS, TEXICMD_EMAIL, TEXICMD_EMPH, TEXICMD_END, + TEXICMD_ENDDOTS, TEXICMD_ENUMERATE, TEXICMD_ENV, + TEXICMD_EQUIV, TEXICMD_ERROR, TEXICMD_EXAMPLE, + TEXICMD_EXDENT, TEXICMD_EXPANSION, TEXICMD_FILE, TEXICMD_FINALOUT, TEXICMD_FINDEX, + TEXICMD_FOOTNOTE, TEXICMD_FTABLE, TEXICMD_FORMAT, TEXICMD_GRAVE, @@ -97,6 +112,7 @@ enum texicmd { TEXICMD_HEADING, TEXICMD_HEADINGS, TEXICMD_HEADITEM, + TEXICMD_HTML, TEXICMD_HYPHEN, TEXICMD_I, TEXICMD_IFCLEAR, @@ -117,6 +133,7 @@ enum texicmd { TEXICMD_IMAGE, TEXICMD_INCLUDE, TEXICMD_INDENTBLOCK, + TEXICMD_INFOREF, TEXICMD_INSERTCOPYING, TEXICMD_ITEM, TEXICMD_ITEMIZE, @@ -126,8 +143,10 @@ enum texicmd { TEXICMD_KINDEX, TEXICMD_LATEX, TEXICMD_LOWERSECTIONS, + TEXICMD_MACRO, TEXICMD_MATH, TEXICMD_MENU, + TEXICMD_MINUS, TEXICMD_MULTITABLE, TEXICMD_NEED, TEXICMD_NEWLINE, @@ -139,10 +158,13 @@ enum texicmd { TEXICMD_QUOTATION, TEXICMD_PAGE, TEXICMD_PARINDENT, + TEXICMD_PERIOD, + TEXICMD_PINDEX, TEXICMD_PRINTINDEX, TEXICMD_R, TEXICMD_RAISESECTIONS, TEXICMD_REF, + TEXICMD_REFILL, TEXICMD_RESULT, TEXICMD_SAMP, TEXICMD_SANSSERIF, @@ -150,9 +172,12 @@ enum texicmd { TEXICMD_SECTION, TEXICMD_SET, TEXICMD_SETCHAPNEWPAGE, + TEXICMD_SETCONTENTSAFTER, TEXICMD_SETFILENAME, TEXICMD_SETTITLE, + TEXICMD_SHORTCONTENTS, TEXICMD_SLANTED, + TEXICMD_SLASH, TEXICMD_SP, TEXICMD_SPACE, TEXICMD_SMALLBOOK, @@ -162,11 +187,15 @@ enum texicmd { TEXICMD_SMALLINDENTBLOCK, TEXICMD_SQUIGGLE_LEFT, TEXICMD_SQUIGGLE_RIGHT, + TEXICMD_SS, TEXICMD_STRONG, TEXICMD_SUBHEADING, TEXICMD_SUBSECTION, + TEXICMD_SUBSUBHEADING, TEXICMD_SUBSUBSECTION, TEXICMD_SUBTITLE, + TEXICMD_SUMMARYCONTENTS, + TEXICMD_SYNINDEX, TEXICMD_SYNCODEINDEX, TEXICMD_T, TEXICMD_TAB, @@ -174,7 +203,9 @@ enum texicmd { TEXICMD_TABLE, TEXICMD_TEX, TEXICMD_TEXSYM, + TEXICMD_TIE, TEXICMD_TILDE, + TEXICMD_TINDEX, TEXICMD_TITLE, TEXICMD_TITLEFONT, TEXICMD_TITLEPAGE, @@ -186,8 +217,11 @@ enum texicmd { TEXICMD_UNNUMBEREDSUBSUBSEC, TEXICMD_UREF, TEXICMD_URL, + TEXICMD_USER_INDEX, TEXICMD_VALUE, TEXICMD_VAR, + TEXICMD_VERB, + TEXICMD_VERBATIM, TEXICMD_VERBATIMINCLUDE, TEXICMD_VINDEX, TEXICMD_VSKIP, @@ -197,15 +231,21 @@ enum texicmd { TEXICMD__MAX }; +enum texisrc { + TEXISRC_FILE, + TEXISRC_STDIN +}; + /* * The file currently being parsed. * This keeps track of our location within that file. */ struct texifile { + enum texisrc type; /* type of file */ 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 */ + char *map; /* mmap'd file OR allocated buffer */ size_t mapsz; /* size of mmap */ }; @@ -226,6 +266,10 @@ struct texitok { size_t len; /* strlen(tok) */ }; +/* + * These values instruct us on whether a list (or table) of some type is + * currently being parsed. + */ enum texilist { TEXILIST_NONE = 0, TEXILIST_ITEM, @@ -233,26 +277,47 @@ enum texilist { TEXILIST_TABLE }; +/* + * Hold values assigned with @set and retrieved with @value. + * These values can contain arbitrary Texinfo. + */ struct texivalue { - char *key; - char *value; + char *key; /* the nil-terminated value name */ + char *value; /* the nil-terminated value */ }; /* + * Macros are (possibly-recursive) Texinfo sequences created with @macro + * and filled in by arguments when invoked. + */ +struct teximacro { + char *key; /* nil-terminated macro name */ + char *value; /* nil-terminated value */ + char **args; /* array of argument names (or NULL) */ + size_t argsz; /* array size */ +}; + +/* * 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 */ + const char *valstack[64]; /* stack of opened values */ + size_t valstackpos; /* position in valstack */ 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; + char **indexs; /* @defindex indices */ + size_t indexsz; /* entries in indexs */ + struct texivalue *vals; /* @value entries */ + size_t valsz; /* entries in vals */ + struct teximacro *macros; /* @macro entries */ + size_t macrosz; /* entries in macros */ /* * The following control what we output to the screen. * The complexity is required to accomodate for mdoc(7). @@ -276,31 +341,46 @@ 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); +char **argparse(struct texi *, const char *, size_t, size_t *, 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 parsestdin(struct texi *); 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 parsemembuf(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 *); +void texiabort(struct texi *, const char *) + __attribute__((noreturn)); enum texicmd - texicmd(struct texi *, const char *, size_t, size_t, size_t *); + texicmd(struct texi *, const char *, size_t, size_t, + size_t *, struct teximacro **); void texierr(struct texi *, const char *, ...) - __attribute__((format(printf, 2, 3))); + __attribute__((format(printf, 2, 3))) + __attribute__((noreturn)); 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 texiputbuf(struct texi *p, 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))); + +void valueadd(struct texi *, char *, char *); +const char * + valueblookup(struct texi *, const char *, size_t, size_t *); +void valuelclear(struct texi *, const char *, size_t, size_t *); +const char * + valuellookup(struct texi *, const char *, size_t, size_t *); extern const struct texitok *const texitoks;