version 1.182, 2013/10/05 22:19:10 |
version 1.188, 2013/12/25 00:50:05 |
|
|
ROFF_de1, |
ROFF_de1, |
ROFF_ds, |
ROFF_ds, |
ROFF_el, |
ROFF_el, |
|
ROFF_fam, |
|
ROFF_hw, |
ROFF_hy, |
ROFF_hy, |
ROFF_ie, |
ROFF_ie, |
ROFF_if, |
ROFF_if, |
|
|
}; |
}; |
|
|
enum roffrule { |
enum roffrule { |
ROFFRULE_ALLOW, |
ROFFRULE_DENY, |
ROFFRULE_DENY |
ROFFRULE_ALLOW |
}; |
}; |
|
|
/* |
/* |
Line 185 static void roff_free1(struct roff *); |
|
Line 187 static void roff_free1(struct roff *); |
|
static void roff_freereg(struct roffreg *); |
static void roff_freereg(struct roffreg *); |
static void roff_freestr(struct roffkv *); |
static void roff_freestr(struct roffkv *); |
static char *roff_getname(struct roff *, char **, int, int); |
static char *roff_getname(struct roff *, char **, int, int); |
|
static int roff_getnum(const char *, int *, int *); |
|
static int roff_getop(const char *, int *, char *); |
static int roff_getregn(const struct roff *, |
static int roff_getregn(const struct roff *, |
const char *, size_t); |
const char *, size_t); |
static const char *roff_getstrn(const struct roff *, |
static const char *roff_getstrn(const struct roff *, |
Line 233 static struct roffmac roffs[ROFF_MAX] = { |
|
Line 237 static struct roffmac roffs[ROFF_MAX] = { |
|
{ "de1", roff_block, roff_block_text, roff_block_sub, 0, NULL }, |
{ "de1", roff_block, roff_block_text, roff_block_sub, 0, NULL }, |
{ "ds", roff_ds, NULL, NULL, 0, NULL }, |
{ "ds", roff_ds, NULL, NULL, 0, NULL }, |
{ "el", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT, NULL }, |
{ "el", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT, NULL }, |
|
{ "fam", roff_line_ignore, NULL, NULL, 0, NULL }, |
|
{ "hw", roff_line_ignore, NULL, NULL, 0, NULL }, |
{ "hy", roff_line_ignore, NULL, NULL, 0, NULL }, |
{ "hy", roff_line_ignore, NULL, NULL, 0, NULL }, |
{ "ie", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT, NULL }, |
{ "ie", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT, NULL }, |
{ "if", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT, NULL }, |
{ "if", roff_cond, roff_cond_text, roff_cond_sub, ROFFMAC_STRUCT, NULL }, |
Line 1125 roff_cond_text(ROFF_ARGS) |
|
Line 1131 roff_cond_text(ROFF_ARGS) |
|
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
return(ROFFRULE_DENY == rr ? ROFF_IGN : ROFF_CONT); |
} |
} |
|
|
|
static int |
|
roff_getnum(const char *v, int *pos, int *res) |
|
{ |
|
int p, n; |
|
|
|
p = *pos; |
|
n = v[p] == '-'; |
|
if (n) |
|
p++; |
|
|
|
for (*res = 0; isdigit((unsigned char)v[p]); p++) |
|
*res += 10 * *res + v[p] - '0'; |
|
if (p == *pos + n) |
|
return 0; |
|
|
|
if (n) |
|
*res = -*res; |
|
|
|
*pos = p; |
|
return 1; |
|
} |
|
|
|
static int |
|
roff_getop(const char *v, int *pos, char *res) |
|
{ |
|
int e; |
|
|
|
*res = v[*pos]; |
|
e = v[*pos + 1] == '='; |
|
|
|
switch (*res) { |
|
case '=': |
|
break; |
|
case '>': |
|
if (e) |
|
*res = 'g'; |
|
break; |
|
case '<': |
|
if (e) |
|
*res = 'l'; |
|
break; |
|
default: |
|
return(0); |
|
} |
|
|
|
*pos += 1 + e; |
|
|
|
return(*res); |
|
} |
|
|
static enum roffrule |
static enum roffrule |
roff_evalcond(const char *v, int *pos) |
roff_evalcond(const char *v, int *pos) |
{ |
{ |
|
int not, lh, rh; |
|
char op; |
|
|
switch (v[*pos]) { |
switch (v[*pos]) { |
case ('n'): |
case ('n'): |
Line 1140 roff_evalcond(const char *v, int *pos) |
|
Line 1198 roff_evalcond(const char *v, int *pos) |
|
case ('t'): |
case ('t'): |
(*pos)++; |
(*pos)++; |
return(ROFFRULE_DENY); |
return(ROFFRULE_DENY); |
|
case ('!'): |
|
(*pos)++; |
|
not = 1; |
|
break; |
default: |
default: |
|
not = 0; |
break; |
break; |
} |
} |
|
|
while (v[*pos] && ' ' != v[*pos]) |
if (!roff_getnum(v, pos, &lh)) |
(*pos)++; |
return ROFFRULE_DENY; |
return(ROFFRULE_DENY); |
if (!roff_getop(v, pos, &op)) { |
|
if (lh < 0) |
|
lh = 0; |
|
goto out; |
|
} |
|
if (!roff_getnum(v, pos, &rh)) |
|
return ROFFRULE_DENY; |
|
switch (op) { |
|
case 'g': |
|
lh = lh >= rh; |
|
break; |
|
case 'l': |
|
lh = lh <= rh; |
|
break; |
|
case '=': |
|
lh = lh == rh; |
|
break; |
|
case '>': |
|
lh = lh > rh; |
|
break; |
|
case '<': |
|
lh = lh < rh; |
|
break; |
|
default: |
|
return ROFFRULE_DENY; |
|
} |
|
out: |
|
if (not) |
|
lh = !lh; |
|
return lh ? ROFFRULE_ALLOW : ROFFRULE_DENY; |
} |
} |
|
|
/* ARGSUSED */ |
/* ARGSUSED */ |
Line 1268 roff_ds(ROFF_ARGS) |
|
Line 1360 roff_ds(ROFF_ARGS) |
|
} |
} |
|
|
void |
void |
roff_setreg(struct roff *r, const char *name, int val) |
roff_setreg(struct roff *r, const char *name, int val, char sign) |
{ |
{ |
struct roffreg *reg; |
struct roffreg *reg; |
|
|
Line 1283 roff_setreg(struct roff *r, const char *name, int val) |
|
Line 1375 roff_setreg(struct roff *r, const char *name, int val) |
|
reg = mandoc_malloc(sizeof(struct roffreg)); |
reg = mandoc_malloc(sizeof(struct roffreg)); |
reg->key.p = mandoc_strdup(name); |
reg->key.p = mandoc_strdup(name); |
reg->key.sz = strlen(name); |
reg->key.sz = strlen(name); |
|
reg->val = 0; |
reg->next = r->regtab; |
reg->next = r->regtab; |
r->regtab = reg; |
r->regtab = reg; |
} |
} |
|
|
reg->val = val; |
if ('+' == sign) |
|
reg->val += val; |
|
else if ('-' == sign) |
|
reg->val -= val; |
|
else |
|
reg->val = val; |
} |
} |
|
|
int |
int |
Line 1334 roff_nr(ROFF_ARGS) |
|
Line 1432 roff_nr(ROFF_ARGS) |
|
{ |
{ |
const char *key; |
const char *key; |
char *val; |
char *val; |
|
size_t sz; |
int iv; |
int iv; |
|
char sign; |
|
|
val = *bufp + pos; |
val = *bufp + pos; |
key = roff_getname(r, &val, ln, pos); |
key = roff_getname(r, &val, ln, pos); |
|
|
iv = mandoc_strntoi(val, strlen(val), 10); |
sign = *val; |
|
if ('+' == sign || '-' == sign) |
|
val++; |
|
|
roff_setreg(r, key, iv); |
sz = strspn(val, "0123456789"); |
|
iv = sz ? mandoc_strntoi(val, sz, 10) : 0; |
|
|
|
roff_setreg(r, key, iv, sign); |
|
|
return(ROFF_IGN); |
return(ROFF_IGN); |
} |
} |
|
|
Line 1628 roff_userdef(ROFF_ARGS) |
|
Line 1733 roff_userdef(ROFF_ARGS) |
|
|
|
/* |
/* |
* Collect pointers to macro argument strings |
* Collect pointers to macro argument strings |
* and null-terminate them. |
* and NUL-terminate them. |
*/ |
*/ |
cp = *bufp + pos; |
cp = *bufp + pos; |
for (i = 0; i < 9; i++) |
for (i = 0; i < 9; i++) |