version 1.51, 2015/02/27 19:28:55 |
version 1.71, 2015/03/19 09:53:35 |
|
|
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
#include <time.h> |
|
#include <unistd.h> |
#include <unistd.h> |
|
|
#include "extern.h" |
#include "extern.h" |
|
|
|
#define HAVE_INDEX 1 |
|
|
|
/* |
|
* Texinfo can change the "meaning" of its section headings: chapter, |
|
* section, subsection, etc., can be promoted and/or demoted to other |
|
* levels of heading. |
|
* Thus, we use an offset and just jump into this array. |
|
*/ |
#define SECTSZ 4 |
#define SECTSZ 4 |
static const char *const sects[SECTSZ] = { |
static const char *const sects[SECTSZ] = { |
"Sh", |
"Sh", /* Chapters (sections) */ |
"Ss", |
"Ss", /* Sections (subsections) */ |
"Em", |
"Em", /* Subsections (subsubsection) */ |
"No", |
"Sy", /* Subsubsections (...). */ |
}; |
}; |
|
|
static void doaccent(struct texi *, enum texicmd, size_t *); |
static void doaccent(struct texi *, enum texicmd, size_t *); |
static void doblock(struct texi *, enum texicmd, size_t *); |
static void doblock(struct texi *, enum texicmd, size_t *); |
static void dobracket(struct texi *, enum texicmd, size_t *); |
static void dobracket(struct texi *, enum texicmd, size_t *); |
static void dobye(struct texi *, enum texicmd, size_t *); |
static void dobye(struct texi *, enum texicmd, size_t *); |
|
static void docopying(struct texi *, enum texicmd, size_t *); |
static void dodefindex(struct texi *, enum texicmd, size_t *); |
static void dodefindex(struct texi *, enum texicmd, size_t *); |
static void dodefn(struct texi *, enum texicmd, size_t *); |
static void dodefn(struct texi *, enum texicmd, size_t *); |
static void dodisplay(struct texi *, enum texicmd, size_t *); |
static void dodisplay(struct texi *, enum texicmd, size_t *); |
Line 53 static void doignargn(struct texi *, enum texicmd, siz |
|
Line 61 static void doignargn(struct texi *, enum texicmd, siz |
|
static void doignblock(struct texi *, enum texicmd, size_t *); |
static void doignblock(struct texi *, enum texicmd, size_t *); |
static void doignbracket(struct texi *, enum texicmd, size_t *); |
static void doignbracket(struct texi *, enum texicmd, size_t *); |
static void doignline(struct texi *, enum texicmd, size_t *); |
static void doignline(struct texi *, enum texicmd, size_t *); |
|
static void doindex(struct texi *, enum texicmd, size_t *); |
static void doinline(struct texi *, enum texicmd, size_t *); |
static void doinline(struct texi *, enum texicmd, size_t *); |
static void doinclude(struct texi *, enum texicmd, size_t *); |
static void doinclude(struct texi *, enum texicmd, size_t *); |
|
static void doinsertcopying(struct texi *, enum texicmd, size_t *); |
static void doitem(struct texi *, enum texicmd, size_t *); |
static void doitem(struct texi *, enum texicmd, size_t *); |
static void doitemize(struct texi *, enum texicmd, size_t *); |
static void doitemize(struct texi *, enum texicmd, size_t *); |
static void dolink(struct texi *, enum texicmd, size_t *); |
static void dolink(struct texi *, enum texicmd, size_t *); |
static void domacro(struct texi *, enum texicmd, size_t *); |
static void domacro(struct texi *, enum texicmd, size_t *); |
static void domath(struct texi *, enum texicmd, size_t *); |
static void domath(struct texi *, enum texicmd, size_t *); |
|
static void domenu(struct texi *, enum texicmd, size_t *); |
static void domultitable(struct texi *, enum texicmd, size_t *); |
static void domultitable(struct texi *, enum texicmd, size_t *); |
|
static void donode(struct texi *, enum texicmd, size_t *); |
|
static void doprintindex(struct texi *, enum texicmd, size_t *); |
static void doquotation(struct texi *, enum texicmd, size_t *); |
static void doquotation(struct texi *, enum texicmd, size_t *); |
static void dotable(struct texi *, enum texicmd, size_t *); |
static void dotable(struct texi *, enum texicmd, size_t *); |
static void dotop(struct texi *, enum texicmd, size_t *); |
|
static void dosecoffs(struct texi *, enum texicmd, size_t *); |
static void dosecoffs(struct texi *, enum texicmd, size_t *); |
static void dosection(struct texi *, enum texicmd, size_t *); |
static void dosection(struct texi *, enum texicmd, size_t *); |
static void dosp(struct texi *, enum texicmd, size_t *); |
static void dosp(struct texi *, enum texicmd, size_t *); |
static void dosubsection(struct texi *, enum texicmd, size_t *); |
|
static void dosubsubsection(struct texi *, enum texicmd, size_t *); |
|
static void dosymbol(struct texi *, enum texicmd, size_t *); |
static void dosymbol(struct texi *, enum texicmd, size_t *); |
static void dotab(struct texi *, enum texicmd, size_t *); |
static void dotab(struct texi *, enum texicmd, size_t *); |
static void dotitle(struct texi *, enum texicmd, size_t *); |
static void dotitle(struct texi *, enum texicmd, size_t *); |
Line 89 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 99 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignbracket, "anchor", 6 }, /* TEXICMD_ANCHOR */ |
{ doignbracket, "anchor", 6 }, /* TEXICMD_ANCHOR */ |
{ dosection, "appendix", 8 }, /* TEXICMD_APPENDIX */ |
{ dosection, "appendix", 8 }, /* TEXICMD_APPENDIX */ |
{ dosection, "appendixsec", 11 }, /* TEXICMD_APPENDIXSEC */ |
{ dosection, "appendixsec", 11 }, /* TEXICMD_APPENDIXSEC */ |
{ dosubsection, "appendixsubsec", 14 }, /* TEXICMD_APPENDIXSUBSEC */ |
{ dosection, "appendixsubsec", 14 }, /* TEXICMD_APPENDIXSUBSEC */ |
{ dosubsubsection, "appendixsubsubsec", 17 }, /* TEXICMD_APPENDIXSUBSUBSEC */ |
{ dosection, "appendixsubsubsec", 17 }, /* TEXICMD_APPENDIXSUBSUBSEC */ |
{ doinline, "asis", 4 }, /* TEXICMD_ASIS */ |
{ doinline, "asis", 4 }, /* TEXICMD_ASIS */ |
{ dosymbol, "*", 1 }, /* TEXICMD_ASTERISK */ |
{ dosymbol, "*", 1 }, /* TEXICMD_ASTERISK */ |
{ dosymbol, "@", 1 }, /* TEXICMD_AT */ |
{ dosymbol, "@", 1 }, /* TEXICMD_AT */ |
{ doignline, "author", 6 }, /* TEXICMD_AUTHOR */ |
{ doignline, "author", 6 }, /* TEXICMD_AUTHOR */ |
{ doinline, "b", 1 }, /* TEXICMD_BOLD */ |
{ doinline, "b", 1 }, /* TEXICMD_B */ |
|
{ dosymbol, "\\", 1 }, /* TEXICMD_BACKSLASH */ |
{ 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 */ |
Line 103 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 114 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doaccent, ",", 1 }, /* TEXICMD_CEDILLA */ |
{ 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 */ |
{ doindex, "cindex", 6 }, /* TEXICMD_CINDEX */ |
{ doaccent, "^", 1 }, /* TEXICMD_CIRCUMFLEX */ |
{ doaccent, "^", 1 }, /* TEXICMD_CIRCUMFLEX */ |
{ doinline, "cite", 4 }, /* TEXICMD_CITE */ |
{ doinline, "cite", 4 }, /* TEXICMD_CITE */ |
{ dovalue, "clear", 5 }, /* TEXICMD_CLEAR */ |
{ dovalue, "clear", 5 }, /* TEXICMD_CLEAR */ |
Line 115 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 126 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignline, "c", 1 }, /* TEXICMD_COMMENT */ |
{ doignline, "c", 1 }, /* TEXICMD_COMMENT */ |
{ doignline, "comment", 7 }, /* TEXICMD_COMMENT_LONG */ |
{ doignline, "comment", 7 }, /* TEXICMD_COMMENT_LONG */ |
{ doignline, "contents", 8 }, /* TEXICMD_CONTENTS */ |
{ doignline, "contents", 8 }, /* TEXICMD_CONTENTS */ |
{ doignblock, "copying", 7 }, /* TEXICMD_COPYING */ |
{ docopying, "copying", 7 }, /* TEXICMD_COPYING */ |
{ dosymbol, "copyright", 9 }, /* TEXICMD_COPYRIGHT */ |
{ dosymbol, "copyright", 9 }, /* TEXICMD_COPYRIGHT */ |
{ dodefindex, "defcodeindex", 12 }, /* TEXICMD_DEFCODEINDEX */ |
{ dodefindex, "defcodeindex", 12 }, /* TEXICMD_DEFCODEINDEX */ |
{ dodefn, "deffn", 5 }, /* TEXICMD_DEFFN */ |
{ dodefn, "deffn", 5 }, /* TEXICMD_DEFFN */ |
Line 123 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 134 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dodefindex, "defindex", 8 }, /* TEXICMD_DEFINDEX */ |
{ dodefindex, "defindex", 8 }, /* TEXICMD_DEFINDEX */ |
{ dodefn, "defmac", 6 }, /* TEXICMD_DEFMAC */ |
{ dodefn, "defmac", 6 }, /* TEXICMD_DEFMAC */ |
{ dodefn, "defmacx", 7 }, /* TEXICMD_DEFMACX */ |
{ dodefn, "defmacx", 7 }, /* TEXICMD_DEFMACX */ |
|
{ dodefn, "defop", 5 }, /* TEXICMD_DEFOP */ |
|
{ dodefn, "defopx", 6 }, /* TEXICMD_DEFOPX */ |
|
{ dodefn, "defopt", 6 }, /* TEXICMD_DEFOPT */ |
|
{ dodefn, "defoptx", 7 }, /* TEXICMD_DEFOPTX */ |
{ dodefn, "deftp", 5 }, /* TEXICMD_DEFTP */ |
{ dodefn, "deftp", 5 }, /* TEXICMD_DEFTP */ |
{ dodefn, "deftpx", 6 }, /* TEXICMD_DEFTPX */ |
{ dodefn, "deftpx", 6 }, /* TEXICMD_DEFTPX */ |
{ dodefn, "deftypefn", 9 }, /* TEXICMD_DEFTYPEFN */ |
{ dodefn, "deftypefn", 9 }, /* TEXICMD_DEFTYPEFN */ |
Line 170 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 185 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosymbol, "expansion", 9 }, /* TEXICMD_EXPANSION */ |
{ dosymbol, "expansion", 9 }, /* TEXICMD_EXPANSION */ |
{ 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 */ |
{ doindex, "findex", 6 }, /* TEXICMD_FINDEX */ |
{ doblock, "flushleft", 9 }, /* TEXICMD_FLUSHLEFT */ |
{ doblock, "flushleft", 9 }, /* TEXICMD_FLUSHLEFT */ |
{ doblock, "flushright", 10 }, /* TEXICMD_FLUSHRIGHT */ |
{ doblock, "flushright", 10 }, /* TEXICMD_FLUSHRIGHT */ |
{ doignline, "firstparagraphindent", 20 }, /* TEXICMD_FIRSTPARAGRAPHINDENT */ |
{ doignline, "firstparagraphindent", 20 }, /* TEXICMD_FIRSTPARAGRAPHINDENT */ |
Line 214 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 229 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dodisplay, "indentblock", 11 }, /* TEXICMD_INDENTBLOCK */ |
{ dodisplay, "indentblock", 11 }, /* TEXICMD_INDENTBLOCK */ |
{ dolink, "indicateurl", 11 }, /* TEXICMD_INDICATEURL */ |
{ dolink, "indicateurl", 11 }, /* TEXICMD_INDICATEURL */ |
{ dolink, "inforef", 7 }, /* TEXICMD_INFOREF */ |
{ dolink, "inforef", 7 }, /* TEXICMD_INFOREF */ |
{ doignline, "insertcopying", 13 }, /* TEXICMD_INSERTCOPYING */ |
{ doinsertcopying, "insertcopying", 13 }, /* TEXICMD_INSERTCOPYING */ |
{ doitem, "item", 4 }, /* TEXICMD_ITEM */ |
{ doitem, "item", 4 }, /* TEXICMD_ITEM */ |
{ doitemize, "itemize", 7 }, /* TEXICMD_ITEMIZE */ |
{ doitemize, "itemize", 7 }, /* TEXICMD_ITEMIZE */ |
{ doitem, "itemx", 5 }, /* TEXICMD_ITEMX */ |
{ doitem, "itemx", 5 }, /* TEXICMD_ITEMX */ |
Line 229 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 244 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ domacro, "macro", 5 }, /* TEXICMD_MACRO */ |
{ domacro, "macro", 5 }, /* TEXICMD_MACRO */ |
{ doaccent, "=", 1 }, /* TEXICMD_MACRON */ |
{ doaccent, "=", 1 }, /* TEXICMD_MACRON */ |
{ domath, "math", 4 }, /* TEXICMD_MATH */ |
{ domath, "math", 4 }, /* TEXICMD_MATH */ |
{ doignblock, "menu", 4 }, /* TEXICMD_MENU */ |
{ domenu, "menu", 4 }, /* TEXICMD_MENU */ |
{ dosymbol, "minus", 5 }, /* TEXICMD_MINUS */ |
{ dosymbol, "minus", 5 }, /* TEXICMD_MINUS */ |
{ domultitable, "multitable", 10 }, /* TEXICMD_MULTITABLE */ |
{ domultitable, "multitable", 10 }, /* TEXICMD_MULTITABLE */ |
{ doignline, "need", 4 }, /* TEXICMD_NEED */ |
{ doignline, "need", 4 }, /* TEXICMD_NEED */ |
{ dosymbol, "\n", 1 }, /* TEXICMD_NEWLINE */ |
{ dosymbol, "\n", 1 }, /* TEXICMD_NEWLINE */ |
{ doignline, "node", 4 }, /* TEXICMD_NODE */ |
{ donode, "node", 4 }, /* TEXICMD_NODE */ |
{ doignline, "noindent", 8 }, /* TEXICMD_NOINDENT */ |
{ doignline, "noindent", 8 }, /* TEXICMD_NOINDENT */ |
{ dosymbol, "O", 1 }, /* TEXICMD_O */ |
{ dosymbol, "O", 1 }, /* TEXICMD_O */ |
{ dosymbol, "OE", 2 }, /* TEXICMD_OE */ |
{ dosymbol, "OE", 2 }, /* TEXICMD_OE */ |
Line 249 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 264 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosymbol, ".", 1 }, /* TEXICMD_PERIOD */ |
{ dosymbol, ".", 1 }, /* TEXICMD_PERIOD */ |
{ doignline, "pindex", 6 }, /* TEXICMD_PINDEX */ |
{ doignline, "pindex", 6 }, /* TEXICMD_PINDEX */ |
{ dosymbol, "pounds", 6 }, /* TEXICMD_POUNDS */ |
{ dosymbol, "pounds", 6 }, /* TEXICMD_POUNDS */ |
{ doignline, "printindex", 10 }, /* TEXICMD_PRINTINDEX */ |
{ doprintindex, "printindex", 10 }, /* TEXICMD_PRINTINDEX */ |
{ dolink, "pxref", 5 }, /* TEXICMD_PXREF */ |
{ dolink, "pxref", 5 }, /* TEXICMD_PXREF */ |
{ dosymbol, "questiondown", 12 }, /* TEXICMD_QUESTIONDOWN */ |
{ dosymbol, "questiondown", 12 }, /* TEXICMD_QUESTIONDOWN */ |
{ dosymbol, "?", 1 }, /* TEXICMD_QUESTIONMARK */ |
{ dosymbol, "?", 1 }, /* TEXICMD_QUESTIONMARK */ |
Line 269 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 284 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doaccent, "ringaccent", 10 }, /* TEXICMD_RINGACCENT */ |
{ doaccent, "ringaccent", 10 }, /* TEXICMD_RINGACCENT */ |
{ doinline, "samp", 4 }, /* TEXICMD_SAMP */ |
{ doinline, "samp", 4 }, /* TEXICMD_SAMP */ |
{ doinline, "sansserif", 9 }, /* TEXICMD_SANSSERIF */ |
{ doinline, "sansserif", 9 }, /* TEXICMD_SANSSERIF */ |
{ dobracket, "sc", 2 }, /* TEXICMD_SC */ |
{ doinline, "sc", 2 }, /* TEXICMD_SC */ |
{ 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 */ |
Line 290 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 305 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosymbol, "}", 1 }, /* TEXICMD_SQUIGGLE_RIGHT */ |
{ dosymbol, "}", 1 }, /* TEXICMD_SQUIGGLE_RIGHT */ |
{ dosymbol, "ss", 2 }, /* TEXICMD_SS */ |
{ dosymbol, "ss", 2 }, /* TEXICMD_SS */ |
{ doinline, "strong", 6 }, /* TEXICMD_STRONG */ |
{ doinline, "strong", 6 }, /* TEXICMD_STRONG */ |
{ dosubsection, "subheading", 10 }, /* TEXICMD_SUBHEADING */ |
{ dosection, "subheading", 10 }, /* TEXICMD_SUBHEADING */ |
{ dosubsection, "subsection", 10 }, /* TEXICMD_SUBSECTION */ |
{ dosection, "subsection", 10 }, /* TEXICMD_SUBSECTION */ |
{ dosubsubsection, "subsubheading", 13 }, /* TEXICMD_SUBSUBHEADING */ |
{ dosection, "subsubheading", 13 }, /* TEXICMD_SUBSUBHEADING */ |
{ dosubsubsection, "subsubsection", 13 }, /* TEXICMD_SUBSUBSECTION */ |
{ dosection, "subsubsection", 13 }, /* TEXICMD_SUBSUBSECTION */ |
{ doignline, "subtitle", 8 }, /* TEXICMD_SUBTITLE */ |
{ doignline, "subtitle", 8 }, /* TEXICMD_SUBTITLE */ |
{ doignline, "summarycontents", 15 }, /* TEXICMD_SUMMARYCONTENTS */ |
{ doignline, "summarycontents", 15 }, /* TEXICMD_SUMMARYCONTENTS */ |
{ dodefindex, "synindex", 8 }, /* TEXICMD_SYNINDEX */ |
{ dodefindex, "synindex", 8 }, /* TEXICMD_SYNINDEX */ |
Line 310 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 325 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosymbol, "tie", 3 }, /* TEXICMD_TIE */ |
{ dosymbol, "tie", 3 }, /* TEXICMD_TIE */ |
{ doaccent, "tieaccent", 9 }, /* TEXICMD_TIEACCENT */ |
{ doaccent, "tieaccent", 9 }, /* TEXICMD_TIEACCENT */ |
{ doaccent, "~", 1 }, /* TEXICMD_TILDE */ |
{ doaccent, "~", 1 }, /* TEXICMD_TILDE */ |
{ doignline, "tindex", 6 }, /* TEXICMD_TINDEX */ |
{ doindex, "tindex", 6 }, /* TEXICMD_TINDEX */ |
{ doignline, "title", 5 }, /* TEXICMD_TITLE */ |
{ doignline, "title", 5 }, /* TEXICMD_TITLE */ |
{ dobracket, "titlefont", 9 }, /* TEXICMD_TITLEFONT */ |
{ dobracket, "titlefont", 9 }, /* TEXICMD_TITLEFONT */ |
{ doignblock, "titlepage", 9 }, /* TEXICMD_TITLEPAGE */ |
{ doignblock, "titlepage", 9 }, /* TEXICMD_TITLEPAGE */ |
{ dotop, "top", 3 }, /* TEXICMD_TOP */ |
{ dosection, "top", 3 }, /* TEXICMD_TOP */ |
|
{ doindex, "tpindex", 7 }, /* TEXICMD_TPINDEX */ |
{ doaccent, "u", 1 }, /* TEXICMD_U */ |
{ doaccent, "u", 1 }, /* TEXICMD_U */ |
{ doaccent, "ubaraccent", 10 }, /* TEXICMD_UBARACCENT */ |
{ doaccent, "ubaraccent", 10 }, /* TEXICMD_UBARACCENT */ |
{ doaccent, "udotaccent", 10 }, /* TEXICMD_UDOTACCENT */ |
{ doaccent, "udotaccent", 10 }, /* TEXICMD_UDOTACCENT */ |
{ doaccent, "\"", 1 }, /* TEXICMD_UMLAUT */ |
{ doaccent, "\"", 1 }, /* TEXICMD_UMLAUT */ |
{ dosection, "unnumbered", 10 }, /* TEXICMD_UNNUMBERED */ |
{ dosection, "unnumbered", 10 }, /* TEXICMD_UNNUMBERED */ |
{ dosection, "unnumberedsec", 13 }, /* TEXICMD_UNNUMBEREDSEC */ |
{ dosection, "unnumberedsec", 13 }, /* TEXICMD_UNNUMBEREDSEC */ |
{ dosubsection, "unnumberedsubsec", 16 }, /* TEXICMD_UNNUMBEREDSUBSEC */ |
{ dosection, "unnumberedsubsec", 16 }, /* TEXICMD_UNNUMBEREDSUBSEC */ |
{ dosubsubsection, "unnumberedsubsubsec", 19 }, /* TEXICMD_UNNUMBEREDSUBSUBSEC */ |
{ dosection, "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 */ |
{ doignline, "", 0 }, /* TEXICMD_USER_INDEX */ |
Line 332 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 348 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doverb, "verb", 4 }, /* TEXICMD_VERB */ |
{ doverb, "verb", 4 }, /* TEXICMD_VERB */ |
{ doverbatim, "verbatim", 8 }, /* TEXICMD_VERBATIM */ |
{ doverbatim, "verbatim", 8 }, /* TEXICMD_VERBATIM */ |
{ doverbinclude, "verbatiminclude", 15 }, /* TEXICMD_VERBATIMINCLUDE */ |
{ doverbinclude, "verbatiminclude", 15 }, /* TEXICMD_VERBATIMINCLUDE */ |
{ doignline, "vindex", 6 }, /* TEXICMD_VINDEX */ |
{ doindex, "vindex", 6 }, /* TEXICMD_VINDEX */ |
|
{ doindex, "vrindex", 7 }, /* TEXICMD_VRINDEX */ |
{ dosp, "vskip", 5 }, /* TEXICMD_VSKIP */ |
{ dosp, "vskip", 5 }, /* TEXICMD_VSKIP */ |
{ dotable, "vtable", 6 }, /* TEXICMD_VTABLE */ |
{ dotable, "vtable", 6 }, /* TEXICMD_VTABLE */ |
{ dobracket, "w", 1 }, /* TEXICMD_W */ |
{ dobracket, "w", 1 }, /* TEXICMD_W */ |
Line 342 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 359 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
|
|
const struct texitok *const texitoks = __texitoks; |
const struct texitok *const texitoks = __texitoks; |
|
|
|
/* |
|
* Define new indexes either by assignment or aliasing (both of these |
|
* accept the first argument as the new index). |
|
*/ |
static void |
static void |
dodefindex(struct texi *p, enum texicmd cmd, size_t *pos) |
dodefindex(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
size_t start, end; |
size_t start; |
char *cp; |
|
|
|
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
advance(p, pos); |
advance(p, pos); |
|
start = *pos; |
start = end = *pos; |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
while (end < BUFSZ(p) && ! ismspace(BUF(p)[end])) |
advance(p, pos); |
end++; |
if (*pos == BUFSZ(p)) { |
|
texiwarn(p, "unexpected EOF"); |
if (start == end) { |
|
advanceeoln(p, pos, 1); |
|
return; |
return; |
} else if (NULL == (cp = malloc(end - start + 1))) |
} |
texiabort(p, NULL); |
if (0 == *pos - start) |
|
texiwarn(p, "zero-length index definition"); |
memcpy(cp, &BUF(p)[start], end - start); |
else |
cp[end - start] = '\0'; |
texindex_add(p, &BUF(p)[start], *pos - start); |
|
advance(p, pos); |
p->indexs = realloc(p->indexs, |
|
sizeof(char *) * (p->indexsz + 1)); |
|
|
|
if (NULL == p->indexs) |
|
texiabort(p, NULL); |
|
p->indexs[p->indexsz++] = cp; |
|
} |
} |
|
|
|
/* |
|
* Handle both possible "define function" (type, etc.) classes: where |
|
* we'll have a body and without one (suffixed with "x"). |
|
*/ |
static void |
static void |
dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
Line 381 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 397 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
switch (cmd) { |
switch (cmd) { |
case (TEXICMD_DEFFN): |
case (TEXICMD_DEFFN): |
case (TEXICMD_DEFMAC): |
case (TEXICMD_DEFMAC): |
|
case (TEXICMD_DEFOP): |
|
case (TEXICMD_DEFOPT): |
case (TEXICMD_DEFTP): |
case (TEXICMD_DEFTP): |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFUN): |
case (TEXICMD_DEFTYPEFUN): |
Line 403 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 421 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
return; |
return; |
} |
} |
|
|
if (NULL != blk) |
if (p->seenvs >= 0) { |
texivspace(p); |
teximacro(p, "Pp"); |
|
p->seenvs = -1; |
|
} |
|
|
switch (cmd) { |
switch (cmd) { |
case (TEXICMD_DEFTYPEMETHOD): |
case (TEXICMD_DEFTYPEMETHOD): |
Line 415 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 435 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
case (TEXICMD_DEFMACX): |
case (TEXICMD_DEFMACX): |
texiputchars(p, "Macro"); |
texiputchars(p, "Macro"); |
break; |
break; |
|
case (TEXICMD_DEFOPT): |
|
case (TEXICMD_DEFOPTX): |
|
texiputchars(p, "User Option"); |
|
break; |
case (TEXICMD_DEFTYPEVAR): |
case (TEXICMD_DEFTYPEVAR): |
case (TEXICMD_DEFTYPEVARX): |
case (TEXICMD_DEFTYPEVARX): |
case (TEXICMD_DEFVAR): |
case (TEXICMD_DEFVAR): |
Line 432 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 456 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
break; |
break; |
} |
} |
|
|
|
p->seenvs = 0; |
texiputchar(p, ':'); |
texiputchar(p, ':'); |
texiputchar(p, '\n'); |
texiputchar(p, '\n'); |
|
|
Line 439 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 464 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
case (TEXICMD_DEFMAC): |
case (TEXICMD_DEFMAC): |
case (TEXICMD_DEFMACX): |
case (TEXICMD_DEFMACX): |
teximacroopen(p, "Dv"); |
teximacroopen(p, "Dv"); |
while (parselinearg(p, pos)) |
while (parselinearg(p, pos)) |
/* Spin. */ ; |
/* Spin. */ ; |
teximacroclose(p); |
teximacroclose(p); |
break; |
break; |
Line 451 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 476 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
parselinearg(p, pos); |
parselinearg(p, pos); |
teximacroclose(p); |
teximacroclose(p); |
teximacroopen(p, "Fa"); |
teximacroopen(p, "Fa"); |
while (parselinearg(p, pos)) |
while (parselinearg(p, pos)) |
/* Spin. */ ; |
/* Spin. */ ; |
teximacroclose(p); |
teximacroclose(p); |
teximacro(p, "Fc"); |
teximacro(p, "Fc"); |
break; |
break; |
|
case (TEXICMD_DEFOP): |
|
case (TEXICMD_DEFOPX): |
case (TEXICMD_DEFTYPEFUN): |
case (TEXICMD_DEFTYPEFUN): |
case (TEXICMD_DEFTYPEFUNX): |
case (TEXICMD_DEFTYPEFUNX): |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFN): |
Line 469 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 496 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
parselinearg(p, pos); |
parselinearg(p, pos); |
teximacroclose(p); |
teximacroclose(p); |
teximacroopen(p, "Fa"); |
teximacroopen(p, "Fa"); |
while (parselinearg(p, pos)) |
while (parselinearg(p, pos)) |
/* Spin. */ ; |
/* Spin. */ ; |
teximacroclose(p); |
teximacroclose(p); |
teximacro(p, "Fc"); |
teximacro(p, "Fc"); |
Line 481 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 508 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
case (TEXICMD_DEFTYPEVR): |
case (TEXICMD_DEFTYPEVR): |
case (TEXICMD_DEFTYPEVRX): |
case (TEXICMD_DEFTYPEVRX): |
teximacroopen(p, "Vt"); |
teximacroopen(p, "Vt"); |
while (parselinearg(p, pos)) |
while (parselinearg(p, pos)) |
/* Spin. */ ; |
/* Spin. */ ; |
teximacroclose(p); |
teximacroclose(p); |
break; |
break; |
|
case (TEXICMD_DEFOPT): |
|
case (TEXICMD_DEFOPTX): |
case (TEXICMD_DEFVAR): |
case (TEXICMD_DEFVAR): |
case (TEXICMD_DEFVARX): |
case (TEXICMD_DEFVARX): |
case (TEXICMD_DEFVR): |
case (TEXICMD_DEFVR): |
case (TEXICMD_DEFVRX): |
case (TEXICMD_DEFVRX): |
teximacroopen(p, "Va"); |
teximacroopen(p, "Va"); |
while (parselinearg(p, pos)) |
while (parselinearg(p, pos)) |
/* Spin. */ ; |
/* Spin. */ ; |
teximacroclose(p); |
teximacroclose(p); |
break; |
break; |
Line 498 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 527 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
abort(); |
abort(); |
} |
} |
|
|
texivspace(p); |
if (NULL == blk) |
if (NULL != blk) |
return; |
|
|
|
/* |
|
* All "block" definitions have their block bodies indented |
|
* unless they have the "x" form of the command following. |
|
* E.g., |
|
* @deffn some function |
|
* @deffnx another |
|
* An explanation. |
|
* @end deffn |
|
* With this loop, we delay opening the indented block until we |
|
* skipped past conformant macros. |
|
*/ |
|
for (;;) { |
|
switch (peekcmd(p, *pos)) { |
|
case (TEXICMD_DEFFNX): |
|
case (TEXICMD_DEFMACX): |
|
case (TEXICMD_DEFOPX): |
|
case (TEXICMD_DEFOPTX): |
|
case (TEXICMD_DEFTPX): |
|
case (TEXICMD_DEFTYPEFNX): |
|
case (TEXICMD_DEFTYPEFUNX): |
|
case (TEXICMD_DEFTYPEMETHODX): |
|
case (TEXICMD_DEFTYPEVARX): |
|
case (TEXICMD_DEFTYPEVRX): |
|
case (TEXICMD_DEFUNX): |
|
case (TEXICMD_DEFVARX): |
|
case (TEXICMD_DEFVRX): |
|
texivspace(p); |
|
parseeoln(p, pos); |
|
continue; |
|
default: |
|
break; |
|
} |
|
break; |
|
} |
|
|
|
if (TEXICMD_END == peekcmd(p, *pos)) { |
parseto(p, pos, blk); |
parseto(p, pos, blk); |
|
return; |
|
} |
|
|
|
texivspace(p); |
|
teximacro(p, "Bd -filled -offset indent -compact"); |
|
p->seenvs = -1; |
|
parseto(p, pos, blk); |
|
p->seenvs = 0; |
|
teximacro(p, "Ed"); |
|
texivspace(p); |
} |
} |
|
|
static void |
static void |
Line 531 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 607 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
m.key[end - start] = '\0'; |
m.key[end - start] = '\0'; |
|
|
m.args = argparse(p, pos, &m.argsz, 0); |
m.args = argparse(p, pos, &m.argsz, 0); |
|
if (*pos == BUFSZ(p)) { |
|
texiwarn(p, "unexpected EOF"); |
|
return; |
|
} |
|
|
/* Note: we advance to the beginning of the macro. */ |
/* Note: we advance to the beginning of the macro. */ |
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
|
if ((start = *pos) == BUFSZ(p)) { |
|
texiwarn(p, "unexpected EOF"); |
|
return; |
|
} |
|
|
/* |
/* |
* According to the Texinfo manual, the macro ends on the |
* According to the Texinfo manual, the macro ends on the |
Line 546 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 630 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
* @end macro without the leading newline else we might look |
* @end macro without the leading newline else we might look |
* past empty macros. |
* past empty macros. |
*/ |
*/ |
start = *pos; |
|
endtok = "@end macro\n"; |
endtok = "@end macro\n"; |
endtoksz = strlen(endtok); |
endtoksz = strlen(endtok); |
blk = memmem(&BUF(p)[start], BUFSZ(p) - start, endtok, endtoksz); |
blk = memmem(&BUF(p)[start], BUFSZ(p) - start, endtok, endtoksz); |
Line 556 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 639 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
while (&BUF(p)[*pos] != blk) |
while (&BUF(p)[*pos] != blk) |
advance(p, pos); |
advance(p, pos); |
assert('@' == BUF(p)[*pos]); |
assert('@' == BUF(p)[*pos]); |
if ('\n' != BUF(p)[*pos - 1]) |
if ('\n' != BUF(p)[*pos - 1]) |
texierr(p, "cannot handle @end macro in-line"); |
texierr(p, "cannot handle @end macro in-line"); |
|
|
len = blk - &BUF(p)[start]; |
len = blk - &BUF(p)[start]; |
Line 568 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 651 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
|
|
p->macros = realloc |
p->macros = realloc |
(p->macros, |
(p->macros, |
(p->macrosz + 1) * |
(p->macrosz + 1) * |
sizeof(struct teximacro)); |
sizeof(struct teximacro)); |
if (NULL == p->macros) |
if (NULL == p->macros) |
texiabort(p, NULL); |
texiabort(p, NULL); |
Line 584 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 667 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
const char *endt, *startt; |
const char *endt, *startt; |
size_t esz, ssz, newpos, stack; |
size_t esz, ssz, newpos, stack; |
|
|
/* |
/* |
* FIXME: this is cheating. |
* FIXME: this is cheating. |
* These tokens are supposed to begin on a newline. |
* These tokens are supposed to begin on a newline. |
* However, if we do that, then we would need to check within |
* However, if we do that, then we would need to check within |
* the loop for trailer (or leading, as the case may be) |
* the loop for trailer (or leading, as the case may be) |
* newline, and that's just a bit too complicated right now. |
* newline, and that's just a bit too complicated right now. |
* This is becasue |
* This is becasue |
* @ifset BAR |
* @ifset BAR |
* @ifset FOO |
* @ifset FOO |
* @end ifset |
* @end ifset |
* @end ifset |
* @end ifset |
* won't work right now: we'd read after the first "@end ifset" |
* won't work right now: we'd read after the first "@end ifset" |
* to the next line, then look for the next line after that. |
* to the next line, then look for the next line after that. |
*/ |
*/ |
ssz = snprintf(start, sizeof(start), |
ssz = snprintf(start, sizeof(start), |
"@%s", texitoks[cmd].tok); |
"@%s", texitoks[cmd].tok); |
assert(ssz < sizeof(start)); |
assert(ssz < sizeof(start)); |
esz = snprintf(end, sizeof(end), |
esz = snprintf(end, sizeof(end), |
"@end %s\n", texitoks[cmd].tok); |
"@end %s", texitoks[cmd].tok); |
assert(esz < sizeof(end)); |
assert(esz < sizeof(end)); |
stack = 1; |
stack = 1; |
|
|
Line 614 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 697 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
* Thus, we keep track of scopes for matching "end" blocks. |
* Thus, we keep track of scopes for matching "end" blocks. |
*/ |
*/ |
while (stack > 0 && *pos < BUFSZ(p)) { |
while (stack > 0 && *pos < BUFSZ(p)) { |
if (stack > 10) |
if (stack > 64) |
abort(); |
texierr(p, "run-away nested stack?"); |
endt = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, end, esz); |
endt = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, end, esz); |
startt = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, start, ssz); |
startt = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, start, ssz); |
if (NULL == endt) { |
if (NULL == endt) { |
Line 623 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 706 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
"block", texitoks[cmd].tok); |
"block", texitoks[cmd].tok); |
*pos = BUFSZ(p); |
*pos = BUFSZ(p); |
break; |
break; |
} |
} |
|
|
newpos = *pos; |
newpos = *pos; |
if (NULL == startt || startt > endt) { |
if (NULL == startt || startt > endt) { |
Line 643 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 726 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
static void |
static void |
doblock(struct texi *p, enum texicmd cmd, size_t *pos) |
doblock(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
parseto(p, pos, texitoks[cmd].tok); |
parseto(p, pos, texitoks[cmd].tok); |
} |
} |
|
|
Line 655 doinline(struct texi *p, enum texicmd cmd, size_t *pos |
|
Line 738 doinline(struct texi *p, enum texicmd cmd, size_t *pos |
|
switch (cmd) { |
switch (cmd) { |
case (TEXICMD_CODE): |
case (TEXICMD_CODE): |
case (TEXICMD_KBD): |
case (TEXICMD_KBD): |
|
/* FIXME: quote around @samp{} */ |
case (TEXICMD_SAMP): |
case (TEXICMD_SAMP): |
case (TEXICMD_T): |
case (TEXICMD_T): |
macro = "Li"; |
macro = "Li"; |
Line 690 doinline(struct texi *p, enum texicmd cmd, size_t *pos |
|
Line 774 doinline(struct texi *p, enum texicmd cmd, size_t *pos |
|
} |
} |
|
|
if (NULL == macro || p->literal || TEXILIST_TABLE == p->list) { |
if (NULL == macro || p->literal || TEXILIST_TABLE == p->list) { |
parsebracket(p, pos); |
if (TEXICMD_SC == cmd) |
|
p->uppercase++; |
|
parsebracket(p, pos, 0); |
|
if (TEXICMD_SC == cmd) |
|
p->uppercase--; |
return; |
return; |
} |
} |
|
|
|
/* |
|
* If we haven't seen any whitespace, then we don't want the |
|
* subsequent macro to insert any whitespace. |
|
*/ |
|
if (p->outmacro && 0 == p->seenws) { |
|
teximacroopen(p, "Ns"); |
|
teximacroclose(p); |
|
} |
|
|
teximacroopen(p, macro); |
teximacroopen(p, macro); |
p->seenws = 0; |
p->seenws = 0; |
parsebracket(p, pos); |
if (TEXICMD_CODE == cmd) |
|
p->literal++; |
|
if (TEXICMD_SC == cmd) |
|
p->uppercase++; |
|
parsebracket(p, pos, 0); |
|
if (TEXICMD_SC == cmd) |
|
p->uppercase--; |
|
if (TEXICMD_CODE == cmd) |
|
p->literal--; |
texipunctuate(p, pos); |
texipunctuate(p, pos); |
teximacroclose(p); |
teximacroclose(p); |
} |
} |
Line 724 doverb(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 829 doverb(struct texi *p, enum texicmd cmd, size_t *pos) |
|
start = *pos; |
start = *pos; |
/* Read until we see the delimiter then end-brace. */ |
/* Read until we see the delimiter then end-brace. */ |
while (*pos < BUFSZ(p) - 1) { |
while (*pos < BUFSZ(p) - 1) { |
if (BUF(p)[*pos] == delim && BUF(p)[*pos + 1] == '}') |
if (BUF(p)[*pos] == delim && BUF(p)[*pos + 1] == '}') |
break; |
break; |
advance(p, pos); |
advance(p, pos); |
} |
} |
Line 740 doverb(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 845 doverb(struct texi *p, enum texicmd cmd, size_t *pos) |
|
} |
} |
|
|
static void |
static void |
|
doinsertcopying(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
|
|
advanceeoln(p, pos, 0); |
|
if (NULL != p->copying) |
|
texisplice(p, p->copying, p->copyingsz, *pos); |
|
} |
|
|
|
static void |
|
docopying(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
const char *end, *term; |
|
size_t endsz, endpos; |
|
|
|
/* We retain our starting (but not ending) newlines. */ |
|
end = "\n@end copying\n"; |
|
endsz = strlen(end); |
|
advanceeoln(p, pos, 0); |
|
if (*pos == BUFSZ(p)) { |
|
texiwarn(p, "unterminated \"%s\"", texitoks[cmd].tok); |
|
return; |
|
} |
|
|
|
term = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, end, endsz); |
|
if (NULL == term) |
|
texierr(p, "unterminated \"%s\"", texitoks[cmd].tok); |
|
else |
|
endpos = *pos + (size_t)(term - &BUF(p)[*pos]); |
|
|
|
if (endpos == *pos) { |
|
advanceeoln(p, pos, 1); |
|
return; |
|
} |
|
|
|
assert(endpos < BUFSZ(p) && endpos > *pos); |
|
assert('\n' == BUF(p)[*pos]); |
|
advance(p, pos); |
|
|
|
if (*pos == BUFSZ(p)) { |
|
texiwarn(p, "unterminated \"%s\"", texitoks[cmd].tok); |
|
return; |
|
} |
|
|
|
p->copying = malloc(endpos - *pos + 1); |
|
p->copyingsz = endpos - *pos; |
|
memcpy(p->copying, &BUF(p)[*pos], p->copyingsz); |
|
p->copying[endpos - *pos] = '\0'; |
|
|
|
while (*pos < endpos) |
|
advance(p, pos); |
|
if (*pos < BUFSZ(p)) |
|
advanceto(p, pos, endpos + endsz); |
|
} |
|
|
|
static void |
doverbatim(struct texi *p, enum texicmd cmd, size_t *pos) |
doverbatim(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
const char *end, *term; |
const char *end, *term; |
Line 750 doverbatim(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 910 doverbatim(struct texi *p, enum texicmd cmd, size_t *p |
|
endsz = strlen(end); |
endsz = strlen(end); |
advanceeoln(p, pos, 0); |
advanceeoln(p, pos, 0); |
if (*pos == BUFSZ(p)) { |
if (*pos == BUFSZ(p)) { |
texiwarn(p, "unexpected end of file"); |
texiwarn(p, "unterminated \"%s\"", texitoks[cmd].tok); |
return; |
return; |
} |
} |
|
|
term = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, end, endsz); |
term = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, end, endsz); |
if (NULL == term) { |
if (NULL == term) { |
texiwarn(p, "unterminated verbatim block"); |
texiwarn(p, "unterminated \"%s\"", texitoks[cmd].tok); |
endpos = BUFSZ(p); |
endpos = BUFSZ(p); |
} else |
} else |
endpos = *pos + (size_t)(term - &BUF(p)[*pos]); |
endpos = *pos + (size_t)(term - &BUF(p)[*pos]); |
Line 764 doverbatim(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 924 doverbatim(struct texi *p, enum texicmd cmd, size_t *p |
|
assert(endpos <= BUFSZ(p)); |
assert(endpos <= BUFSZ(p)); |
assert('\n' == BUF(p)[*pos]); |
assert('\n' == BUF(p)[*pos]); |
advance(p, pos); |
advance(p, pos); |
teximacro(p, "Bd -literal -offset indent"); |
texivspace(p); |
|
teximacro(p, "Bd -literal -offset indent -compact"); |
|
p->seenvs = -1; |
while (*pos < endpos) { |
while (*pos < endpos) { |
texiputchar(p, BUF(p)[*pos]); |
texiputchar(p, BUF(p)[*pos]); |
advance(p, pos); |
advance(p, pos); |
} |
} |
|
p->seenvs = 0; |
teximacro(p, "Ed"); |
teximacro(p, "Ed"); |
|
texivspace(p); |
if (*pos < BUFSZ(p)) |
if (*pos < BUFSZ(p)) |
advanceto(p, pos, endpos + endsz); |
advanceto(p, pos, endpos + endsz); |
} |
} |
Line 777 doverbatim(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 941 doverbatim(struct texi *p, enum texicmd cmd, size_t *p |
|
static void |
static void |
doverbinclude(struct texi *p, enum texicmd cmd, size_t *pos) |
doverbinclude(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
char fname[PATH_MAX], path[PATH_MAX]; |
char fname[PATH_MAX], path[PATH_MAX]; |
int rc; |
int rc; |
size_t i, end; |
size_t i, end; |
const char *v; |
const char *v; |
enum texicmd type; |
enum texicmd type; |
|
|
Line 796 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
Line 960 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
} |
} |
type = texicmd(p, *pos, &end, NULL); |
type = texicmd(p, *pos, &end, NULL); |
advanceto(p, pos, end); |
advanceto(p, pos, end); |
if (TEXICMD_VALUE != type) |
if (TEXICMD_VALUE != type) |
texierr(p, "unknown verbatiminclude command"); |
texierr(p, "unknown verbatiminclude command"); |
v = valueblookup(p, pos); |
v = valueblookup(p, pos); |
if (NULL == v) |
if (NULL == v) |
Line 821 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
Line 985 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
if (strstr(fname, "../") || strstr(fname, "/..")) |
if (strstr(fname, "../") || strstr(fname, "/..")) |
texierr(p, "insecure path"); |
texierr(p, "insecure path"); |
|
|
rc = snprintf(path, sizeof(path), |
rc = snprintf(path, sizeof(path), |
"%s/%s", p->dirs[0], fname); |
"%s/%s", p->dirs[0], fname); |
if (rc < 0) |
if (rc < 0) |
texierr(p, "couldn't format path"); |
texierr(p, "couldn't format path"); |
else if ((size_t)rc >= sizeof(path)) |
else if ((size_t)rc >= sizeof(path)) |
texierr(p, "path too long"); |
texierr(p, "path too long"); |
Line 834 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
Line 998 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
static void |
static void |
doinclude(struct texi *p, enum texicmd cmd, size_t *pos) |
doinclude(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
char fname[PATH_MAX], path[PATH_MAX]; |
char fname[PATH_MAX], path[PATH_MAX]; |
size_t i, end; |
size_t i, end; |
int rc; |
int rc; |
const char *v; |
const char *v; |
enum texicmd type; |
enum texicmd type; |
|
|
Line 854 doinclude(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1018 doinclude(struct texi *p, enum texicmd cmd, size_t *po |
|
} |
} |
type = texicmd(p, *pos, &end, NULL); |
type = texicmd(p, *pos, &end, NULL); |
advanceto(p, pos, end); |
advanceto(p, pos, end); |
if (TEXICMD_VALUE != type) |
if (TEXICMD_VALUE != type) |
texierr(p, "unknown include command"); |
texierr(p, "unknown include command"); |
v = valueblookup(p, pos); |
v = valueblookup(p, pos); |
if (NULL == v) |
if (NULL == v) |
Line 880 doinclude(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1044 doinclude(struct texi *p, enum texicmd cmd, size_t *po |
|
texierr(p, "insecure path"); |
texierr(p, "insecure path"); |
|
|
for (i = 0; i < p->dirsz; i++) { |
for (i = 0; i < p->dirsz; i++) { |
rc = snprintf(path, sizeof(path), |
rc = snprintf(path, sizeof(path), |
"%s/%s", p->dirs[i], fname); |
"%s/%s", p->dirs[i], fname); |
if (rc < 0) |
if (rc < 0) |
texierr(p, "couldn't format path"); |
texierr(p, "couldn't format path"); |
else if ((size_t)rc >= sizeof(path)) |
else if ((size_t)rc >= sizeof(path)) |
texierr(p, "path too long"); |
texierr(p, "path too long"); |
|
|
dobracket(struct texi *p, enum texicmd cmd, size_t *pos) |
dobracket(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
parsebracket(p, pos); |
parsebracket(p, pos, 0); |
} |
} |
|
|
static void |
static void |
dodisplay(struct texi *p, enum texicmd cmd, size_t *pos) |
dodisplay(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
|
advanceeoln(p, pos, 1); |
|
texivspace(p); |
|
|
switch (cmd) { |
switch (cmd) { |
case (TEXICMD_FORMAT): |
case (TEXICMD_FORMAT): |
case (TEXICMD_SMALLFORMAT): |
case (TEXICMD_SMALLFORMAT): |
teximacro(p, "Bd -filled"); |
teximacro(p, "Bd -filled -compact"); |
break; |
break; |
default: |
default: |
teximacro(p, "Bd -filled -offset indent"); |
teximacro(p, "Bd -filled -offset indent -compact"); |
break; |
break; |
} |
} |
|
|
p->seenvs = 1; |
p->seenvs = -1; |
/* FIXME: ignore and parseeoln. */ |
|
advanceeoln(p, pos, 1); |
|
parseto(p, pos, texitoks[cmd].tok); |
parseto(p, pos, texitoks[cmd].tok); |
|
p->seenvs = 0; |
teximacro(p, "Ed"); |
teximacro(p, "Ed"); |
|
texivspace(p); |
} |
} |
|
|
static void |
static void |
doexample(struct texi *p, enum texicmd cmd, size_t *pos) |
doexample(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
teximacro(p, "Bd -literal -offset indent"); |
|
/* FIXME: ignore and parseeoln. */ |
|
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
|
|
|
texivspace(p); |
|
teximacro(p, "Bd -literal -offset indent -compact"); |
p->literal++; |
p->literal++; |
parseto(p, pos, texitoks[cmd].tok); |
parseto(p, pos, texitoks[cmd].tok); |
p->literal--; |
p->literal--; |
|
p->seenvs = 0; |
teximacro(p, "Ed"); |
teximacro(p, "Ed"); |
|
texivspace(p); |
} |
} |
|
|
static void |
static void |
Line 948 dobye(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1118 dobye(struct texi *p, enum texicmd cmd, size_t *pos) |
|
static void |
static void |
dotitle(struct texi *p, enum texicmd cmd, size_t *pos) |
dotitle(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
size_t start, end; |
size_t start; |
|
|
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
advance(p, pos); |
advance(p, pos); |
start = end = *pos; |
|
while (end < BUFSZ(p) && '\n' != BUF(p)[end]) |
/* We want to suck down the entire line, inclusive \n. */ |
end++; |
start = *pos; |
advanceeoln(p, pos, 1); |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) { |
|
if ('@' == BUF(p)[*pos]) |
|
advance(p, pos); |
|
advance(p, pos); |
|
} |
|
if (*pos < BUFSZ(p)) |
|
advance(p, pos); |
|
|
|
/* Copy this into a buffer. */ |
free(p->subtitle); |
free(p->subtitle); |
p->subtitle = malloc(end - start + 1); |
if (NULL == (p->subtitle = malloc(*pos - start + 1))) |
if (NULL == p->subtitle) |
|
texiabort(p, NULL); |
texiabort(p, NULL); |
memcpy(p->subtitle, &BUF(p)[start], end - start); |
memcpy(p->subtitle, &BUF(p)[start], *pos - start); |
p->subtitle[end - start] = '\0'; |
p->subtitle[*pos - start] = '\0'; |
} |
} |
|
|
static void |
static void |
Line 990 doaccent(struct texi *p, enum texicmd cmd, size_t *pos |
|
Line 1167 doaccent(struct texi *p, enum texicmd cmd, size_t *pos |
|
if ('{' == BUF(p)[*pos]) { |
if ('{' == BUF(p)[*pos]) { |
brace = 1; |
brace = 1; |
advance(p, pos); |
advance(p, pos); |
} else if (isalpha((unsigned char)texitoks[cmd].tok[0])) |
} else if (isalpha((unsigned char)texitoks[cmd].tok[0])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
advance(p, pos); |
advance(p, pos); |
|
|
Line 1108 doaccent(struct texi *p, enum texicmd cmd, size_t *pos |
|
Line 1285 doaccent(struct texi *p, enum texicmd cmd, size_t *pos |
|
} |
} |
if (*pos < BUFSZ(p)) |
if (*pos < BUFSZ(p)) |
advance(p, pos); |
advance(p, pos); |
} |
} |
|
|
switch (cmd) { |
switch (cmd) { |
case (TEXICMD_TIEACCENT): |
case (TEXICMD_TIEACCENT): |
Line 1154 dosymbol(struct texi *p, enum texicmd cmd, size_t *pos |
|
Line 1331 dosymbol(struct texi *p, enum texicmd cmd, size_t *pos |
|
case (TEXICMD_AT): |
case (TEXICMD_AT): |
texiputchar(p, '@'); |
texiputchar(p, '@'); |
break; |
break; |
|
case (TEXICMD_BACKSLASH): |
|
texiputchar(p, '\\'); |
|
break; |
case (TEXICMD_BANG): |
case (TEXICMD_BANG): |
texiputchar(p, '!'); |
texiputchar(p, '!'); |
break; |
break; |
Line 1319 dosymbol(struct texi *p, enum texicmd cmd, size_t *pos |
|
Line 1499 dosymbol(struct texi *p, enum texicmd cmd, size_t *pos |
|
static void |
static void |
doquotation(struct texi *p, enum texicmd cmd, size_t *pos) |
doquotation(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
teximacro(p, "Qo"); |
teximacro(p, "Qo"); |
parseto(p, pos, "quotation"); |
parseto(p, pos, "quotation"); |
teximacro(p, "Qc"); |
teximacro(p, "Qc"); |
} |
} |
|
|
|
static int |
|
indexcmp(const void *p1, const void *p2) |
|
{ |
|
const struct texiterm *t1 = p1, *t2 = p2; |
|
|
|
return(strcasecmp(t1->term, t2->term)); |
|
} |
|
|
static void |
static void |
domath(struct texi *p, enum texicmd cmd, size_t *pos) |
doprintindex(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
size_t nest, start; |
static size_t guard = 0; |
|
size_t i, j, start, end, len; |
|
#if HAVE_INDEX |
|
char *cp; |
|
char buf[PATH_MAX]; |
|
#endif |
|
|
/* |
if (guard++ > 8) |
* Math handling is different from everything else. |
texierr(p, "recursive @printindex"); |
* We don't allow any subcomponents, and we ignore the rules in |
|
* terms of @-commands. |
|
* This departs from GNU's rules, but whatever. |
|
*/ |
|
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
advance(p, pos); |
advance(p, pos); |
if (*pos == BUFSZ(p) || '{' != BUF(p)[*pos]) |
start = *pos; |
|
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
|
advance(p, pos); |
|
if ((end = *pos) == BUFSZ(p)) { |
|
texiwarn(p, "unexpected EOF"); |
|
guard--; |
return; |
return; |
|
} |
|
|
advance(p, pos); |
advance(p, pos); |
if (p->seenws && p->outcol && 0 == p->literal) |
if (*pos == BUFSZ(p)) { |
texiputchar(p, ' '); |
texiwarn(p, "unexpected EOF"); |
p->seenws = 0; |
guard--; |
for (nest = 1, start = *pos; *pos < BUFSZ(p) && nest > 0; ) { |
return; |
if ('{' == BUF(p)[*pos]) |
} else if (0 == (len = end - start)) { |
nest++; |
texiwarn(p, "zero-length index"); |
else if ('}' == BUF(p)[*pos]) |
guard--; |
if (0 == --nest) |
return; |
continue; |
} |
|
|
|
/* Look for the index in our table. */ |
|
for (i = 0; i < p->indexsz; i++) { |
|
if (strlen(p->indexs[i].name) != len) |
|
continue; |
|
if (strncmp(p->indexs[i].name, &BUF(p)[start], len)) |
|
continue; |
|
break; |
|
} |
|
|
|
if (i == p->indexsz) { |
|
texiwarn(p, "cannot find index"); |
|
guard--; |
|
return; |
|
} else if (0 == p->indexs[i].indexsz) { |
|
guard--; |
|
return; |
|
} |
|
|
|
/* Alphabetically sort our indices. */ |
|
qsort(p->indexs[i].index, |
|
p->indexs[i].indexsz, |
|
sizeof(struct texiterm), indexcmp); |
|
|
|
texivspace(p); |
|
teximacro(p, "Bl -tag -width Ds -compact"); |
|
for (j = 0; j < p->indexs[i].indexsz; j++) { |
|
teximacroopen(p, "It"); |
|
#if HAVE_INDEX |
|
if (NULL == p->chapters) { |
|
teximacroopen(p, "Lkx"); |
|
texiputchars(p, "\"idx"); |
|
texiputchars(p, p->indexs[i].name); |
|
cp = p->indexs[i].index[j].term; |
|
while ('\n' != *cp) |
|
texiputchar(p, *cp++); |
|
texiputchars(p, "\" \""); |
|
p->literal++; |
|
} else { |
|
teximacroopen(p, "Xr"); |
|
snprintf(buf, sizeof(buf), "%s-%zd 7 \"idx", |
|
p->chapters, p->indexs[i].index[j].chapter); |
|
texiputchars(p, buf); |
|
texiputchars(p, p->indexs[i].name); |
|
cp = p->indexs[i].index[j].term; |
|
while ('\n' != *cp) |
|
texiputchar(p, *cp++); |
|
texiputchars(p, "\" \""); |
|
p->literal++; |
|
} |
|
#endif |
|
texisplice(p, p->indexs[i].index[j].term, |
|
strlen(p->indexs[i].index[j].term), *pos); |
|
parseeoln(p, pos); |
|
#if HAVE_INDEX |
|
p->literal--; |
|
texiputchars(p, "\""); |
|
teximacroclose(p); |
|
#endif |
|
teximacroclose(p); |
|
} |
|
p->seenvs = 0; |
|
teximacro(p, "El"); |
|
texivspace(p); |
|
guard--; |
|
} |
|
|
|
static void |
|
donode(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
int sv = p->seenvs; |
|
char fname[PATH_MAX]; |
|
size_t end, start; |
|
|
|
if (0 == p->nodesz++) |
|
p->ign--; |
|
|
|
/* Grab our node name. */ |
|
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
advance(p, pos); |
advance(p, pos); |
|
start = *pos; |
|
while (*pos < BUFSZ(p)) { |
|
if (BUF(p)[*pos] == ',') |
|
break; |
|
else if (BUF(p)[*pos] == '\n') |
|
break; |
|
advance(p, pos); |
} |
} |
if (*pos == BUFSZ(p)) |
if (*pos == BUFSZ(p)) { |
|
texiwarn(p, "unexpected EOF"); |
return; |
return; |
assert('}' == BUF(p)[*pos]); |
} |
texiputbuf(p, start, *pos); |
end = *pos; |
advance(p, pos); |
advanceeoln(p, pos, 1); |
|
|
|
if (NULL != p->chapters) |
|
teximdocclose(p, 0); |
|
|
|
/* Cache our node name. */ |
|
p->nodecur = texicache(p, &BUF(p)[start], end - start); |
|
|
|
if (NULL != p->chapters) { |
|
snprintf(fname, sizeof(fname), |
|
"%s-%zd.7", p->chapters, p->nodecur); |
|
p->outfile = fopen(fname, "w"); |
|
if (NULL == p->outfile) |
|
texiabort(p, fname); |
|
teximdocopen(p, pos); |
|
} else if (p->nodesz > 1) { |
|
/* Otherwise, mark our index. */ |
|
p->seenvs = -1; |
|
#if HAVE_INDEX |
|
teximacroopen(p, "Ix"); |
|
texiputchars(p, "node"); |
|
texiputchars(p, p->nodecache[p->nodecur].name); |
|
teximacroclose(p); |
|
#endif |
|
p->seenvs = sv; |
|
} else |
|
teximdocopen(p, pos); |
} |
} |
|
|
|
/* |
|
* This handles both menu and detailedmenu. |
|
* The syntax of these is fairly... unspecific, but what we do here |
|
* seems to work with most manuals. |
|
*/ |
static void |
static void |
|
domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
size_t nodename, entryname; |
|
size_t nodenameend, entrynameend, i; |
|
ssize_t ppos, lastppos; |
|
char buf[PATH_MAX]; |
|
enum texicmd tcmd; |
|
|
|
advanceeoln(p, pos, 1); |
|
|
|
/* |
|
* Parse past initial stuff. |
|
* TODO: the manual says we're supposed to make this in bold or |
|
* something. |
|
*/ |
|
while (*pos < BUFSZ(p)) { |
|
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
|
advance(p, pos); |
|
if (*pos < BUFSZ(p) && '*' != BUF(p)[*pos]) { |
|
if (TEXICMD_END == peeklinecmd(p, *pos)) |
|
break; |
|
parseeoln(p, pos); |
|
} else |
|
break; |
|
} |
|
|
|
lastppos = -1; |
|
texivspace(p); |
|
teximacro(p, "Bl -tag -width Ds -compact"); |
|
while (*pos < BUFSZ(p)) { |
|
/* |
|
* Read to next menu item. |
|
* We simply parse every line until we get a magic '*'. |
|
* These lines might occur interspersed OR as the |
|
* description of an entry. |
|
* Either way it's in the `It' block. |
|
*/ |
|
if (0 == p->seenws) |
|
p->seenws = *pos < BUFSZ(p) && isws(BUF(p)[*pos]); |
|
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
|
advance(p, pos); |
|
if (*pos == BUFSZ(p)) { |
|
texiwarn(p, "unexpected EOF"); |
|
return; |
|
} else if ('*' != BUF(p)[*pos]) { |
|
tcmd = peeklinecmd(p, *pos); |
|
if (TEXICMD_END == tcmd) |
|
break; |
|
else if (TEXICMD_COMMENT == tcmd) |
|
advanceeoln(p, pos, 1); |
|
else |
|
parseeoln(p, pos); |
|
continue; |
|
} |
|
|
|
/* Now we're parsing a menu item. */ |
|
advance(p, pos); |
|
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
|
advance(p, pos); |
|
entryname = *pos; |
|
while (*pos < BUFSZ(p) && ':' != BUF(p)[*pos]) |
|
advance(p, pos); |
|
entrynameend = *pos; |
|
if (*pos == BUFSZ(p)) { |
|
texiwarn(p, "unexpected EOF"); |
|
return; |
|
} |
|
advance(p, pos); |
|
|
|
p->seenvs = 0; |
|
teximacroopen(p, "It"); |
|
if (*pos == BUFSZ(p)) { |
|
texiwarn(p, "bad menu syntax"); |
|
break; |
|
} else if (':' != BUF(p)[*pos]) { |
|
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
|
advance(p, pos); |
|
nodename = *pos; |
|
while (*pos < BUFSZ(p)) { |
|
switch (BUF(p)[*pos]) { |
|
case ('\t'): |
|
case ('\n'): |
|
case (','): |
|
break; |
|
case ('.'): |
|
if (*pos + 1 == BUFSZ(p)) { |
|
advance(p, pos); |
|
continue; |
|
} |
|
if (' ' == BUF(p)[*pos + 1]) { |
|
advance(p, pos); |
|
break; |
|
} |
|
/* FALLTHROUGH */ |
|
default: |
|
advance(p, pos); |
|
continue; |
|
} |
|
advance(p, pos); |
|
break; |
|
} |
|
nodenameend = *pos; |
|
} else { |
|
advance(p, pos); |
|
nodename = entryname; |
|
nodenameend = entrynameend; |
|
} |
|
ppos = texicache(p, &BUF(p)[nodename], |
|
nodenameend - nodename); |
|
if (-1 != lastppos) |
|
p->nodecache[lastppos].next = ppos; |
|
p->nodecache[ppos].prev = lastppos; |
|
p->nodecache[ppos].up = p->nodecur; |
|
lastppos = ppos; |
|
#ifdef HAVE_INDEX |
|
if (NULL == p->chapters) { |
|
teximacroopen(p, "Lkx"); |
|
texiputchars(p, "\"node"); |
|
for (i = nodename; i < nodenameend; i++) |
|
texiputchar(p, BUF(p)[i]); |
|
texiputchars(p, "\" \""); |
|
for (i = entryname; i < entrynameend; i++) |
|
texiputchar(p, BUF(p)[i]); |
|
texiputchars(p, "\""); |
|
teximacroclose(p); |
|
} else { |
|
snprintf(buf, sizeof(buf), |
|
"%s-%zd 7 ", p->chapters, ppos); |
|
teximacroopen(p, "Xr"); |
|
texiputchars(p, buf); |
|
texiputchars(p, "\"node"); |
|
for (i = nodename; i < nodenameend; i++) |
|
texiputchar(p, BUF(p)[i]); |
|
texiputchars(p, "\" \""); |
|
for (i = entryname; i < entrynameend; i++) |
|
texiputchar(p, BUF(p)[i]); |
|
texiputchars(p, "\""); |
|
teximacroclose(p); |
|
} |
|
#else |
|
for (i = entryname; i < entrynameend; i++) |
|
texiputchar(p, BUF(p)[i]); |
|
#endif |
|
teximacroclose(p); |
|
} |
|
|
|
advanceeoln(p, pos, 0); |
|
p->seenvs = 0; |
|
teximacro(p, "El"); |
|
texivspace(p); |
|
} |
|
|
|
static void |
|
domath(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
|
|
parsebracket(p, pos, 1); |
|
} |
|
|
|
static void |
dovalue(struct texi *p, enum texicmd cmd, size_t *pos) |
dovalue(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
size_t start, end; |
size_t start, end; |
Line 1402 dovalue(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1877 dovalue(struct texi *p, enum texicmd cmd, size_t *pos) |
|
texiputchar(p, ' '); |
texiputchar(p, ' '); |
p->seenws = 0; |
p->seenws = 0; |
if (NULL != (cp = valueblookup(p, pos))) |
if (NULL != (cp = valueblookup(p, pos))) |
texisplice(p, cp, strlen(cp), pos); |
texisplice(p, cp, strlen(cp), *pos); |
else |
else |
texiputchars(p, "{No value}"); |
texiputchars(p, "{No value}"); |
} else if (TEXICMD_IFCLEAR == cmd) { |
} else if (TEXICMD_IFCLEAR == cmd) { |
Line 1492 sectioner(struct texi *p, int sec) |
|
Line 1967 sectioner(struct texi *p, int sec) |
|
} |
} |
|
|
static void |
static void |
dosubsubsection(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
int sec; |
|
|
|
sec = sectioner(p, 3); |
|
|
|
/* We don't have a subsubsubsection, so make one up. */ |
|
texivspace(p); |
|
teximacroopen(p, sects[sec]); |
|
parseeoln(p, pos); |
|
teximacroclose(p); |
|
texivspace(p); |
|
} |
|
|
|
static void |
|
dosubsection(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
int sec; |
|
|
|
sec = sectioner(p, 2); |
|
|
|
if (p->outmacro) |
|
texierr(p, "\"%s\" in open line scope!?", sects[sec]); |
|
else if (p->literal) |
|
texierr(p, "\"%s\" in a literal scope!?", sects[sec]); |
|
|
|
/* We don't have a subsubsection, so make one up. */ |
|
if (sec > 1) |
|
texivspace(p); |
|
teximacroopen(p, sects[sec]); |
|
parseeoln(p, pos); |
|
teximacroclose(p); |
|
if (sec > 1) |
|
texivspace(p); |
|
} |
|
|
|
static void |
|
dosecoffs(struct texi *p, enum texicmd cmd, size_t *pos) |
dosecoffs(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
Line 1544 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1982 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
int sec; |
int sec; |
|
|
switch (cmd) { |
switch (cmd) { |
|
case (TEXICMD_TOP): |
|
sec = 0; |
|
break; |
case (TEXICMD_APPENDIX): |
case (TEXICMD_APPENDIX): |
case (TEXICMD_CHAPTER): |
case (TEXICMD_CHAPTER): |
case (TEXICMD_TOP): |
|
case (TEXICMD_UNNUMBERED): |
case (TEXICMD_UNNUMBERED): |
sec = sectioner(p, 0); |
sec = sectioner(p, 0); |
break; |
break; |
Line 1556 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1996 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
case (TEXICMD_UNNUMBEREDSEC): |
case (TEXICMD_UNNUMBEREDSEC): |
sec = sectioner(p, 1); |
sec = sectioner(p, 1); |
break; |
break; |
|
case (TEXICMD_APPENDIXSUBSEC): |
|
case (TEXICMD_SUBHEADING): |
|
case (TEXICMD_SUBSECTION): |
|
case (TEXICMD_UNNUMBEREDSUBSEC): |
|
sec = sectioner(p, 2); |
|
break; |
|
case (TEXICMD_APPENDIXSUBSUBSEC): |
|
case (TEXICMD_SUBSUBHEADING): |
|
case (TEXICMD_SUBSUBSECTION): |
|
case (TEXICMD_UNNUMBEREDSUBSUBSEC): |
|
sec = sectioner(p, 3); |
|
break; |
default: |
default: |
abort(); |
abort(); |
} |
} |
Line 1565 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 2017 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
else if (p->literal) |
else if (p->literal) |
texierr(p, "\"%s\" in a literal scope!?", sects[sec]); |
texierr(p, "\"%s\" in a literal scope!?", sects[sec]); |
|
|
|
if (sec < 2) |
|
p->seenvs = -1; |
|
else |
|
texivspace(p); |
|
|
teximacroopen(p, sects[sec]); |
teximacroopen(p, sects[sec]); |
parseeoln(p, pos); |
parseeoln(p, pos); |
teximacroclose(p); |
teximacroclose(p); |
p->seenvs = 1; |
|
|
if (sec < 2) |
|
p->seenvs = -1; |
|
else |
|
texivspace(p); |
} |
} |
|
|
static void |
static void |
dosp(struct texi *p, enum texicmd cmd, size_t *pos) |
dosp(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
|
advanceeoln(p, pos, 1); |
if (p->literal) |
if (p->literal) |
texiputchar(p, '\n'); |
texiputchar(p, '\n'); |
else |
else |
texivspace(p); |
texivspace(p); |
/* FIXME: ignore and parseeoln. */ |
|
advanceeoln(p, pos, 1); |
|
} |
} |
|
|
static void |
static void |
dotop(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
const char *cp; |
|
time_t t; |
|
char date[32]; |
|
|
|
if (--p->ign) |
|
texierr(p, "@top command while ignoring"); |
|
|
|
/* |
|
* Here we print our standard mdoc(7) prologue. |
|
* We use the title set with @settitle for the `Nd' description |
|
* and the source document filename (the first one as invoked on |
|
* the command line) for the title. |
|
* The date is set to the current date. |
|
*/ |
|
t = time(NULL); |
|
strftime(date, sizeof(date), "%F", localtime(&t)); |
|
|
|
teximacroopen(p, "Dd"); |
|
texiputchars(p, date); |
|
teximacroclose(p); |
|
teximacroopen(p, "Dt"); |
|
for (cp = p->title; '\0' != *cp; cp++) |
|
texiputchar(p, toupper((unsigned int)*cp)); |
|
texiputchars(p, " 7"); |
|
teximacroclose(p); |
|
teximacro(p, "Os"); |
|
teximacro(p, "Sh NAME"); |
|
teximacroopen(p, "Nm"); |
|
for (cp = p->title; '\0' != *cp; cp++) |
|
texiputchar(p, *cp); |
|
teximacroclose(p); |
|
teximacroopen(p, "Nd"); |
|
if (NULL != p->subtitle) |
|
for (cp = p->subtitle; '\0' != *cp; cp++) |
|
texiputchar(p, *cp); |
|
else |
|
texiputchars(p, "Unknown description"); |
|
teximacroclose(p); |
|
p->seenvs = 1; |
|
dosection(p, cmd, pos); |
|
} |
|
|
|
static void |
|
doitem(struct texi *p, enum texicmd cmd, size_t *pos) |
doitem(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
/* Multitable is using raw tbl(7). */ |
/* Multitable is using raw tbl(7). */ |
if (TEXILIST_TABLE == p->list) { |
if (TEXILIST_TABLE == p->list) { |
texiputchar(p, '\n'); |
if (p->outcol > 0) |
|
texiputchar(p, '\n'); |
return; |
return; |
} |
} |
|
|
if (p->outmacro) |
if (p->outmacro) |
texierr(p, "item in open line scope!?"); |
texierr(p, "item in open line scope!?"); |
else if (p->literal) |
else if (p->literal) |
Line 1645 doitem(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 2061 doitem(struct texi *p, enum texicmd cmd, size_t *pos) |
|
|
|
switch (p->list) { |
switch (p->list) { |
case (TEXILIST_ITEM): |
case (TEXILIST_ITEM): |
|
p->seenvs = -1; |
teximacroopen(p, "It"); |
teximacroopen(p, "It"); |
break; |
break; |
case (TEXILIST_NOITEM): |
case (TEXILIST_NOITEM): |
|
p->seenvs = -1; |
teximacro(p, "It"); |
teximacro(p, "It"); |
break; |
break; |
default: |
default: |
Line 1656 doitem(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 2074 doitem(struct texi *p, enum texicmd cmd, size_t *pos) |
|
} |
} |
|
|
/* Trick so we don't start with Pp. */ |
/* Trick so we don't start with Pp. */ |
p->seenvs = 1; |
|
parseeoln(p, pos); |
parseeoln(p, pos); |
|
|
if (TEXILIST_ITEM == p->list) |
if (TEXILIST_ITEM == p->list) |
Line 1670 dotab(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 2087 dotab(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
{ |
|
|
/* This command is only useful in @multitable. */ |
/* This command is only useful in @multitable. */ |
if (TEXILIST_TABLE == p->list) |
if (TEXILIST_TABLE == p->list && p->outcol) |
texiputchar(p, '\t'); |
texiputchar(p, '\t'); |
} |
} |
|
|
Line 1682 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
Line 2099 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
enum texicmd type; |
enum texicmd type; |
size_t i, end, columns; |
size_t i, end, columns; |
|
|
|
texivspace(p); |
p->list = TEXILIST_TABLE; |
p->list = TEXILIST_TABLE; |
/* |
/* |
* TS/TE blocks aren't "in mdoc(7)", so we can disregard the |
* TS/TE blocks aren't "in mdoc(7)", so we can disregard the |
* fact that we're in literal mode right now. |
* fact that we're in literal mode right now. |
*/ |
*/ |
Line 1697 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
Line 2115 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
|
|
/* Make sure we don't print anything when scanning. */ |
/* Make sure we don't print anything when scanning. */ |
p->ign++; |
p->ign++; |
if ('@' == BUF(p)[*pos]) { |
if (*pos < BUFSZ(p) && '@' == BUF(p)[*pos]) { |
/* |
/* |
* Look for @columnfractions. |
* Look for @columnfractions. |
* We ignore these, but we do use the number of |
* We ignore these, but we do use the number of |
* arguments to set the number of columns that we'll |
* arguments to set the number of columns that we'll |
Line 1706 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
Line 2124 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
*/ |
*/ |
type = texicmd(p, *pos, &end, NULL); |
type = texicmd(p, *pos, &end, NULL); |
advanceto(p, pos, end); |
advanceto(p, pos, end); |
if (TEXICMD_COLUMNFRACTIONS != type) |
if (TEXICMD_COLUMNFRACTIONS != type) |
texierr(p, "unknown multitable command"); |
texierr(p, "unknown multitable command"); |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) { |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) { |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
Line 1718 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
Line 2136 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
} |
} |
columns++; |
columns++; |
} |
} |
} else |
} else |
/* |
/* |
* We have arguments. |
* We have arguments. |
* We could parse these, but it's easier to just let |
* We could parse these, but it's easier to just let |
Line 1735 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
Line 2153 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
texiputchar(p, ' '); |
texiputchar(p, ' '); |
texiputchar(p, 'l'); |
texiputchar(p, 'l'); |
} |
} |
texiputchars(p, ".\n"); |
|
|
texiputchar(p, '.'); |
|
texiputchar(p, '\n'); |
p->outmacro++; |
p->outmacro++; |
parseto(p, pos, texitoks[cmd].tok); |
parseto(p, pos, texitoks[cmd].tok); |
p->outmacro--; |
p->outmacro--; |
teximacro(p, "TE"); |
teximacro(p, "TE"); |
p->literal = svliteral; |
p->literal = svliteral; |
p->list = sv; |
p->list = sv; |
|
texivspace(p); |
} |
} |
|
|
static void |
static void |
Line 1749 dotable(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 2170 dotable(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
{ |
enum texilist sv = p->list; |
enum texilist sv = p->list; |
|
|
p->list = TEXILIST_ITEM; |
|
teximacro(p, "Bl -tag -width Ds"); |
|
/* FIXME: ignore and parseeoln. */ |
|
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
p->seenvs = 1; |
|
|
p->list = TEXILIST_ITEM; |
|
texivspace(p); |
|
teximacro(p, "Bl -tag -width Ds -compact"); |
parseto(p, pos, texitoks[cmd].tok); |
parseto(p, pos, texitoks[cmd].tok); |
|
p->seenvs = 0; |
teximacro(p, "El"); |
teximacro(p, "El"); |
|
texivspace(p); |
p->list = sv; |
p->list = sv; |
} |
} |
|
|
Line 1770 doend(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 2193 doend(struct texi *p, enum texicmd cmd, size_t *pos) |
|
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
advance(p, pos); |
advance(p, pos); |
|
|
texiwarn(p, "unexpected \"end\": %.*s", (int)(*pos - start), &BUF(p)[start]); |
texiwarn(p, "unexpected \"end\": %.*s", |
|
(int)(*pos - start), &BUF(p)[start]); |
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
} |
} |
|
|
Line 1779 doenumerate(struct texi *p, enum texicmd cmd, size_t * |
|
Line 2203 doenumerate(struct texi *p, enum texicmd cmd, size_t * |
|
{ |
{ |
enum texilist sv = p->list; |
enum texilist sv = p->list; |
|
|
p->list = TEXILIST_NOITEM; |
|
teximacro(p, "Bl -enum"); |
|
p->seenvs = 1; |
|
/* FIXME: ignore and parseeoln. */ |
|
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
parseto(p, pos, "enumerate"); |
|
|
p->list = TEXILIST_NOITEM; |
|
texivspace(p); |
|
teximacro(p, "Bl -enum -compact"); |
|
parseto(p, pos, texitoks[cmd].tok); |
|
p->seenvs = 0; |
teximacro(p, "El"); |
teximacro(p, "El"); |
|
texivspace(p); |
p->list = sv; |
p->list = sv; |
} |
} |
|
|
Line 1794 doitemize(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 2220 doitemize(struct texi *p, enum texicmd cmd, size_t *po |
|
{ |
{ |
enum texilist sv = p->list; |
enum texilist sv = p->list; |
|
|
p->list = TEXILIST_NOITEM; |
|
teximacro(p, "Bl -bullet"); |
|
p->seenvs = 1; |
|
/* FIXME: ignore and parseeoln. */ |
|
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
parseto(p, pos, "itemize"); |
|
|
p->list = TEXILIST_NOITEM; |
|
texivspace(p); |
|
teximacro(p, "Bl -bullet -compact"); |
|
parseto(p, pos, texitoks[cmd].tok); |
|
p->seenvs = 0; |
teximacro(p, "El"); |
teximacro(p, "El"); |
|
texivspace(p); |
p->list = sv; |
p->list = sv; |
} |
} |
|
|
Line 1809 doignbracket(struct texi *p, enum texicmd cmd, size_t |
|
Line 2237 doignbracket(struct texi *p, enum texicmd cmd, size_t |
|
{ |
{ |
|
|
p->ign++; |
p->ign++; |
parsebracket(p, pos); |
parsebracket(p, pos, 0); |
p->ign--; |
p->ign--; |
} |
} |
|
|
static void |
static void |
|
doindex(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
size_t start, end, len; |
|
|
|
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
|
advance(p, pos); |
|
|
|
start = *pos; |
|
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
|
advance(p, pos); |
|
|
|
if (*pos == BUFSZ(p)) { |
|
texiwarn(p, "unexpected EOF"); |
|
return; |
|
} |
|
|
|
advance(p, pos); |
|
end = *pos; |
|
if (0 == (len = end - start)) { |
|
texiwarn(p, "zero-length index"); |
|
return; |
|
} |
|
|
|
/* Two-letter combos we can look up verbatim. */ |
|
if (7 == texitoks[cmd].len) { |
|
texindex(p, texitoks[cmd].tok, 2, &BUF(p)[start], len); |
|
return; |
|
} |
|
|
|
assert(6 == texitoks[cmd].len); |
|
/* Newer one-letter combos need to be mapped. */ |
|
switch (texitoks[cmd].tok[0]) { |
|
case ('c'): |
|
texindex(p, "cp", 2, &BUF(p)[start], len); |
|
break; |
|
case ('v'): |
|
texindex(p, "vr", 2, &BUF(p)[start], len); |
|
break; |
|
case ('f'): |
|
texindex(p, "fn", 2, &BUF(p)[start], len); |
|
break; |
|
case ('t'): |
|
texindex(p, "tp", 2, &BUF(p)[start], len); |
|
break; |
|
default: |
|
abort(); |
|
} |
|
} |
|
|
|
static void |
doignline(struct texi *p, enum texicmd cmd, size_t *pos) |
doignline(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
/* FIXME: ignore and parseeoln. */ |
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
|
} |
} |
|
|
/* |
/* |
Line 1830 doignline(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 2307 doignline(struct texi *p, enum texicmd cmd, size_t *po |
|
static char ** |
static char ** |
parsedirs(struct texi *p, const char *base, const char *cp, size_t *sz) |
parsedirs(struct texi *p, const char *base, const char *cp, size_t *sz) |
{ |
{ |
char *tok, *str, *tofree; |
char *tok, *str, *tofree; |
const char *cpp; |
const char *cpp; |
size_t i = 0; |
size_t i = 0; |
char **dirs; |
char **dirs; |
|
|
/* Count up our expected arguments. */ |
/* Count up our expected arguments. */ |
Line 1845 parsedirs(struct texi *p, const char *base, const char |
|
Line 2322 parsedirs(struct texi *p, const char *base, const char |
|
return(NULL); |
return(NULL); |
if (NULL == (dirs = calloc(*sz, sizeof(char *)))) |
if (NULL == (dirs = calloc(*sz, sizeof(char *)))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
if (NULL != base && NULL == (dirs[i++] = 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 ( ; 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); |
|
|
free(tofree); |
free(tofree); |
Line 1876 main(int argc, char *argv[]) |
|
Line 2353 main(int argc, char *argv[]) |
|
|
|
memset(&texi, 0, sizeof(struct texi)); |
memset(&texi, 0, sizeof(struct texi)); |
texi.ign = 1; |
texi.ign = 1; |
|
texi.outfile = stdout; |
|
texi.seenvs = -1; |
Idir = NULL; |
Idir = NULL; |
|
|
while (-1 != (c = getopt(argc, argv, "I:"))) |
while (-1 != (c = getopt(argc, argv, "C:I:"))) |
switch (c) { |
switch (c) { |
|
case ('C'): |
|
texi.chapters = optarg; |
|
break; |
case ('I'): |
case ('I'): |
Idir = optarg; |
Idir = optarg; |
break; |
break; |
Line 1890 main(int argc, char *argv[]) |
|
Line 2372 main(int argc, char *argv[]) |
|
argv += optind; |
argv += optind; |
argc -= optind; |
argc -= optind; |
|
|
|
/* Add the default Texinfo indices. */ |
|
texindex_add(&texi, "cp", 2); |
|
texindex_add(&texi, "vr", 2); |
|
texindex_add(&texi, "tp", 2); |
|
texindex_add(&texi, "fn", 2); |
|
|
if (argc > 0) { |
if (argc > 0) { |
if (NULL == (dirpath = strdup(argv[0]))) |
if (NULL == (dirpath = strdup(argv[0]))) |
texiabort(&texi, NULL); |
texiabort(&texi, NULL); |
if (NULL == (dir = dirname(dirpath))) |
if (NULL == (dir = dirname(dirpath))) |
texiabort(&texi, NULL); |
texiabort(&texi, NULL); |
if (NULL != (cp = strrchr(argv[0], '/'))) |
if (NULL != (cp = strrchr(argv[0], '/'))) |
texi.title = strdup(cp + 1); |
texi.title = strdup(cp + 1); |
else |
else |
texi.title = strdup(argv[0]); |
texi.title = strdup(argv[0]); |
Line 1913 main(int argc, char *argv[]) |
|
Line 2401 main(int argc, char *argv[]) |
|
} |
} |
|
|
texiexit(&texi); |
texiexit(&texi); |
return(EXIT_FAILURE); |
exit(EXIT_SUCCESS); |
usage: |
usage: |
fprintf(stderr, "usage: %s [-Idirs] [file]\n", progname); |
fprintf(stderr, "usage: %s [-Cdir] [-Idirs] [file]\n", progname); |
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |