version 1.326, 2018/04/09 22:27:04 |
version 1.334, 2018/08/18 21:37:01 |
|
|
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 195 static enum rofferr roff_line_ignore(ROFF_ARGS); |
|
Line 197 static enum rofferr roff_line_ignore(ROFF_ARGS); |
|
static void roff_man_alloc1(struct roff_man *); |
static void roff_man_alloc1(struct roff_man *); |
static void roff_man_free1(struct roff_man *); |
static void roff_man_free1(struct roff_man *); |
static enum rofferr roff_manyarg(ROFF_ARGS); |
static enum rofferr roff_manyarg(ROFF_ARGS); |
|
static enum rofferr roff_nop(ROFF_ARGS); |
static enum rofferr roff_nr(ROFF_ARGS); |
static enum rofferr roff_nr(ROFF_ARGS); |
static enum rofferr roff_onearg(ROFF_ARGS); |
static enum rofferr roff_onearg(ROFF_ARGS); |
static enum roff_tok roff_parse(struct roff *, char *, int *, |
static enum roff_tok roff_parse(struct roff *, char *, int *, |
Line 207 static enum rofferr roff_rm(ROFF_ARGS); |
|
Line 210 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 324 const char *__roff_name[MAN_MAX + 1] = { |
|
Line 327 const char *__roff_name[MAN_MAX + 1] = { |
|
"Dx", "%Q", "%U", "Ta", |
"Dx", "%Q", "%U", "Ta", |
NULL, |
NULL, |
"TH", "SH", "SS", "TP", |
"TH", "SH", "SS", "TP", |
|
"TQ", |
"LP", "PP", "P", "IP", |
"LP", "PP", "P", "IP", |
"HP", "SM", "SB", "BI", |
"HP", "SM", "SB", "BI", |
"IB", "BR", "RB", "R", |
"IB", "BR", "RB", "R", |
Line 331 const char *__roff_name[MAN_MAX + 1] = { |
|
Line 335 const char *__roff_name[MAN_MAX + 1] = { |
|
"nf", "fi", |
"nf", "fi", |
"RE", "RS", "DT", "UC", |
"RE", "RS", "DT", "UC", |
"PD", "AT", "in", |
"PD", "AT", "in", |
"OP", "EX", "EE", "UR", |
"SY", "YS", "OP", |
|
"EX", "EE", "UR", |
"UE", "MT", "ME", NULL |
"UE", "MT", "ME", NULL |
}; |
}; |
const char *const *roff_name = __roff_name; |
const char *const *roff_name = __roff_name; |
Line 488 static struct roffmac roffs[TOKEN_NONE] = { |
|
Line 493 static struct roffmac roffs[TOKEN_NONE] = { |
|
{ roff_line_ignore, NULL, NULL, 0 }, /* nhychar */ |
{ roff_line_ignore, NULL, NULL, 0 }, /* nhychar */ |
{ roff_unsupp, NULL, NULL, 0 }, /* nm */ |
{ roff_unsupp, NULL, NULL, 0 }, /* nm */ |
{ roff_unsupp, NULL, NULL, 0 }, /* nn */ |
{ roff_unsupp, NULL, NULL, 0 }, /* nn */ |
{ roff_unsupp, NULL, NULL, 0 }, /* nop */ |
{ roff_nop, NULL, NULL, 0 }, /* nop */ |
{ roff_nr, NULL, NULL, 0 }, /* nr */ |
{ roff_nr, NULL, NULL, 0 }, /* nr */ |
{ roff_unsupp, NULL, NULL, 0 }, /* nrf */ |
{ roff_unsupp, NULL, NULL, 0 }, /* nrf */ |
{ roff_line_ignore, NULL, NULL, 0 }, /* nroff */ |
{ roff_line_ignore, NULL, NULL, 0 }, /* nroff */ |
Line 760 roff_alloc(struct mparse *parse, int options) |
|
Line 765 roff_alloc(struct mparse *parse, int options) |
|
|
|
r = mandoc_calloc(1, sizeof(struct roff)); |
r = mandoc_calloc(1, sizeof(struct roff)); |
r->parse = parse; |
r->parse = parse; |
r->reqtab = roffhash_alloc(0, ROFF_USERDEF); |
r->reqtab = roffhash_alloc(0, ROFF_RENAMED); |
r->options = options; |
r->options = options; |
r->format = options & (MPARSE_MDOC | MPARSE_MAN); |
r->format = options & (MPARSE_MDOC | MPARSE_MAN); |
r->rstackpos = -1; |
r->rstackpos = -1; |
Line 1120 static enum rofferr |
|
Line 1125 static enum rofferr |
|
roff_res(struct roff *r, struct buf *buf, int ln, int pos) |
roff_res(struct roff *r, struct buf *buf, int ln, int pos) |
{ |
{ |
char ubuf[24]; /* buffer to print the number */ |
char ubuf[24]; /* buffer to print the number */ |
|
struct roff_node *n; /* used for header comments */ |
const char *start; /* start of the string to process */ |
const char *start; /* start of the string to process */ |
char *stesc; /* start of an escape sequence ('\\') */ |
char *stesc; /* start of an escape sequence ('\\') */ |
|
char *ep; /* end of comment string */ |
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 */ |
Line 1136 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1143 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 1170 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1178 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
|
|
/* Handle trailing whitespace. */ |
/* Handle trailing whitespace. */ |
|
|
cp = strchr(stesc--, '\0') - 1; |
ep = strchr(stesc--, '\0') - 1; |
if (*cp == '\n') { |
if (*ep == '\n') { |
done = 1; |
done = 1; |
cp--; |
ep--; |
} |
} |
if (*cp == ' ' || *cp == '\t') |
if (*ep == ' ' || *ep == '\t') |
mandoc_msg(MANDOCERR_SPACE_EOL, r->parse, |
mandoc_msg(MANDOCERR_SPACE_EOL, r->parse, |
ln, cp - buf->buf, NULL); |
ln, ep - buf->buf, NULL); |
|
|
|
/* |
|
* Save comments preceding the title macro |
|
* in the syntax tree. |
|
*/ |
|
|
|
if (r->format == 0) { |
|
while (*ep == ' ' || *ep == '\t') |
|
ep--; |
|
ep[1] = '\0'; |
|
n = roff_node_alloc(r->man, |
|
ln, stesc + 1 - buf->buf, |
|
ROFFT_COMMENT, TOKEN_NONE); |
|
n->string = mandoc_strdup(stesc + 2); |
|
roff_node_append(r->man, n); |
|
n->flags |= NODE_VALID | NODE_ENDED; |
|
r->man->next = ROFF_NEXT_SIBLING; |
|
} |
|
|
|
/* Line continuation with comment. */ |
|
|
|
if (stesc[1] == '#') { |
|
*stesc = '\0'; |
|
return ROFF_APPEND; |
|
} |
|
|
|
/* Discard normal comments. */ |
|
|
while (stesc > start && stesc[-1] == ' ') |
while (stesc > start && stesc[-1] == ' ') |
stesc--; |
stesc--; |
*stesc = '\0'; |
*stesc = '\0'; |
Line 1246 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1282 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 1337 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1376 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
if (arg_complete) { |
if (arg_complete) { |
deftype = ROFFDEF_USER | ROFFDEF_PRE; |
deftype = ROFFDEF_USER | ROFFDEF_PRE; |
res = roff_getstrn(r, stnam, naml, &deftype); |
res = roff_getstrn(r, stnam, naml, &deftype); |
|
|
|
/* |
|
* If not overriden, let \*(.T |
|
* through to the formatters. |
|
*/ |
|
|
|
if (res == NULL && naml == 2 && |
|
stnam[0] == '.' && stnam[1] == 'T') { |
|
roff_setstrn(&r->strtab, |
|
".T", 2, NULL, 0, 0); |
|
stesc--; |
|
continue; |
|
} |
} |
} |
break; |
break; |
case 'B': |
case 'B': |
Line 1350 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1402 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 2574 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 2596 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 2607 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 2644 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 2659 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 2716 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 2733 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; |
} |
} |
|
|
Line 2793 roff_TE(ROFF_ARGS) |
|
Line 2868 roff_TE(ROFF_ARGS) |
|
free(buf->buf); |
free(buf->buf); |
buf->buf = mandoc_strdup(".sp"); |
buf->buf = mandoc_strdup(".sp"); |
buf->sz = 4; |
buf->sz = 4; |
|
*offs = 0; |
return ROFF_REPARSE; |
return ROFF_REPARSE; |
} |
} |
r->tbl = NULL; |
r->tbl = NULL; |
Line 3108 roff_eo(ROFF_ARGS) |
|
Line 3184 roff_eo(ROFF_ARGS) |
|
} |
} |
|
|
static enum rofferr |
static enum rofferr |
|
roff_nop(ROFF_ARGS) |
|
{ |
|
while (buf->buf[pos] == ' ') |
|
pos++; |
|
*offs = pos; |
|
return ROFF_RERUN; |
|
} |
|
|
|
static enum rofferr |
roff_tr(ROFF_ARGS) |
roff_tr(ROFF_ARGS) |
{ |
{ |
const char *p, *first, *second; |
const char *p, *first, *second; |
Line 3312 roff_userdef(ROFF_ARGS) |
|
Line 3397 roff_userdef(ROFF_ARGS) |
|
ln, (int)(cp - n1), NULL); |
ln, (int)(cp - n1), NULL); |
free(buf->buf); |
free(buf->buf); |
buf->buf = n1; |
buf->buf = n1; |
|
*offs = 0; |
return ROFF_IGN; |
return ROFF_IGN; |
} |
} |
|
|
Line 3406 roff_renamed(ROFF_ARGS) |
|
Line 3492 roff_renamed(ROFF_ARGS) |
|
buf->buf[pos] == '\0' ? "" : " ", buf->buf + pos) + 1; |
buf->buf[pos] == '\0' ? "" : " ", buf->buf + pos) + 1; |
free(buf->buf); |
free(buf->buf); |
buf->buf = nbuf; |
buf->buf = nbuf; |
|
*offs = 0; |
return ROFF_CONT; |
return ROFF_CONT; |
} |
} |
|
|