version 1.285, 2017/01/10 13:47:00 |
version 1.292, 2017/03/08 13:18:10 |
|
|
/* $Id$ */ |
/* $Id$ */ |
/* |
/* |
* Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2008-2012, 2014 Kristaps Dzonsons <kristaps@bsd.lv> |
* Copyright (c) 2010-2015 Ingo Schwarze <schwarze@openbsd.org> |
* Copyright (c) 2010-2015, 2017 Ingo Schwarze <schwarze@openbsd.org> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
Line 1017 roff_node_append(struct roff_man *man, struct roff_nod |
|
Line 1017 roff_node_append(struct roff_man *man, struct roff_nod |
|
n->parent = man->last->parent; |
n->parent = man->last->parent; |
break; |
break; |
case ROFF_NEXT_CHILD: |
case ROFF_NEXT_CHILD: |
|
if (man->last->child != NULL) { |
|
n->next = man->last->child; |
|
man->last->child->prev = n; |
|
} else |
|
man->last->last = n; |
man->last->child = n; |
man->last->child = n; |
n->parent = man->last; |
n->parent = man->last; |
n->parent->last = n; |
|
break; |
break; |
default: |
default: |
abort(); |
abort(); |
Line 1059 roff_word_alloc(struct roff_man *man, int line, int po |
|
Line 1063 roff_word_alloc(struct roff_man *man, int line, int po |
|
n = roff_node_alloc(man, line, pos, ROFFT_TEXT, TOKEN_NONE); |
n = roff_node_alloc(man, line, pos, ROFFT_TEXT, TOKEN_NONE); |
n->string = roff_strdup(man->roff, word); |
n->string = roff_strdup(man->roff, word); |
roff_node_append(man, n); |
roff_node_append(man, n); |
if (man->macroset == MACROSET_MDOC) |
n->flags |= NODE_VALID | NODE_ENDED; |
n->flags |= NODE_VALID | NODE_ENDED; |
|
else |
|
n->flags |= NODE_VALID; |
|
man->next = ROFF_NEXT_SIBLING; |
man->next = ROFF_NEXT_SIBLING; |
} |
} |
|
|
Line 1147 roff_addtbl(struct roff_man *man, const struct tbl_spa |
|
Line 1148 roff_addtbl(struct roff_man *man, const struct tbl_spa |
|
n = roff_node_alloc(man, tbl->line, 0, ROFFT_TBL, TOKEN_NONE); |
n = roff_node_alloc(man, tbl->line, 0, ROFFT_TBL, TOKEN_NONE); |
n->span = tbl; |
n->span = tbl; |
roff_node_append(man, n); |
roff_node_append(man, n); |
if (man->macroset == MACROSET_MDOC) |
n->flags |= NODE_VALID | NODE_ENDED; |
n->flags |= NODE_VALID | NODE_ENDED; |
|
else |
|
n->flags |= NODE_VALID; |
|
man->next = ROFF_NEXT_SIBLING; |
man->next = ROFF_NEXT_SIBLING; |
} |
} |
|
|
Line 1225 deroff(char **dest, const struct roff_node *n) |
|
Line 1223 deroff(char **dest, const struct roff_node *n) |
|
return; |
return; |
} |
} |
|
|
/* Skip leading whitespace and escape sequences. */ |
/* Skip leading whitespace. */ |
|
|
cp = n->string; |
for (cp = n->string; *cp != '\0'; cp++) { |
while (*cp != '\0') { |
if (cp[0] == '\\' && cp[1] != '\0' && |
if ('\\' == *cp) { |
strchr(" %&0^|~", cp[1]) != NULL) |
cp++; |
cp++; |
mandoc_escape((const char **)&cp, NULL, NULL); |
else if ( ! isspace((unsigned char)*cp)) |
} else if (isspace((unsigned char)*cp)) |
|
cp++; |
|
else |
|
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 1607 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 3037 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 3061 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 3082 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); |
|
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 3364 roff_strdup(const struct roff *r, const char *p) |
|
Line 3378 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); |