version 1.24, 2015/02/20 09:58:50 |
version 1.28, 2015/02/21 21:49:18 |
Line 44 static void doaccent(struct texi *, enum texicmd, cons |
|
Line 44 static void doaccent(struct texi *, enum texicmd, cons |
|
static void doblock(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doblock(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dobracket(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dobracket(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dobye(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dobye(struct texi *, enum texicmd, const char *, size_t, size_t *); |
|
static void dodefindex(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dodefn(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dodefn(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dodisplay(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dodisplay(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doenumerate(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doenumerate(struct texi *, enum texicmd, const char *, size_t, size_t *); |
Line 71 static void dosymbol(struct texi *, enum texicmd, cons |
|
Line 72 static void dosymbol(struct texi *, enum texicmd, cons |
|
static void dotab(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dotab(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dotitle(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dotitle(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dovalue(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dovalue(struct texi *, enum texicmd, const char *, size_t, size_t *); |
|
static void doverb(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doverbinclude(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doverbinclude(struct texi *, enum texicmd, const char *, size_t, size_t *); |
|
|
static const struct texitok __texitoks[TEXICMD__MAX] = { |
static const struct texitok __texitoks[TEXICMD__MAX] = { |
Line 83 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 85 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosection, "appendixsec", 11 }, /* TEXICMD_APPENDIXSEC */ |
{ dosection, "appendixsec", 11 }, /* TEXICMD_APPENDIXSEC */ |
{ dosubsection, "appendixsubsec", 14 }, /* TEXICMD_APPENDIXSUBSEC */ |
{ dosubsection, "appendixsubsec", 14 }, /* TEXICMD_APPENDIXSUBSEC */ |
{ dosubsubsection, "appendixsubsubsec", 17 }, /* TEXICMD_APPENDIXSUBSUBSEC */ |
{ dosubsubsection, "appendixsubsubsec", 17 }, /* TEXICMD_APPENDIXSUBSUBSEC */ |
|
{ 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 */ |
Line 105 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 108 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignline, "contents", 8 }, /* TEXICMD_CONTENTS */ |
{ doignline, "contents", 8 }, /* TEXICMD_CONTENTS */ |
{ doignblock, "copying", 7 }, /* TEXICMD_COPYING */ |
{ doignblock, "copying", 7 }, /* TEXICMD_COPYING */ |
{ dosymbol, "copyright", 9 }, /* TEXICMD_COPYRIGHT */ |
{ dosymbol, "copyright", 9 }, /* TEXICMD_COPYRIGHT */ |
|
{ dodefindex, "defcodeindex", 12 }, /* TEXICMD_DEFCODEINDEX */ |
{ dodefn, "deffn", 5 }, /* TEXICMD_DEFFN */ |
{ dodefn, "deffn", 5 }, /* TEXICMD_DEFFN */ |
{ dodefn, "deffnx", 6 }, /* TEXICMD_DEFFNX */ |
{ dodefn, "deffnx", 6 }, /* TEXICMD_DEFFNX */ |
|
{ 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, "deftp", 5 }, /* TEXICMD_DEFTP */ |
{ dodefn, "deftp", 5 }, /* TEXICMD_DEFTP */ |
Line 130 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 135 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignline, "dircategory", 11 }, /* TEXICMD_DIRCATEGORY */ |
{ doignline, "dircategory", 11 }, /* TEXICMD_DIRCATEGORY */ |
{ doignblock, "direntry", 8 }, /* TEXICMD_DIRENTRY */ |
{ doignblock, "direntry", 8 }, /* TEXICMD_DIRENTRY */ |
{ dodisplay, "display", 7 }, /* TEXICMD_DISPLAY */ |
{ dodisplay, "display", 7 }, /* TEXICMD_DISPLAY */ |
|
{ doignbracket, "dmn", 3 }, /* TEXICMD_DMN */ |
{ dosymbol, "dots", 4 }, /* TEXICMD_DOTS */ |
{ dosymbol, "dots", 4 }, /* TEXICMD_DOTS */ |
{ dolink, "email", 5 }, /* TEXICMD_EMAIL */ |
{ dolink, "email", 5 }, /* TEXICMD_EMAIL */ |
{ doinline, "emph", 4 }, /* TEXICMD_EMPH */ |
{ doinline, "emph", 4 }, /* TEXICMD_EMPH */ |
{ NULL, "end", 3 }, /* TEXICMD_END */ |
{ NULL, "end", 3 }, /* TEXICMD_END */ |
{ doenumerate, "enumerate", 9 }, /* TEXICMD_ENUMERATE */ |
{ doenumerate, "enumerate", 9 }, /* TEXICMD_ENUMERATE */ |
{ doinline, "env", 3 }, /* TEXICMD_ENV */ |
{ doinline, "env", 3 }, /* TEXICMD_ENV */ |
|
{ dosymbol, "equiv", 5 }, /* TEXICMD_EQUIV */ |
{ dosymbol, "error", 5 }, /* TEXICMD_ERROR */ |
{ dosymbol, "error", 5 }, /* TEXICMD_ERROR */ |
{ doexample, "example", 7 }, /* TEXICMD_EXAMPLE */ |
{ doexample, "example", 7 }, /* TEXICMD_EXAMPLE */ |
|
{ doignline, "exdent", 6 }, /* TEXICMD_EXDENT */ |
{ 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 */ |
Line 149 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 157 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosection, "heading", 7 }, /* TEXICMD_HEADING */ |
{ dosection, "heading", 7 }, /* TEXICMD_HEADING */ |
{ doignline, "headings", 8 }, /* TEXICMD_HEADINGS */ |
{ doignline, "headings", 8 }, /* TEXICMD_HEADINGS */ |
{ doitem, "headitem", 8 }, /* TEXICMD_HEADITEM */ |
{ doitem, "headitem", 8 }, /* TEXICMD_HEADITEM */ |
|
{ doignblock, "html", 4 }, /* TEXICMD_HTML */ |
{ dosymbol, "-", 1 }, /* TEXICMD_HYPHEN */ |
{ dosymbol, "-", 1 }, /* TEXICMD_HYPHEN */ |
{ doinline, "i", 1 }, /* TEXICMD_I */ |
{ doinline, "i", 1 }, /* TEXICMD_I */ |
{ dovalue, "ifclear", 7 }, /* TEXICMD_IFCLEAR */ |
{ dovalue, "ifclear", 7 }, /* TEXICMD_IFCLEAR */ |
{ doignblock, "ifdocbook", 9 }, /* TEXICMD_IFDOCBOOK */ |
{ doignblock, "ifdocbook", 9 }, /* TEXICMD_IFDOCBOOK */ |
{ doignblock, "ifhtml", 6 }, /* TEXICMD_IFHTML */ |
{ doignblock, "ifhtml", 6 }, /* TEXICMD_IFHTML */ |
{ doignblock, "ifinfo", 6 }, /* TEXICMD_IFINFO */ |
{ doblock, "ifinfo", 6 }, /* TEXICMD_IFINFO */ |
{ doblock, "ifnotdocbook", 12 }, /* TEXICMD_IFNOTDOCBOOK */ |
{ doblock, "ifnotdocbook", 12 }, /* TEXICMD_IFNOTDOCBOOK */ |
{ doblock, "ifnothtml", 9 }, /* TEXICMD_IFNOTHTML */ |
{ doblock, "ifnothtml", 9 }, /* TEXICMD_IFNOTHTML */ |
{ doblock, "ifnotinfo", 9 }, /* TEXICMD_IFNOTINFO */ |
{ doblock, "ifnotinfo", 9 }, /* TEXICMD_IFNOTINFO */ |
Line 169 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 178 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignbracket, "image", 5 }, /* TEXICMD_IMAGE */ |
{ doignbracket, "image", 5 }, /* TEXICMD_IMAGE */ |
{ doinclude, "include", 7 }, /* TEXICMD_INCLUDE */ |
{ doinclude, "include", 7 }, /* TEXICMD_INCLUDE */ |
{ dodisplay, "indentblock", 11 }, /* TEXICMD_INDENTBLOCK */ |
{ dodisplay, "indentblock", 11 }, /* TEXICMD_INDENTBLOCK */ |
|
{ doignline, "", 0 }, /* TEXICMD_INDEX */ |
{ doignline, "insertcopying", 13 }, /* TEXICMD_INSERTCOPYING */ |
{ doignline, "insertcopying", 13 }, /* TEXICMD_INSERTCOPYING */ |
{ doitem, "item", 4 }, /* TEXICMD_ITEM */ |
{ doitem, "item", 4 }, /* TEXICMD_ITEM */ |
{ doitemize, "itemize", 7 }, /* TEXICMD_ITEMIZE */ |
{ doitemize, "itemize", 7 }, /* TEXICMD_ITEMIZE */ |
Line 180 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 190 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosecoffs, "lowersections", 13 }, /* TEXICMD_LOWERSECTIONS */ |
{ dosecoffs, "lowersections", 13 }, /* TEXICMD_LOWERSECTIONS */ |
{ domath, "math", 4 }, /* TEXICMD_MATH */ |
{ domath, "math", 4 }, /* TEXICMD_MATH */ |
{ doignblock, "menu", 4 }, /* TEXICMD_MENU */ |
{ doignblock, "menu", 4 }, /* TEXICMD_MENU */ |
|
{ dosymbol, "minus", 5 }, /* TEXICMD_MINUS */ |
{ 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 */ |
Line 190 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 201 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dosymbol, "?", 1 }, /* TEXICMD_QUESTIONMARK */ |
{ dosymbol, "?", 1 }, /* TEXICMD_QUESTIONMARK */ |
{ doquotation, "quotation", 9 }, /* TEXICMD_QUOTATION */ |
{ doquotation, "quotation", 9 }, /* TEXICMD_QUOTATION */ |
{ doignline, "page", 4 }, /* TEXICMD_PAGE */ |
{ doignline, "page", 4 }, /* TEXICMD_PAGE */ |
{ doignline, "paragraphindent", 14 }, /* TEXICMD_PARINDENT */ |
{ doignline, "paragraphindent", 15 }, /* TEXICMD_PARINDENT */ |
|
{ dosymbol, ".", 1 }, /* TEXICMD_PERIOD */ |
|
{ doignline, "pindex", 6 }, /* TEXICMD_PINDEX */ |
{ doignline, "printindex", 10 }, /* TEXICMD_PRINTINDEX */ |
{ doignline, "printindex", 10 }, /* TEXICMD_PRINTINDEX */ |
{ doinline, "r", 1 }, /* TEXICMD_R */ |
{ doinline, "r", 1 }, /* TEXICMD_R */ |
{ dosecoffs, "raisesections", 13 }, /* TEXICMD_RAISESECTIONS */ |
{ dosecoffs, "raisesections", 13 }, /* TEXICMD_RAISESECTIONS */ |
{ dobracket, "ref", 3 }, /* TEXICMD_REF */ |
{ dobracket, "ref", 3 }, /* TEXICMD_REF */ |
|
{ doignline, "refill", 6 }, /* TEXICMD_REFILL */ |
{ dosymbol, "result", 6 }, /* TEXICMD_RESULT */ |
{ dosymbol, "result", 6 }, /* TEXICMD_RESULT */ |
{ doinline, "samp", 4 }, /* TEXICMD_SAMP */ |
{ doinline, "samp", 4 }, /* TEXICMD_SAMP */ |
{ doinline, "sansserif", 9 }, /* TEXICMD_SANSSERIF */ |
{ doinline, "sansserif", 9 }, /* TEXICMD_SANSSERIF */ |
Line 204 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 218 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignline, "setchapternewpage", 17 }, /* TEXICMD_SETCHAPNEWPAGE */ |
{ doignline, "setchapternewpage", 17 }, /* TEXICMD_SETCHAPNEWPAGE */ |
{ doignline, "setfilename", 11 }, /* TEXICMD_SETFILENAME */ |
{ doignline, "setfilename", 11 }, /* TEXICMD_SETFILENAME */ |
{ dotitle, "settitle", 8 }, /* TEXICMD_SETTITLE */ |
{ dotitle, "settitle", 8 }, /* TEXICMD_SETTITLE */ |
|
{ doignline, "shortcontents", 13 }, /* TEXICMD_SHORTCONTENTS */ |
{ doinline, "slanted", 7 }, /* TEXICMD_SLANTED */ |
{ doinline, "slanted", 7 }, /* TEXICMD_SLANTED */ |
{ dosp, "sp", 2 }, /* TEXICMD_SP */ |
{ dosp, "sp", 2 }, /* TEXICMD_SP */ |
{ dosymbol, " ", 1 }, /* TEXICMD_SPACE */ |
{ dosymbol, " ", 1 }, /* TEXICMD_SPACE */ |
Line 217 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 232 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doinline, "strong", 6 }, /* TEXICMD_STRONG */ |
{ doinline, "strong", 6 }, /* TEXICMD_STRONG */ |
{ dosubsection, "subheading", 10 }, /* TEXICMD_SUBHEADING */ |
{ dosubsection, "subheading", 10 }, /* TEXICMD_SUBHEADING */ |
{ dosubsection, "subsection", 10 }, /* TEXICMD_SUBSECTION */ |
{ dosubsection, "subsection", 10 }, /* TEXICMD_SUBSECTION */ |
|
{ dosubsubsection, "subsubheading", 13 }, /* TEXICMD_SUBSUBHEADING */ |
{ dosubsubsection, "subsubsection", 13 }, /* TEXICMD_SUBSUBSECTION */ |
{ dosubsubsection, "subsubsection", 13 }, /* TEXICMD_SUBSUBSECTION */ |
{ doignline, "subtitle", 8 }, /* TEXICMD_SUBTITLE */ |
{ doignline, "subtitle", 8 }, /* TEXICMD_SUBTITLE */ |
|
{ doignline, "summarycontents", 15 }, /* TEXICMD_SUMMARYCONTENTS */ |
|
{ doignline, "synindex", 8 }, /* TEXICMD_SYNINDEX */ |
{ doignline, "syncodeindex", 12 }, /* TEXICMD_SYNCODEINDEX */ |
{ doignline, "syncodeindex", 12 }, /* TEXICMD_SYNCODEINDEX */ |
{ doinline, "t", 1 }, /* TEXICMD_T */ |
{ doinline, "t", 1 }, /* TEXICMD_T */ |
{ dotab, "tab", 3 }, /* TEXICMD_TAB */ |
{ dotab, "tab", 3 }, /* TEXICMD_TAB */ |
Line 227 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 245 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ doignblock, "tex", 3 }, /* TEXICMD_TEX */ |
{ doignblock, "tex", 3 }, /* TEXICMD_TEX */ |
{ dosymbol, "TeX", 3 }, /* TEXICMD_TEXSYM */ |
{ dosymbol, "TeX", 3 }, /* TEXICMD_TEXSYM */ |
{ doaccent, "~", 1 }, /* TEXICMD_TILDE */ |
{ doaccent, "~", 1 }, /* TEXICMD_TILDE */ |
|
{ doignline, "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 */ |
Line 240 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 259 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dolink, "url", 3 }, /* TEXICMD_URL */ |
{ dolink, "url", 3 }, /* TEXICMD_URL */ |
{ dovalue, "value", 5 }, /* TEXICMD_VALUE */ |
{ dovalue, "value", 5 }, /* TEXICMD_VALUE */ |
{ doinline, "var", 3 }, /* TEXICMD_VAR */ |
{ doinline, "var", 3 }, /* TEXICMD_VAR */ |
|
{ doverb, "verbatim", 8 }, /* TEXICMD_VERBATIM */ |
{ doverbinclude, "verbatiminclude", 15 }, /* TEXICMD_VERBATIMINCLUDE */ |
{ doverbinclude, "verbatiminclude", 15 }, /* TEXICMD_VERBATIMINCLUDE */ |
{ doignline, "vindex", 6 }, /* TEXICMD_VINDEX */ |
{ doignline, "vindex", 6 }, /* TEXICMD_VINDEX */ |
{ dosp, "vskip", 5 }, /* TEXICMD_VSKIP */ |
{ dosp, "vskip", 5 }, /* TEXICMD_VSKIP */ |
Line 251 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 271 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
|
|
const struct texitok *const texitoks = __texitoks; |
const struct texitok *const texitoks = __texitoks; |
|
|
static char * |
static void |
lineargdup(struct texi *p, const char *buf, size_t sz, size_t *pos) |
dodefindex(struct texi *p, enum texicmd cmd, |
|
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
char *key; |
|
size_t start, end; |
size_t start, end; |
|
char *cp; |
|
|
while (*pos < sz && isws(buf[*pos])) |
while (*pos < sz && isws(buf[*pos])) |
advance(p, buf, pos); |
advance(p, buf, pos); |
if (*pos == sz) |
|
return(NULL); |
start = end = *pos; |
for (start = end = *pos; end < sz; end++) |
while (end < sz && ! ismspace(buf[end])) |
if ('\n' == buf[end]) |
end++; |
break; |
|
advanceto(p, buf, pos, end); |
if (start == end) { |
if (*pos < sz) |
advanceeoln(p, buf, sz, pos, 1); |
advance(p, buf, pos); |
return; |
key = malloc(end - start + 1); |
} else if (NULL == (cp = malloc(end - start + 1))) |
if (NULL == key) { |
texiabort(p, NULL); |
perror(NULL); |
|
exit(EXIT_FAILURE); |
memcpy(cp, &buf[start], end - start); |
} |
cp[end - start] = '\0'; |
memcpy(key, &buf[start], end - start); |
|
key[end - start] = '\0'; |
p->indexs = realloc(p->indexs, |
return(key); |
sizeof(char *) * (p->indexsz + 1)); |
|
|
|
if (NULL == p->indexs) |
|
texiabort(p, NULL); |
|
p->indexs[p->indexsz++] = cp; |
} |
} |
|
|
static void |
static void |
|
|
doignblock(struct texi *p, enum texicmd cmd, |
doignblock(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
|
char end[32]; |
p->ign++; |
const char *term; |
parseto(p, buf, sz, pos, texitoks[cmd].tok); |
size_t endsz, endpos; |
p->ign--; |
|
|
/* |
|
* We want to completely ignore everything in these blocks, so |
|
* simply jump to the @end block. |
|
*/ |
|
endsz = snprintf(end, sizeof(end), |
|
"\n@end %s\n", texitoks[cmd].tok); |
|
assert(endsz < sizeof(end)); |
|
|
|
/* |
|
* Look up where our end token occurs. |
|
* Set our end position based on the relative offset of that |
|
* from our current position, or the EOF if we don't have a |
|
* proper ending point. |
|
*/ |
|
term = memmem(&buf[*pos], sz, end, endsz); |
|
endpos = NULL == term ? sz : |
|
*pos + term - &buf[*pos]; |
|
assert(endpos <= sz); |
|
while (*pos < endpos) |
|
advance(p, buf, pos); |
|
|
|
/* Only do this if we're not already at the end. */ |
|
if (endpos < sz) |
|
advanceto(p, buf, pos, endpos + endsz); |
} |
} |
|
|
static void |
static void |
Line 461 doinline(struct texi *p, enum texicmd cmd, |
|
Line 510 doinline(struct texi *p, enum texicmd cmd, |
|
break; |
break; |
} |
} |
|
|
if (NULL == macro || p->literal) { |
if (NULL == macro || p->literal || TEXILIST_TABLE == p->list) { |
parsebracket(p, buf, sz, pos); |
parsebracket(p, buf, sz, pos); |
return; |
return; |
} |
} |
Line 474 doinline(struct texi *p, enum texicmd cmd, |
|
Line 523 doinline(struct texi *p, enum texicmd cmd, |
|
} |
} |
|
|
static void |
static void |
|
doverb(struct texi *p, enum texicmd cmd, |
|
const char *buf, size_t sz, size_t *pos) |
|
{ |
|
const char *end, *term; |
|
size_t endsz, endpos; |
|
|
|
advanceeoln(p, buf, sz, pos, 1); |
|
|
|
/* We end at exactly this token. */ |
|
end = "\n@end verbatim\n"; |
|
endsz = strlen(end); |
|
|
|
/* |
|
* Look up where our end token occurs. |
|
* Set our end position based on the relative offset of that |
|
* from our current position. |
|
*/ |
|
term = memmem(&buf[*pos], sz, end, endsz); |
|
endpos = NULL == term ? sz : |
|
*pos + term - &buf[*pos]; |
|
|
|
teximacro(p, "Bd -literal -offset indent"); |
|
assert(endpos <= sz); |
|
while (*pos < endpos) { |
|
if (buf[*pos] == '\n') |
|
p->outcol = 0; |
|
else |
|
p->outcol++; |
|
if (*pos > 0 && '.' == buf[*pos]) |
|
if ('\n' == buf[*pos - 1]) |
|
fputs("\\&", stdout); |
|
putchar(buf[*pos]); |
|
if ('\\' == buf[*pos]) |
|
putchar('e'); |
|
advance(p, buf, pos); |
|
} |
|
teximacro(p, "Ed"); |
|
advanceto(p, buf, pos, endpos + endsz); |
|
} |
|
|
|
static void |
doverbinclude(struct texi *p, enum texicmd cmd, |
doverbinclude(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
char fname[PATH_MAX], path[PATH_MAX]; |
char fname[PATH_MAX], path[PATH_MAX]; |
int rc; |
int rc; |
size_t i; |
size_t i, end; |
|
const char *v; |
|
enum texicmd type; |
|
|
while (*pos < sz && ' ' == buf[*pos]) |
while (*pos < sz && ' ' == buf[*pos]) |
advance(p, buf, pos); |
advance(p, buf, pos); |
|
|
/* Read in the filename. */ |
for (i = 0; *pos < sz && '\n' != buf[*pos]; ) { |
for (i = 0; *pos < sz && '\n' != buf[*pos]; i++) { |
|
if (i == sizeof(fname) - 1) |
if (i == sizeof(fname) - 1) |
break; |
break; |
fname[i] = buf[*pos]; |
if ('@' != buf[*pos]) { |
advance(p, buf, pos); |
fname[i++] = buf[*pos]; |
|
advance(p, buf, pos); |
|
continue; |
|
} |
|
type = texicmd(p, buf, *pos, sz, &end); |
|
advanceto(p, buf, pos, end); |
|
if (TEXICMD_VALUE != type) |
|
texierr(p, "unknown verbatiminclude command"); |
|
v = valueblookup(p, buf, sz, pos); |
|
if (NULL == v) |
|
continue; |
|
while ('\0' != *v) { |
|
if (i == sizeof(fname) - 1) |
|
break; |
|
fname[i++] = *v++; |
|
} |
|
if ('\0' != *v) |
|
break; |
} |
} |
|
|
if (i == 0) |
if (i == 0) |
|
|
doinclude(struct texi *p, enum texicmd cmd, |
doinclude(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
char fname[PATH_MAX], path[PATH_MAX]; |
char fname[PATH_MAX], path[PATH_MAX]; |
size_t i; |
size_t i, end; |
int rc; |
int rc; |
|
const char *v; |
|
enum texicmd type; |
|
|
while (*pos < sz && ' ' == buf[*pos]) |
while (*pos < sz && ' ' == buf[*pos]) |
advance(p, buf, pos); |
advance(p, buf, pos); |
|
|
/* Read in the filename. */ |
/* Read in the filename. */ |
for (i = 0; *pos < sz && '\n' != buf[*pos]; i++) { |
for (i = 0; *pos < sz && '\n' != buf[*pos]; ) { |
if (i == sizeof(fname) - 1) |
if (i == sizeof(fname) - 1) |
break; |
break; |
fname[i] = buf[*pos]; |
if ('@' != buf[*pos]) { |
advance(p, buf, pos); |
fname[i++] = buf[*pos]; |
|
advance(p, buf, pos); |
|
continue; |
|
} |
|
type = texicmd(p, buf, *pos, sz, &end); |
|
advanceto(p, buf, pos, end); |
|
if (TEXICMD_VALUE != type) |
|
texierr(p, "unknown include command"); |
|
v = valueblookup(p, buf, sz, pos); |
|
if (NULL == v) |
|
continue; |
|
while ('\0' != *v) { |
|
if (i == sizeof(fname) - 1) |
|
break; |
|
fname[i++] = *v++; |
|
} |
|
if ('\0' != *v) |
|
break; |
} |
} |
|
|
if (i == 0) |
if (i == 0) |
Line 624 dotitle(struct texi *p, enum texicmd cmd, |
|
Line 751 dotitle(struct texi *p, enum texicmd cmd, |
|
start = end = *pos; |
start = end = *pos; |
while (end < sz && '\n' != buf[end]) |
while (end < sz && '\n' != buf[end]) |
end++; |
end++; |
|
advanceeoln(p, buf, sz, pos, 1); |
free(p->subtitle); |
free(p->subtitle); |
p->subtitle = malloc(end - start + 1); |
p->subtitle = malloc(end - start + 1); |
|
if (NULL == p->subtitle) |
|
texiabort(p, NULL); |
memcpy(p->subtitle, &buf[start], end - start); |
memcpy(p->subtitle, &buf[start], end - start); |
p->subtitle[end - start] = '\0'; |
p->subtitle[end - start] = '\0'; |
} |
} |
Line 745 dosymbol(struct texi *p, enum texicmd cmd, |
|
Line 875 dosymbol(struct texi *p, enum texicmd cmd, |
|
case (TEXICMD_DOTS): |
case (TEXICMD_DOTS): |
texiputchars(p, "..."); |
texiputchars(p, "..."); |
break; |
break; |
|
case (TEXICMD_EQUIV): |
|
texiputchars(p, "\\(=="); |
|
break; |
case (TEXICMD_ERROR): |
case (TEXICMD_ERROR): |
texiputchars(p, "error\\(->"); |
texiputchars(p, "error\\(->"); |
break; |
break; |
Line 754 dosymbol(struct texi *p, enum texicmd cmd, |
|
Line 887 dosymbol(struct texi *p, enum texicmd cmd, |
|
case (TEXICMD_LATEX): |
case (TEXICMD_LATEX): |
texiputchars(p, "LaTeX"); |
texiputchars(p, "LaTeX"); |
break; |
break; |
|
case (TEXICMD_MINUS): |
|
texiputchars(p, "\\-"); |
|
break; |
|
case (TEXICMD_PERIOD): |
|
texiputchar(p, '.'); |
|
break; |
case (TEXICMD_QUESTIONMARK): |
case (TEXICMD_QUESTIONMARK): |
texiputchar(p, '?'); |
texiputchar(p, '?'); |
break; |
break; |
|
|
dovalue(struct texi *p, enum texicmd cmd, |
dovalue(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
size_t i, start, end; |
size_t start, end, i; |
int clr; |
char *key, *val; |
char *key, *val; |
const char *cp; |
|
|
if (TEXICMD_SET == cmd) { |
if (TEXICMD_SET == cmd) { |
/* |
|
* If we're going to set a value, then first parse the |
|
* key and value from the input stream. |
|
* Disallow empty keys. |
|
*/ |
|
while (*pos < sz && isws(buf[*pos])) |
while (*pos < sz && isws(buf[*pos])) |
advance(p, buf, pos); |
advance(p, buf, pos); |
for (start = end = *pos; end < sz; end++) |
for (start = end = *pos; end < sz; end++) |
if (ismspace(buf[end])) |
if (ismspace(buf[end])) |
break; |
break; |
|
/* We don't allow empty keys. */ |
if (start == end) |
if (start == end) |
return; |
return; |
|
advanceto(p, buf, pos, end); |
|
|
key = malloc(end - start + 1); |
key = malloc(end - start + 1); |
if (NULL == key) { |
if (NULL == key) |
perror(NULL); |
texiabort(p, NULL); |
exit(EXIT_FAILURE); |
|
} |
|
memcpy(key, &buf[start], end - start); |
memcpy(key, &buf[start], end - start); |
key[end - start] = '\0'; |
key[end - start] = '\0'; |
|
|
advanceto(p, buf, pos, end); |
|
|
|
while (*pos < sz && isws(buf[*pos])) |
while (*pos < sz && isws(buf[*pos])) |
advance(p, buf, pos); |
advance(p, buf, pos); |
for (start = end = *pos; end < sz; end++) |
for (start = end = *pos; end < sz; end++) |
if ('\n' == buf[end]) |
if ('\n' == buf[end]) |
break; |
break; |
|
/* We do allow empty values. */ |
|
advanceeoln(p, buf, sz, pos, 1); |
|
|
val = malloc(end - start + 1); |
val = malloc(end - start + 1); |
if (NULL == val) { |
if (NULL == val) |
perror(NULL); |
texiabort(p, NULL); |
exit(EXIT_FAILURE); |
|
} |
|
memcpy(val, &buf[start], end - start); |
memcpy(val, &buf[start], end - start); |
val[end - start] = '\0'; |
val[end - start] = '\0'; |
|
valueadd(p, key, val); |
/* |
|
* Now look up the key in our table of existing keys. |
|
* If we find it, then free the local key and replace |
|
* the value (freeing the existing) of the existing. |
|
* If not, reallocate the structure. |
|
*/ |
|
for (i = 0; i < p->valsz; i++) |
|
if (0 == strcmp(p->vals[i].key, key)) |
|
break; |
|
|
|
if (i < p->valsz) { |
|
free(key); |
|
free(p->vals[i].value); |
|
p->vals[i].value = val; |
|
} else { |
|
p->vals = realloc(p->vals, |
|
(p->valsz + 1) * |
|
sizeof(struct texivalue)); |
|
if (NULL == p->vals) { |
|
perror(NULL); |
|
exit(EXIT_FAILURE); |
|
} |
|
p->vals[p->valsz].key = key; |
|
p->vals[p->valsz].value = val; |
|
p->valsz++; |
|
} |
|
|
|
advanceeoln(p, buf, sz, pos, 1); |
|
} else if (TEXICMD_VALUE == cmd) { |
} else if (TEXICMD_VALUE == cmd) { |
/* |
|
* First, parse out the key from the stream, which is |
|
* just the material within the quotes. |
|
*/ |
|
while (*pos < sz && '{' != buf[*pos]) |
|
advance(p, buf, pos); |
|
if (*pos == sz) |
|
return; |
|
advance(p, buf, pos); |
|
start = *pos; |
|
while (*pos < sz && '}' != buf[*pos]) |
|
advance(p, buf, pos); |
|
if ((end = *pos) < sz) |
|
advance(p, buf, pos); |
|
|
|
key = malloc(end - start + 1); |
|
if (NULL == key) { |
|
perror(NULL); |
|
exit(EXIT_FAILURE); |
|
} |
|
memcpy(key, &buf[start], end - start); |
|
key[end - start] = '\0'; |
|
|
|
/* |
|
* Next, look up the key in our table. |
|
* If it exists, print it out, being mindful all the |
|
* while of prior whitespace. |
|
* If it doesn't, print out a message. |
|
*/ |
|
for (i = 0; i < p->valsz; i++) |
|
if (0 == strcmp(p->vals[i].key, key)) |
|
break; |
|
if (p->seenws) |
if (p->seenws) |
texiputchar(p, ' '); |
texiputchar(p, ' '); |
p->seenws = 0; |
p->seenws = 0; |
if (i == p->valsz || NULL == p->vals[i].value) { |
if (NULL != (cp = valueblookup(p, buf, sz, pos))) { |
texiputchars(p, "{No value for \\(lq"); |
for (i = 0; i < p->valstackpos; i++) |
texiputchars(p, key); |
if (cp == p->valstack[i]) |
texiputchars(p, "\\(rq}"); |
break; |
} else |
if (i < p->valstackpos) |
texiputchars(p, p->vals[i].value); |
texierr(p, "recursive value"); |
free(key); |
p->valstack[p->valstackpos++] = cp; |
} else if (TEXICMD_CLEAR == cmd) { |
parseeof(p, cp, strlen(cp)); |
key = lineargdup(p, buf, sz, pos); |
p->valstackpos--; |
for (i = 0; i < p->valsz; i++) |
} else |
if (0 == strcmp(p->vals[i].key, key)) { |
texiputchars(p, "{No value}"); |
free(p->vals[i].value); |
|
p->vals[i].value = NULL; |
|
break; |
|
} |
|
free(key); |
|
} else if (TEXICMD_IFCLEAR == cmd) { |
} else if (TEXICMD_IFCLEAR == cmd) { |
key = lineargdup(p, buf, sz, pos); |
if (NULL != valuellookup(p, buf, sz, pos)) |
for (i = 0; i < p->valsz; i++) |
doignblock(p, cmd, buf, sz, pos); |
if (0 == strcmp(p->vals[i].key, key)) |
else |
break; |
parseto(p, buf, sz, pos, texitoks[cmd].tok); |
free(key); |
} else if (TEXICMD_CLEAR == cmd) |
clr = i < p->valsz && NULL != p->vals[i].value; |
valuelclear(p, buf, sz, pos); |
if (clr) |
|
p->ign++; |
|
parseto(p, buf, sz, pos, texitoks[cmd].tok); |
|
if (clr) |
|
p->ign--; |
|
} |
|
} |
} |
|
|
static void |
static void |
Line 1136 dotop(struct texi *p, enum texicmd cmd, |
|
Line 1197 dotop(struct texi *p, enum texicmd cmd, |
|
time_t t; |
time_t t; |
char date[32]; |
char date[32]; |
|
|
|
if (--p->ign) |
|
texierr(p, "@top command while ignoring (%d)", p->ign); |
|
|
/* |
/* |
* Here we print our standard mdoc(7) prologue. |
* Here we print our standard mdoc(7) prologue. |
* We use the title set with @settitle for the `Nd' description |
* We use the title set with @settitle for the `Nd' description |
Line 1146 dotop(struct texi *p, enum texicmd cmd, |
|
Line 1210 dotop(struct texi *p, enum texicmd cmd, |
|
t = time(NULL); |
t = time(NULL); |
strftime(date, sizeof(date), "%F", localtime(&t)); |
strftime(date, sizeof(date), "%F", localtime(&t)); |
|
|
p->ign--; |
|
teximacroopen(p, "Dd"); |
teximacroopen(p, "Dd"); |
texiputchars(p, date); |
texiputchars(p, date); |
teximacroclose(p); |
teximacroclose(p); |
Line 1244 domultitable(struct texi *p, enum texicmd cmd, |
|
Line 1307 domultitable(struct texi *p, enum texicmd cmd, |
|
type = texicmd(p, buf, *pos, sz, &end); |
type = texicmd(p, buf, *pos, sz, &end); |
advanceto(p, buf, pos, end); |
advanceto(p, buf, pos, end); |
if (TEXICMD_COLUMNFRACTIONS != type) |
if (TEXICMD_COLUMNFRACTIONS != type) |
texierr(p, "unknown multitable type"); |
texierr(p, "unknown multitable command"); |
while (*pos < sz && '\n' != buf[*pos]) { |
while (*pos < sz && '\n' != buf[*pos]) { |
while (*pos < sz && isws(buf[*pos])) |
while (*pos < sz && isws(buf[*pos])) |
advance(p, buf, pos); |
advance(p, buf, pos); |
Line 1354 doignline(struct texi *p, enum texicmd cmd, |
|
Line 1417 doignline(struct texi *p, enum texicmd cmd, |
|
* This does NOT sanitise the directories! |
* This does NOT sanitise the directories! |
*/ |
*/ |
static char ** |
static char ** |
parsedirs(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; |
Line 1366 parsedirs(const char *base, const char *cp, size_t *sz |
|
Line 1429 parsedirs(const char *base, const char *cp, size_t *sz |
|
for ( ; NULL != (cpp = strchr(cpp, ':')); (*sz)++) |
for ( ; NULL != (cpp = strchr(cpp, ':')); (*sz)++) |
cpp++; |
cpp++; |
|
|
dirs = calloc(*sz, sizeof(char *)); |
if (NULL == (dirs = calloc(*sz, sizeof(char *)))) |
if (NULL == dirs) { |
texiabort(p, NULL); |
perror(NULL); |
else if (NULL == (dirs[0] = strdup(base))) |
exit(EXIT_FAILURE); |
texiabort(p, NULL); |
} else if (NULL == (dirs[0] = strdup(base))) { |
|
perror(NULL); |
|
exit(EXIT_FAILURE); |
|
} |
|
|
|
if (NULL == cp) |
if (NULL == cp) |
return(dirs); |
return(dirs); |
|
|
if (NULL == (tofree = tok = str = strdup(cp))) { |
if (NULL == (tofree = tok = str = strdup(cp))) |
perror(NULL); |
texiabort(p, NULL); |
exit(EXIT_FAILURE); |
|
} |
|
|
|
for (i = 1; NULL != (tok = strsep(&str, ":")); i++) |
for (i = 1; NULL != (tok = strsep(&str, ":")); i++) |
if (NULL == (dirs[i] = strdup(tok))) { |
if (NULL == (dirs[i] = strdup(tok))) |
perror(NULL); |
texiabort(p, NULL); |
exit(EXIT_FAILURE); |
|
} |
|
|
|
free(tofree); |
free(tofree); |
return(dirs); |
return(dirs); |
Line 1423 main(int argc, char *argv[]) |
|
Line 1478 main(int argc, char *argv[]) |
|
if (0 == (argc -= optind)) |
if (0 == (argc -= optind)) |
goto usage; |
goto usage; |
|
|
if (NULL == (path = strdup(argv[0]))) { |
if (NULL == (path = strdup(argv[0]))) |
perror(NULL); |
texiabort(&texi, NULL); |
exit(EXIT_FAILURE); |
else if (NULL == (dir = dirname(path))) |
} else if (NULL == (dir = dirname(path))) { |
texiabort(&texi, NULL); |
perror(argv[0]); |
|
free(path); |
|
exit(EXIT_FAILURE); |
|
} |
|
free(path); |
free(path); |
|
|
if (NULL != (cp = strrchr(argv[0], '/'))) |
if (NULL != (cp = strrchr(argv[0], '/'))) |
Line 1438 main(int argc, char *argv[]) |
|
Line 1490 main(int argc, char *argv[]) |
|
else |
else |
texi.title = strdup(argv[0]); |
texi.title = strdup(argv[0]); |
|
|
if (NULL == texi.title) { |
if (NULL == texi.title) |
perror(NULL); |
texiabort(&texi, NULL); |
exit(EXIT_FAILURE); |
else if (NULL != (path = strchr(texi.title, '.'))) |
} else if (NULL != (path = strchr(texi.title, '.'))) |
|
*path = '\0'; |
*path = '\0'; |
|
|
texi.ign = 1; |
texi.ign = 1; |
texi.dirs = parsedirs(dir, Idir, &texi.dirsz); |
texi.dirs = parsedirs(&texi, dir, Idir, &texi.dirsz); |
parsefile(&texi, argv[0], 1); |
parsefile(&texi, argv[0], 1); |
/* We shouldn't get here. */ |
/* We shouldn't get here. */ |
texiexit(&texi); |
texiexit(&texi); |