version 1.153, 2011/07/26 14:24:06 |
version 1.154, 2011/07/27 07:09:41 |
Line 159 static const char *roff_getstrn(const struct roff *, |
|
Line 159 static const char *roff_getstrn(const struct roff *, |
|
const char *, size_t); |
const char *, size_t); |
static enum rofferr roff_line_ignore(ROFF_ARGS); |
static enum rofferr roff_line_ignore(ROFF_ARGS); |
static enum rofferr roff_nr(ROFF_ARGS); |
static enum rofferr roff_nr(ROFF_ARGS); |
static int roff_res(struct roff *, |
static void roff_res(struct roff *, |
char **, size_t *, int, int); |
char **, size_t *, int, int); |
static enum rofferr roff_rm(ROFF_ARGS); |
static enum rofferr roff_rm(ROFF_ARGS); |
static void roff_setstr(struct roff *, |
static void roff_setstr(struct roff *, |
Line 400 roff_alloc(struct mparse *parse) |
|
Line 400 roff_alloc(struct mparse *parse) |
|
* `\*', e.g., `\*(ab'). These must be handled before the actual line |
* `\*', e.g., `\*(ab'). These must be handled before the actual line |
* is processed. |
* is processed. |
* This also checks the syntax of regular escapes. |
* This also checks the syntax of regular escapes. |
*/ |
*/ |
static int |
static void |
roff_res(struct roff *r, char **bufp, size_t *szp, int ln, int pos) |
roff_res(struct roff *r, char **bufp, size_t *szp, int ln, int pos) |
{ |
{ |
enum mandoc_esc esc; |
enum mandoc_esc esc; |
Line 413 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
Line 413 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
size_t nsz; |
size_t nsz; |
char *n; |
char *n; |
|
|
/* Search for a leading backslash and save a pointer to it. */ |
again: |
|
|
cp = *bufp + pos; |
cp = *bufp + pos; |
while (NULL != (cp = strchr(cp, '\\'))) { |
while (NULL != (cp = strchr(cp, '\\'))) { |
stesc = cp++; |
stesc = cp++; |
Line 426 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
Line 425 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
*/ |
*/ |
|
|
if ('\0' == *cp) |
if ('\0' == *cp) |
return(1); |
return; |
|
|
if ('*' != *cp) { |
if ('*' != *cp) { |
res = cp; |
res = cp; |
Line 437 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
Line 436 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
mandoc_msg |
mandoc_msg |
(MANDOCERR_BADESCAPE, r->parse, |
(MANDOCERR_BADESCAPE, r->parse, |
ln, (int)(stesc - *bufp), NULL); |
ln, (int)(stesc - *bufp), NULL); |
continue; |
return; |
} |
} |
|
|
cp++; |
cp++; |
Line 450 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
Line 449 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
|
|
switch (*cp) { |
switch (*cp) { |
case ('\0'): |
case ('\0'): |
return(1); |
return; |
case ('('): |
case ('('): |
cp++; |
cp++; |
maxl = 2; |
maxl = 2; |
Line 473 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
Line 472 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
(MANDOCERR_BADESCAPE, |
(MANDOCERR_BADESCAPE, |
r->parse, ln, |
r->parse, ln, |
(int)(stesc - *bufp), NULL); |
(int)(stesc - *bufp), NULL); |
return(1); |
return; |
} |
} |
if (0 == maxl && ']' == *cp) |
if (0 == maxl && ']' == *cp) |
break; |
break; |
Line 495 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
Line 494 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
|
|
/* Replace the escape sequence by the string. */ |
/* Replace the escape sequence by the string. */ |
|
|
|
pos += (stesc - *bufp); |
|
|
nsz = *szp + strlen(res) + 1; |
nsz = *szp + strlen(res) + 1; |
n = mandoc_malloc(nsz); |
n = mandoc_malloc(nsz); |
|
|
Line 506 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
Line 507 roff_res(struct roff *r, char **bufp, size_t *szp, int |
|
|
|
*bufp = n; |
*bufp = n; |
*szp = nsz; |
*szp = nsz; |
return(0); |
goto again; |
} |
} |
|
} |
|
|
return(1); |
/* |
|
* Process text streams: convert all breakable hyphens into ASCII_HYPH. |
|
*/ |
|
static enum rofferr |
|
roff_parsetext(char *p) |
|
{ |
|
size_t sz; |
|
const char *start; |
|
enum mandoc_esc esc; |
|
|
|
start = p; |
|
|
|
while ('\0' != *p) { |
|
sz = strcspn(p, "-\\"); |
|
p += sz; |
|
|
|
if ('\\' == *p) { |
|
/* Skip over escapes. */ |
|
p++; |
|
esc = mandoc_escape |
|
((const char **)&p, NULL, NULL); |
|
if (ESCAPE_ERROR == esc) |
|
break; |
|
} else if ('-' == *p) { |
|
if (mandoc_hyph(start, p)) |
|
*p = ASCII_HYPH; |
|
p++; |
|
} |
|
} |
|
|
|
return(ROFF_CONT); |
} |
} |
|
|
enum rofferr |
enum rofferr |
Line 525 roff_parseln(struct roff *r, int ln, char **bufp, |
|
Line 557 roff_parseln(struct roff *r, int ln, char **bufp, |
|
* words to fill in. |
* words to fill in. |
*/ |
*/ |
|
|
if ( ! roff_res(r, bufp, szp, ln, pos)) |
roff_res(r, bufp, szp, ln, pos); |
return(ROFF_REPARSE); |
|
|
|
ppos = pos; |
ppos = pos; |
ctl = mandoc_getcontrol(*bufp, &pos); |
ctl = mandoc_getcontrol(*bufp, &pos); |
Line 551 roff_parseln(struct roff *r, int ln, char **bufp, |
|
Line 582 roff_parseln(struct roff *r, int ln, char **bufp, |
|
return(eqn_read(&r->eqn, ln, *bufp, pos, offs)); |
return(eqn_read(&r->eqn, ln, *bufp, pos, offs)); |
if (r->tbl) |
if (r->tbl) |
return(tbl_read(r->tbl, ln, *bufp, pos)); |
return(tbl_read(r->tbl, ln, *bufp, pos)); |
return(ROFF_CONT); |
return(roff_parsetext(*bufp + pos)); |
} else if ( ! ctl) { |
} else if ( ! ctl) { |
if (r->eqn) |
if (r->eqn) |
return(eqn_read(&r->eqn, ln, *bufp, pos, offs)); |
return(eqn_read(&r->eqn, ln, *bufp, pos, offs)); |
if (r->tbl) |
if (r->tbl) |
return(tbl_read(r->tbl, ln, *bufp, pos)); |
return(tbl_read(r->tbl, ln, *bufp, pos)); |
return(ROFF_CONT); |
return(roff_parsetext(*bufp + pos)); |
} else if (r->eqn) |
} else if (r->eqn) |
return(eqn_read(&r->eqn, ln, *bufp, ppos, offs)); |
return(eqn_read(&r->eqn, ln, *bufp, ppos, offs)); |
|
|