version 1.272, 2015/06/27 13:29:14 |
version 1.276, 2015/09/26 00:54:04 |
|
|
int rstacksz; /* current size limit of rstack */ |
int rstacksz; /* current size limit of rstack */ |
int rstackpos; /* position in rstack */ |
int rstackpos; /* position in rstack */ |
int format; /* current file in mdoc or man format */ |
int format; /* current file in mdoc or man format */ |
|
int argc; /* number of args of the last macro */ |
char control; /* control character */ |
char control; /* control character */ |
}; |
}; |
|
|
Line 411 static int roff_getnum(const char *, int *, int *, i |
|
Line 412 static int roff_getnum(const char *, int *, int *, i |
|
static int roff_getop(const char *, int *, char *); |
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 int roff_getregro(const char *name); |
static int roff_getregro(const struct roff *, |
|
const char *name); |
static const char *roff_getstrn(const struct roff *, |
static const char *roff_getstrn(const struct roff *, |
const char *, size_t); |
const char *, size_t); |
static int roff_hasregn(const struct roff *, |
static int roff_hasregn(const struct roff *, |
Line 1020 roff_node_append(struct roff_man *man, struct roff_nod |
|
Line 1022 roff_node_append(struct roff_man *man, struct roff_nod |
|
break; |
break; |
default: |
default: |
abort(); |
abort(); |
/* NOTREACHED */ |
|
} |
} |
n->parent->nchild++; |
n->parent->nchild++; |
n->parent->last = n; |
n->parent->last = n; |
Line 1482 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1483 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
} |
} |
|
|
/* |
/* |
* Process text streams: |
* Process text streams. |
* Convert all breakable hyphens into ASCII_HYPH. |
|
* Decrement and spring input line trap. |
|
*/ |
*/ |
static enum rofferr |
static enum rofferr |
roff_parsetext(struct buf *buf, int pos, int *offs) |
roff_parsetext(struct buf *buf, int pos, int *offs) |
Line 1495 roff_parsetext(struct buf *buf, int pos, int *offs) |
|
Line 1494 roff_parsetext(struct buf *buf, int pos, int *offs) |
|
int isz; |
int isz; |
enum mandoc_esc esc; |
enum mandoc_esc esc; |
|
|
|
/* Spring the input line trap. */ |
|
|
|
if (roffit_lines == 1) { |
|
isz = mandoc_asprintf(&p, "%s\n.%s", buf->buf, roffit_macro); |
|
free(buf->buf); |
|
buf->buf = p; |
|
buf->sz = isz + 1; |
|
*offs = 0; |
|
free(roffit_macro); |
|
roffit_lines = 0; |
|
return(ROFF_REPARSE); |
|
} else if (roffit_lines > 1) |
|
--roffit_lines; |
|
|
|
/* Convert all breakable hyphens into ASCII_HYPH. */ |
|
|
start = p = buf->buf + pos; |
start = p = buf->buf + pos; |
|
|
while (*p != '\0') { |
while (*p != '\0') { |
Line 1523 roff_parsetext(struct buf *buf, int pos, int *offs) |
|
Line 1538 roff_parsetext(struct buf *buf, int pos, int *offs) |
|
*p = ASCII_HYPH; |
*p = ASCII_HYPH; |
p++; |
p++; |
} |
} |
|
|
/* Spring the input line trap. */ |
|
if (roffit_lines == 1) { |
|
isz = mandoc_asprintf(&p, "%s\n.%s", buf->buf, roffit_macro); |
|
free(buf->buf); |
|
buf->buf = p; |
|
buf->sz = isz + 1; |
|
*offs = 0; |
|
free(roffit_macro); |
|
roffit_lines = 0; |
|
return(ROFF_REPARSE); |
|
} else if (roffit_lines > 1) |
|
--roffit_lines; |
|
return(ROFF_CONT); |
return(ROFF_CONT); |
} |
} |
|
|
Line 2057 roff_getnum(const char *v, int *pos, int *res, int fla |
|
Line 2059 roff_getnum(const char *v, int *pos, int *res, int fla |
|
scaled = *res * 240 / 2.54; |
scaled = *res * 240 / 2.54; |
break; |
break; |
case 'v': |
case 'v': |
/* FALLTROUGH */ |
/* FALLTHROUGH */ |
case 'P': |
case 'P': |
scaled = *res * 40; |
scaled = *res * 40; |
break; |
break; |
case 'm': |
case 'm': |
/* FALLTROUGH */ |
/* FALLTHROUGH */ |
case 'n': |
case 'n': |
scaled = *res * 24; |
scaled = *res * 24; |
break; |
break; |
Line 2575 roff_setreg(struct roff *r, const char *name, int val, |
|
Line 2577 roff_setreg(struct roff *r, const char *name, int val, |
|
* were to turn up, another special value would have to be chosen. |
* were to turn up, another special value would have to be chosen. |
*/ |
*/ |
static int |
static int |
roff_getregro(const char *name) |
roff_getregro(const struct roff *r, const char *name) |
{ |
{ |
|
|
switch (*name) { |
switch (*name) { |
|
case '$': /* Number of arguments of the last macro evaluated. */ |
|
return(r->argc); |
case 'A': /* ASCII approximation mode is always off. */ |
case 'A': /* ASCII approximation mode is always off. */ |
return(0); |
return(0); |
case 'g': /* Groff compatibility mode is always on. */ |
case 'g': /* Groff compatibility mode is always on. */ |
Line 2603 roff_getreg(const struct roff *r, const char *name) |
|
Line 2607 roff_getreg(const struct roff *r, const char *name) |
|
int val; |
int val; |
|
|
if ('.' == name[0] && '\0' != name[1] && '\0' == name[2]) { |
if ('.' == name[0] && '\0' != name[1] && '\0' == name[2]) { |
val = roff_getregro(name + 1); |
val = roff_getregro(r, name + 1); |
if (-1 != val) |
if (-1 != val) |
return (val); |
return (val); |
} |
} |
Line 2622 roff_getregn(const struct roff *r, const char *name, s |
|
Line 2626 roff_getregn(const struct roff *r, const char *name, s |
|
int val; |
int val; |
|
|
if ('.' == name[0] && 2 == len) { |
if ('.' == name[0] && 2 == len) { |
val = roff_getregro(name + 1); |
val = roff_getregro(r, name + 1); |
if (-1 != val) |
if (-1 != val) |
return (val); |
return (val); |
} |
} |
Line 2642 roff_hasregn(const struct roff *r, const char *name, s |
|
Line 2646 roff_hasregn(const struct roff *r, const char *name, s |
|
int val; |
int val; |
|
|
if ('.' == name[0] && 2 == len) { |
if ('.' == name[0] && 2 == len) { |
val = roff_getregro(name + 1); |
val = roff_getregro(r, name + 1); |
if (-1 != val) |
if (-1 != val) |
return(1); |
return(1); |
} |
} |
Line 3076 roff_userdef(ROFF_ARGS) |
|
Line 3080 roff_userdef(ROFF_ARGS) |
|
{ |
{ |
const char *arg[9], *ap; |
const char *arg[9], *ap; |
char *cp, *n1, *n2; |
char *cp, *n1, *n2; |
int i; |
int i, ib, ie; |
size_t asz, rsz; |
size_t asz, rsz; |
|
|
/* |
/* |
Line 3084 roff_userdef(ROFF_ARGS) |
|
Line 3088 roff_userdef(ROFF_ARGS) |
|
* and NUL-terminate them. |
* and NUL-terminate them. |
*/ |
*/ |
|
|
|
r->argc = 0; |
cp = buf->buf + pos; |
cp = buf->buf + pos; |
for (i = 0; i < 9; i++) |
for (i = 0; i < 9; i++) { |
arg[i] = *cp == '\0' ? "" : |
if (*cp == '\0') |
mandoc_getarg(r->parse, &cp, ln, &pos); |
arg[i] = ""; |
|
else { |
|
arg[i] = mandoc_getarg(r->parse, &cp, ln, &pos); |
|
r->argc = i + 1; |
|
} |
|
} |
|
|
/* |
/* |
* Expand macro arguments. |
* Expand macro arguments. |
Line 3104 roff_userdef(ROFF_ARGS) |
|
Line 3114 roff_userdef(ROFF_ARGS) |
|
continue; |
continue; |
if (*cp++ != '$') |
if (*cp++ != '$') |
continue; |
continue; |
i = *cp - '1'; |
if (*cp == '*') { /* \\$* inserts all arguments */ |
if (0 > i || 8 < i) |
ib = 0; |
continue; |
ie = r->argc - 1; |
|
} else { /* \\$1 .. \\$9 insert one argument */ |
|
ib = ie = *cp - '1'; |
|
if (ib < 0 || ib > 8) |
|
continue; |
|
} |
cp -= 2; |
cp -= 2; |
|
|
/* |
/* |
Line 3114 roff_userdef(ROFF_ARGS) |
|
Line 3129 roff_userdef(ROFF_ARGS) |
|
* taking escaping of quotes into account. |
* taking escaping of quotes into account. |
*/ |
*/ |
|
|
asz = 0; |
asz = ie > ib ? ie - ib : 0; /* for blanks */ |
for (ap = arg[i]; *ap != '\0'; ap++) { |
for (i = ib; i <= ie; i++) { |
asz++; |
for (ap = arg[i]; *ap != '\0'; ap++) { |
if (*ap == '"') |
asz++; |
asz += 3; |
if (*ap == '"') |
|
asz += 3; |
|
} |
} |
} |
if (asz != 3) { |
if (asz != 3) { |
|
|
Line 3159 roff_userdef(ROFF_ARGS) |
|
Line 3176 roff_userdef(ROFF_ARGS) |
|
/* Copy the expanded argument, escaping quotes. */ |
/* Copy the expanded argument, escaping quotes. */ |
|
|
n2 = cp; |
n2 = cp; |
for (ap = arg[i]; *ap != '\0'; ap++) { |
for (i = ib; i <= ie; i++) { |
if (*ap == '"') { |
for (ap = arg[i]; *ap != '\0'; ap++) { |
memcpy(n2, "\\(dq", 4); |
if (*ap == '"') { |
n2 += 4; |
memcpy(n2, "\\(dq", 4); |
} else |
n2 += 4; |
*n2++ = *ap; |
} else |
|
*n2++ = *ap; |
|
} |
|
if (i < ie) |
|
*n2++ = ' '; |
} |
} |
} |
} |
|
|