version 1.20, 2015/03/01 00:25:08 |
version 1.26, 2015/03/05 08:35:35 |
Line 100 texiexit(struct texi *p) |
|
Line 100 texiexit(struct texi *p) |
|
free(p->dirs); |
free(p->dirs); |
free(p->subtitle); |
free(p->subtitle); |
free(p->title); |
free(p->title); |
|
free(p->copying); |
} |
} |
|
|
/* |
/* |
Line 184 texiputchar(struct texi *p, char c) |
|
Line 185 texiputchar(struct texi *p, char c) |
|
if ('\'' == c && 0 == p->outcol) |
if ('\'' == c && 0 == p->outcol) |
fputs("\\&", p->outfile); |
fputs("\\&", p->outfile); |
|
|
fputc(c, p->outfile); |
if (p->uppercase) |
|
fputc(toupper((unsigned int)c), p->outfile); |
|
else |
|
fputc(c, p->outfile); |
if ('\\' == c) |
if ('\\' == c) |
fputc('e', p->outfile); |
fputc('e', p->outfile); |
p->seenvs = 0; |
p->seenvs = 0; |
Line 210 texiputchars(struct texi *p, const char *s) |
|
Line 214 texiputchars(struct texi *p, const char *s) |
|
fputs("\\&", p->outfile); |
fputs("\\&", p->outfile); |
if ('\'' == *s && 0 == p->outcol) |
if ('\'' == *s && 0 == p->outcol) |
fputs("\\&", p->outfile); |
fputs("\\&", p->outfile); |
p->outcol += fputs(s, p->outfile); |
if (p->uppercase) |
|
for ( ; '\0' != *s; s++) |
|
p->outcol += fputc(toupper |
|
((unsigned int)*s), p->outfile); |
|
else |
|
p->outcol += fputs(s, p->outfile); |
p->seenvs = 0; |
p->seenvs = 0; |
} |
} |
|
|
Line 362 texipunctuate(struct texi *p, size_t *pos) |
|
Line 371 texipunctuate(struct texi *p, size_t *pos) |
|
case ('.'): |
case ('.'): |
case ('"'): |
case ('"'): |
case (':'): |
case (':'): |
|
case (';'): |
case ('!'): |
case ('!'): |
case ('?'): |
case ('?'): |
continue; |
continue; |
Line 415 advancenext(struct texi *p, size_t *pos) |
|
Line 425 advancenext(struct texi *p, size_t *pos) |
|
|
|
/* |
/* |
* Advance to the EOLN in the input stream. |
* Advance to the EOLN in the input stream. |
* NOTE: THIS SHOULD NOT BE CALLED ON BLANK TEXT, as it will read up to |
* This will skip over '@' markers in an effort to ignore escaped |
* the @\n. |
* newlines. |
*/ |
*/ |
size_t |
size_t |
advanceeoln(struct texi *p, size_t *pos, int consumenl) |
advanceeoln(struct texi *p, size_t *pos, int consumenl) |
{ |
{ |
|
|
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) |
while (*pos < BUFSZ(p) && '\n' != BUF(p)[*pos]) { |
|
if ('@' == BUF(p)[*pos]) |
|
advance(p, pos); |
advance(p, pos); |
advance(p, pos); |
|
} |
if (*pos < BUFSZ(p) && consumenl) |
if (*pos < BUFSZ(p) && consumenl) |
advance(p, pos); |
advance(p, pos); |
return(*pos); |
return(*pos); |
Line 452 texiexecmacro(struct texi *p, struct teximacro *m, siz |
|
Line 465 texiexecmacro(struct texi *p, struct teximacro *m, siz |
|
const char *cp; |
const char *cp; |
|
|
/* Disregard empty macros. */ |
/* Disregard empty macros. */ |
if (0 == (valsz = realsz = strlen(m->value))) |
if (0 == (valsz = realsz = strlen(m->value))) { |
|
args = argparse(p, pos, &asz, m->argsz); |
|
for (i = 0; i < asz; i++) |
|
free(args[i]); |
|
free(args); |
return; |
return; |
|
} |
|
|
/* |
/* |
* This is important: it protect us from macros that invoke more |
* This is important: it protect us from macros that invoke more |
Line 463 texiexecmacro(struct texi *p, struct teximacro *m, siz |
|
Line 481 texiexecmacro(struct texi *p, struct teximacro *m, siz |
|
* The "sv" value was initialised at the start of the macro. |
* The "sv" value was initialised at the start of the macro. |
*/ |
*/ |
if (sv > 0) |
if (sv > 0) |
if (++p->files[p->filepos].depth > 64) |
if (++p->files[p->filepos - 1].depth > 64) |
texierr(p, "maximium recursive depth"); |
texierr(p, "maximium recursive depth"); |
|
|
args = argparse(p, pos, &asz, m->argsz); |
args = argparse(p, pos, &asz, m->argsz); |
Line 472 texiexecmacro(struct texi *p, struct teximacro *m, siz |
|
Line 490 texiexecmacro(struct texi *p, struct teximacro *m, siz |
|
aasz = asz < m->argsz ? asz : m->argsz; |
aasz = asz < m->argsz ? asz : m->argsz; |
|
|
if (0 == aasz) { |
if (0 == aasz) { |
texisplice(p, m->value, valsz, pos); |
texisplice(p, m->value, valsz, *pos); |
return; |
return; |
} |
} |
|
|
Line 535 texiexecmacro(struct texi *p, struct teximacro *m, siz |
|
Line 553 texiexecmacro(struct texi *p, struct teximacro *m, siz |
|
i = end; |
i = end; |
} |
} |
|
|
texisplice(p, val, strlen(val), pos); |
texisplice(p, val, strlen(val), *pos); |
|
|
for (i = 0; i < asz; i++) |
for (i = 0; i < asz; i++) |
free(args[i]); |
free(args[i]); |
|
|
parseword(struct texi *p, size_t *pos, char extra) |
parseword(struct texi *p, size_t *pos, char extra) |
{ |
{ |
|
|
|
/* |
|
* Some line control: if we (non-macro, non-literal) already |
|
* have more than 72 characters written to the screen, then |
|
* output a newline before getting started. |
|
*/ |
if (p->seenws && 0 == p->outmacro && |
if (p->seenws && 0 == p->outmacro && |
p->outcol > 72 && 0 == p->literal) |
p->outcol > 72 && 0 == p->literal) |
texiputchar(p, '\n'); |
texiputchar(p, '\n'); |
/* FIXME: abstract this: we use it elsewhere. */ |
|
|
/* Usual padding in the case of seen whitespace. */ |
if (p->seenws && p->outcol && 0 == p->literal) |
if (p->seenws && p->outcol && 0 == p->literal) |
texiputchar(p, ' '); |
texiputchar(p, ' '); |
|
|
Line 584 parseword(struct texi *p, size_t *pos, char extra) |
|
Line 608 parseword(struct texi *p, size_t *pos, char extra) |
|
texiputchar(p, BUF(p)[*pos]); |
texiputchar(p, BUF(p)[*pos]); |
advance(p, pos); |
advance(p, pos); |
} |
} |
|
|
|
/* |
|
* New sentence, new line:if we (non-macro, non-literal) see a |
|
* period at the end of the last printed word, then open a |
|
* newline. |
|
*/ |
|
if (0 == p->literal && 0 == p->outmacro && |
|
*pos < BUFSZ(p) && '.' == BUF(p)[*pos - 1]) |
|
texiputchar(p, '\n'); |
} |
} |
|
|
/* |
/* |
Line 607 texicmd(const struct texi *p, size_t pos, size_t *end, |
|
Line 640 texicmd(const struct texi *p, size_t pos, size_t *end, |
|
return(TEXICMD__MAX); |
return(TEXICMD__MAX); |
|
|
/* Alphabetic commands are special. */ |
/* Alphabetic commands are special. */ |
if ( ! isalpha((unsigned char)BUF(p)[pos])) { |
if ( ! isalpha((unsigned int)BUF(p)[pos])) { |
if ((*end = pos + 1) == BUFSZ(p)) |
if ((*end = pos + 1) == BUFSZ(p)) |
return(TEXICMD__MAX); |
return(TEXICMD__MAX); |
for (i = 0; i < TEXICMD__MAX; i++) { |
for (i = 0; i < TEXICMD__MAX; i++) { |
Line 927 parseeof(struct texi *p) |
|
Line 960 parseeof(struct texi *p) |
|
} |
} |
|
|
void |
void |
texisplice(struct texi *p, const char *buf, size_t sz, size_t *pos) |
texisplice(struct texi *p, const char *buf, size_t sz, size_t pos) |
{ |
{ |
char *cp; |
char *cp; |
struct texifile *f; |
struct texifile *f; |
Line 944 texisplice(struct texi *p, const char *buf, size_t sz, |
|
Line 977 texisplice(struct texi *p, const char *buf, size_t sz, |
|
} |
} |
|
|
f->insplice += sz; |
f->insplice += sz; |
memmove(f->map + *pos + sz, f->map + *pos, f->mapsz - *pos); |
memmove(f->map + pos + sz, f->map + pos, f->mapsz - pos); |
memcpy(f->map + *pos, buf, sz); |
memcpy(f->map + pos, buf, sz); |
f->mapsz += sz; |
f->mapsz += sz; |
} |
} |
|
|
Line 1369 teximdocclose(struct texi *p, int last) |
|
Line 1402 teximdocclose(struct texi *p, int last) |
|
|
|
/* Print a reference to the "top" node. */ |
/* Print a reference to the "top" node. */ |
if (p->chapnum > 1) { |
if (p->chapnum > 1) { |
|
texiputchars(p, "Top node,"); |
snprintf(buf, sizeof(buf), "node1 7"); |
snprintf(buf, sizeof(buf), "node1 7"); |
teximacroopen(p, "Xr "); |
teximacroopen(p, "Xr "); |
texiputchars(p, buf); |
texiputchars(p, buf); |
texiputchars(p, " ,"); |
texiputchars(p, " ;"); |
teximacroclose(p); |
teximacroclose(p); |
} |
} |
|
|
/* Print a reference to the previous node. */ |
/* Print a reference to the previous node. */ |
if (p->chapnum > 2) { |
if (p->chapnum > 2) { |
|
texiputchars(p, "previous node,"); |
snprintf(buf, sizeof(buf), |
snprintf(buf, sizeof(buf), |
"node%zu 7", p->chapnum - 1); |
"node%zu 7", p->chapnum - 1); |
teximacroopen(p, "Xr "); |
teximacroopen(p, "Xr "); |
texiputchars(p, buf); |
texiputchars(p, buf); |
if ( ! last) |
if ( ! last) |
texiputchars(p, " ,"); |
texiputchars(p, " ;"); |
teximacroclose(p); |
teximacroclose(p); |
} |
} |
|
|
/* Print a reference to the next node. */ |
/* Print a reference to the next node. */ |
if ( ! last) { |
if ( ! last) { |
|
if (1 == p->chapnum) |
|
texiputchars(p, "Next node,"); |
|
else |
|
texiputchars(p, "next node,"); |
snprintf(buf, sizeof(buf), |
snprintf(buf, sizeof(buf), |
"node%zu 7", p->chapnum + 1); |
"node%zu 7", p->chapnum + 1); |
teximacroopen(p, "Xr "); |
teximacroopen(p, "Xr "); |
Line 1405 teximdocclose(struct texi *p, int last) |
|
Line 1444 teximdocclose(struct texi *p, int last) |
|
* Otherwise just print the mdoc(7) prologue. |
* Otherwise just print the mdoc(7) prologue. |
*/ |
*/ |
void |
void |
teximdocopen(struct texi *p) |
teximdocopen(struct texi *p, size_t *pos) |
{ |
{ |
const char *cp; |
const char *cp; |
time_t t; |
time_t t; |
Line 1445 teximdocopen(struct texi *p) |
|
Line 1484 teximdocopen(struct texi *p) |
|
texiputchar(p, *cp); |
texiputchar(p, *cp); |
teximacroclose(p); |
teximacroclose(p); |
teximacroopen(p, "Nd"); |
teximacroopen(p, "Nd"); |
if (NULL != p->subtitle) |
/* |
for (cp = p->subtitle; '\0' != *cp; cp++) |
* The subtitle `Nd' can consist of arbitrary macros, so paste |
texiputchar(p, *cp); |
* it and parse to the end of the line. |
else |
*/ |
|
if (NULL != p->subtitle) { |
|
texisplice(p, p->subtitle, strlen(p->subtitle), *pos); |
|
parseeoln(p, pos); |
|
} else |
texiputchars(p, "Unknown description"); |
texiputchars(p, "Unknown description"); |
teximacroclose(p); |
teximacroclose(p); |
p->seenvs = 1; |
p->seenvs = 1; |