=================================================================== RCS file: /cvs/texi2mdoc/extern.h,v retrieving revision 1.23 retrieving revision 1.29 diff -u -p -r1.23 -r1.29 --- texi2mdoc/extern.h 2015/03/01 16:57:39 1.23 +++ texi2mdoc/extern.h 2015/03/12 10:44:34 1.29 @@ -1,4 +1,4 @@ -/* $Id: extern.h,v 1.23 2015/03/01 16:57:39 kristaps Exp $ */ +/* $Id: extern.h,v 1.29 2015/03/12 10:44:34 kristaps Exp $ */ /* * Copyright (c) 2015 Kristaps Dzonsons * @@ -32,6 +32,8 @@ # endif #endif +#define HAVE_INDEX 1 + /* * This defines each one of the Texinfo commands that we understand. * Obviously this only refers to native commands; overriden names are a @@ -55,6 +57,7 @@ enum texicmd { TEXICMD_AT, TEXICMD_AUTHOR, TEXICMD_B, + TEXICMD_BACKSLASH, TEXICMD_BANG, TEXICMD_BULLET, TEXICMD_BYE, @@ -82,6 +85,10 @@ enum texicmd { TEXICMD_DEFINDEX, TEXICMD_DEFMAC, TEXICMD_DEFMACX, + TEXICMD_DEFOP, + TEXICMD_DEFOPX, + TEXICMD_DEFOPT, + TEXICMD_DEFOPTX, TEXICMD_DEFTP, TEXICMD_DEFTPX, TEXICMD_DEFTYPEFN, @@ -274,6 +281,7 @@ enum texicmd { TEXICMD_TITLEFONT, TEXICMD_TITLEPAGE, TEXICMD_TOP, + TEXICMD_TPINDEX, TEXICMD_U, TEXICMD_UBARACCENT, TEXICMD_UDOTACCENT, @@ -292,6 +300,7 @@ enum texicmd { TEXICMD_VERBATIM, TEXICMD_VERBATIMINCLUDE, TEXICMD_VINDEX, + TEXICMD_VRINDEX, TEXICMD_VSKIP, TEXICMD_VTABLE, TEXICMD_W, @@ -368,15 +377,42 @@ struct teximacro { }; /* + * A term is a word in an index. + * For example "@cindex foo" adds the term "foo" to the "cp" index. + * This occurs within a chapter ("nodes" in struct texi) + */ +struct texiterm { + char *term; + ssize_t chapter; +}; + +/* + * Index tables. + * These have a two or three letter name (usually) and any number of + * terms that are associated with it. + */ +struct texidex { + char *name; + struct texiterm *index; + size_t indexsz; +}; + +struct texinode { + char *name; + ssize_t up; + ssize_t prev; + ssize_t next; +}; + +/* * The main parse structure. * This keeps any necessary information handy. */ struct texi { const char *chapters; /* are we splitting chapters */ - size_t chapnum; /* current chapter node */ char **dirs; /* texi directories */ size_t dirsz; /* number of texi directories */ - FILE *outfile; + FILE *outfile; /* current output stream */ /* * Run-time parameters. */ @@ -387,12 +423,18 @@ struct texi { char *title; /* title of document */ char *subtitle; /* subtitle of document */ int secoffs; /* see sectioner() */ - char **indexs; /* @defindex indices */ + struct texidex *indexs; /* index entries */ 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 */ + char *copying; /* the @copying block */ + size_t copyingsz; /* length of @copying */ + struct texinode *nodecache; /* index of node names */ + size_t nodecachesz; /* nodes in nodecache */ + size_t nodesz; /* parsing node (sequential) */ + ssize_t nodecur; /* parsing node (cache position) */ /* * The following control what we output to the screen. * The complexity is required to accomodate for mdoc(7). @@ -404,6 +446,7 @@ struct texi { int seenvs; /* newline has been Pp'd */ int ign; /* if >0, don't print anything */ int literal; /* if >0, literal context */ + int uppercase; /* if >0, uppercase */ }; #define BUF(_p) ((_p)->files[(_p)->filepos - 1].map) @@ -429,6 +472,7 @@ void parsefile(struct texi *, const char *, int); int parselinearg(struct texi *, size_t *); void parseeoln(struct texi *, size_t *); void parseto(struct texi *, size_t *, const char *); +void parsesingle(struct texi *, size_t *); void texiabort(struct texi *, const char *) __attribute__((noreturn)); @@ -436,6 +480,9 @@ enum texicmd texicmd(const struct texi *, size_t, size_t *, struct teximacro **); enum texicmd peekcmd(const struct texi *, size_t); +enum texicmd + peeklinecmd(const struct texi *, size_t); +ssize_t texicache(struct texi *, const char *, size_t); void texierr(struct texi *, const char *, ...) __attribute__((format(printf, 2, 3))) __attribute__((noreturn)); @@ -446,6 +493,9 @@ void teximacroclose(struct texi *); void teximacroopen(struct texi *, const char *); void teximdocopen(struct texi *, size_t *); void teximdocclose(struct texi *, int); +void texindex(struct texi *, const char *, + size_t, const char *, size_t); +void texindex_add(struct texi *, const char *, size_t); void texipunctuate(struct texi *, size_t *); void texiputbuf(struct texi *p, size_t, size_t); void texiputchar(struct texi *p, char);