version 1.70, 2015/03/13 08:13:21 |
version 1.71, 2015/03/19 09:53:35 |
Line 376 dodefindex(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 376 dodefindex(struct texi *p, enum texicmd cmd, size_t *p |
|
if (*pos == BUFSZ(p)) { |
if (*pos == BUFSZ(p)) { |
texiwarn(p, "unexpected EOF"); |
texiwarn(p, "unexpected EOF"); |
return; |
return; |
} |
} |
if (0 == *pos - start) |
if (0 == *pos - start) |
texiwarn(p, "zero-length index definition"); |
texiwarn(p, "zero-length index definition"); |
else |
else |
Line 464 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 464 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
case (TEXICMD_DEFMAC): |
case (TEXICMD_DEFMAC): |
case (TEXICMD_DEFMACX): |
case (TEXICMD_DEFMACX): |
teximacroopen(p, "Dv"); |
teximacroopen(p, "Dv"); |
while (parselinearg(p, pos)) |
while (parselinearg(p, pos)) |
/* Spin. */ ; |
/* Spin. */ ; |
teximacroclose(p); |
teximacroclose(p); |
break; |
break; |
Line 476 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 476 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
parselinearg(p, pos); |
parselinearg(p, pos); |
teximacroclose(p); |
teximacroclose(p); |
teximacroopen(p, "Fa"); |
teximacroopen(p, "Fa"); |
while (parselinearg(p, pos)) |
while (parselinearg(p, pos)) |
/* Spin. */ ; |
/* Spin. */ ; |
teximacroclose(p); |
teximacroclose(p); |
teximacro(p, "Fc"); |
teximacro(p, "Fc"); |
Line 496 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 496 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
parselinearg(p, pos); |
parselinearg(p, pos); |
teximacroclose(p); |
teximacroclose(p); |
teximacroopen(p, "Fa"); |
teximacroopen(p, "Fa"); |
while (parselinearg(p, pos)) |
while (parselinearg(p, pos)) |
/* Spin. */ ; |
/* Spin. */ ; |
teximacroclose(p); |
teximacroclose(p); |
teximacro(p, "Fc"); |
teximacro(p, "Fc"); |
Line 508 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 508 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
case (TEXICMD_DEFTYPEVR): |
case (TEXICMD_DEFTYPEVR): |
case (TEXICMD_DEFTYPEVRX): |
case (TEXICMD_DEFTYPEVRX): |
teximacroopen(p, "Vt"); |
teximacroopen(p, "Vt"); |
while (parselinearg(p, pos)) |
while (parselinearg(p, pos)) |
/* Spin. */ ; |
/* Spin. */ ; |
teximacroclose(p); |
teximacroclose(p); |
break; |
break; |
Line 519 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 519 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
case (TEXICMD_DEFVR): |
case (TEXICMD_DEFVR): |
case (TEXICMD_DEFVRX): |
case (TEXICMD_DEFVRX): |
teximacroopen(p, "Va"); |
teximacroopen(p, "Va"); |
while (parselinearg(p, pos)) |
while (parselinearg(p, pos)) |
/* Spin. */ ; |
/* Spin. */ ; |
teximacroclose(p); |
teximacroclose(p); |
break; |
break; |
Line 639 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 639 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
while (&BUF(p)[*pos] != blk) |
while (&BUF(p)[*pos] != blk) |
advance(p, pos); |
advance(p, pos); |
assert('@' == BUF(p)[*pos]); |
assert('@' == BUF(p)[*pos]); |
if ('\n' != BUF(p)[*pos - 1]) |
if ('\n' != BUF(p)[*pos - 1]) |
texierr(p, "cannot handle @end macro in-line"); |
texierr(p, "cannot handle @end macro in-line"); |
|
|
len = blk - &BUF(p)[start]; |
len = blk - &BUF(p)[start]; |
Line 651 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 651 domacro(struct texi *p, enum texicmd cmd, size_t *pos) |
|
|
|
p->macros = realloc |
p->macros = realloc |
(p->macros, |
(p->macros, |
(p->macrosz + 1) * |
(p->macrosz + 1) * |
sizeof(struct teximacro)); |
sizeof(struct teximacro)); |
if (NULL == p->macros) |
if (NULL == p->macros) |
texiabort(p, NULL); |
texiabort(p, NULL); |
Line 667 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 667 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
const char *endt, *startt; |
const char *endt, *startt; |
size_t esz, ssz, newpos, stack; |
size_t esz, ssz, newpos, stack; |
|
|
/* |
/* |
* FIXME: this is cheating. |
* FIXME: this is cheating. |
* These tokens are supposed to begin on a newline. |
* These tokens are supposed to begin on a newline. |
* However, if we do that, then we would need to check within |
* However, if we do that, then we would need to check within |
* the loop for trailer (or leading, as the case may be) |
* the loop for trailer (or leading, as the case may be) |
* newline, and that's just a bit too complicated right now. |
* newline, and that's just a bit too complicated right now. |
* This is becasue |
* This is becasue |
* @ifset BAR |
* @ifset BAR |
* @ifset FOO |
* @ifset FOO |
* @end ifset |
* @end ifset |
* @end ifset |
* @end ifset |
* won't work right now: we'd read after the first "@end ifset" |
* won't work right now: we'd read after the first "@end ifset" |
* to the next line, then look for the next line after that. |
* to the next line, then look for the next line after that. |
*/ |
*/ |
ssz = snprintf(start, sizeof(start), |
ssz = snprintf(start, sizeof(start), |
"@%s", texitoks[cmd].tok); |
"@%s", texitoks[cmd].tok); |
assert(ssz < sizeof(start)); |
assert(ssz < sizeof(start)); |
esz = snprintf(end, sizeof(end), |
esz = snprintf(end, sizeof(end), |
"@end %s", texitoks[cmd].tok); |
"@end %s", texitoks[cmd].tok); |
assert(esz < sizeof(end)); |
assert(esz < sizeof(end)); |
stack = 1; |
stack = 1; |
Line 706 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 706 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
"block", texitoks[cmd].tok); |
"block", texitoks[cmd].tok); |
*pos = BUFSZ(p); |
*pos = BUFSZ(p); |
break; |
break; |
} |
} |
|
|
newpos = *pos; |
newpos = *pos; |
if (NULL == startt || startt > endt) { |
if (NULL == startt || startt > endt) { |
Line 726 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 726 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
static void |
static void |
doblock(struct texi *p, enum texicmd cmd, size_t *pos) |
doblock(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
parseto(p, pos, texitoks[cmd].tok); |
parseto(p, pos, texitoks[cmd].tok); |
} |
} |
|
|
Line 782 doinline(struct texi *p, enum texicmd cmd, size_t *pos |
|
Line 782 doinline(struct texi *p, enum texicmd cmd, size_t *pos |
|
return; |
return; |
} |
} |
|
|
/* |
/* |
* If we haven't seen any whitespace, then we don't want the |
* If we haven't seen any whitespace, then we don't want the |
* subsequent macro to insert any whitespace. |
* subsequent macro to insert any whitespace. |
*/ |
*/ |
if (p->outmacro && 0 == p->seenws) { |
if (p->outmacro && 0 == p->seenws) { |
teximacroopen(p, "Ns"); |
teximacroopen(p, "Ns"); |
Line 829 doverb(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 829 doverb(struct texi *p, enum texicmd cmd, size_t *pos) |
|
start = *pos; |
start = *pos; |
/* Read until we see the delimiter then end-brace. */ |
/* Read until we see the delimiter then end-brace. */ |
while (*pos < BUFSZ(p) - 1) { |
while (*pos < BUFSZ(p) - 1) { |
if (BUF(p)[*pos] == delim && BUF(p)[*pos + 1] == '}') |
if (BUF(p)[*pos] == delim && BUF(p)[*pos + 1] == '}') |
break; |
break; |
advance(p, pos); |
advance(p, pos); |
} |
} |
Line 941 doverbatim(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 941 doverbatim(struct texi *p, enum texicmd cmd, size_t *p |
|
static void |
static void |
doverbinclude(struct texi *p, enum texicmd cmd, size_t *pos) |
doverbinclude(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
char fname[PATH_MAX], path[PATH_MAX]; |
char fname[PATH_MAX], path[PATH_MAX]; |
int rc; |
int rc; |
size_t i, end; |
size_t i, end; |
const char *v; |
const char *v; |
enum texicmd type; |
enum texicmd type; |
|
|
Line 960 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
Line 960 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
} |
} |
type = texicmd(p, *pos, &end, NULL); |
type = texicmd(p, *pos, &end, NULL); |
advanceto(p, pos, end); |
advanceto(p, pos, end); |
if (TEXICMD_VALUE != type) |
if (TEXICMD_VALUE != type) |
texierr(p, "unknown verbatiminclude command"); |
texierr(p, "unknown verbatiminclude command"); |
v = valueblookup(p, pos); |
v = valueblookup(p, pos); |
if (NULL == v) |
if (NULL == v) |
Line 985 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
Line 985 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
if (strstr(fname, "../") || strstr(fname, "/..")) |
if (strstr(fname, "../") || strstr(fname, "/..")) |
texierr(p, "insecure path"); |
texierr(p, "insecure path"); |
|
|
rc = snprintf(path, sizeof(path), |
rc = snprintf(path, sizeof(path), |
"%s/%s", p->dirs[0], fname); |
"%s/%s", p->dirs[0], fname); |
if (rc < 0) |
if (rc < 0) |
texierr(p, "couldn't format path"); |
texierr(p, "couldn't format path"); |
else if ((size_t)rc >= sizeof(path)) |
else if ((size_t)rc >= sizeof(path)) |
texierr(p, "path too long"); |
texierr(p, "path too long"); |
Line 998 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
Line 998 doverbinclude(struct texi *p, enum texicmd cmd, size_t |
|
static void |
static void |
doinclude(struct texi *p, enum texicmd cmd, size_t *pos) |
doinclude(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
char fname[PATH_MAX], path[PATH_MAX]; |
char fname[PATH_MAX], path[PATH_MAX]; |
size_t i, end; |
size_t i, end; |
int rc; |
int rc; |
const char *v; |
const char *v; |
enum texicmd type; |
enum texicmd type; |
|
|
Line 1018 doinclude(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1018 doinclude(struct texi *p, enum texicmd cmd, size_t *po |
|
} |
} |
type = texicmd(p, *pos, &end, NULL); |
type = texicmd(p, *pos, &end, NULL); |
advanceto(p, pos, end); |
advanceto(p, pos, end); |
if (TEXICMD_VALUE != type) |
if (TEXICMD_VALUE != type) |
texierr(p, "unknown include command"); |
texierr(p, "unknown include command"); |
v = valueblookup(p, pos); |
v = valueblookup(p, pos); |
if (NULL == v) |
if (NULL == v) |
Line 1044 doinclude(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 1044 doinclude(struct texi *p, enum texicmd cmd, size_t *po |
|
texierr(p, "insecure path"); |
texierr(p, "insecure path"); |
|
|
for (i = 0; i < p->dirsz; i++) { |
for (i = 0; i < p->dirsz; i++) { |
rc = snprintf(path, sizeof(path), |
rc = snprintf(path, sizeof(path), |
"%s/%s", p->dirs[i], fname); |
"%s/%s", p->dirs[i], fname); |
if (rc < 0) |
if (rc < 0) |
texierr(p, "couldn't format path"); |
texierr(p, "couldn't format path"); |
else if ((size_t)rc >= sizeof(path)) |
else if ((size_t)rc >= sizeof(path)) |
texierr(p, "path too long"); |
texierr(p, "path too long"); |
Line 1167 doaccent(struct texi *p, enum texicmd cmd, size_t *pos |
|
Line 1167 doaccent(struct texi *p, enum texicmd cmd, size_t *pos |
|
if ('{' == BUF(p)[*pos]) { |
if ('{' == BUF(p)[*pos]) { |
brace = 1; |
brace = 1; |
advance(p, pos); |
advance(p, pos); |
} else if (isalpha((unsigned char)texitoks[cmd].tok[0])) |
} else if (isalpha((unsigned char)texitoks[cmd].tok[0])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
advance(p, pos); |
advance(p, pos); |
|
|
Line 1285 doaccent(struct texi *p, enum texicmd cmd, size_t *pos |
|
Line 1285 doaccent(struct texi *p, enum texicmd cmd, size_t *pos |
|
} |
} |
if (*pos < BUFSZ(p)) |
if (*pos < BUFSZ(p)) |
advance(p, pos); |
advance(p, pos); |
} |
} |
|
|
switch (cmd) { |
switch (cmd) { |
case (TEXICMD_TIEACCENT): |
case (TEXICMD_TIEACCENT): |
Line 1499 dosymbol(struct texi *p, enum texicmd cmd, size_t *pos |
|
Line 1499 dosymbol(struct texi *p, enum texicmd cmd, size_t *pos |
|
static void |
static void |
doquotation(struct texi *p, enum texicmd cmd, size_t *pos) |
doquotation(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
|
|
teximacro(p, "Qo"); |
teximacro(p, "Qo"); |
parseto(p, pos, "quotation"); |
parseto(p, pos, "quotation"); |
teximacro(p, "Qc"); |
teximacro(p, "Qc"); |
|
|
doprintindex(struct texi *p, enum texicmd cmd, size_t *pos) |
doprintindex(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
static size_t guard = 0; |
static size_t guard = 0; |
size_t i, j, start, end, len; |
size_t i, j, start, end, len; |
#if HAVE_INDEX |
#if HAVE_INDEX |
char *cp; |
char *cp; |
char buf[PATH_MAX]; |
char buf[PATH_MAX]; |
Line 1567 doprintindex(struct texi *p, enum texicmd cmd, size_t |
|
Line 1567 doprintindex(struct texi *p, enum texicmd cmd, size_t |
|
} |
} |
|
|
/* Alphabetically sort our indices. */ |
/* Alphabetically sort our indices. */ |
qsort(p->indexs[i].index, |
qsort(p->indexs[i].index, |
p->indexs[i].indexsz, |
p->indexs[i].indexsz, |
sizeof(struct texiterm), indexcmp); |
sizeof(struct texiterm), indexcmp); |
|
|
texivspace(p); |
texivspace(p); |
Line 1598 doprintindex(struct texi *p, enum texicmd cmd, size_t |
|
Line 1598 doprintindex(struct texi *p, enum texicmd cmd, size_t |
|
p->literal++; |
p->literal++; |
} |
} |
#endif |
#endif |
texisplice(p, p->indexs[i].index[j].term, |
texisplice(p, p->indexs[i].index[j].term, |
strlen(p->indexs[i].index[j].term), *pos); |
strlen(p->indexs[i].index[j].term), *pos); |
parseeoln(p, pos); |
parseeoln(p, pos); |
#if HAVE_INDEX |
#if HAVE_INDEX |
Line 1649 donode(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1649 donode(struct texi *p, enum texicmd cmd, size_t *pos) |
|
p->nodecur = texicache(p, &BUF(p)[start], end - start); |
p->nodecur = texicache(p, &BUF(p)[start], end - start); |
|
|
if (NULL != p->chapters) { |
if (NULL != p->chapters) { |
snprintf(fname, sizeof(fname), |
snprintf(fname, sizeof(fname), |
"%s-%zd.7", p->chapters, p->nodecur); |
"%s-%zd.7", p->chapters, p->nodecur); |
p->outfile = fopen(fname, "w"); |
p->outfile = fopen(fname, "w"); |
if (NULL == p->outfile) |
if (NULL == p->outfile) |
Line 1679 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1679 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
{ |
{ |
size_t nodename, entryname; |
size_t nodename, entryname; |
size_t nodenameend, entrynameend, i; |
size_t nodenameend, entrynameend, i; |
ssize_t ppos, lastppos; |
ssize_t ppos, lastppos; |
char buf[PATH_MAX]; |
char buf[PATH_MAX]; |
enum texicmd tcmd; |
enum texicmd tcmd; |
|
|
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
|
|
/* |
/* |
* Parse past initial stuff. |
* Parse past initial stuff. |
* TODO: the manual says we're supposed to make this in bold or |
* TODO: the manual says we're supposed to make this in bold or |
* something. |
* something. |
*/ |
*/ |
Line 1705 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1705 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
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. |
* Read to next menu item. |
* We simply parse every line until we get a magic '*'. |
* We simply parse every line until we get a magic '*'. |
* These lines might occur interspersed OR as the |
* These lines might occur interspersed OR as the |
* description of an entry. |
* description of an entry. |
Line 1723 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1723 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
tcmd = peeklinecmd(p, *pos); |
tcmd = peeklinecmd(p, *pos); |
if (TEXICMD_END == tcmd) |
if (TEXICMD_END == tcmd) |
break; |
break; |
else if (TEXICMD_COMMENT == tcmd) |
else if (TEXICMD_COMMENT == tcmd) |
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
else |
else |
parseeoln(p, pos); |
parseeoln(p, pos); |
continue; |
continue; |
} |
} |
|
|
/* Now we're parsing a menu item. */ |
/* Now we're parsing a menu item. */ |
advance(p, pos); |
advance(p, pos); |
Line 1763 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1763 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
if (*pos + 1 == BUFSZ(p)) { |
if (*pos + 1 == BUFSZ(p)) { |
advance(p, pos); |
advance(p, pos); |
continue; |
continue; |
} |
} |
if (' ' == BUF(p)[*pos + 1]) { |
if (' ' == BUF(p)[*pos + 1]) { |
advance(p, pos); |
advance(p, pos); |
break; |
break; |
Line 1782 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1782 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
nodename = entryname; |
nodename = entryname; |
nodenameend = entrynameend; |
nodenameend = entrynameend; |
} |
} |
ppos = texicache(p, &BUF(p)[nodename], |
ppos = texicache(p, &BUF(p)[nodename], |
nodenameend - nodename); |
nodenameend - nodename); |
if (-1 != lastppos) |
if (-1 != lastppos) |
p->nodecache[lastppos].next = ppos; |
p->nodecache[lastppos].next = ppos; |
Line 1801 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1801 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
texiputchars(p, "\""); |
texiputchars(p, "\""); |
teximacroclose(p); |
teximacroclose(p); |
} else { |
} else { |
snprintf(buf, sizeof(buf), |
snprintf(buf, sizeof(buf), |
"%s-%zd 7 ", p->chapters, ppos); |
"%s-%zd 7 ", p->chapters, ppos); |
teximacroopen(p, "Xr"); |
teximacroopen(p, "Xr"); |
texiputchars(p, buf); |
texiputchars(p, buf); |
Line 2019 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 2019 dosection(struct texi *p, enum texicmd cmd, size_t *po |
|
|
|
if (sec < 2) |
if (sec < 2) |
p->seenvs = -1; |
p->seenvs = -1; |
else |
else |
texivspace(p); |
texivspace(p); |
|
|
teximacroopen(p, sects[sec]); |
teximacroopen(p, sects[sec]); |
Line 2052 doitem(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 2052 doitem(struct texi *p, enum texicmd cmd, size_t *pos) |
|
if (p->outcol > 0) |
if (p->outcol > 0) |
texiputchar(p, '\n'); |
texiputchar(p, '\n'); |
return; |
return; |
} |
} |
|
|
if (p->outmacro) |
if (p->outmacro) |
texierr(p, "item in open line scope!?"); |
texierr(p, "item in open line scope!?"); |
else if (p->literal) |
else if (p->literal) |
Line 2101 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
Line 2101 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
|
|
texivspace(p); |
texivspace(p); |
p->list = TEXILIST_TABLE; |
p->list = TEXILIST_TABLE; |
/* |
/* |
* TS/TE blocks aren't "in mdoc(7)", so we can disregard the |
* TS/TE blocks aren't "in mdoc(7)", so we can disregard the |
* fact that we're in literal mode right now. |
* fact that we're in literal mode right now. |
*/ |
*/ |
Line 2116 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
Line 2116 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
/* Make sure we don't print anything when scanning. */ |
/* Make sure we don't print anything when scanning. */ |
p->ign++; |
p->ign++; |
if (*pos < BUFSZ(p) && '@' == BUF(p)[*pos]) { |
if (*pos < BUFSZ(p) && '@' == BUF(p)[*pos]) { |
/* |
/* |
* Look for @columnfractions. |
* Look for @columnfractions. |
* We ignore these, but we do use the number of |
* We ignore these, but we do use the number of |
* arguments to set the number of columns that we'll |
* arguments to set the number of columns that we'll |
Line 2124 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
Line 2124 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
*/ |
*/ |
type = texicmd(p, *pos, &end, NULL); |
type = texicmd(p, *pos, &end, NULL); |
advanceto(p, pos, end); |
advanceto(p, pos, end); |
if (TEXICMD_COLUMNFRACTIONS != type) |
if (TEXICMD_COLUMNFRACTIONS != type) |
texierr(p, "unknown multitable command"); |
texierr(p, "unknown multitable command"); |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) { |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) { |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
Line 2136 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
Line 2136 domultitable(struct texi *p, enum texicmd cmd, size_t |
|
} |
} |
columns++; |
columns++; |
} |
} |
} else |
} else |
/* |
/* |
* We have arguments. |
* We have arguments. |
* We could parse these, but it's easier to just let |
* We could parse these, but it's easier to just let |
Line 2193 doend(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 2193 doend(struct texi *p, enum texicmd cmd, size_t *pos) |
|
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
advance(p, pos); |
advance(p, pos); |
|
|
texiwarn(p, "unexpected \"end\": %.*s", |
texiwarn(p, "unexpected \"end\": %.*s", |
(int)(*pos - start), &BUF(p)[start]); |
(int)(*pos - start), &BUF(p)[start]); |
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
} |
} |
Line 2307 doignline(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 2307 doignline(struct texi *p, enum texicmd cmd, size_t *po |
|
static char ** |
static char ** |
parsedirs(struct texi *p, const char *base, const char *cp, size_t *sz) |
parsedirs(struct texi *p, const char *base, const char *cp, size_t *sz) |
{ |
{ |
char *tok, *str, *tofree; |
char *tok, *str, *tofree; |
const char *cpp; |
const char *cpp; |
size_t i = 0; |
size_t i = 0; |
char **dirs; |
char **dirs; |
|
|
/* Count up our expected arguments. */ |
/* Count up our expected arguments. */ |
Line 2322 parsedirs(struct texi *p, const char *base, const char |
|
Line 2322 parsedirs(struct texi *p, const char *base, const char |
|
return(NULL); |
return(NULL); |
if (NULL == (dirs = calloc(*sz, sizeof(char *)))) |
if (NULL == (dirs = calloc(*sz, sizeof(char *)))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
if (NULL != base && NULL == (dirs[i++] = strdup(base))) |
if (NULL != base && NULL == (dirs[i++] = strdup(base))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
if (NULL == cp) |
if (NULL == cp) |
return(dirs); |
return(dirs); |
if (NULL == (tofree = tok = str = strdup(cp))) |
if (NULL == (tofree = tok = str = strdup(cp))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
|
|
for ( ; NULL != (tok = strsep(&str, ":")); i++) |
for ( ; NULL != (tok = strsep(&str, ":")); i++) |
if (NULL == (dirs[i] = strdup(tok))) |
if (NULL == (dirs[i] = strdup(tok))) |
texiabort(p, NULL); |
texiabort(p, NULL); |
|
|
free(tofree); |
free(tofree); |
Line 2357 main(int argc, char *argv[]) |
|
Line 2357 main(int argc, char *argv[]) |
|
texi.seenvs = -1; |
texi.seenvs = -1; |
Idir = NULL; |
Idir = NULL; |
|
|
while (-1 != (c = getopt(argc, argv, "C:I:"))) |
while (-1 != (c = getopt(argc, argv, "C:I:"))) |
switch (c) { |
switch (c) { |
case ('C'): |
case ('C'): |
texi.chapters = optarg; |
texi.chapters = optarg; |
Line 2383 main(int argc, char *argv[]) |
|
Line 2383 main(int argc, char *argv[]) |
|
texiabort(&texi, NULL); |
texiabort(&texi, NULL); |
if (NULL == (dir = dirname(dirpath))) |
if (NULL == (dir = dirname(dirpath))) |
texiabort(&texi, NULL); |
texiabort(&texi, NULL); |
if (NULL != (cp = strrchr(argv[0], '/'))) |
if (NULL != (cp = strrchr(argv[0], '/'))) |
texi.title = strdup(cp + 1); |
texi.title = strdup(cp + 1); |
else |
else |
texi.title = strdup(argv[0]); |
texi.title = strdup(argv[0]); |