version 1.28, 2015/03/05 15:18:13 |
version 1.29, 2015/03/07 11:53:21 |
|
|
#include "extern.h" |
#include "extern.h" |
|
|
/* |
/* |
|
* Table of macros. |
|
* These ABSOLUTELY MUST BE 2 or three characters long. |
|
*/ |
|
static const char *const mdocs[] = { |
|
"Ap", "Dd", "Dt", "Os", |
|
"Sh", "Ss", "Pp", "D1", |
|
"Dl", "Bd", "Ed", "Bl", |
|
"El", "It", "Ad", "An", |
|
"Ar", "Cd", "Cm", "Dv", |
|
"Er", "Ev", "Ex", "Fa", |
|
"Fd", "Fl", "Fn", "Ft", |
|
"Ic", "In", "Li", "Nd", |
|
"Nm", "Op", "Ot", "Pa", |
|
"Rv", "St", "Va", "Vt", |
|
"Xr", "%A", "%B", "%D", |
|
"%I", "%J", "%N", "%O", |
|
"%P", "%R", "%T", "%V", |
|
"Ac", "Ao", "Aq", "At", |
|
"Bc", "Bf", "Bo", "Bq", |
|
"Bsx", "Bx", "Db", "Dc", |
|
"Do", "Dq", "Ec", "Ef", |
|
"Em", "Eo", "Fx", "Ms", |
|
"No", "Ns", "Nx", "Ox", |
|
"Pc", "Pf", "Po", "Pq", |
|
"Qc", "Ql", "Qo", "Qq", |
|
"Re", "Rs", "Sc", "So", |
|
"Sq", "Sm", "Sx", "Sy", |
|
"Tn", "Ux", "Xc", "Xo", |
|
"Fo", "Fc", "Oo", "Oc", |
|
"Bk", "Ek", "Bt", "Hf", |
|
"Fr", "Ud", "Lb", "Lp", |
|
"Lk", "Mt", "Brq", "Bro", |
|
"Brc", "%C", "Es", "En", |
|
"Dx", "%Q", "br", "sp", |
|
"%U", "Ta", "ll", NULL, |
|
}; |
|
|
|
/* |
* Unmap the top-most file in the stack of files currently opened (that |
* Unmap the top-most file in the stack of files currently opened (that |
* is, nested calls to parsefile()). |
* is, nested calls to parsefile()). |
*/ |
*/ |
Line 561 texiexecmacro(struct texi *p, struct teximacro *m, siz |
|
Line 599 texiexecmacro(struct texi *p, struct teximacro *m, siz |
|
static void |
static void |
parseword(struct texi *p, size_t *pos, char extra) |
parseword(struct texi *p, size_t *pos, char extra) |
{ |
{ |
|
size_t i, end, len; |
|
int c; |
|
|
/* |
/* |
* If a prior word had a terminating double-newline, then begin |
* If a prior word had a terminating double-newline, then begin |
Line 587 parseword(struct texi *p, size_t *pos, char extra) |
|
Line 627 parseword(struct texi *p, size_t *pos, char extra) |
|
texiputchar(p, ' '); |
texiputchar(p, ' '); |
|
|
p->seenws = 0; |
p->seenws = 0; |
|
|
|
/* |
|
* If we're in a macro line, we might want to print text that |
|
* happens to be the same as an mdoc(7) macro. |
|
* Obviously, we need to escape these words. |
|
*/ |
|
if (p->outmacro) { |
|
end = *pos; |
|
/* Read ahead to get the word length. */ |
|
while (end < BUFSZ(p) && ! ismspace(BUF(p)[end])) { |
|
switch ((c = BUF(p)[end])) { |
|
case ('@'): |
|
case ('}'): |
|
case ('{'): |
|
break; |
|
default: |
|
if ('\0' != extra && extra == c) |
|
break; |
|
end++; |
|
continue; |
|
} |
|
break; |
|
} |
|
len = end - *pos; |
|
/* See if we have a match. */ |
|
for (i = 0; NULL != mdocs[i]; i++) { |
|
/* All macros are 2 or three letters. */ |
|
if (len < 2 || len > 3) |
|
continue; |
|
/* Check the macro word length. */ |
|
if ('\0' == mdocs[i][2] && 2 != len) |
|
continue; |
|
else if ('\0' == mdocs[i][3] && 3 != len) |
|
continue; |
|
if (strncmp(mdocs[i], &BUF(p)[*pos], len)) |
|
continue; |
|
texiputchars(p, "\\&"); |
|
break; |
|
} |
|
} |
|
|
while (*pos < BUFSZ(p) && ! ismspace(BUF(p)[*pos])) { |
while (*pos < BUFSZ(p) && ! ismspace(BUF(p)[*pos])) { |
switch (BUF(p)[*pos]) { |
switch (BUF(p)[*pos]) { |