version 1.168, 2011/08/16 12:30:12 |
version 1.171, 2011/09/19 08:34:45 |
|
|
/* Maximum number of nested if-else conditionals. */ |
/* Maximum number of nested if-else conditionals. */ |
#define RSTACK_MAX 128 |
#define RSTACK_MAX 128 |
|
|
|
/* Maximum number of string expansions per line, to break infinite loops. */ |
|
#define EXPAND_LIMIT 1000 |
|
|
enum rofft { |
enum rofft { |
ROFF_ad, |
ROFF_ad, |
ROFF_am, |
ROFF_am, |
Line 179 static const char *roff_getstrn(const struct roff *, |
|
Line 182 static const char *roff_getstrn(const struct roff *, |
|
const char *, size_t); |
const char *, size_t); |
static enum rofferr roff_line_ignore(ROFF_ARGS); |
static enum rofferr roff_line_ignore(ROFF_ARGS); |
static enum rofferr roff_nr(ROFF_ARGS); |
static enum rofferr roff_nr(ROFF_ARGS); |
static void roff_openeqn(struct roff *, const char *, |
static void roff_openeqn(struct roff *, const char *, |
int, int, const char *); |
int, int, const char *); |
static enum rofft roff_parse(struct roff *, const char *, int *); |
static enum rofft roff_parse(struct roff *, const char *, int *); |
static enum rofferr roff_parsetext(char *); |
static enum rofferr roff_parsetext(char *); |
Line 437 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
Line 440 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
const char *stnam; /* start of the name, after "[(*" */ |
const char *stnam; /* start of the name, after "[(*" */ |
const char *cp; /* end of the name, e.g. before ']' */ |
const char *cp; /* end of the name, e.g. before ']' */ |
const char *res; /* the string to be substituted */ |
const char *res; /* the string to be substituted */ |
int i, maxl; |
int i, maxl, expand_count; |
size_t nsz; |
size_t nsz; |
char *n; |
char *n; |
|
|
|
expand_count = 0; |
|
|
again: |
again: |
cp = *bufp + pos; |
cp = *bufp + pos; |
while (NULL != (cp = strchr(cp, '\\'))) { |
while (NULL != (cp = strchr(cp, '\\'))) { |
|
|
|
|
*bufp = n; |
*bufp = n; |
*szp = nsz; |
*szp = nsz; |
goto again; |
|
|
if (EXPAND_LIMIT >= ++expand_count) |
|
goto again; |
|
|
|
/* Just leave the string unexpanded. */ |
|
mandoc_msg(MANDOCERR_ROFFLOOP, r->parse, ln, pos, NULL); |
|
return; |
} |
} |
} |
} |
|
|
|
|
static enum rofferr |
static enum rofferr |
roff_parsetext(char *p) |
roff_parsetext(char *p) |
{ |
{ |
char l, r; |
|
size_t sz; |
size_t sz; |
const char *start; |
const char *start; |
enum mandoc_esc esc; |
enum mandoc_esc esc; |
Line 572 roff_parsetext(char *p) |
|
Line 582 roff_parsetext(char *p) |
|
continue; |
continue; |
} |
} |
|
|
l = *(p - 1); |
if (isalpha((unsigned char)p[-1]) && |
r = *(p + 1); |
isalpha((unsigned char)p[1])) |
if ('\\' != l && |
|
'\t' != r && '\t' != l && |
|
' ' != r && ' ' != l && |
|
'-' != r && '-' != l && |
|
! isdigit((unsigned char)l) && |
|
! isdigit((unsigned char)r)) |
|
*p = ASCII_HYPH; |
*p = ASCII_HYPH; |
p++; |
p++; |
} |
} |