[BACK]Return to extern.h CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / texi2mdoc

Annotation of texi2mdoc/extern.h, Revision 1.10

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

CVSweb