version 1.326, 2018/04/09 22:27:04 |
version 1.327, 2018/04/10 00:52:30 |
|
|
struct roffreg { |
struct roffreg { |
struct roffstr key; |
struct roffstr key; |
int val; |
int val; |
|
int step; |
struct roffreg *next; |
struct roffreg *next; |
}; |
}; |
|
|
Line 182 static void roff_freestr(struct roffkv *); |
|
Line 183 static void roff_freestr(struct roffkv *); |
|
static size_t roff_getname(struct roff *, char **, int, int); |
static size_t roff_getname(struct roff *, char **, int, int); |
static int roff_getnum(const char *, int *, int *, int); |
static int roff_getnum(const char *, int *, int *, int); |
static int roff_getop(const char *, int *, char *); |
static int roff_getop(const char *, int *, char *); |
static int roff_getregn(struct roff *, const char *, size_t); |
static int roff_getregn(struct roff *, |
|
const char *, size_t, char); |
static int roff_getregro(const struct roff *, |
static int roff_getregro(const struct roff *, |
const char *name); |
const char *name); |
static const char *roff_getstrn(struct roff *, |
static const char *roff_getstrn(struct roff *, |
Line 207 static enum rofferr roff_rm(ROFF_ARGS); |
|
Line 209 static enum rofferr roff_rm(ROFF_ARGS); |
|
static enum rofferr roff_rn(ROFF_ARGS); |
static enum rofferr roff_rn(ROFF_ARGS); |
static enum rofferr roff_rr(ROFF_ARGS); |
static enum rofferr roff_rr(ROFF_ARGS); |
static void roff_setregn(struct roff *, const char *, |
static void roff_setregn(struct roff *, const char *, |
size_t, int, char); |
size_t, int, char, int); |
static void roff_setstr(struct roff *, |
static void roff_setstr(struct roff *, |
const char *, const char *, int); |
const char *, const char *, int); |
static void roff_setstrn(struct roffkv **, const char *, |
static void roff_setstrn(struct roffkv **, const char *, |
Line 1136 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1138 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
int done; /* no more input available */ |
int done; /* no more input available */ |
int deftype; /* type of definition to paste */ |
int deftype; /* type of definition to paste */ |
int rcsid; /* kind of RCS id seen */ |
int rcsid; /* kind of RCS id seen */ |
|
char sign; /* increment number register */ |
char term; /* character terminating the escape */ |
char term; /* character terminating the escape */ |
|
|
/* Search forward for comments. */ |
/* Search forward for comments. */ |
Line 1246 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1249 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
term = cp[1]; |
term = cp[1]; |
/* FALLTHROUGH */ |
/* FALLTHROUGH */ |
case 'n': |
case 'n': |
|
sign = cp[1]; |
|
if (sign == '+' || sign == '-') |
|
cp++; |
res = ubuf; |
res = ubuf; |
break; |
break; |
default: |
default: |
Line 1350 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1356 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
case 'n': |
case 'n': |
if (arg_complete) |
if (arg_complete) |
(void)snprintf(ubuf, sizeof(ubuf), "%d", |
(void)snprintf(ubuf, sizeof(ubuf), "%d", |
roff_getregn(r, stnam, naml)); |
roff_getregn(r, stnam, naml, sign)); |
else |
else |
ubuf[0] = '\0'; |
ubuf[0] = '\0'; |
break; |
break; |
Line 2522 roff_evalnum(struct roff *r, int ln, const char *v, |
|
Line 2528 roff_evalnum(struct roff *r, int ln, const char *v, |
|
void |
void |
roff_setreg(struct roff *r, const char *name, int val, char sign) |
roff_setreg(struct roff *r, const char *name, int val, char sign) |
{ |
{ |
roff_setregn(r, name, strlen(name), val, sign); |
roff_setregn(r, name, strlen(name), val, sign, INT_MIN); |
} |
} |
|
|
static void |
static void |
roff_setregn(struct roff *r, const char *name, size_t len, |
roff_setregn(struct roff *r, const char *name, size_t len, |
int val, char sign) |
int val, char sign, int step) |
{ |
{ |
struct roffreg *reg; |
struct roffreg *reg; |
|
|
Line 2544 roff_setregn(struct roff *r, const char *name, size_t |
|
Line 2550 roff_setregn(struct roff *r, const char *name, size_t |
|
reg->key.p = mandoc_strndup(name, len); |
reg->key.p = mandoc_strndup(name, len); |
reg->key.sz = len; |
reg->key.sz = len; |
reg->val = 0; |
reg->val = 0; |
|
reg->step = 0; |
reg->next = r->regtab; |
reg->next = r->regtab; |
r->regtab = reg; |
r->regtab = reg; |
} |
} |
Line 2554 roff_setregn(struct roff *r, const char *name, size_t |
|
Line 2561 roff_setregn(struct roff *r, const char *name, size_t |
|
reg->val -= val; |
reg->val -= val; |
else |
else |
reg->val = val; |
reg->val = val; |
|
if (step != INT_MIN) |
|
reg->step = step; |
} |
} |
|
|
/* |
/* |
Line 2589 roff_getregro(const struct roff *r, const char *name) |
|
Line 2598 roff_getregro(const struct roff *r, const char *name) |
|
int |
int |
roff_getreg(struct roff *r, const char *name) |
roff_getreg(struct roff *r, const char *name) |
{ |
{ |
return roff_getregn(r, name, strlen(name)); |
return roff_getregn(r, name, strlen(name), '\0'); |
} |
} |
|
|
static int |
static int |
roff_getregn(struct roff *r, const char *name, size_t len) |
roff_getregn(struct roff *r, const char *name, size_t len, char sign) |
{ |
{ |
struct roffreg *reg; |
struct roffreg *reg; |
int val; |
int val; |
Line 2604 roff_getregn(struct roff *r, const char *name, size_t |
|
Line 2613 roff_getregn(struct roff *r, const char *name, size_t |
|
return val; |
return val; |
} |
} |
|
|
for (reg = r->regtab; reg; reg = reg->next) |
for (reg = r->regtab; reg; reg = reg->next) { |
if (len == reg->key.sz && |
if (len == reg->key.sz && |
0 == strncmp(name, reg->key.p, len)) |
0 == strncmp(name, reg->key.p, len)) { |
|
switch (sign) { |
|
case '+': |
|
reg->val += reg->step; |
|
break; |
|
case '-': |
|
reg->val -= reg->step; |
|
break; |
|
default: |
|
break; |
|
} |
return reg->val; |
return reg->val; |
|
} |
|
} |
|
|
roff_setregn(r, name, len, 0, '\0'); |
roff_setregn(r, name, len, 0, '\0', INT_MIN); |
return 0; |
return 0; |
} |
} |
|
|
Line 2649 roff_freereg(struct roffreg *reg) |
|
Line 2670 roff_freereg(struct roffreg *reg) |
|
static enum rofferr |
static enum rofferr |
roff_nr(ROFF_ARGS) |
roff_nr(ROFF_ARGS) |
{ |
{ |
char *key, *val; |
char *key, *val, *step; |
size_t keysz; |
size_t keysz; |
int iv; |
int iv, is, len; |
char sign; |
char sign; |
|
|
key = val = buf->buf + pos; |
key = val = buf->buf + pos; |
Line 2666 roff_nr(ROFF_ARGS) |
|
Line 2687 roff_nr(ROFF_ARGS) |
|
if (sign == '+' || sign == '-') |
if (sign == '+' || sign == '-') |
val++; |
val++; |
|
|
if (roff_evalnum(r, ln, val, NULL, &iv, ROFFNUM_SCALE)) |
len = 0; |
roff_setregn(r, key, keysz, iv, sign); |
if (roff_evalnum(r, ln, val, &len, &iv, ROFFNUM_SCALE) == 0) |
|
return ROFF_IGN; |
|
|
|
step = val + len; |
|
while (isspace((unsigned char)*step)) |
|
step++; |
|
if (roff_evalnum(r, ln, step, NULL, &is, 0) == 0) |
|
is = INT_MIN; |
|
|
|
roff_setregn(r, key, keysz, iv, sign, is); |
return ROFF_IGN; |
return ROFF_IGN; |
} |
} |
|
|