version 1.67, 2015/03/12 04:24:19 |
version 1.68, 2015/03/12 10:44:34 |
Line 134 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 134 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
{ dodefindex, "defindex", 8 }, /* TEXICMD_DEFINDEX */ |
{ dodefindex, "defindex", 8 }, /* TEXICMD_DEFINDEX */ |
{ dodefn, "defmac", 6 }, /* TEXICMD_DEFMAC */ |
{ dodefn, "defmac", 6 }, /* TEXICMD_DEFMAC */ |
{ dodefn, "defmacx", 7 }, /* TEXICMD_DEFMACX */ |
{ dodefn, "defmacx", 7 }, /* TEXICMD_DEFMACX */ |
|
{ dodefn, "defop", 5 }, /* TEXICMD_DEFOP */ |
|
{ dodefn, "defopx", 6 }, /* TEXICMD_DEFOPX */ |
|
{ dodefn, "defopt", 6 }, /* TEXICMD_DEFOPT */ |
|
{ dodefn, "defoptx", 7 }, /* TEXICMD_DEFOPTX */ |
{ dodefn, "deftp", 5 }, /* TEXICMD_DEFTP */ |
{ dodefn, "deftp", 5 }, /* TEXICMD_DEFTP */ |
{ dodefn, "deftpx", 6 }, /* TEXICMD_DEFTPX */ |
{ dodefn, "deftpx", 6 }, /* TEXICMD_DEFTPX */ |
{ dodefn, "deftypefn", 9 }, /* TEXICMD_DEFTYPEFN */ |
{ dodefn, "deftypefn", 9 }, /* TEXICMD_DEFTYPEFN */ |
Line 152 static const struct texitok __texitoks[TEXICMD__MAX] = |
|
Line 156 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 */ |
{ domenu, "detailmenu", 10 }, /* TEXICMD_DETAILMENU */ |
{ doignblock, "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 393 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 397 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
switch (cmd) { |
switch (cmd) { |
case (TEXICMD_DEFFN): |
case (TEXICMD_DEFFN): |
case (TEXICMD_DEFMAC): |
case (TEXICMD_DEFMAC): |
|
case (TEXICMD_DEFOP): |
|
case (TEXICMD_DEFOPT): |
case (TEXICMD_DEFTP): |
case (TEXICMD_DEFTP): |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFUN): |
case (TEXICMD_DEFTYPEFUN): |
Line 429 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 435 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
case (TEXICMD_DEFMACX): |
case (TEXICMD_DEFMACX): |
texiputchars(p, "Macro"); |
texiputchars(p, "Macro"); |
break; |
break; |
|
case (TEXICMD_DEFOPT): |
|
case (TEXICMD_DEFOPTX): |
|
texiputchars(p, "User Option"); |
|
break; |
case (TEXICMD_DEFTYPEVAR): |
case (TEXICMD_DEFTYPEVAR): |
case (TEXICMD_DEFTYPEVARX): |
case (TEXICMD_DEFTYPEVARX): |
case (TEXICMD_DEFVAR): |
case (TEXICMD_DEFVAR): |
Line 471 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 481 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
teximacroclose(p); |
teximacroclose(p); |
teximacro(p, "Fc"); |
teximacro(p, "Fc"); |
break; |
break; |
|
case (TEXICMD_DEFOP): |
|
case (TEXICMD_DEFOPX): |
case (TEXICMD_DEFTYPEFUN): |
case (TEXICMD_DEFTYPEFUN): |
case (TEXICMD_DEFTYPEFUNX): |
case (TEXICMD_DEFTYPEFUNX): |
case (TEXICMD_DEFTYPEFN): |
case (TEXICMD_DEFTYPEFN): |
Line 500 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 512 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
/* Spin. */ ; |
/* Spin. */ ; |
teximacroclose(p); |
teximacroclose(p); |
break; |
break; |
|
case (TEXICMD_DEFOPT): |
|
case (TEXICMD_DEFOPTX): |
case (TEXICMD_DEFVAR): |
case (TEXICMD_DEFVAR): |
case (TEXICMD_DEFVARX): |
case (TEXICMD_DEFVARX): |
case (TEXICMD_DEFVR): |
case (TEXICMD_DEFVR): |
Line 531 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 545 dodefn(struct texi *p, enum texicmd cmd, size_t *pos) |
|
switch (peekcmd(p, *pos)) { |
switch (peekcmd(p, *pos)) { |
case (TEXICMD_DEFFNX): |
case (TEXICMD_DEFFNX): |
case (TEXICMD_DEFMACX): |
case (TEXICMD_DEFMACX): |
|
case (TEXICMD_DEFOPX): |
|
case (TEXICMD_DEFOPTX): |
case (TEXICMD_DEFTPX): |
case (TEXICMD_DEFTPX): |
case (TEXICMD_DEFTYPEFNX): |
case (TEXICMD_DEFTYPEFNX): |
case (TEXICMD_DEFTYPEFUNX): |
case (TEXICMD_DEFTYPEFUNX): |
Line 662 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
Line 678 doignblock(struct texi *p, enum texicmd cmd, size_t *p |
|
"@%s", texitoks[cmd].tok); |
"@%s", texitoks[cmd].tok); |
assert(ssz < sizeof(start)); |
assert(ssz < sizeof(start)); |
esz = snprintf(end, sizeof(end), |
esz = snprintf(end, sizeof(end), |
"@end %s\n", texitoks[cmd].tok); |
"@end %s", texitoks[cmd].tok); |
assert(esz < sizeof(end)); |
assert(esz < sizeof(end)); |
stack = 1; |
stack = 1; |
|
|
Line 846 docopying(struct texi *p, enum texicmd cmd, size_t *po |
|
Line 862 docopying(struct texi *p, enum texicmd cmd, size_t *po |
|
} |
} |
|
|
term = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, end, endsz); |
term = memmem(&BUF(p)[*pos], BUFSZ(p) - *pos, end, endsz); |
if (NULL == term) { |
if (NULL == term) |
texiwarn(p, "unterminated \"%s\"", texitoks[cmd].tok); |
texierr(p, "unterminated \"%s\"", texitoks[cmd].tok); |
endpos = BUFSZ(p); |
else |
} else |
|
endpos = *pos + (size_t)(term - &BUF(p)[*pos]); |
endpos = *pos + (size_t)(term - &BUF(p)[*pos]); |
|
|
assert(endpos <= BUFSZ(p)); |
if (endpos == *pos) { |
|
advanceeoln(p, pos, 1); |
|
return; |
|
} |
|
|
|
assert(endpos < BUFSZ(p) && endpos > *pos); |
assert('\n' == BUF(p)[*pos]); |
assert('\n' == BUF(p)[*pos]); |
advance(p, pos); |
advance(p, pos); |
|
|
|
if (*pos == BUFSZ(p)) { |
|
texiwarn(p, "unterminated \"%s\"", texitoks[cmd].tok); |
|
return; |
|
} |
|
|
p->copying = malloc(endpos - *pos + 1); |
p->copying = malloc(endpos - *pos + 1); |
p->copyingsz = endpos - *pos; |
p->copyingsz = endpos - *pos; |
memcpy(p->copying, &BUF(p)[*pos], p->copyingsz); |
memcpy(p->copying, &BUF(p)[*pos], p->copyingsz); |
Line 1487 doprintindex(struct texi *p, enum texicmd cmd, size_t |
|
Line 1512 doprintindex(struct texi *p, enum texicmd cmd, size_t |
|
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]; |
#endif |
#endif |
|
|
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
Line 1535 doprintindex(struct texi *p, enum texicmd cmd, size_t |
|
Line 1561 doprintindex(struct texi *p, enum texicmd cmd, size_t |
|
texiputchars(p, "\"idx"); |
texiputchars(p, "\"idx"); |
texiputchars(p, p->indexs[i].name); |
texiputchars(p, p->indexs[i].name); |
cp = p->indexs[i].index[j].term; |
cp = p->indexs[i].index[j].term; |
while ('\n' != *cp) { |
while ('\n' != *cp) |
assert('\0' != *cp); |
|
texiputchar(p, *cp++); |
texiputchar(p, *cp++); |
} |
|
texiputchars(p, "\" \""); |
texiputchars(p, "\" \""); |
p->literal++; |
p->literal++; |
} else { |
} else { |
teximacroopen(p, "Xr"); |
teximacroopen(p, "Xr"); |
texiputchars(p, p->nodes[p->indexs[i].index[j].chapter]); |
snprintf(buf, sizeof(buf), "%s-%zd 7 \"idx", |
texiputchars(p, " 7 \"idx"); |
p->chapters, p->indexs[i].index[j].chapter); |
|
texiputchars(p, buf); |
texiputchars(p, p->indexs[i].name); |
texiputchars(p, p->indexs[i].name); |
cp = p->indexs[i].index[j].term; |
cp = p->indexs[i].index[j].term; |
while ('\n' != *cp) { |
while ('\n' != *cp) |
assert('\0' != *cp); |
|
texiputchar(p, *cp++); |
texiputchar(p, *cp++); |
} |
|
texiputchars(p, "\" \""); |
texiputchars(p, "\" \""); |
p->literal++; |
p->literal++; |
} |
} |
|
|
donode(struct texi *p, enum texicmd cmd, size_t *pos) |
donode(struct texi *p, enum texicmd cmd, size_t *pos) |
{ |
{ |
int sv = p->seenvs; |
int sv = p->seenvs; |
|
char fname[PATH_MAX]; |
|
size_t end, start; |
|
|
if (NULL != p->chapters) { |
if (0 == p->nodesz++) |
advanceeoln(p, pos, 1); |
p->ign--; |
if (0 == p->chapnum) |
|
p->ign--; |
/* Grab our node name. */ |
|
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
|
advance(p, pos); |
|
start = *pos; |
|
while (*pos < BUFSZ(p)) { |
|
if (BUF(p)[*pos] == ',') |
|
break; |
|
else if (BUF(p)[*pos] == '\n') |
|
break; |
|
advance(p, pos); |
|
} |
|
if (*pos == BUFSZ(p)) { |
|
texiwarn(p, "unexpected EOF"); |
|
return; |
|
} |
|
end = *pos; |
|
advanceeoln(p, pos, 1); |
|
|
|
if (NULL != p->chapters) |
teximdocclose(p, 0); |
teximdocclose(p, 0); |
|
|
|
/* Cache our node name. */ |
|
p->nodecur = texicache(p, &BUF(p)[start], end - start); |
|
|
|
if (NULL != p->chapters) { |
|
snprintf(fname, sizeof(fname), |
|
"%s-%zd.7", p->chapters, p->nodecur); |
|
p->outfile = fopen(fname, "w"); |
|
if (NULL == p->outfile) |
|
texiabort(p, fname); |
teximdocopen(p, pos); |
teximdocopen(p, pos); |
} else { |
} else if (p->nodesz > 1) { |
#if HAVE_INDEX |
/* Otherwise, mark our index. */ |
p->seenvs = -1; |
p->seenvs = -1; |
|
#if HAVE_INDEX |
teximacroopen(p, "Ix"); |
teximacroopen(p, "Ix"); |
texiputchars(p, "node"); |
texiputchars(p, "node"); |
while (*pos < BUFSZ(p) && isws(BUF(p)[*pos])) |
texiputchars(p, p->nodecache[p->nodecur].name); |
advance(p, pos); |
|
while (*pos < BUFSZ(p)) { |
|
if (BUF(p)[*pos] == ',') |
|
break; |
|
else if (BUF(p)[*pos] == '\n') |
|
break; |
|
texiputchar(p, BUF(p)[*pos]); |
|
advance(p, pos); |
|
} |
|
teximacroclose(p); |
teximacroclose(p); |
#endif |
#endif |
advanceeoln(p, pos, 1); |
|
p->seenvs = sv; |
p->seenvs = sv; |
} |
} else |
|
teximdocopen(p, pos); |
} |
} |
|
|
/* |
/* |
Line 1611 donode(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1656 donode(struct texi *p, enum texicmd cmd, size_t *pos) |
|
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, end, sv; |
size_t nodename, entryname; |
|
size_t nodenameend, entrynameend, i; |
|
ssize_t ppos, lastppos; |
|
char buf[PATH_MAX]; |
|
enum texicmd tcmd; |
|
|
advanceeoln(p, pos, 1); |
advanceeoln(p, pos, 1); |
|
|
Line 1631 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1680 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
break; |
break; |
} |
} |
|
|
|
lastppos = -1; |
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)) { |
Line 1646 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1696 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
while (*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]) { |
if (TEXICMD_END == peeklinecmd(p, *pos)) |
tcmd = peeklinecmd(p, *pos); |
|
if (TEXICMD_END == tcmd) |
break; |
break; |
parseeoln(p, pos); |
else if (TEXICMD_COMMENT == tcmd) |
|
advanceeoln(p, pos, 1); |
|
else |
|
parseeoln(p, pos); |
continue; |
continue; |
} |
} |
|
|
Line 1656 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1710 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
advance(p, pos); |
advance(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 = sv = *pos; |
entryname = *pos; |
while (*pos < BUFSZ(p) && ':' != BUF(p)[*pos]) |
while (*pos < BUFSZ(p) && ':' != BUF(p)[*pos]) |
advance(p, pos); |
advance(p, pos); |
end = *pos; |
entrynameend = *pos; |
advance(p, pos); |
advance(p, pos); |
|
|
|
p->seenvs = 0; |
|
teximacroopen(p, "It"); |
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); |
teximacroopen(p, "It"); |
nodename = *pos; |
#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 1690 domenu(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 1742 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; |
} |
} |
#ifdef HAVE_INDEX |
nodenameend = *pos; |
texiputchars(p, "\" \""); |
|
for (start = sv; start < end; start++) |
|
texiputchar(p, BUF(p)[start]); |
|
texiputchar(p, '"'); |
|
#endif |
|
} else { |
} else { |
advance(p, pos); |
advance(p, pos); |
p->seenvs = 0; |
nodename = entryname; |
teximacroopen(p, "It"); |
nodenameend = entrynameend; |
|
} |
|
ppos = texicache(p, &BUF(p)[nodename], |
|
nodenameend - nodename); |
|
if (-1 != lastppos) |
|
p->nodecache[lastppos].next = ppos; |
|
p->nodecache[ppos].prev = lastppos; |
|
p->nodecache[ppos].up = p->nodecur; |
|
lastppos = ppos; |
#ifdef HAVE_INDEX |
#ifdef HAVE_INDEX |
|
if (NULL == p->chapters) { |
teximacroopen(p, "Lkx"); |
teximacroopen(p, "Lkx"); |
texiputchars(p, "\"node"); |
texiputchars(p, "\"node"); |
for (start = sv; start < end; start++) |
for (i = nodename; i < nodenameend; i++) |
texiputchar(p, BUF(p)[start]); |
texiputchar(p, BUF(p)[i]); |
texiputchars(p, "\" \""); |
texiputchars(p, "\" \""); |
#endif |
for (i = entryname; i < entrynameend; i++) |
for (start = sv; start < end; start++) |
texiputchar(p, BUF(p)[i]); |
texiputchar(p, BUF(p)[start]); |
texiputchars(p, "\""); |
#ifdef HAVE_INDEX |
teximacroclose(p); |
texiputchar(p, '"'); |
} else { |
#endif |
snprintf(buf, sizeof(buf), |
|
"%s-%zd 7 ", p->chapters, ppos); |
|
teximacroopen(p, "Xr"); |
|
texiputchars(p, buf); |
|
texiputchars(p, "\"node"); |
|
for (i = nodename; i < nodenameend; i++) |
|
texiputchar(p, BUF(p)[i]); |
|
texiputchars(p, "\" \""); |
|
for (i = entryname; i < entrynameend; i++) |
|
texiputchar(p, BUF(p)[i]); |
|
texiputchars(p, "\""); |
|
teximacroclose(p); |
} |
} |
#ifdef HAVE_INDEX |
#else |
teximacroclose(p); |
for (i = entryname; i < entrynameend; i++) |
|
texiputchar(p, BUF(p)[i]); |
#endif |
#endif |
teximacroclose(p); |
teximacroclose(p); |
} |
} |
Line 2155 doindex(struct texi *p, enum texicmd cmd, size_t *pos) |
|
Line 2222 doindex(struct texi *p, enum texicmd cmd, size_t *pos) |
|
advance(p, pos); |
advance(p, pos); |
|
|
start = *pos; |
start = *pos; |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) { |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
assert('\0' != BUF(p)[*pos]); |
|
advance(p, pos); |
advance(p, pos); |
} |
|
|
|
if (*pos == BUFSZ(p)) { |
if (*pos == BUFSZ(p)) { |
texiwarn(p, "unexpected EOF"); |
texiwarn(p, "unexpected EOF"); |