version 1.271, 2015/05/31 23:13:22 |
version 1.275, 2015/08/29 23:56:01 |
|
|
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 1482 roff_res(struct roff *r, struct buf *buf, int ln, int |
|
Line 1484 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 1495 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 1539 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 2265 roff_cond(ROFF_ARGS) |
|
Line 2268 roff_cond(ROFF_ARGS) |
|
if (buf->buf[pos] == '\\' && buf->buf[pos + 1] == '{') { |
if (buf->buf[pos] == '\\' && buf->buf[pos + 1] == '{') { |
r->last->endspan = -1; |
r->last->endspan = -1; |
pos += 2; |
pos += 2; |
|
while (buf->buf[pos] == ' ') |
|
pos++; |
goto out; |
goto out; |
} |
} |
|
|
Line 2573 roff_setreg(struct roff *r, const char *name, int val, |
|
Line 2578 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 2601 roff_getreg(const struct roff *r, const char *name) |
|
Line 2608 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 2620 roff_getregn(const struct roff *r, const char *name, s |
|
Line 2627 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 2640 roff_hasregn(const struct roff *r, const char *name, s |
|
Line 2647 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 3074 roff_userdef(ROFF_ARGS) |
|
Line 3081 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 3082 roff_userdef(ROFF_ARGS) |
|
Line 3089 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 3102 roff_userdef(ROFF_ARGS) |
|
Line 3115 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 3112 roff_userdef(ROFF_ARGS) |
|
Line 3130 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 3157 roff_userdef(ROFF_ARGS) |
|
Line 3177 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++ = ' '; |
} |
} |
} |
} |
|
|