version 1.65, 2015/03/09 18:54:38 |
version 1.66, 2015/03/11 12:51:41 |
|
|
|
|
#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 *); |
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 doinsertcopying(struct texi *, enum texicmd, size_t *); |
Line 61 static void doitemize(struct texi *, enum texicmd, siz |
|
Line 70 static void doitemize(struct texi *, enum texicmd, siz |
|
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 *); |
#if 0 |
|
static void domenu(struct texi *, enum texicmd, size_t *); |
static void domenu(struct texi *, enum texicmd, size_t *); |
#endif |
|
static void domultitable(struct texi *, enum texicmd, size_t *); |
static void domultitable(struct texi *, enum texicmd, size_t *); |
#if 0 |
|
static void donode(struct texi *, enum texicmd, size_t *); |
static void donode(struct texi *, enum texicmd, size_t *); |
#endif |
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 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 96 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 100 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 */ |
Line 111 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 115 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 149 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 153 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dodefn, "defvarx", 7 }, /* TEXICMD_DEFVARX */ |
{ dodefn, "defvarx", 7 }, /* TEXICMD_DEFVARX */ |
{ dodefn, "defvr", 5 }, /* TEXICMD_DEFVR */ |
{ dodefn, "defvr", 5 }, /* TEXICMD_DEFVR */ |
{ dodefn, "defvrx", 6 }, /* TEXICMD_DEFVRX */ |
{ dodefn, "defvrx", 6 }, /* TEXICMD_DEFVRX */ |
{ doignblock, "detailmenu", 10 }, /* TEXICMD_DETAILMENU */ |
{ domenu, "detailmenu", 10 }, /* TEXICMD_DETAILMENU */ |
{ doinline, "dfn", 3 }, /* TEXICMD_DFN */ |
{ doinline, "dfn", 3 }, /* TEXICMD_DFN */ |
{ dosymbol, "DH", 2 }, /* TEXICMD_DH */ |
{ dosymbol, "DH", 2 }, /* TEXICMD_DH */ |
{ dosymbol, "dh", 2 }, /* TEXICMD_DHSMALL */ |
{ dosymbol, "dh", 2 }, /* TEXICMD_DHSMALL */ |
Line 178 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 182 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 237 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 241 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 */ |
#if 0 |
|
{ domenu, "menu", 4 }, /* TEXICMD_MENU */ |
{ domenu, "menu", 4 }, /* TEXICMD_MENU */ |
#else |
|
{ doignblock, "menu", 4 }, /* TEXICMD_MENU */ |
|
#endif |
|
{ 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 */ |
#if 0 |
|
{ donode, "node", 4 }, /* TEXICMD_NODE */ |
{ donode, "node", 4 }, /* TEXICMD_NODE */ |
#else |
|
{ doignline, "node", 4 }, /* TEXICMD_NODE */ |
|
#endif |
|
{ 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 265 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 261 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 306 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 302 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 326 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 322 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 */ |
{ dotop, "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 348 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 345 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 359 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 357 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
const struct texitok *const texitoks = __texitoks; |
const struct texitok *const texitoks = __texitoks; |
|
|
/* |
/* |
* Texinfo has lots of indexes. |
* Define new indexes either by assignment or aliasing (both of these |
* You can add new ones in a variety of ways. |
* accept the first argument as the new index). |
* We maintain an array of all of these index names (usually a few |
|
* letters) and pass unknown commands through the array list. |
|
*/ |
*/ |
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 = end = *pos; |
start = *pos; |
while (end < BUFSZ(p) && ! ismspace(BUF(p)[end])) |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
end++; |
advance(p, pos); |
|
if (*pos == BUFSZ(p)) { |
if (start == end) { |
texiwarn(p, "unexpected EOF"); |
advanceeoln(p, pos, 1); |
|
return; |
return; |
} |
} |
|
if (0 == *pos - start) |
if (NULL == (cp = malloc(end - start + 1))) |
texiwarn(p, "zero-length index definition"); |
texiabort(p, NULL); |
else |
memcpy(cp, &BUF(p)[start], end - start); |
texindex_add(p, &BUF(p)[start], *pos - start); |
cp[end - start] = '\0'; |
advance(p, pos); |
|
|
/* FIXME: use reallocarray(). */ |
|
p->indexs = realloc(p->indexs, |
|
sizeof(char *) * (p->indexsz + 1)); |
|
if (NULL == p->indexs) |
|
texiabort(p, NULL); |
|
p->indexs[p->indexsz++] = cp; |
|
|
|
advanceeoln(p, pos, 1); |
|
} |
} |
|
|
|
/* |
|
* 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 427 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 416 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 456 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 447 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 563 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 555 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
return; |
return; |
} |
} |
|
|
teximacro(p, "Bd -filled -offset indent"); |
texivspace(p); |
|
teximacro(p, "Bd -filled -offset indent -compact"); |
|
p->seenvs = -1; |
parseto(p, pos, blk); |
parseto(p, pos, blk); |
|
p->seenvs = 0; |
teximacro(p, "Ed"); |
teximacro(p, "Ed"); |
p->seenvs = 1; |
texivspace(p); |
} |
} |
|
|
static void |
static void |
Line 721 doinline(struct texi *p, enum texicmd cmd, size_t *pos |
|
Line 716 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 831 doinsertcopying(struct texi *p, enum texicmd cmd, size |
|
Line 827 doinsertcopying(struct texi *p, enum texicmd cmd, size |
|
{ |
{ |
|
|
advanceeoln(p, pos, 0); |
advanceeoln(p, pos, 0); |
if (NULL == p->copying) |
if (NULL != p->copying) |
return; |
texisplice(p, p->copying, p->copyingsz, *pos); |
texisplice(p, p->copying, p->copyingsz, *pos); |
|
} |
} |
|
|
static void |
static void |
Line 898 doverbatim(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 893 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"); |
p->seenvs = 1; |
texivspace(p); |
if (*pos < BUFSZ(p)) |
if (*pos < BUFSZ(p)) |
advanceto(p, pos, endpos + endsz); |
advanceto(p, pos, endpos + endsz); |
} |
} |
Line 1043 dodisplay(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1041 dodisplay(struct texi *p, enum texicmd cmd, size_t *po |
|
{ |
{ |
|
|
advanceeoln(p, pos, 1); |
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; |
parseto(p, pos, texitoks[cmd].tok); |
parseto(p, pos, texitoks[cmd].tok); |
|
p->seenvs = 0; |
teximacro(p, "Ed"); |
teximacro(p, "Ed"); |
p->seenvs = 1; |
texivspace(p); |
} |
} |
|
|
static void |
static void |
Line 1065 doexample(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1066 doexample(struct texi *p, enum texicmd cmd, size_t *po |
|
|
|
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
|
|
teximacro(p, "Bd -literal -offset indent"); |
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"); |
p->seenvs = 1; |
texivspace(p); |
} |
} |
|
|
static void |
static void |
Line 1471 doquotation(struct texi *p, enum texicmd cmd, size_t * |
|
Line 1474 doquotation(struct texi *p, enum texicmd cmd, size_t * |
|
teximacro(p, "Qc"); |
teximacro(p, "Qc"); |
} |
} |
|
|
#if 0 |
static int |
|
indexcmp(const void *p1, const void *p2) |
|
{ |
|
|
|
return(strcasecmp(*(const char **)p1, *(const char **)p2)); |
|
} |
|
|
static void |
static void |
|
doprintindex(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
|
size_t i, j, start, end, len; |
|
#if HAVE_INDEX |
|
char *cp; |
|
#endif |
|
|
|
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 ((end = *pos) == BUFSZ(p)) { |
|
texiwarn(p, "unexpected EOF"); |
|
return; |
|
} |
|
|
|
advance(p, pos); |
|
if (0 == (len = end - start)) { |
|
texiwarn(p, "zero-length index"); |
|
return; |
|
} |
|
|
|
/* 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"); |
|
return; |
|
} else if (0 == p->indexs[i].indexsz) |
|
return; |
|
|
|
/* Alphabetically sort our indices. */ |
|
qsort(p->indexs[i].index, |
|
p->indexs[i].indexsz, sizeof(char *), 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 |
|
teximacroopen(p, "Lkx"); |
|
texiputchars(p, "\"idx"); |
|
texiputchars(p, p->indexs[i].name); |
|
cp = p->indexs[i].index[j]; |
|
while ('\n' != *cp) { |
|
assert('\0' != *cp); |
|
texiputchar(p, *cp++); |
|
} |
|
texiputchars(p, "\" \""); |
|
p->literal++; |
|
#endif |
|
texisplice(p, p->indexs[i].index[j], |
|
strlen(p->indexs[i].index[j]), *pos); |
|
parseeoln(p, pos); |
|
#if HAVE_INDEX |
|
p->literal--; |
|
texiputchars(p, "\""); |
|
teximacroclose(p); |
|
#endif |
|
teximacroclose(p); |
|
} |
|
p->seenvs = 0; |
|
teximacro(p, "El"); |
|
texivspace(p); |
|
} |
|
|
|
static void |
donode(struct texi *p, enum texicmd cmd, size_t *pos) |
donode(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
int sv = p->seenvs; |
|
|
|
if (NULL != p->chapters) { |
|
advanceeoln(p, pos, 1); |
|
return; |
|
} |
|
|
|
#if HAVE_INDEX |
|
p->seenvs = -1; |
teximacroopen(p, "Ix"); |
teximacroopen(p, "Ix"); |
texiputchars(p, "Node"); |
texiputchars(p, "node"); |
while (*pos < BUFSZ(p) && isspace(BUF(p)[*pos])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
advance(p, pos); |
advance(p, pos); |
while (*pos < BUFSZ(p)) { |
while (*pos < BUFSZ(p)) { |
if (BUF(p)[*pos] == ',') |
if (BUF(p)[*pos] == ',') |
Line 1488 donode(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1579 donode(struct texi *p, enum texicmd cmd, size_t *pos) |
|
texiputchar(p, BUF(p)[*pos]); |
texiputchar(p, BUF(p)[*pos]); |
advance(p, pos); |
advance(p, pos); |
} |
} |
|
|
teximacroclose(p); |
teximacroclose(p); |
|
#endif |
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
|
p->seenvs = sv; |
} |
} |
|
|
|
/* |
|
* 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) |
domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
size_t start, sv; |
size_t start, end, sv; |
|
|
if (NULL != p->chapters) { |
if (NULL != p->chapters) { |
doignblock(p, cmd, pos); |
doignblock(p, cmd, pos); |
Line 1505 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1602 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
|
|
advanceeoln(p, pos, 1); |
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 ('*' != BUF(p)[*pos]) { |
|
if (TEXICMD_END == peeklinecmd(p, *pos)) |
|
break; |
|
parseeoln(p, pos); |
|
} else |
|
break; |
|
} |
|
|
texivspace(p); |
texivspace(p); |
teximacro(p, "Bl -tag -width Ds -compact"); |
teximacro(p, "Bl -tag -width Ds -compact"); |
while (*pos < BUFSZ(p)) { |
while (*pos < BUFSZ(p)) { |
/* Read to next menu item. */ |
/* |
while (*pos < BUFSZ(p) && ismspace(BUF(p)[*pos])) |
* 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); |
advance(p, pos); |
if ('*' != BUF(p)[*pos]) |
if ('*' != BUF(p)[*pos]) { |
break; |
if (TEXICMD_END == peeklinecmd(p, *pos)) |
|
break; |
|
parseeoln(p, pos); |
|
continue; |
|
} |
|
|
assert('*' == BUF(p)[*pos]); |
/* Now we're parsing a menu item. */ |
advance(p, pos); |
advance(p, pos); |
while (*pos < BUFSZ(p) && ismspace(BUF(p)[*pos])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
advance(p, pos); |
advance(p, pos); |
sv = start = *pos; |
start = sv = *pos; |
while (*pos < BUFSZ(p) && ':' != BUF(p)[*pos]) |
while (*pos < BUFSZ(p) && ':' != BUF(p)[*pos]) |
advance(p, pos); |
advance(p, pos); |
if (*pos == BUFSZ(p) || *pos == start) { |
end = *pos; |
texiwarn(p, "empty menu name"); |
|
break; |
|
} |
|
teximacroopen(p, "It"); |
|
teximacroopen(p, "Lkx"); |
|
texiputchar(p, '"'); |
|
texiputchars(p, "Node"); |
|
for (start = sv; start < *pos; start++) |
|
texiputchar(p, BUF(p)[start]); |
|
texiputchars(p, "\" \""); |
|
for (start = sv; start < *pos; start++) |
|
texiputchar(p, BUF(p)[start]); |
|
texiputchar(p, '"'); |
|
teximacroclose(p); |
|
teximacroclose(p); |
|
|
|
advance(p, pos); |
advance(p, pos); |
|
|
if (*pos == BUFSZ(p)) { |
if (*pos == BUFSZ(p)) { |
texiwarn(p, "bad menu syntax"); |
texiwarn(p, "bad menu syntax"); |
break; |
break; |
} else if (':' != BUF(p)[*pos]) { |
} else if (':' != BUF(p)[*pos]) { |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
advance(p, pos); |
advance(p, pos); |
start = *pos; |
teximacroopen(p, "It"); |
|
#ifdef HAVE_INDEX |
|
teximacroopen(p, "Lkx"); |
|
texiputchars(p, "\"node"); |
|
#endif |
while (*pos < BUFSZ(p)) { |
while (*pos < BUFSZ(p)) { |
switch (BUF(p)[*pos]) { |
switch (BUF(p)[*pos]) { |
case ('\t'): |
case ('\t'): |
Line 1563 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1677 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
} |
} |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
default: |
default: |
|
texiputchar(p, BUF(p)[*pos]); |
advance(p, pos); |
advance(p, pos); |
continue; |
continue; |
} |
} |
advance(p, pos); |
advance(p, pos); |
break; |
break; |
} |
} |
} else |
#ifdef HAVE_INDEX |
|
texiputchars(p, "\" \""); |
|
for (start = sv; start < end; start++) |
|
texiputchar(p, BUF(p)[start]); |
|
texiputchar(p, '"'); |
|
#endif |
|
} else { |
advance(p, pos); |
advance(p, pos); |
|
p->seenvs = 0; |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
teximacroopen(p, "It"); |
advance(p, pos); |
#ifdef HAVE_INDEX |
|
teximacroopen(p, "Lkx"); |
if (*pos == BUFSZ(p)) { |
texiputchars(p, "\"node"); |
texiwarn(p, "bad menu syntax"); |
for (start = sv; start < end; start++) |
break; |
texiputchar(p, BUF(p)[start]); |
|
texiputchars(p, "\" \""); |
|
#endif |
|
for (start = sv; start < end; start++) |
|
texiputchar(p, BUF(p)[start]); |
|
#ifdef HAVE_INDEX |
|
texiputchar(p, '"'); |
|
#endif |
} |
} |
|
#ifdef HAVE_INDEX |
while (*pos < BUFSZ(p)) { |
teximacroclose(p); |
if ('*' == BUF(p)[*pos]) |
#endif |
break; |
teximacroclose(p); |
if ('\n' != BUF(p)[*pos]) { |
|
texiputchar(p, BUF(p)[*pos]); |
|
advance(p, pos); |
|
continue; |
|
} |
|
advance(p, pos); |
|
while (*pos == BUFSZ(p)) { |
|
texiwarn(p, "bad menu syntax"); |
|
break; |
|
} |
|
if ('\n' == BUF(p)[*pos]) { |
|
advance(p, pos); |
|
break; |
|
} else if ('*' == BUF(p)[*pos]) { |
|
continue; |
|
} else if ('@' == BUF(p)[*pos]) |
|
break; |
|
texiputchar(p, ' '); |
|
} |
|
} |
} |
|
|
|
advanceeoln(p, pos, 0); |
|
p->seenvs = 0; |
teximacro(p, "El"); |
teximacro(p, "El"); |
|
texivspace(p); |
doignblock(p, cmd, pos); |
|
} |
} |
#endif |
|
|
|
static void |
static void |
domath(struct texi *p, enum texicmd cmd, size_t *pos) |
domath(struct texi *p, enum texicmd cmd, size_t *pos) |
Line 1750 sectioner(struct texi *p, int sec) |
|
Line 1859 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 1816 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1888 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 1825 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1909 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); |
|
|
if (0 == sec && NULL != p->chapters) { |
if (0 == sec && NULL != p->chapters) { |
teximdocclose(p, 0); |
teximdocclose(p, 0); |
teximdocopen(p, pos); |
teximdocopen(p, pos); |
Line 1833 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1922 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
teximacroopen(p, sects[sec]); |
teximacroopen(p, sects[sec]); |
parseeoln(p, pos); |
parseeoln(p, pos); |
teximacroclose(p); |
teximacroclose(p); |
|
|
|
if (sec < 2) |
|
p->seenvs = -1; |
|
else |
|
texivspace(p); |
} |
} |
|
|
static void |
static void |
Line 1876 doitem(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1970 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 1975 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
Line 2071 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
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 1985 dotable(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 2082 dotable(struct texi *p, enum texicmd cmd, size_t *pos) |
|
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
|
|
p->list = TEXILIST_ITEM; |
p->list = TEXILIST_ITEM; |
teximacro(p, "Bl -tag -width Ds"); |
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"); |
p->seenvs = 1; |
texivspace(p); |
p->list = sv; |
p->list = sv; |
} |
} |
|
|
Line 2016 doenumerate(struct texi *p, enum texicmd cmd, size_t * |
|
Line 2115 doenumerate(struct texi *p, enum texicmd cmd, size_t * |
|
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
|
|
p->list = TEXILIST_NOITEM; |
p->list = TEXILIST_NOITEM; |
teximacro(p, "Bl -enum"); |
texivspace(p); |
|
teximacro(p, "Bl -enum -compact"); |
parseto(p, pos, texitoks[cmd].tok); |
parseto(p, pos, texitoks[cmd].tok); |
|
p->seenvs = 0; |
teximacro(p, "El"); |
teximacro(p, "El"); |
p->seenvs = 1; |
texivspace(p); |
p->list = sv; |
p->list = sv; |
} |
} |
|
|
Line 2031 doitemize(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 2132 doitemize(struct texi *p, enum texicmd cmd, size_t *po |
|
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
|
|
p->list = TEXILIST_NOITEM; |
p->list = TEXILIST_NOITEM; |
teximacro(p, "Bl -bullet"); |
texivspace(p); |
|
teximacro(p, "Bl -bullet -compact"); |
parseto(p, pos, texitoks[cmd].tok); |
parseto(p, pos, texitoks[cmd].tok); |
|
p->seenvs = 0; |
teximacro(p, "El"); |
teximacro(p, "El"); |
p->seenvs = 1; |
texivspace(p); |
p->list = sv; |
p->list = sv; |
} |
} |
|
|
Line 2048 doignbracket(struct texi *p, enum texicmd cmd, size_t |
|
Line 2151 doignbracket(struct texi *p, enum texicmd cmd, size_t |
|
} |
} |
|
|
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) |
{ |
{ |
|
|
Line 2110 main(int argc, char *argv[]) |
|
Line 2263 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.outfile = stdout; |
|
texi.seenvs = -1; |
Idir = NULL; |
Idir = NULL; |
|
|
while (-1 != (c = getopt(argc, argv, "C:I:"))) |
while (-1 != (c = getopt(argc, argv, "C:I:"))) |
Line 2126 main(int argc, char *argv[]) |
|
Line 2280 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]))) |