version 1.288, 2017/01/12 18:02:20 |
version 1.293, 2017/03/09 15:29:35 |
Line 1226 deroff(char **dest, const struct roff_node *n) |
|
Line 1226 deroff(char **dest, const struct roff_node *n) |
|
/* Skip leading whitespace. */ |
/* Skip leading whitespace. */ |
|
|
for (cp = n->string; *cp != '\0'; cp++) { |
for (cp = n->string; *cp != '\0'; cp++) { |
if (cp[0] == '\\' && strchr(" %&0^|~", cp[1]) != NULL) |
if (cp[0] == '\\' && cp[1] != '\0' && |
|
strchr(" %&0^|~", cp[1]) != NULL) |
cp++; |
cp++; |
else if ( ! isspace((unsigned char)*cp)) |
else if ( ! isspace((unsigned char)*cp)) |
break; |
break; |
} |
} |
|
|
|
/* Skip trailing backslash. */ |
|
|
|
sz = strlen(cp); |
|
if (sz > 0 && cp[sz - 1] == '\\') |
|
sz--; |
|
|
/* Skip trailing whitespace. */ |
/* Skip trailing whitespace. */ |
|
|
for (sz = strlen(cp); sz; sz--) |
for (; sz; sz--) |
if ( ! isspace((unsigned char)cp[sz-1])) |
if ( ! isspace((unsigned char)cp[sz-1])) |
break; |
break; |
|
|
Line 1601 roff_parseln(struct roff *r, int ln, struct buf *buf, |
|
Line 1608 roff_parseln(struct roff *r, int ln, struct buf *buf, |
|
return ROFF_IGN; |
return ROFF_IGN; |
while (buf->buf[pos] != '\0' && buf->buf[pos] != ' ') |
while (buf->buf[pos] != '\0' && buf->buf[pos] != ' ') |
pos++; |
pos++; |
while (buf->buf[pos] != '\0' && buf->buf[pos] == ' ') |
while (buf->buf[pos] == ' ') |
pos++; |
pos++; |
return tbl_read(r->tbl, ln, buf->buf, pos); |
return tbl_read(r->tbl, ln, buf->buf, pos); |
} |
} |
Line 3031 roff_userdef(ROFF_ARGS) |
|
Line 3038 roff_userdef(ROFF_ARGS) |
|
{ |
{ |
const char *arg[9], *ap; |
const char *arg[9], *ap; |
char *cp, *n1, *n2; |
char *cp, *n1, *n2; |
int i, ib, ie; |
int expand_count, i, ib, ie; |
size_t asz, rsz; |
size_t asz, rsz; |
|
|
/* |
/* |
Line 3055 roff_userdef(ROFF_ARGS) |
|
Line 3062 roff_userdef(ROFF_ARGS) |
|
*/ |
*/ |
|
|
buf->sz = strlen(r->current_string) + 1; |
buf->sz = strlen(r->current_string) + 1; |
n1 = cp = mandoc_malloc(buf->sz); |
n1 = n2 = cp = mandoc_malloc(buf->sz); |
memcpy(n1, r->current_string, buf->sz); |
memcpy(n1, r->current_string, buf->sz); |
|
expand_count = 0; |
while (*cp != '\0') { |
while (*cp != '\0') { |
|
|
/* Scan ahead for the next argument invocation. */ |
/* Scan ahead for the next argument invocation. */ |
Line 3076 roff_userdef(ROFF_ARGS) |
|
Line 3084 roff_userdef(ROFF_ARGS) |
|
cp -= 2; |
cp -= 2; |
|
|
/* |
/* |
|
* Prevent infinite recursion. |
|
*/ |
|
|
|
if (cp >= n2) |
|
expand_count = 1; |
|
else if (++expand_count > EXPAND_LIMIT) { |
|
mandoc_msg(MANDOCERR_ROFFLOOP, r->parse, |
|
ln, (int)(cp - n1), NULL); |
|
free(buf->buf); |
|
buf->buf = n1; |
|
return ROFF_IGN; |
|
} |
|
|
|
/* |
* Determine the size of the expanded argument, |
* Determine the size of the expanded argument, |
* taking escaping of quotes into account. |
* taking escaping of quotes into account. |
*/ |
*/ |
Line 3358 roff_strdup(const struct roff *r, const char *p) |
|
Line 3380 roff_strdup(const struct roff *r, const char *p) |
|
ssz = 0; |
ssz = 0; |
|
|
while ('\0' != *p) { |
while ('\0' != *p) { |
if ('\\' != *p && r->xtab && r->xtab[(int)*p].p) { |
assert((unsigned int)*p < 128); |
|
if ('\\' != *p && r->xtab && r->xtab[(unsigned int)*p].p) { |
sz = r->xtab[(int)*p].sz; |
sz = r->xtab[(int)*p].sz; |
res = mandoc_realloc(res, ssz + sz + 1); |
res = mandoc_realloc(res, ssz + sz + 1); |
memcpy(res + ssz, r->xtab[(int)*p].p, sz); |
memcpy(res + ssz, r->xtab[(int)*p].p, sz); |