version 1.27, 2015/02/21 17:00:33 |
version 1.41, 2015/02/24 14:35:40 |
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
*/ |
*/ |
#include <sys/mman.h> |
#if defined(__linux__) || defined(__MINT__) |
#include <sys/stat.h> |
# define _GNU_SOURCE /* memmem */ |
|
#endif |
#include <assert.h> |
#include <assert.h> |
#include <ctype.h> |
#include <ctype.h> |
#include <fcntl.h> |
|
#include <getopt.h> |
#include <getopt.h> |
#include <libgen.h> |
#include <libgen.h> |
#include <limits.h> |
#include <limits.h> |
|
|
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
#include <time.h> |
#include <time.h> |
#include <unistd.h> |
|
|
|
#include "extern.h" |
#include "extern.h" |
|
|
Line 58 static void doinclude(struct texi *, enum texicmd, con |
|
Line 56 static void doinclude(struct texi *, enum texicmd, con |
|
static void doitem(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doitem(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doitemize(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doitemize(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dolink(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dolink(struct texi *, enum texicmd, const char *, size_t, size_t *); |
|
static void domacro(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void domath(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void domath(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void domultitable(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void domultitable(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doquotation(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doquotation(struct texi *, enum texicmd, const char *, size_t, size_t *); |
Line 73 static void dotab(struct texi *, enum texicmd, const c |
|
Line 72 static void dotab(struct texi *, enum texicmd, const c |
|
static void dotitle(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dotitle(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dovalue(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dovalue(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doverb(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doverb(struct texi *, enum texicmd, const char *, size_t, size_t *); |
|
static void doverbatim(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doverbinclude(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doverbinclude(struct texi *, enum texicmd, const char *, size_t, size_t *); |
|
|
static const struct texitok __texitoks[TEXICMD__MAX] = { |
static const struct texitok __texitoks[TEXICMD__MAX] = { |
Line 93 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 93 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosymbol, "!", 1 }, /* TEXICMD_BANG */ |
{ dosymbol, "!", 1 }, /* TEXICMD_BANG */ |
{ dosymbol, "bullet", 6 }, /* TEXICMD_BULLET */ |
{ dosymbol, "bullet", 6 }, /* TEXICMD_BULLET */ |
{ dobye, "bye", 3 }, /* TEXICMD_BYE */ |
{ dobye, "bye", 3 }, /* TEXICMD_BYE */ |
|
{ doblock, "cartouche", 9 }, /* TEXICMD_CARTOUCHE */ |
|
{ doaccent, ",", 1 }, /* TEXICMD_CEDILLA */ |
{ doignline, "center", 6 }, /* TEXICMD_CENTER */ |
{ doignline, "center", 6 }, /* TEXICMD_CENTER */ |
{ dosection, "chapter", 7 }, /* TEXICMD_CHAPTER */ |
{ dosection, "chapter", 7 }, /* TEXICMD_CHAPTER */ |
{ doignline, "cindex", 6 }, /* TEXICMD_CINDEX */ |
{ doignline, "cindex", 6 }, /* TEXICMD_CINDEX */ |
Line 102 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 104 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doinline, "code", 4 }, /* TEXICMD_CODE */ |
{ doinline, "code", 4 }, /* TEXICMD_CODE */ |
{ dosymbol, ":", 1 }, /* TEXICMD_COLON */ |
{ dosymbol, ":", 1 }, /* TEXICMD_COLON */ |
{ NULL, "columnfractions", 15 }, /* TEXICMD_COLUMNFRACTIONS */ |
{ NULL, "columnfractions", 15 }, /* TEXICMD_COLUMNFRACTIONS */ |
|
{ dosymbol, "comma", 5 }, /* TEXICMD_COMMA */ |
{ doinline, "command", 7 }, /* TEXICMD_COMMAND */ |
{ doinline, "command", 7 }, /* TEXICMD_COMMAND */ |
{ doignline, "c", 1 }, /* TEXICMD_COMMENT */ |
{ doignline, "c", 1 }, /* TEXICMD_COMMENT */ |
{ doignline, "comment", 7 }, /* TEXICMD_COMMENT_LONG */ |
{ doignline, "comment", 7 }, /* TEXICMD_COMMENT_LONG */ |
Line 120 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 123 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dodefn, "deftypefnx", 10 }, /* TEXICMD_DEFTYPEFNX */ |
{ dodefn, "deftypefnx", 10 }, /* TEXICMD_DEFTYPEFNX */ |
{ dodefn, "deftypefun", 10 }, /* TEXICMD_DEFTYPEFUN */ |
{ dodefn, "deftypefun", 10 }, /* TEXICMD_DEFTYPEFUN */ |
{ dodefn, "deftypefunx", 11 }, /* TEXICMD_DEFTYPEFUNX */ |
{ dodefn, "deftypefunx", 11 }, /* TEXICMD_DEFTYPEFUNX */ |
|
{ dodefn, "deftypemethod", 13 }, /* TEXICMD_DEFTYPEMETHOD */ |
|
{ dodefn, "deftypemethodx", 14 }, /* TEXICMD_DEFTYPEMETHODX */ |
{ dodefn, "deftypevar", 10 }, /* TEXICMD_DEFTYPEVAR */ |
{ dodefn, "deftypevar", 10 }, /* TEXICMD_DEFTYPEVAR */ |
{ dodefn, "deftypevarx", 11 }, /* TEXICMD_DEFTYPEVARX */ |
{ dodefn, "deftypevarx", 11 }, /* TEXICMD_DEFTYPEVARX */ |
{ dodefn, "deftypevr", 9 }, /* TEXICMD_DEFTYPEVR */ |
{ dodefn, "deftypevr", 9 }, /* TEXICMD_DEFTYPEVR */ |
Line 135 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 140 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignline, "dircategory", 11 }, /* TEXICMD_DIRCATEGORY */ |
{ doignline, "dircategory", 11 }, /* TEXICMD_DIRCATEGORY */ |
{ doignblock, "direntry", 8 }, /* TEXICMD_DIRENTRY */ |
{ doignblock, "direntry", 8 }, /* TEXICMD_DIRENTRY */ |
{ dodisplay, "display", 7 }, /* TEXICMD_DISPLAY */ |
{ dodisplay, "display", 7 }, /* TEXICMD_DISPLAY */ |
|
{ doignbracket, "dmn", 3 }, /* TEXICMD_DMN */ |
|
{ doignblock, "documentdescription", 19 }, /* TEXICMD_DOCUMENTDESCRIPTION */ |
|
{ doignline, "documentencoding", 16 }, /* TEXICMD_DOCUMENTENCODING */ |
{ dosymbol, "dots", 4 }, /* TEXICMD_DOTS */ |
{ dosymbol, "dots", 4 }, /* TEXICMD_DOTS */ |
{ dolink, "email", 5 }, /* TEXICMD_EMAIL */ |
{ dolink, "email", 5 }, /* TEXICMD_EMAIL */ |
{ doinline, "emph", 4 }, /* TEXICMD_EMPH */ |
{ doinline, "emph", 4 }, /* TEXICMD_EMPH */ |
{ NULL, "end", 3 }, /* TEXICMD_END */ |
{ NULL, "end", 3 }, /* TEXICMD_END */ |
|
{ dosymbol, "enddots", 7 }, /* TEXICMD_ENDDOTS */ |
{ doenumerate, "enumerate", 9 }, /* TEXICMD_ENUMERATE */ |
{ doenumerate, "enumerate", 9 }, /* TEXICMD_ENUMERATE */ |
{ doinline, "env", 3 }, /* TEXICMD_ENV */ |
{ doinline, "env", 3 }, /* TEXICMD_ENV */ |
|
{ dosymbol, "equiv", 5 }, /* TEXICMD_EQUIV */ |
{ dosymbol, "error", 5 }, /* TEXICMD_ERROR */ |
{ dosymbol, "error", 5 }, /* TEXICMD_ERROR */ |
{ doexample, "example", 7 }, /* TEXICMD_EXAMPLE */ |
{ doexample, "example", 7 }, /* TEXICMD_EXAMPLE */ |
{ doignline, "exdent", 6 }, /* TEXICMD_EXDENT */ |
{ doignline, "exdent", 6 }, /* TEXICMD_EXDENT */ |
Line 148 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 158 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doinline, "file", 4 }, /* TEXICMD_FILE */ |
{ doinline, "file", 4 }, /* TEXICMD_FILE */ |
{ doignline, "finalout", 8 }, /* TEXICMD_FINALOUT */ |
{ doignline, "finalout", 8 }, /* TEXICMD_FINALOUT */ |
{ doignline, "findex", 6 }, /* TEXICMD_FINDEX */ |
{ doignline, "findex", 6 }, /* TEXICMD_FINDEX */ |
|
{ doignbracket, "footnote", 8 }, /* TEXICMD_FOOTNOTE */ |
{ dotable, "ftable", 6 }, /* TEXICMD_FTABLE */ |
{ dotable, "ftable", 6 }, /* TEXICMD_FTABLE */ |
{ dodisplay, "format", 6 }, /* TEXICMD_FORMAT */ |
{ dodisplay, "format", 6 }, /* TEXICMD_FORMAT */ |
{ doaccent, "`", 1 }, /* TEXICMD_GRAVE */ |
{ doaccent, "`", 1 }, /* TEXICMD_GRAVE */ |
Line 170 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 181 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doblock, "ifnotxml", 8 }, /* TEXICMD_IFNOTXML */ |
{ doblock, "ifnotxml", 8 }, /* TEXICMD_IFNOTXML */ |
{ doblock, "ifplaintext", 11 }, /* TEXICMD_IFPLAINTEXT */ |
{ doblock, "ifplaintext", 11 }, /* TEXICMD_IFPLAINTEXT */ |
{ doignblock, "iftex", 5 }, /* TEXICMD_IFTEX */ |
{ doignblock, "iftex", 5 }, /* TEXICMD_IFTEX */ |
{ doignblock, "ifset", 5 }, /* TEXICMD_IFSET */ |
{ dovalue, "ifset", 5 }, /* TEXICMD_IFSET */ |
{ doignblock, "ifxml", 5 }, /* TEXICMD_IFXML */ |
{ doignblock, "ifxml", 5 }, /* TEXICMD_IFXML */ |
{ doignblock, "ignore", 6 }, /* TEXICMD_IGNORE */ |
{ doignblock, "ignore", 6 }, /* TEXICMD_IGNORE */ |
{ doignbracket, "image", 5 }, /* TEXICMD_IMAGE */ |
{ doignbracket, "image", 5 }, /* TEXICMD_IMAGE */ |
{ doinclude, "include", 7 }, /* TEXICMD_INCLUDE */ |
{ doinclude, "include", 7 }, /* TEXICMD_INCLUDE */ |
{ dodisplay, "indentblock", 11 }, /* TEXICMD_INDENTBLOCK */ |
{ dodisplay, "indentblock", 11 }, /* TEXICMD_INDENTBLOCK */ |
{ doignline, "", 0 }, /* TEXICMD_INDEX */ |
{ dolink, "inforef", 7 }, /* TEXICMD_INDENTBLOCK */ |
{ doignline, "insertcopying", 13 }, /* TEXICMD_INSERTCOPYING */ |
{ doignline, "insertcopying", 13 }, /* TEXICMD_INSERTCOPYING */ |
{ doitem, "item", 4 }, /* TEXICMD_ITEM */ |
{ doitem, "item", 4 }, /* TEXICMD_ITEM */ |
{ doitemize, "itemize", 7 }, /* TEXICMD_ITEMIZE */ |
{ doitemize, "itemize", 7 }, /* TEXICMD_ITEMIZE */ |
Line 186 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 197 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignline, "kindex", 6 }, /* TEXICMD_KINDEX */ |
{ doignline, "kindex", 6 }, /* TEXICMD_KINDEX */ |
{ dosymbol, "LaTeX", 5 }, /* TEXICMD_LATEX */ |
{ dosymbol, "LaTeX", 5 }, /* TEXICMD_LATEX */ |
{ dosecoffs, "lowersections", 13 }, /* TEXICMD_LOWERSECTIONS */ |
{ dosecoffs, "lowersections", 13 }, /* TEXICMD_LOWERSECTIONS */ |
|
{ domacro, "macro", 5 }, /* TEXICMD_MACRO */ |
{ domath, "math", 4 }, /* TEXICMD_MATH */ |
{ domath, "math", 4 }, /* TEXICMD_MATH */ |
{ doignblock, "menu", 4 }, /* TEXICMD_MENU */ |
{ doignblock, "menu", 4 }, /* TEXICMD_MENU */ |
{ dosymbol, "minus", 5 }, /* TEXICMD_MINUS */ |
{ dosymbol, "minus", 5 }, /* TEXICMD_MINUS */ |
Line 201 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 213 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignline, "page", 4 }, /* TEXICMD_PAGE */ |
{ doignline, "page", 4 }, /* TEXICMD_PAGE */ |
{ doignline, "paragraphindent", 15 }, /* TEXICMD_PARINDENT */ |
{ doignline, "paragraphindent", 15 }, /* TEXICMD_PARINDENT */ |
{ dosymbol, ".", 1 }, /* TEXICMD_PERIOD */ |
{ dosymbol, ".", 1 }, /* TEXICMD_PERIOD */ |
|
{ doignline, "pindex", 6 }, /* TEXICMD_PINDEX */ |
{ doignline, "printindex", 10 }, /* TEXICMD_PRINTINDEX */ |
{ doignline, "printindex", 10 }, /* TEXICMD_PRINTINDEX */ |
{ doinline, "r", 1 }, /* TEXICMD_R */ |
{ doinline, "r", 1 }, /* TEXICMD_R */ |
{ dosecoffs, "raisesections", 13 }, /* TEXICMD_RAISESECTIONS */ |
{ dosecoffs, "raisesections", 13 }, /* TEXICMD_RAISESECTIONS */ |
{ dobracket, "ref", 3 }, /* TEXICMD_REF */ |
{ dobracket, "ref", 3 }, /* TEXICMD_REF */ |
|
{ doignline, "refill", 6 }, /* TEXICMD_REFILL */ |
{ dosymbol, "result", 6 }, /* TEXICMD_RESULT */ |
{ dosymbol, "result", 6 }, /* TEXICMD_RESULT */ |
{ doinline, "samp", 4 }, /* TEXICMD_SAMP */ |
{ doinline, "samp", 4 }, /* TEXICMD_SAMP */ |
{ doinline, "sansserif", 9 }, /* TEXICMD_SANSSERIF */ |
{ doinline, "sansserif", 9 }, /* TEXICMD_SANSSERIF */ |
Line 212 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 226 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosection, "section", 7 }, /* TEXICMD_SECTION */ |
{ dosection, "section", 7 }, /* TEXICMD_SECTION */ |
{ dovalue, "set", 3 }, /* TEXICMD_SET */ |
{ dovalue, "set", 3 }, /* TEXICMD_SET */ |
{ doignline, "setchapternewpage", 17 }, /* TEXICMD_SETCHAPNEWPAGE */ |
{ doignline, "setchapternewpage", 17 }, /* TEXICMD_SETCHAPNEWPAGE */ |
|
{ doignline, "setcontentsaftertitlepage", 25 }, /* TEXICMD_SETCONTENTSAFTER */ |
{ doignline, "setfilename", 11 }, /* TEXICMD_SETFILENAME */ |
{ doignline, "setfilename", 11 }, /* TEXICMD_SETFILENAME */ |
{ dotitle, "settitle", 8 }, /* TEXICMD_SETTITLE */ |
{ dotitle, "settitle", 8 }, /* TEXICMD_SETTITLE */ |
{ doignline, "shortcontents", 13 }, /* TEXICMD_SHORTCONTENTS */ |
{ doignline, "shortcontents", 13 }, /* TEXICMD_SHORTCONTENTS */ |
{ doinline, "slanted", 7 }, /* TEXICMD_SLANTED */ |
{ doinline, "slanted", 7 }, /* TEXICMD_SLANTED */ |
|
{ dosymbol, "/", 1 }, /* TEXICMD_SLASH */ |
{ dosp, "sp", 2 }, /* TEXICMD_SP */ |
{ dosp, "sp", 2 }, /* TEXICMD_SP */ |
{ dosymbol, " ", 1 }, /* TEXICMD_SPACE */ |
{ dosymbol, " ", 1 }, /* TEXICMD_SPACE */ |
{ doignline, "smallbook", 9 }, /* TEXICMD_SMALLBOOK */ |
{ doignline, "smallbook", 9 }, /* TEXICMD_SMALLBOOK */ |
Line 225 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 241 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dodisplay, "smallindentblock", 16 }, /* TEXICMD_SMALLINDENTBLOCK */ |
{ dodisplay, "smallindentblock", 16 }, /* TEXICMD_SMALLINDENTBLOCK */ |
{ dosymbol, "{", 1 }, /* TEXICMD_SQUIGGLE_LEFT */ |
{ dosymbol, "{", 1 }, /* TEXICMD_SQUIGGLE_LEFT */ |
{ dosymbol, "}", 1 }, /* TEXICMD_SQUIGGLE_RIGHT */ |
{ dosymbol, "}", 1 }, /* TEXICMD_SQUIGGLE_RIGHT */ |
|
{ dosymbol, "ss", 2 }, /* TEXICMD_SS */ |
{ doinline, "strong", 6 }, /* TEXICMD_STRONG */ |
{ doinline, "strong", 6 }, /* TEXICMD_STRONG */ |
{ dosubsection, "subheading", 10 }, /* TEXICMD_SUBHEADING */ |
{ dosubsection, "subheading", 10 }, /* TEXICMD_SUBHEADING */ |
{ dosubsection, "subsection", 10 }, /* TEXICMD_SUBSECTION */ |
{ dosubsection, "subsection", 10 }, /* TEXICMD_SUBSECTION */ |
|
{ dosubsubsection, "subsubheading", 13 }, /* TEXICMD_SUBSUBHEADING */ |
{ dosubsubsection, "subsubsection", 13 }, /* TEXICMD_SUBSUBSECTION */ |
{ dosubsubsection, "subsubsection", 13 }, /* TEXICMD_SUBSUBSECTION */ |
{ doignline, "subtitle", 8 }, /* TEXICMD_SUBTITLE */ |
{ doignline, "subtitle", 8 }, /* TEXICMD_SUBTITLE */ |
{ doignline, "summarycontents", 15 }, /* TEXICMD_SUMMARYCONTENTS */ |
{ doignline, "summarycontents", 15 }, /* TEXICMD_SUMMARYCONTENTS */ |
Line 239 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 257 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dotable, "table", 5 }, /* TEXICMD_TABLE */ |
{ dotable, "table", 5 }, /* TEXICMD_TABLE */ |
{ doignblock, "tex", 3 }, /* TEXICMD_TEX */ |
{ doignblock, "tex", 3 }, /* TEXICMD_TEX */ |
{ dosymbol, "TeX", 3 }, /* TEXICMD_TEXSYM */ |
{ dosymbol, "TeX", 3 }, /* TEXICMD_TEXSYM */ |
|
{ dosymbol, "tie", 3 }, /* TEXICMD_TIE */ |
{ doaccent, "~", 1 }, /* TEXICMD_TILDE */ |
{ doaccent, "~", 1 }, /* TEXICMD_TILDE */ |
{ doignline, "tindex", 6 }, /* TEXICMD_TINDEX */ |
{ doignline, "tindex", 6 }, /* TEXICMD_TINDEX */ |
{ doignline, "title", 5 }, /* TEXICMD_TITLE */ |
{ doignline, "title", 5 }, /* TEXICMD_TITLE */ |
Line 252 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 271 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosubsubsection, "unnumberedsubsubsec", 19 }, /* TEXICMD_UNNUMBEREDSUBSUBSEC */ |
{ dosubsubsection, "unnumberedsubsubsec", 19 }, /* TEXICMD_UNNUMBEREDSUBSUBSEC */ |
{ dolink, "uref", 4 }, /* TEXICMD_UREF */ |
{ dolink, "uref", 4 }, /* TEXICMD_UREF */ |
{ dolink, "url", 3 }, /* TEXICMD_URL */ |
{ dolink, "url", 3 }, /* TEXICMD_URL */ |
|
{ doignline, "", 0 }, /* TEXICMD_USER_INDEX */ |
{ dovalue, "value", 5 }, /* TEXICMD_VALUE */ |
{ dovalue, "value", 5 }, /* TEXICMD_VALUE */ |
{ doinline, "var", 3 }, /* TEXICMD_VAR */ |
{ doinline, "var", 3 }, /* TEXICMD_VAR */ |
{ doverb, "verbatim", 8 }, /* TEXICMD_VERBATIM */ |
{ doverb, "verb", 4 }, /* TEXICMD_VERB */ |
|
{ doverbatim, "verbatim", 8 }, /* TEXICMD_VERBATIM */ |
{ doverbinclude, "verbatiminclude", 15 }, /* TEXICMD_VERBATIMINCLUDE */ |
{ doverbinclude, "verbatiminclude", 15 }, /* TEXICMD_VERBATIMINCLUDE */ |
{ doignline, "vindex", 6 }, /* TEXICMD_VINDEX */ |
{ doignline, "vindex", 6 }, /* TEXICMD_VINDEX */ |
{ dosp, "vskip", 5 }, /* TEXICMD_VSKIP */ |
{ dosp, "vskip", 5 }, /* TEXICMD_VSKIP */ |
Line 306 dodefn(struct texi *p, enum texicmd cmd, |
|
Line 327 dodefn(struct texi *p, enum texicmd cmd, |
|
blk = NULL; |
blk = NULL; |
switch (cmd) { |
switch (cmd) { |
case (TEXICMD_DEFFN): |
case (TEXICMD_DEFFN): |
|
case (TEXICMD_DEFMAC): |
case (TEXICMD_DEFTP): |
case (TEXICMD_DEFTP): |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFUN): |
case (TEXICMD_DEFTYPEFUN): |
|
case (TEXICMD_DEFTYPEMETHOD): |
case (TEXICMD_DEFTYPEVAR): |
case (TEXICMD_DEFTYPEVAR): |
case (TEXICMD_DEFTYPEVR): |
case (TEXICMD_DEFTYPEVR): |
case (TEXICMD_DEFUN): |
case (TEXICMD_DEFUN): |
Line 331 dodefn(struct texi *p, enum texicmd cmd, |
|
Line 354 dodefn(struct texi *p, enum texicmd cmd, |
|
texivspace(p); |
texivspace(p); |
|
|
switch (cmd) { |
switch (cmd) { |
|
case (TEXICMD_DEFTYPEMETHOD): |
|
case (TEXICMD_DEFTYPEMETHODX): |
|
texiputchars(p, "Method"); |
|
break; |
case (TEXICMD_DEFMAC): |
case (TEXICMD_DEFMAC): |
case (TEXICMD_DEFMACX): |
case (TEXICMD_DEFMACX): |
texiputchars(p, "Macro"); |
texiputchars(p, "Macro"); |
Line 379 dodefn(struct texi *p, enum texicmd cmd, |
|
Line 406 dodefn(struct texi *p, enum texicmd cmd, |
|
case (TEXICMD_DEFTYPEFUNX): |
case (TEXICMD_DEFTYPEFUNX): |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFNX): |
case (TEXICMD_DEFTYPEFNX): |
|
case (TEXICMD_DEFTYPEMETHOD): |
|
case (TEXICMD_DEFTYPEMETHODX): |
teximacroopen(p, "Ft"); |
teximacroopen(p, "Ft"); |
parselinearg(p, buf, sz, pos); |
parselinearg(p, buf, sz, pos); |
teximacroclose(p); |
teximacroclose(p); |
Line 421 dodefn(struct texi *p, enum texicmd cmd, |
|
Line 450 dodefn(struct texi *p, enum texicmd cmd, |
|
} |
} |
|
|
static void |
static void |
|
domacro(struct texi *p, enum texicmd cmd, |
|
const char *buf, size_t sz, size_t *pos) |
|
{ |
|
size_t start, end, endtoksz, len; |
|
struct teximacro m; |
|
const char *endtok, *blk; |
|
|
|
memset(&m, 0, sizeof(struct teximacro)); |
|
|
|
while (*pos < sz && isws(buf[*pos])) |
|
advance(p, buf, pos); |
|
|
|
for (start = end = *pos; end < sz; end++) |
|
if (ismspace(buf[end]) || '{' == buf[end]) |
|
break; |
|
|
|
if (start == end) |
|
texierr(p, "zero-length macro name"); |
|
|
|
advanceto(p, buf, pos, end); |
|
|
|
m.key = malloc(end - start + 1); |
|
if (NULL == m.key) |
|
texiabort(p, NULL); |
|
memcpy(m.key, &buf[start], end - start); |
|
m.key[end - start] = '\0'; |
|
|
|
m.args = argparse(p, buf, sz, pos, &m.argsz, 0); |
|
advanceeoln(p, buf, sz, pos, 0); |
|
|
|
start = *pos; |
|
endtok = "\n@end macro\n"; |
|
endtoksz = strlen(endtok); |
|
blk = memmem(&buf[start], sz, endtok, endtoksz); |
|
if (NULL == blk) |
|
texierr(p, "unterminated macro body"); |
|
while (&buf[*pos] != blk) |
|
advance(p, buf, pos); |
|
assert('\n' == buf[*pos]); |
|
advance(p, buf, pos); |
|
len = blk - &buf[start]; |
|
m.value = malloc(len + 1); |
|
if (NULL == m.value) |
|
texiabort(p, NULL); |
|
memcpy(m.value, &buf[start], len); |
|
m.value[len] = '\0'; |
|
|
|
p->macros = realloc |
|
(p->macros, |
|
(p->macrosz + 1) * |
|
sizeof(struct teximacro)); |
|
if (NULL == p->macros) |
|
texiabort(p, NULL); |
|
|
|
p->macros[p->macrosz++] = m; |
|
advanceeoln(p, buf, sz, pos, 1); |
|
} |
|
|
|
static void |
doignblock(struct texi *p, enum texicmd cmd, |
doignblock(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
Line 444 doignblock(struct texi *p, enum texicmd cmd, |
|
Line 532 doignblock(struct texi *p, enum texicmd cmd, |
|
*/ |
*/ |
term = memmem(&buf[*pos], sz, end, endsz); |
term = memmem(&buf[*pos], sz, end, endsz); |
endpos = NULL == term ? sz : |
endpos = NULL == term ? sz : |
*pos + term - &buf[*pos]; |
*pos + (size_t)(term - &buf[*pos]); |
assert(endpos <= sz); |
assert(endpos <= sz); |
while (*pos < endpos) |
while (*pos < endpos) |
advance(p, buf, pos); |
advance(p, buf, pos); |
|
|
doverb(struct texi *p, enum texicmd cmd, |
doverb(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
|
char delim; |
|
size_t start; |
|
|
|
while (*pos < sz && isws(buf[*pos])) |
|
advance(p, buf, pos); |
|
if (*pos == sz || '{' != buf[*pos]) |
|
return; |
|
advance(p, buf, pos); |
|
if (*pos == sz) |
|
return; |
|
|
|
delim = buf[*pos]; |
|
advance(p, buf, pos); |
|
/* Make sure we flush out our initial whitespace... */ |
|
if (p->seenws && p->outcol && 0 == p->literal) |
|
texiputchar(p, ' '); |
|
p->seenws = 0; |
|
start = *pos; |
|
/* Read until we see the delimiter then end-brace. */ |
|
while (*pos < sz - 1) { |
|
if (buf[*pos] == delim && buf[*pos + 1] == '}') |
|
break; |
|
advance(p, buf, pos); |
|
} |
|
if (*pos == sz - 1) |
|
return; |
|
texiputbuf(p, buf, start, *pos); |
|
|
|
/* Make sure we read after the end-brace. */ |
|
assert(delim == buf[*pos]); |
|
advance(p, buf, pos); |
|
assert('}' == buf[*pos]); |
|
advance(p, buf, pos); |
|
} |
|
|
|
static void |
|
doverbatim(struct texi *p, enum texicmd cmd, |
|
const char *buf, size_t sz, size_t *pos) |
|
{ |
const char *end, *term; |
const char *end, *term; |
size_t endsz, endpos; |
size_t endsz, endpos; |
|
|
Line 537 doverb(struct texi *p, enum texicmd cmd, |
|
Line 664 doverb(struct texi *p, enum texicmd cmd, |
|
*/ |
*/ |
term = memmem(&buf[*pos], sz, end, endsz); |
term = memmem(&buf[*pos], sz, end, endsz); |
endpos = NULL == term ? sz : |
endpos = NULL == term ? sz : |
*pos + term - &buf[*pos]; |
*pos + (size_t)(term - &buf[*pos]); |
|
|
teximacro(p, "Bd -literal -offset indent"); |
teximacro(p, "Bd -literal -offset indent"); |
assert(endpos <= sz); |
assert(endpos <= sz); |
while (*pos < endpos) { |
while (*pos < endpos) { |
if (buf[*pos] == '\n') |
texiputchar(p, buf[*pos]); |
p->outcol = 0; |
|
else |
|
p->outcol++; |
|
if (*pos > 0 && '.' == buf[*pos]) |
|
if ('\n' == buf[*pos - 1]) |
|
fputs("\\&", stdout); |
|
putchar(buf[*pos]); |
|
if ('\\' == buf[*pos]) |
|
putchar('e'); |
|
advance(p, buf, pos); |
advance(p, buf, pos); |
} |
} |
teximacro(p, "Ed"); |
teximacro(p, "Ed"); |
Line 579 doverbinclude(struct texi *p, enum texicmd cmd, |
|
Line 697 doverbinclude(struct texi *p, enum texicmd cmd, |
|
advance(p, buf, pos); |
advance(p, buf, pos); |
continue; |
continue; |
} |
} |
type = texicmd(p, buf, *pos, sz, &end); |
type = texicmd(p, buf, *pos, sz, &end, NULL); |
advanceto(p, buf, pos, end); |
advanceto(p, buf, pos, end); |
if (TEXICMD_VALUE != type) |
if (TEXICMD_VALUE != type) |
texierr(p, "unknown verbatiminclude command"); |
texierr(p, "unknown verbatiminclude command"); |
Line 638 doinclude(struct texi *p, enum texicmd cmd, |
|
Line 756 doinclude(struct texi *p, enum texicmd cmd, |
|
advance(p, buf, pos); |
advance(p, buf, pos); |
continue; |
continue; |
} |
} |
type = texicmd(p, buf, *pos, sz, &end); |
type = texicmd(p, buf, *pos, sz, &end, NULL); |
advanceto(p, buf, pos, end); |
advanceto(p, buf, pos, end); |
if (TEXICMD_VALUE != type) |
if (TEXICMD_VALUE != type) |
texierr(p, "unknown include command"); |
texierr(p, "unknown include command"); |
Line 762 doaccent(struct texi *p, enum texicmd cmd, |
|
Line 880 doaccent(struct texi *p, enum texicmd cmd, |
|
|
|
if (*pos == sz) |
if (*pos == sz) |
return; |
return; |
advance(p, buf, pos); |
if (p->seenws && p->outcol && 0 == p->literal) |
|
texiputchar(p, ' '); |
|
p->seenws = 0; |
switch (cmd) { |
switch (cmd) { |
|
case (TEXICMD_CEDILLA): |
|
/* Strange rules... */ |
|
while (*pos < sz && isws(buf[*pos])) |
|
advance(p, buf, pos); |
|
if (*pos == sz || '{' != buf[*pos]) |
|
return; |
|
advance(p, buf, pos); |
|
switch (buf[*pos]) { |
|
case ('c'): case ('C'): |
|
texiputchars(p, "\\(,"); |
|
texiputchar(p, buf[*pos]); |
|
break; |
|
default: |
|
texiputchar(p, buf[*pos]); |
|
break; |
|
} |
|
advance(p, buf, pos); |
|
break; |
case (TEXICMD_ACUTE): |
case (TEXICMD_ACUTE): |
switch (buf[*pos]) { |
switch (buf[*pos]) { |
case ('a'): case ('A'): |
case ('a'): case ('A'): |
Line 790 doaccent(struct texi *p, enum texicmd cmd, |
|
Line 928 doaccent(struct texi *p, enum texicmd cmd, |
|
break; |
break; |
default: |
default: |
texiputchar(p, buf[*pos]); |
texiputchar(p, buf[*pos]); |
|
break; |
} |
} |
break; |
break; |
case (TEXICMD_GRAVE): |
case (TEXICMD_GRAVE): |
Line 816 doaccent(struct texi *p, enum texicmd cmd, |
|
Line 955 doaccent(struct texi *p, enum texicmd cmd, |
|
break; |
break; |
default: |
default: |
texiputchar(p, buf[*pos]); |
texiputchar(p, buf[*pos]); |
|
break; |
} |
} |
break; |
break; |
case (TEXICMD_UMLAUT): |
case (TEXICMD_UMLAUT): |
Line 831 doaccent(struct texi *p, enum texicmd cmd, |
|
Line 971 doaccent(struct texi *p, enum texicmd cmd, |
|
break; |
break; |
default: |
default: |
texiputchar(p, buf[*pos]); |
texiputchar(p, buf[*pos]); |
|
break; |
} |
} |
break; |
break; |
default: |
default: |
abort(); |
abort(); |
} |
} |
|
advance(p, buf, pos); |
} |
} |
|
|
static void |
static void |
Line 864 dosymbol(struct texi *p, enum texicmd cmd, |
|
Line 1006 dosymbol(struct texi *p, enum texicmd cmd, |
|
case (TEXICMD_BULLET): |
case (TEXICMD_BULLET): |
texiputchars(p, "\\(bu"); |
texiputchars(p, "\\(bu"); |
break; |
break; |
|
case (TEXICMD_COMMA): |
|
texiputchar(p, ','); |
|
break; |
case (TEXICMD_COPYRIGHT): |
case (TEXICMD_COPYRIGHT): |
texiputchars(p, "\\(co"); |
texiputchars(p, "\\(co"); |
break; |
break; |
case (TEXICMD_DOTS): |
case (TEXICMD_DOTS): |
|
case (TEXICMD_ENDDOTS): |
texiputchars(p, "..."); |
texiputchars(p, "..."); |
break; |
break; |
|
case (TEXICMD_EQUIV): |
|
texiputchars(p, "\\(=="); |
|
break; |
case (TEXICMD_ERROR): |
case (TEXICMD_ERROR): |
texiputchars(p, "error\\(->"); |
texiputchars(p, "error\\(->"); |
break; |
break; |
Line 891 dosymbol(struct texi *p, enum texicmd cmd, |
|
Line 1040 dosymbol(struct texi *p, enum texicmd cmd, |
|
case (TEXICMD_RESULT): |
case (TEXICMD_RESULT): |
texiputchars(p, "\\(rA"); |
texiputchars(p, "\\(rA"); |
break; |
break; |
|
case (TEXICMD_SLASH): |
|
texiputchar(p, '/'); |
|
break; |
|
case (TEXICMD_SS): |
|
texiputchars(p, "\\(ss"); |
|
break; |
case (TEXICMD_SQUIGGLE_LEFT): |
case (TEXICMD_SQUIGGLE_LEFT): |
texiputchars(p, "{"); |
texiputchars(p, "{"); |
break; |
break; |
Line 900 dosymbol(struct texi *p, enum texicmd cmd, |
|
Line 1055 dosymbol(struct texi *p, enum texicmd cmd, |
|
case (TEXICMD_TEXSYM): |
case (TEXICMD_TEXSYM): |
texiputchars(p, "TeX"); |
texiputchars(p, "TeX"); |
break; |
break; |
|
case (TEXICMD_TIE): |
|
texiputchars(p, "\\ "); |
|
break; |
case (TEXICMD_COLON): |
case (TEXICMD_COLON): |
case (TEXICMD_HYPHEN): |
case (TEXICMD_HYPHEN): |
break; |
break; |
default: |
default: |
texiwarn(p, "sym: %d", cmd); |
|
abort(); |
abort(); |
} |
} |
|
|
|
|
domath(struct texi *p, enum texicmd cmd, |
domath(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
size_t nest; |
size_t nest, start; |
|
|
/* |
/* |
* Math handling is different from everything else. |
* Math handling is different from everything else. |
Line 942 domath(struct texi *p, enum texicmd cmd, |
|
Line 1099 domath(struct texi *p, enum texicmd cmd, |
|
if (p->seenws && p->outcol && 0 == p->literal) |
if (p->seenws && p->outcol && 0 == p->literal) |
texiputchar(p, ' '); |
texiputchar(p, ' '); |
p->seenws = 0; |
p->seenws = 0; |
for (nest = 1; *pos < sz && nest > 0; ) { |
for (nest = 1, start = *pos; *pos < sz && nest > 0; ) { |
if ('{' == buf[*pos]) |
if ('{' == buf[*pos]) |
nest++; |
nest++; |
else if ('}' == buf[*pos]) |
else if ('}' == buf[*pos]) |
if (0 == --nest) |
if (0 == --nest) |
continue; |
continue; |
texiputchar(p, buf[*pos]); |
|
advance(p, buf, pos); |
advance(p, buf, pos); |
} |
} |
if (*pos == sz) |
if (*pos == sz) |
return; |
return; |
assert('}' == buf[*pos]); |
assert('}' == buf[*pos]); |
|
texiputbuf(p, buf, start, *pos); |
advance(p, buf, pos); |
advance(p, buf, pos); |
} |
} |
|
|
|
|
dovalue(struct texi *p, enum texicmd cmd, |
dovalue(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
size_t start, end; |
size_t start, end, i; |
char *key, *val; |
char *key, *val; |
const char *cp; |
const char *cp; |
|
|
Line 1000 dovalue(struct texi *p, enum texicmd cmd, |
|
Line 1157 dovalue(struct texi *p, enum texicmd cmd, |
|
if (p->seenws) |
if (p->seenws) |
texiputchar(p, ' '); |
texiputchar(p, ' '); |
p->seenws = 0; |
p->seenws = 0; |
if (NULL == (cp = valueblookup(p, buf, sz, pos))) |
if (NULL != (cp = valueblookup(p, buf, sz, pos))) { |
|
for (i = 0; i < p->valstackpos; i++) |
|
if (cp == p->valstack[i]) |
|
break; |
|
if (i < p->valstackpos) |
|
texierr(p, "recursive value"); |
|
if (64 == p->valstackpos) |
|
texierr(p, "too many nested values"); |
|
p->valstack[p->valstackpos++] = cp; |
|
parsemembuf(p, cp, strlen(cp)); |
|
p->valstackpos--; |
|
} else |
texiputchars(p, "{No value}"); |
texiputchars(p, "{No value}"); |
else |
|
texiputchars(p, cp); |
|
} else if (TEXICMD_IFCLEAR == cmd) { |
} else if (TEXICMD_IFCLEAR == cmd) { |
if (NULL != valuellookup(p, buf, sz, pos)) |
if (NULL != valuellookup(p, buf, sz, pos)) |
doignblock(p, cmd, buf, sz, pos); |
doignblock(p, cmd, buf, sz, pos); |
else |
else |
parseto(p, buf, sz, pos, texitoks[cmd].tok); |
parseto(p, buf, sz, pos, texitoks[cmd].tok); |
|
} else if (TEXICMD_IFSET == cmd) { |
|
if (NULL == valuellookup(p, buf, sz, pos)) |
|
doignblock(p, cmd, buf, sz, pos); |
|
else |
|
parseto(p, buf, sz, pos, texitoks[cmd].tok); |
} else if (TEXICMD_CLEAR == cmd) |
} else if (TEXICMD_CLEAR == cmd) |
valuelclear(p, buf, sz, pos); |
valuelclear(p, buf, sz, pos); |
} |
} |
Line 1029 dolink(struct texi *p, enum texicmd cmd, |
|
Line 1200 dolink(struct texi *p, enum texicmd cmd, |
|
break; |
break; |
case (TEXICMD_XREF): |
case (TEXICMD_XREF): |
texiputchars(p, "See Section"); |
texiputchars(p, "See Section"); |
teximacroopen(p, "Qq"); |
teximacroopen(p, "Dq"); |
break; |
break; |
case (TEXICMD_PXREF): |
case (TEXICMD_PXREF): |
texiputchars(p, "see Section"); |
texiputchars(p, "see Section"); |
teximacroopen(p, "Qq"); |
teximacroopen(p, "Dq"); |
break; |
break; |
|
case (TEXICMD_INFOREF): |
|
texiputchars(p, "See Info file node"); |
|
teximacroopen(p, "Dq"); |
|
break; |
default: |
default: |
abort(); |
abort(); |
} |
} |
Line 1112 dosubsection(struct texi *p, enum texicmd cmd, |
|
Line 1287 dosubsection(struct texi *p, enum texicmd cmd, |
|
texierr(p, "\"%s\" in a literal scope!?", sects[sec]); |
texierr(p, "\"%s\" in a literal scope!?", sects[sec]); |
|
|
/* We don't have a subsubsection, so make one up. */ |
/* We don't have a subsubsection, so make one up. */ |
texivspace(p); |
if (sec > 1) |
|
texivspace(p); |
teximacroopen(p, sects[sec]); |
teximacroopen(p, sects[sec]); |
parseeoln(p, buf, sz, pos); |
parseeoln(p, buf, sz, pos); |
teximacroclose(p); |
teximacroclose(p); |
texivspace(p); |
if (sec > 1) |
|
texivspace(p); |
} |
} |
|
|
static void |
static void |
Line 1169 dosp(struct texi *p, enum texicmd cmd, |
|
Line 1346 dosp(struct texi *p, enum texicmd cmd, |
|
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
|
|
texivspace(p); |
if (p->literal) |
|
texiputchar(p, '\n'); |
|
else |
|
texivspace(p); |
/* FIXME: ignore and parseeoln. */ |
/* FIXME: ignore and parseeoln. */ |
advanceeoln(p, buf, sz, pos, 1); |
advanceeoln(p, buf, sz, pos, 1); |
} |
} |
Line 1206 dotop(struct texi *p, enum texicmd cmd, |
|
Line 1386 dotop(struct texi *p, enum texicmd cmd, |
|
teximacro(p, "Os"); |
teximacro(p, "Os"); |
teximacro(p, "Sh NAME"); |
teximacro(p, "Sh NAME"); |
teximacroopen(p, "Nm"); |
teximacroopen(p, "Nm"); |
texiputchars(p, p->title); |
for (cp = p->title; '\0' != *cp; cp++) |
|
texiputchar(p, *cp); |
teximacroclose(p); |
teximacroclose(p); |
teximacroopen(p, "Nd"); |
teximacroopen(p, "Nd"); |
texiputchars(p, NULL != p->subtitle ? |
if (NULL != p->subtitle) |
p->subtitle : "Unknown description"); |
for (cp = p->subtitle; '\0' != *cp; cp++) |
|
texiputchar(p, *cp); |
|
else |
|
texiputchars(p, "Unknown description"); |
teximacroclose(p); |
teximacroclose(p); |
p->seenvs = 1; |
p->seenvs = 1; |
dosection(p, cmd, buf, sz, pos); |
dosection(p, cmd, buf, sz, pos); |
Line 1269 domultitable(struct texi *p, enum texicmd cmd, |
|
Line 1453 domultitable(struct texi *p, enum texicmd cmd, |
|
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
enum texilist sv = p->list; |
enum texilist sv = p->list; |
|
int svliteral = p->literal; |
enum texicmd type; |
enum texicmd type; |
size_t i, end, columns; |
size_t i, end, columns; |
|
|
p->list = TEXILIST_TABLE; |
p->list = TEXILIST_TABLE; |
|
/* |
|
* TS/TE blocks aren't "in mdoc(7)", so we can disregard the |
|
* fact that we're in literal mode right now. |
|
*/ |
|
p->literal = 0; |
teximacro(p, "TS"); |
teximacro(p, "TS"); |
columns = 0; |
columns = 0; |
|
|
Line 1289 domultitable(struct texi *p, enum texicmd cmd, |
|
Line 1479 domultitable(struct texi *p, enum texicmd cmd, |
|
* arguments to set the number of columns that we'll |
* arguments to set the number of columns that we'll |
* have. |
* have. |
*/ |
*/ |
type = texicmd(p, buf, *pos, sz, &end); |
type = texicmd(p, buf, *pos, sz, &end, NULL); |
advanceto(p, buf, pos, end); |
advanceto(p, buf, pos, end); |
if (TEXICMD_COLUMNFRACTIONS != type) |
if (TEXICMD_COLUMNFRACTIONS != type) |
texierr(p, "unknown multitable command"); |
texierr(p, "unknown multitable command"); |
Line 1325 domultitable(struct texi *p, enum texicmd cmd, |
|
Line 1515 domultitable(struct texi *p, enum texicmd cmd, |
|
parseto(p, buf, sz, pos, texitoks[cmd].tok); |
parseto(p, buf, sz, pos, texitoks[cmd].tok); |
p->outmacro--; |
p->outmacro--; |
teximacro(p, "TE"); |
teximacro(p, "TE"); |
|
p->literal = svliteral; |
p->list = sv; |
p->list = sv; |
} |
} |
|
|
Line 1398 doignline(struct texi *p, enum texicmd cmd, |
|
Line 1589 doignline(struct texi *p, enum texicmd cmd, |
|
/* |
/* |
* Parse colon-separated directories from "cp" (if not NULL) and returns |
* Parse colon-separated directories from "cp" (if not NULL) and returns |
* the array of pointers. |
* the array of pointers. |
* Prepends "base" to the array. |
* Prepends "base" to the array, if found. |
* This does NOT sanitise the directories! |
* This does NOT sanitise the directories! |
*/ |
*/ |
static char ** |
static char ** |
Line 1406 parsedirs(struct texi *p, const char *base, const char |
|
Line 1597 parsedirs(struct texi *p, const char *base, const char |
|
{ |
{ |
char *tok, *str, *tofree; |
char *tok, *str, *tofree; |
const char *cpp; |
const char *cpp; |
size_t i; |
size_t i = 0; |
char **dirs; |
char **dirs; |
|
|
*sz = NULL != (cpp = cp) ? 2 : 1; |
/* Count up our expected arguments. */ |
if (*sz > 1) |
*sz = NULL != base; |
for ( ; NULL != (cpp = strchr(cpp, ':')); (*sz)++) |
if (NULL != (cpp = cp)) |
|
for ((*sz)++; NULL != (cpp = strchr(cpp, ':')); (*sz)++) |
cpp++; |
cpp++; |
|
|
|
if (0 == *sz) |
|
return(NULL); |
if (NULL == (dirs = calloc(*sz, sizeof(char *)))) |
if (NULL == (dirs = calloc(*sz, sizeof(char *)))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
else if (NULL == (dirs[0] = strdup(base))) |
if (NULL != base && NULL == (dirs[i++] = strdup(base))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
|
|
if (NULL == cp) |
if (NULL == cp) |
return(dirs); |
return(dirs); |
|
|
if (NULL == (tofree = tok = str = strdup(cp))) |
if (NULL == (tofree = tok = str = strdup(cp))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
|
|
for (i = 1; NULL != (tok = strsep(&str, ":")); i++) |
for ( ; NULL != (tok = strsep(&str, ":")); i++) |
if (NULL == (dirs[i] = strdup(tok))) |
if (NULL == (dirs[i] = strdup(tok))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
|
|
Line 1438 main(int argc, char *argv[]) |
|
Line 1630 main(int argc, char *argv[]) |
|
{ |
{ |
struct texi texi; |
struct texi texi; |
int c; |
int c; |
char *path, *dir; |
char *dirpath, *dir, *ccp; |
const char *progname, *Idir, *cp; |
const char *progname, *Idir, *cp; |
|
|
progname = strrchr(argv[0], '/'); |
progname = strrchr(argv[0], '/'); |
Line 1448 main(int argc, char *argv[]) |
|
Line 1640 main(int argc, char *argv[]) |
|
++progname; |
++progname; |
|
|
memset(&texi, 0, sizeof(struct texi)); |
memset(&texi, 0, sizeof(struct texi)); |
|
texi.ign = 1; |
Idir = NULL; |
Idir = NULL; |
|
|
while (-1 != (c = getopt(argc, argv, "I:"))) |
while (-1 != (c = getopt(argc, argv, "I:"))) |
Line 1460 main(int argc, char *argv[]) |
|
Line 1653 main(int argc, char *argv[]) |
|
} |
} |
|
|
argv += optind; |
argv += optind; |
if (0 == (argc -= optind)) |
argc -= optind; |
goto usage; |
|
|
|
if (NULL == (path = strdup(argv[0]))) |
if (argc > 0) { |
texiabort(&texi, NULL); |
if (NULL == (dirpath = strdup(argv[0]))) |
else if (NULL == (dir = dirname(path))) |
texiabort(&texi, NULL); |
texiabort(&texi, NULL); |
if (NULL == (dir = dirname(dirpath))) |
|
texiabort(&texi, NULL); |
|
if (NULL != (cp = strrchr(argv[0], '/'))) |
|
texi.title = strdup(cp + 1); |
|
else |
|
texi.title = strdup(argv[0]); |
|
if (NULL == texi.title) |
|
texiabort(&texi, NULL); |
|
else if (NULL != (ccp = strchr(texi.title, '.'))) |
|
*ccp = '\0'; |
|
texi.dirs = parsedirs(&texi, dir, Idir, &texi.dirsz); |
|
free(dirpath); |
|
parsefile(&texi, argv[0], 1); |
|
} else { |
|
texi.title = strdup("Unknown Manual"); |
|
texi.dirs = parsedirs(&texi, NULL, Idir, &texi.dirsz); |
|
parsestdin(&texi); |
|
} |
|
|
free(path); |
|
|
|
if (NULL != (cp = strrchr(argv[0], '/'))) |
|
texi.title = strdup(cp + 1); |
|
else |
|
texi.title = strdup(argv[0]); |
|
|
|
if (NULL == texi.title) |
|
texiabort(&texi, NULL); |
|
else if (NULL != (path = strchr(texi.title, '.'))) |
|
*path = '\0'; |
|
|
|
texi.ign = 1; |
|
texi.dirs = parsedirs(&texi, dir, Idir, &texi.dirsz); |
|
parsefile(&texi, argv[0], 1); |
|
/* We shouldn't get here. */ |
|
texiexit(&texi); |
texiexit(&texi); |
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
usage: |
usage: |
fprintf(stderr, "usage: %s [-Idirs] file\n", progname); |
fprintf(stderr, "usage: %s [-Idirs] [file]\n", progname); |
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |