version 1.7, 2015/02/18 11:08:58 |
version 1.8, 2015/02/18 12:03:21 |
|
|
TEXICMD_NEWLINE, |
TEXICMD_NEWLINE, |
TEXICMD_NODE, |
TEXICMD_NODE, |
TEXICMD_NOINDENT, |
TEXICMD_NOINDENT, |
|
TEXICMD_PXREF, |
TEXICMD_QUESTIONMARK, |
TEXICMD_QUESTIONMARK, |
TEXICMD_QUOTATION, |
TEXICMD_QUOTATION, |
TEXICMD_PAGE, |
TEXICMD_PAGE, |
|
|
TEXICMD_SMALLEXAMPLE, |
TEXICMD_SMALLEXAMPLE, |
TEXICMD_SQUIGGLE_LEFT, |
TEXICMD_SQUIGGLE_LEFT, |
TEXICMD_SQUIGGLE_RIGHT, |
TEXICMD_SQUIGGLE_RIGHT, |
|
TEXICMD_STRONG, |
TEXICMD_SUBSECTION, |
TEXICMD_SUBSECTION, |
TEXICMD_SUBTITLE, |
TEXICMD_SUBTITLE, |
TEXICMD_TAB, |
TEXICMD_TAB, |
|
|
TEXICMD_URL, |
TEXICMD_URL, |
TEXICMD_VAR, |
TEXICMD_VAR, |
TEXICMD_W, |
TEXICMD_W, |
|
TEXICMD_XREF, |
TEXICMD__MAX |
TEXICMD__MAX |
}; |
}; |
|
|
|
|
size_t outcol; /* column in output line */ |
size_t outcol; /* column in output line */ |
char **dirs; /* texi directories */ |
char **dirs; /* texi directories */ |
size_t dirsz; /* number of texi directories */ |
size_t dirsz; /* number of texi directories */ |
enum texilist list; |
enum texilist list; /* current list (set recursively) */ |
int outmacro; /* whether output is in line macro */ |
int outmacro; /* if >0, output is in line macro */ |
int seenws; /* whitespace has been ignored */ |
int seenws; /* ws has been seen (and ignored) */ |
int ign; /* don't print anything */ |
int ign; /* if >0, don't print anything */ |
int literal; |
int literal; /* if >0, literal context */ |
}; |
}; |
|
|
/* FIXME: don't use this crap. */ |
/* FIXME: FIND A BETTER WAY. */ |
#define ismpunct(_x) \ |
#define ismpunct(_x) \ |
('.' == (_x) || \ |
('.' == (_x) || \ |
',' == (_x) || \ |
',' == (_x) || \ |
';' == (_x)) |
';' == (_x)) |
|
/* Texi disregards spaces and tabs. */ |
#define isws(_x) \ |
#define isws(_x) \ |
(' ' == (_x) || '\t' == (_x)) |
(' ' == (_x) || '\t' == (_x)) |
|
|
static void doarg1(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 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 *); |
Line 211 static void doenumerate(struct texi *, enum texicmd, c |
|
Line 214 static void doenumerate(struct texi *, enum texicmd, c |
|
static void doenv(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doenv(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doexample(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doexample(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dofile(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dofile(struct texi *, enum texicmd, const char *, size_t, size_t *); |
|
static void doignargn(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doignblock(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doignblock(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doignbracket(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doignbracket(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doignline(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doignline(struct texi *, enum texicmd, const char *, size_t, size_t *); |
Line 218 static void doinclude(struct texi *, enum texicmd, con |
|
Line 222 static void doinclude(struct texi *, enum texicmd, con |
|
static void doitalic(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doitalic(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doitem(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doitem(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doitemize(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doitemize(struct texi *, enum texicmd, const char *, size_t, size_t *); |
|
static void dolink(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doliteral(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doliteral(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void domath(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void domath(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doquotation(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void doquotation(struct texi *, enum texicmd, const char *, size_t, size_t *); |
Line 229 static void dosubsection(struct texi *, enum texicmd, |
|
Line 234 static void dosubsection(struct texi *, enum texicmd, |
|
static void dosymbol(struct texi *, enum texicmd, const char *, size_t, size_t *); |
static void dosymbol(struct texi *, enum texicmd, const char *, size_t, size_t *); |
|
|
static const struct texitok texitoks[TEXICMD__MAX] = { |
static const struct texitok texitoks[TEXICMD__MAX] = { |
{ doarg1, "acronym", 7 }, /* TEXICMD_ACRONYM */ |
{ doignargn, "acronym", 7 }, /* TEXICMD_ACRONYM */ |
{ doignline, "afourpaper", 10 }, /* TEXICMD_A4PAPER */ |
{ doignline, "afourpaper", 10 }, /* TEXICMD_A4PAPER */ |
{ doignbracket, "anchor", 6 }, /* TEXICMD_ANCHOR */ |
{ doignbracket, "anchor", 6 }, /* TEXICMD_ANCHOR */ |
{ dochapter, "appendix", 8 }, /* TEXICMD_APPENDIX */ |
{ dochapter, "appendix", 8 }, /* TEXICMD_APPENDIX */ |
Line 264 static const struct texitok texitoks[TEXICMD__MAX] = { |
|
Line 269 static const struct texitok texitoks[TEXICMD__MAX] = { |
|
{ doignblock, "direntry", 8 }, /* TEXICMD_DIRENTRY */ |
{ doignblock, "direntry", 8 }, /* TEXICMD_DIRENTRY */ |
{ dodisplay, "display", 7 }, /* TEXICMD_DISPLAY */ |
{ dodisplay, "display", 7 }, /* TEXICMD_DISPLAY */ |
{ dosymbol, "dots", 4 }, /* TEXICMD_DOTS */ |
{ dosymbol, "dots", 4 }, /* TEXICMD_DOTS */ |
{ doarg1, "email", 5 }, /* TEXICMD_EMAIL */ |
{ dolink, "email", 5 }, /* TEXICMD_EMAIL */ |
{ doemph, "emph", 4 }, /* TEXICMD_EMPH */ |
{ doemph, "emph", 4 }, /* TEXICMD_EMPH */ |
{ NULL, "end", 3 }, /* TEXICMD_END */ |
{ NULL, "end", 3 }, /* TEXICMD_END */ |
{ doenumerate, "enumerate", 9 }, /* TEXICMD_ENUMERATE */ |
{ doenumerate, "enumerate", 9 }, /* TEXICMD_ENUMERATE */ |
Line 294 static const struct texitok texitoks[TEXICMD__MAX] = { |
|
Line 299 static const struct texitok texitoks[TEXICMD__MAX] = { |
|
{ dosymbol, "\n", 1 }, /* TEXICMD_NEWLINE */ |
{ dosymbol, "\n", 1 }, /* TEXICMD_NEWLINE */ |
{ doignline, "node", 4 }, /* TEXICMD_NODE */ |
{ doignline, "node", 4 }, /* TEXICMD_NODE */ |
{ doignline, "noindent", 8 }, /* TEXICMD_NOINDENT */ |
{ doignline, "noindent", 8 }, /* TEXICMD_NOINDENT */ |
|
{ dolink, "pxref", 5 }, /* TEXICMD_PXREF */ |
{ 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 */ |
Line 312 static const struct texitok texitoks[TEXICMD__MAX] = { |
|
Line 318 static const struct texitok texitoks[TEXICMD__MAX] = { |
|
{ doexample, "smallexample", 12 }, /* TEXICMD_SMALLEXAMPLE */ |
{ doexample, "smallexample", 12 }, /* TEXICMD_SMALLEXAMPLE */ |
{ dosymbol, "{", 1 }, /* TEXICMD_SQUIGGLE_LEFT */ |
{ dosymbol, "{", 1 }, /* TEXICMD_SQUIGGLE_LEFT */ |
{ dosymbol, "}", 1 }, /* TEXICMD_SQUIGGLE_RIGHT */ |
{ dosymbol, "}", 1 }, /* TEXICMD_SQUIGGLE_RIGHT */ |
|
{ doemph, "strong", 6 }, /* TEXICMD_STRONG */ |
{ dosubsection, "subsection", 10 }, /* TEXICMD_SUBSECTION */ |
{ dosubsection, "subsection", 10 }, /* TEXICMD_SUBSECTION */ |
{ doignline, "subtitle", 8 }, /* TEXICMD_SUBTITLE */ |
{ doignline, "subtitle", 8 }, /* TEXICMD_SUBTITLE */ |
{ dosymbol, "\t", 1 }, /* TEXICMD_TAB */ |
{ dosymbol, "\t", 1 }, /* TEXICMD_TAB */ |
Line 324 static const struct texitok texitoks[TEXICMD__MAX] = { |
|
Line 331 static const struct texitok texitoks[TEXICMD__MAX] = { |
|
{ dotop, "top", 3 }, /* TEXICMD_TOP */ |
{ dotop, "top", 3 }, /* TEXICMD_TOP */ |
{ dochapter, "unnumbered", 10 }, /* TEXICMD_UNNUMBERED */ |
{ dochapter, "unnumbered", 10 }, /* TEXICMD_UNNUMBERED */ |
{ dosection, "unnumberedsec", 13 }, /* TEXICMD_UNNUMBEREDSEC */ |
{ dosection, "unnumberedsec", 13 }, /* TEXICMD_UNNUMBEREDSEC */ |
{ doarg1, "uref", 4 }, /* TEXICMD_UREF */ |
{ dolink, "uref", 4 }, /* TEXICMD_UREF */ |
{ doarg1, "url", 3 }, /* TEXICMD_URL */ |
{ dolink, "url", 3 }, /* TEXICMD_URL */ |
{ doliteral, "var", 3 }, /* TEXICMD_VAR */ |
{ doliteral, "var", 3 }, /* TEXICMD_VAR */ |
{ dobracket, "w", 1 }, /* TEXICMD_W */ |
{ dobracket, "w", 1 }, /* TEXICMD_W */ |
|
{ dolink, "xref", 4 }, /* TEXICMD_XREF */ |
}; |
}; |
|
|
/* |
/* |
Line 344 texifilepop(struct texi *p) |
|
Line 352 texifilepop(struct texi *p) |
|
} |
} |
|
|
/* |
/* |
* Unmap all files that we're currently using. |
* Unmap all files that we're currently using and free all resources |
|
* that we've allocated during the parse. |
* The utility should exit(...) after this is called. |
* The utility should exit(...) after this is called. |
*/ |
*/ |
static void |
static void |
Line 395 texiwarn(const struct texi *p, const char *fmt, ...) |
|
Line 404 texiwarn(const struct texi *p, const char *fmt, ...) |
|
fputc('\n', stderr); |
fputc('\n', stderr); |
} |
} |
|
|
|
/* |
|
* Print an error message (to stderr) tied to our current location in |
|
* the parse sequence, invoke texiexit(), then die. |
|
*/ |
static void |
static void |
texierr(struct texi *p, const char *fmt, ...) |
texierr(struct texi *p, const char *fmt, ...) |
{ |
{ |
Line 413 texierr(struct texi *p, const char *fmt, ...) |
|
Line 426 texierr(struct texi *p, const char *fmt, ...) |
|
} |
} |
|
|
/* |
/* |
* Put a single data character. |
* Put a single data character to the output if we're not ignoring. |
* This MUST NOT be a mdoc(7) command: it should be free text that's |
* Adjusts our output status. |
* outputted to the screen. |
|
*/ |
*/ |
static void |
static void |
texiputchar(struct texi *p, char c) |
texiputchar(struct texi *p, char c) |
Line 443 texiputchars(struct texi *p, const char *s) |
|
Line 455 texiputchars(struct texi *p, const char *s) |
|
} |
} |
|
|
/* |
/* |
* Put an mdoc(7) command without the trailing newline. |
* Close an mdoc(7) macro opened with teximacroopen(). |
* This should ONLY be used for mdoc(7) commands! |
* If there are no more macros on the line, prints a newline. |
*/ |
*/ |
static void |
static void |
teximacroclose(struct texi *p) |
teximacroclose(struct texi *p) |
{ |
{ |
|
|
|
/* FIXME: punctuation. */ |
if (0 == --p->outmacro) |
if (0 == --p->outmacro) |
texiputchar(p, '\n'); |
texiputchar(p, '\n'); |
} |
} |
|
|
/* |
/* |
* Put an mdoc(7) command without the trailing newline. |
* Open a mdoc(7) macro. |
* This should ONLY be used for mdoc(7) commands! |
* This is used for line macros, e.g., Qq [foo bar baz]. |
|
* It can be invoked for nested macros, e.g., Qq Li foo . |
*/ |
*/ |
static void |
static void |
teximacroopen(struct texi *p, const char *s) |
teximacroopen(struct texi *p, const char *s) |
Line 475 teximacroopen(struct texi *p, const char *s) |
|
Line 489 teximacroopen(struct texi *p, const char *s) |
|
} |
} |
|
|
/* |
/* |
* Put an mdoc(7) command with the trailing newline. |
* Put a stadnalone mdoc(7) command with the trailing newline. |
* This should ONLY be used for mdoc(7) commands! |
|
*/ |
*/ |
static void |
static void |
teximacro(struct texi *p, const char *s) |
teximacro(struct texi *p, const char *s) |
Line 554 advanceeoln(struct texi *p, const char *buf, |
|
Line 567 advanceeoln(struct texi *p, const char *buf, |
|
size_t sz, size_t *pos, int consumenl) |
size_t sz, size_t *pos, int consumenl) |
{ |
{ |
|
|
|
/* FIXME: disregards @NEWLINE. */ |
while (*pos < sz && '\n' != buf[*pos]) |
while (*pos < sz && '\n' != buf[*pos]) |
advance(p, buf, pos); |
advance(p, buf, pos); |
if (*pos < sz && consumenl) |
if (*pos < sz && consumenl) |
Line 580 advanceto(struct texi *p, const char *buf, size_t *pos |
|
Line 594 advanceto(struct texi *p, const char *buf, size_t *pos |
|
* This also will advance the input stream. |
* This also will advance the input stream. |
*/ |
*/ |
static void |
static void |
texiword(struct texi *p, const char *buf, size_t sz, size_t *pos) |
texiword(struct texi *p, const char *buf, |
|
size_t sz, size_t *pos, char extra) |
{ |
{ |
|
|
/* |
|
* XXX: if we're in literal mode, then we shouldn't do any |
|
* reflowing of text here. |
|
*/ |
|
if (0 == p->outmacro && p->outcol > 72 && 0 == p->literal) |
if (0 == p->outmacro && p->outcol > 72 && 0 == p->literal) |
texiputchar(p, '\n'); |
texiputchar(p, '\n'); |
|
/* FIXME: abstract this: we use it elsewhere. */ |
if (p->seenws && p->outcol && 0 == p->literal) |
if (p->seenws && p->outcol && 0 == p->literal) |
texiputchar(p, ' '); |
texiputchar(p, ' '); |
|
|
Line 602 texiword(struct texi *p, const char *buf, size_t sz, s |
|
Line 613 texiword(struct texi *p, const char *buf, size_t sz, s |
|
case ('{'): |
case ('{'): |
return; |
return; |
} |
} |
|
if ('\0' != extra && buf[*pos] == extra) |
|
return; |
if (*pos < sz - 1 && |
if (*pos < sz - 1 && |
'`' == buf[*pos] && |
'`' == buf[*pos] && |
'`' == buf[*pos + 1]) { |
'`' == buf[*pos + 1]) { |
Line 618 texiword(struct texi *p, const char *buf, size_t sz, s |
|
Line 631 texiword(struct texi *p, const char *buf, size_t sz, s |
|
} |
} |
} |
} |
|
|
|
/* |
|
* Look up the command at position "pos" in the buffer, returning it (or |
|
* TEXICMD__MAX if none found) and setting "end" to be the absolute |
|
* index after the command name. |
|
*/ |
static enum texicmd |
static enum texicmd |
texicmd(struct texi *p, const char *buf, |
texicmd(struct texi *p, const char *buf, |
size_t pos, size_t sz, size_t *end) |
size_t pos, size_t sz, size_t *end) |
Line 659 texicmd(struct texi *p, const char *buf, |
|
Line 677 texicmd(struct texi *p, const char *buf, |
|
return(TEXICMD__MAX); |
return(TEXICMD__MAX); |
} |
} |
|
|
|
/* |
|
* Parse an argument from a bracketed command, e.g., @url{foo, baz}. |
|
* Num should be set to the argument we're currently parsing, although |
|
* it suffixes for it to be zero or non-zero. |
|
* This will return 1 if there are more arguments, 0 otherwise. |
|
* This will stop (returning 0) in the event of EOF or if we're not at a |
|
* bracket for the zeroth parse. |
|
*/ |
|
static int |
|
parsearg(struct texi *p, const char *buf, |
|
size_t sz, size_t *pos, size_t num) |
|
{ |
|
size_t end; |
|
enum texicmd cmd; |
|
|
|
while (*pos < sz && isspace(buf[*pos])) |
|
advance(p, buf, pos); |
|
if (*pos == sz || (0 == num && '{' != buf[*pos])) |
|
return(0); |
|
if (0 == num) |
|
advance(p, buf, pos); |
|
|
|
while ((*pos = advancenext(p, buf, sz, pos)) < sz) { |
|
switch (buf[*pos]) { |
|
case (','): |
|
advance(p, buf, pos); |
|
return(1); |
|
case ('}'): |
|
advance(p, buf, pos); |
|
return(0); |
|
case ('{'): |
|
if (0 == p->ign) |
|
texiwarn(p, "unexpected \"{\""); |
|
advance(p, buf, pos); |
|
continue; |
|
case ('@'): |
|
break; |
|
default: |
|
texiword(p, buf, sz, pos, ','); |
|
continue; |
|
} |
|
|
|
cmd = texicmd(p, buf, *pos, sz, &end); |
|
advanceto(p, buf, pos, end); |
|
if (TEXICMD__MAX == cmd) |
|
continue; |
|
if (NULL != texitoks[cmd].fp) |
|
(*texitoks[cmd].fp)(p, cmd, buf, sz, pos); |
|
} |
|
return(0); |
|
} |
|
|
|
/* |
|
* Parse until the end of a bracketed statement, e.g., @foo{bar baz}. |
|
* This will stop in the event of EOF or if we're not at a bracket. |
|
*/ |
static void |
static void |
parsebracket(struct texi *p, const char *buf, size_t sz, size_t *pos) |
parsebracket(struct texi *p, const char *buf, size_t sz, size_t *pos) |
{ |
{ |
Line 685 parsebracket(struct texi *p, const char *buf, size_t s |
|
Line 759 parsebracket(struct texi *p, const char *buf, size_t s |
|
case ('@'): |
case ('@'): |
break; |
break; |
default: |
default: |
texiword(p, buf, sz, pos); |
texiword(p, buf, sz, pos, '\0'); |
continue; |
continue; |
} |
} |
|
|
Line 730 parseeoln(struct texi *p, const char *buf, size_t sz, |
|
Line 804 parseeoln(struct texi *p, const char *buf, size_t sz, |
|
case ('@'): |
case ('@'): |
break; |
break; |
default: |
default: |
texiword(p, buf, sz, pos); |
texiword(p, buf, sz, pos, '\0'); |
continue; |
continue; |
} |
} |
|
|
Line 743 parseeoln(struct texi *p, const char *buf, size_t sz, |
|
Line 817 parseeoln(struct texi *p, const char *buf, size_t sz, |
|
} |
} |
} |
} |
|
|
|
/* |
|
* Parse a single word or command. |
|
* This will return immediately at the EOF. |
|
*/ |
static void |
static void |
parsesingle(struct texi *p, const char *buf, size_t sz, size_t *pos) |
parsesingle(struct texi *p, const char *buf, size_t sz, size_t *pos) |
{ |
{ |
Line 766 parsesingle(struct texi *p, const char *buf, size_t sz |
|
Line 844 parsesingle(struct texi *p, const char *buf, size_t sz |
|
case ('@'): |
case ('@'): |
break; |
break; |
default: |
default: |
texiword(p, buf, sz, pos); |
texiword(p, buf, sz, pos, '\0'); |
return; |
return; |
} |
} |
|
|
Line 778 parsesingle(struct texi *p, const char *buf, size_t sz |
|
Line 856 parsesingle(struct texi *p, const char *buf, size_t sz |
|
(*texitoks[cmd].fp)(p, cmd, buf, sz, pos); |
(*texitoks[cmd].fp)(p, cmd, buf, sz, pos); |
} |
} |
|
|
|
/* |
|
* Parse til the end of the buffer. |
|
*/ |
static void |
static void |
parseeof(struct texi *p, const char *buf, size_t sz) |
parseeof(struct texi *p, const char *buf, size_t sz) |
{ |
{ |
Line 787 parseeof(struct texi *p, const char *buf, size_t sz) |
|
Line 868 parseeof(struct texi *p, const char *buf, size_t sz) |
|
parsesingle(p, buf, sz, &pos); |
parsesingle(p, buf, sz, &pos); |
} |
} |
|
|
|
/* |
|
* Parse a block sequence until we have the "@end endtoken" command |
|
* invocation. |
|
* This will return immediately at EOF. |
|
*/ |
static void |
static void |
parseto(struct texi *p, const char *buf, |
parseto(struct texi *p, const char *buf, |
size_t sz, size_t *pos, const char *endtoken) |
size_t sz, size_t *pos, const char *endtoken) |
Line 813 parseto(struct texi *p, const char *buf, |
|
Line 899 parseto(struct texi *p, const char *buf, |
|
case ('@'): |
case ('@'): |
break; |
break; |
default: |
default: |
texiword(p, buf, sz, pos); |
texiword(p, buf, sz, pos, '\0'); |
continue; |
continue; |
} |
} |
|
|
Line 823 parseto(struct texi *p, const char *buf, |
|
Line 909 parseto(struct texi *p, const char *buf, |
|
while (*pos < sz && isws(buf[*pos])) |
while (*pos < sz && isws(buf[*pos])) |
advance(p, buf, pos); |
advance(p, buf, pos); |
/* |
/* |
* FIXME: skip tabs and also check the full |
* FIXME: check the full word, not just its |
* word, not just its initial substring! |
* initial substring! |
*/ |
*/ |
if (sz - *pos >= endtoksz && 0 == strncmp |
if (sz - *pos >= endtoksz && 0 == strncmp |
(&buf[*pos], endtoken, endtoksz)) { |
(&buf[*pos], endtoken, endtoksz)) { |
Line 841 parseto(struct texi *p, const char *buf, |
|
Line 927 parseto(struct texi *p, const char *buf, |
|
} |
} |
} |
} |
|
|
|
/* |
|
* Memory-map the file "fname" and begin parsing it. |
|
* This can be called in a nested context. |
|
*/ |
static void |
static void |
parsefile(struct texi *p, const char *fname) |
parsefile(struct texi *p, const char *fname) |
{ |
{ |
Line 1206 doquotation(struct texi *p, enum texicmd cmd, |
|
Line 1296 doquotation(struct texi *p, enum texicmd cmd, |
|
teximacro(p, "Qc"); |
teximacro(p, "Qc"); |
} |
} |
|
|
/* FIXME */ |
|
static void |
static void |
domath(struct texi *p, enum texicmd cmd, |
domath(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
Line 1242 domath(struct texi *p, enum texicmd cmd, |
|
Line 1331 domath(struct texi *p, enum texicmd cmd, |
|
advance(p, buf, pos); |
advance(p, buf, pos); |
} |
} |
|
|
/* FIXME */ |
|
static void |
static void |
doarg1(struct texi *p, enum texicmd cmd, |
dolink(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
|
int c; |
|
|
if (*pos == sz || '{' != buf[*pos]) |
|
return; |
|
advance(p, buf, pos); |
|
switch (cmd) { |
switch (cmd) { |
case (TEXICMD_EMAIL): |
case (TEXICMD_EMAIL): |
teximacroopen(p, "Mt"); |
teximacroopen(p, "Mt"); |
Line 1259 doarg1(struct texi *p, enum texicmd cmd, |
|
Line 1345 doarg1(struct texi *p, enum texicmd cmd, |
|
case (TEXICMD_URL): |
case (TEXICMD_URL): |
teximacroopen(p, "Lk"); |
teximacroopen(p, "Lk"); |
break; |
break; |
default: |
case (TEXICMD_XREF): |
|
texiputchars(p, "See Section"); |
|
teximacroopen(p, "Qq"); |
break; |
break; |
|
case (TEXICMD_PXREF): |
|
texiputchars(p, "see Section"); |
|
teximacroopen(p, "Qq"); |
|
break; |
|
default: |
|
abort(); |
} |
} |
/* FIXME: this is ugly */ |
|
while (*pos < sz && '}' != buf[*pos] && ',' != buf[*pos]) { |
c = parsearg(p, buf, sz, pos, 0); |
texiputchar(p, buf[*pos]); |
p->ign++; |
advance(p, buf, pos); |
while (c > 0) |
} |
c = parsearg(p, buf, sz, pos, 1); |
while (*pos < sz && '}' != buf[*pos]) |
p->ign--; |
advance(p, buf, pos); |
|
if (*pos < sz) |
|
advance(p, buf, pos); |
|
if (*pos < sz - 1 && |
if (*pos < sz - 1 && |
ismpunct(buf[*pos]) && |
ismpunct(buf[*pos]) && |
isspace(buf[*pos + 1])) { |
isspace(buf[*pos + 1])) { |
Line 1278 doarg1(struct texi *p, enum texicmd cmd, |
|
Line 1370 doarg1(struct texi *p, enum texicmd cmd, |
|
texiputchar(p, buf[*pos]); |
texiputchar(p, buf[*pos]); |
advance(p, buf, pos); |
advance(p, buf, pos); |
} |
} |
switch (cmd) { |
|
case (TEXICMD_EMAIL): |
teximacroclose(p); |
case (TEXICMD_UREF): |
|
case (TEXICMD_URL): |
|
teximacroclose(p); |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
} |
|
|
static void |
static void |
|
doignargn(struct texi *p, enum texicmd cmd, |
|
const char *buf, size_t sz, size_t *pos) |
|
{ |
|
int c; |
|
|
|
c = parsearg(p, buf, sz, pos, 0); |
|
p->ign++; |
|
while (c > 0) |
|
c = parsearg(p, buf, sz, pos, 1); |
|
p->ign--; |
|
} |
|
|
|
static void |
dosubsection(struct texi *p, enum texicmd cmd, |
dosubsection(struct texi *p, enum texicmd cmd, |
const char *buf, size_t sz, size_t *pos) |
const char *buf, size_t sz, size_t *pos) |
{ |
{ |
Line 1442 doignline(struct texi *p, enum texicmd cmd, |
|
Line 1540 doignline(struct texi *p, enum texicmd cmd, |
|
advanceeoln(p, buf, sz, pos, 1); |
advanceeoln(p, buf, sz, pos, 1); |
} |
} |
|
|
|
/* |
|
* Parse colon-separated directories from "cp" (if not NULL) and returns |
|
* the array of pointers. |
|
* Prepends "base" to the array. |
|
* This does NOT sanitise the directories! |
|
*/ |
static char ** |
static char ** |
parsedirs(const char *base, const char *cp, size_t *sz) |
parsedirs(const char *base, const char *cp, size_t *sz) |
{ |
{ |
Line 1528 main(int argc, char *argv[]) |
|
Line 1632 main(int argc, char *argv[]) |
|
texiexit(&texi); |
texiexit(&texi); |
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
usage: |
usage: |
fprintf(stderr, "usage: %s file\n", progname); |
fprintf(stderr, "usage: %s [-Idirs] file\n", progname); |
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |