version 1.331, 2018/08/16 13:54:06 |
version 1.337, 2018/08/20 17:25:09 |
|
|
int rstacksz; /* current size limit of rstack */ |
int rstacksz; /* current size limit of rstack */ |
int rstackpos; /* position in rstack */ |
int rstackpos; /* position in rstack */ |
int format; /* current file in mdoc or man format */ |
int format; /* current file in mdoc or man format */ |
int argc; /* number of args of the last macro */ |
|
char control; /* control character */ |
char control; /* control character */ |
char escape; /* escape character */ |
char escape; /* escape character */ |
}; |
}; |
Line 327 const char *__roff_name[MAN_MAX + 1] = { |
|
Line 326 const char *__roff_name[MAN_MAX + 1] = { |
|
"Dx", "%Q", "%U", "Ta", |
"Dx", "%Q", "%U", "Ta", |
NULL, |
NULL, |
"TH", "SH", "SS", "TP", |
"TH", "SH", "SS", "TP", |
|
"TQ", |
"LP", "PP", "P", "IP", |
"LP", "PP", "P", "IP", |
"HP", "SM", "SB", "BI", |
"HP", "SM", "SB", "BI", |
"IB", "BR", "RB", "R", |
"IB", "BR", "RB", "R", |
Line 334 const char *__roff_name[MAN_MAX + 1] = { |
|
Line 334 const char *__roff_name[MAN_MAX + 1] = { |
|
"nf", "fi", |
"nf", "fi", |
"RE", "RS", "DT", "UC", |
"RE", "RS", "DT", "UC", |
"PD", "AT", "in", |
"PD", "AT", "in", |
"OP", "EX", "EE", "UR", |
"SY", "YS", "OP", |
|
"EX", "EE", "UR", |
"UE", "MT", "ME", NULL |
"UE", "MT", "ME", NULL |
}; |
}; |
const char *const *roff_name = __roff_name; |
const char *const *roff_name = __roff_name; |
Line 1203 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1204 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
r->man->next = ROFF_NEXT_SIBLING; |
r->man->next = ROFF_NEXT_SIBLING; |
} |
} |
|
|
/* Discard comments. */ |
/* Line continuation with comment. */ |
|
|
while (stesc > start && stesc[-1] == ' ') |
if (stesc[1] == '#') { |
|
*stesc = '\0'; |
|
return ROFF_APPEND; |
|
} |
|
|
|
/* Discard normal comments. */ |
|
|
|
while (stesc > start && stesc[-1] == ' ' && |
|
(stesc == start + 1 || stesc[-2] != '\\')) |
stesc--; |
stesc--; |
*stesc = '\0'; |
*stesc = '\0'; |
break; |
break; |
|
|
static int |
static int |
roff_evalcond(struct roff *r, int ln, char *v, int *pos) |
roff_evalcond(struct roff *r, int ln, char *v, int *pos) |
{ |
{ |
char *cp, *name; |
const char *start, *end; |
size_t sz; |
char *cp, *name; |
int deftype, number, savepos, istrue, wanttrue; |
size_t sz; |
|
int deftype, len, number, savepos, istrue, wanttrue; |
|
|
if ('!' == v[*pos]) { |
if ('!' == v[*pos]) { |
wanttrue = 0; |
wanttrue = 0; |
Line 2175 roff_evalcond(struct roff *r, int ln, char *v, int *po |
|
Line 2185 roff_evalcond(struct roff *r, int ln, char *v, int *po |
|
case 'o': |
case 'o': |
(*pos)++; |
(*pos)++; |
return wanttrue; |
return wanttrue; |
case 'c': |
|
case 'e': |
case 'e': |
case 't': |
case 't': |
case 'v': |
case 'v': |
(*pos)++; |
(*pos)++; |
return !wanttrue; |
return !wanttrue; |
|
case 'c': |
|
do { |
|
(*pos)++; |
|
} while (v[*pos] == ' '); |
|
|
|
/* |
|
* Quirk for groff compatibility: |
|
* The horizontal tab is neither available nor unavailable. |
|
*/ |
|
|
|
if (v[*pos] == '\t') { |
|
(*pos)++; |
|
return 0; |
|
} |
|
|
|
/* Printable ASCII characters are available. */ |
|
|
|
if (v[*pos] != '\\') { |
|
(*pos)++; |
|
return wanttrue; |
|
} |
|
|
|
end = v + ++*pos; |
|
switch (mandoc_escape(&end, &start, &len)) { |
|
case ESCAPE_SPECIAL: |
|
istrue = mchars_spec2cp(start, len) != -1; |
|
break; |
|
case ESCAPE_UNICODE: |
|
istrue = 1; |
|
break; |
|
case ESCAPE_NUMBERED: |
|
istrue = mchars_num2char(start, len) != -1; |
|
break; |
|
default: |
|
istrue = !wanttrue; |
|
break; |
|
} |
|
*pos = end - v; |
|
return istrue == wanttrue; |
case 'd': |
case 'd': |
case 'r': |
case 'r': |
cp = v + *pos + 1; |
cp = v + *pos + 1; |
Line 2614 roff_getregro(const struct roff *r, const char *name) |
|
Line 2662 roff_getregro(const struct roff *r, const char *name) |
|
|
|
switch (*name) { |
switch (*name) { |
case '$': /* Number of arguments of the last macro evaluated. */ |
case '$': /* Number of arguments of the last macro evaluated. */ |
return r->argc; |
return 0; |
case 'A': /* ASCII approximation mode is always off. */ |
case 'A': /* ASCII approximation mode is always off. */ |
return 0; |
return 0; |
case 'g': /* Groff compatibility mode is always on. */ |
case 'g': /* Groff compatibility mode is always on. */ |
Line 3332 roff_userdef(ROFF_ARGS) |
|
Line 3380 roff_userdef(ROFF_ARGS) |
|
{ |
{ |
const char *arg[16], *ap; |
const char *arg[16], *ap; |
char *cp, *n1, *n2; |
char *cp, *n1, *n2; |
int expand_count, i, ib, ie; |
int argc, expand_count, i, ib, ie; |
size_t asz, rsz; |
size_t asz, esz, rsz; |
|
|
/* |
/* |
* Collect pointers to macro argument strings |
* Collect pointers to macro argument strings |
* and NUL-terminate them. |
* and NUL-terminate them. |
*/ |
*/ |
|
|
r->argc = 0; |
argc = 0; |
cp = buf->buf + pos; |
cp = buf->buf + pos; |
for (i = 0; i < 16; i++) { |
for (i = 0; i < 16; i++) { |
if (*cp == '\0') |
if (*cp == '\0') |
arg[i] = ""; |
arg[i] = ""; |
else { |
else { |
arg[i] = mandoc_getarg(r->parse, &cp, ln, &pos); |
arg[i] = mandoc_getarg(r->parse, &cp, ln, &pos); |
r->argc = i + 1; |
argc = i + 1; |
} |
} |
} |
} |
|
|
Line 3369 roff_userdef(ROFF_ARGS) |
|
Line 3417 roff_userdef(ROFF_ARGS) |
|
continue; |
continue; |
if (*cp == '*') { /* \\$* inserts all arguments */ |
if (*cp == '*') { /* \\$* inserts all arguments */ |
ib = 0; |
ib = 0; |
ie = r->argc - 1; |
ie = argc - 1; |
} else { /* \\$1 .. \\$9 insert one argument */ |
} else { /* \\$1 .. \\$9 insert one argument */ |
ib = ie = *cp - '1'; |
ib = ie = *cp - '1'; |
if (ib < 0 || ib > 8) |
if (ib < 0 || ib > 8) |
Line 3455 roff_userdef(ROFF_ARGS) |
|
Line 3503 roff_userdef(ROFF_ARGS) |
|
if (i < ie) |
if (i < ie) |
*n2++ = ' '; |
*n2++ = ' '; |
} |
} |
|
} |
|
|
|
/* |
|
* Expand the number of arguments, if it is used. |
|
* This never makes the expanded macro longer. |
|
*/ |
|
|
|
for (cp = n1; *cp != '\0'; cp++) { |
|
if (cp[0] != '\\') |
|
continue; |
|
if (cp[1] == '\\') { |
|
cp++; |
|
continue; |
|
} |
|
if (strncmp(cp + 1, "n(.$", 4) == 0) |
|
esz = 5; |
|
else if (strncmp(cp + 1, "n[.$]", 5) == 0) |
|
esz = 6; |
|
else |
|
continue; |
|
asz = snprintf(cp, esz, "%d", argc); |
|
assert(asz < esz); |
|
rsz = buf->sz - (cp - n1) - esz; |
|
memmove(cp + asz, cp + esz, rsz); |
|
buf->sz -= esz - asz; |
|
n2 = mandoc_realloc(n1, buf->sz); |
|
cp = n2 + (cp - n1) + asz; |
|
n1 = n2; |
} |
} |
|
|
/* |
/* |