version 1.121, 2010/12/06 16:55:35 |
version 1.130, 2011/01/01 16:18:39 |
|
|
#define MAP_FILE 0 |
#define MAP_FILE 0 |
#endif |
#endif |
|
|
|
#define REPARSE_LIMIT 1000 |
#define UNCONST(a) ((void *)(uintptr_t)(const void *)(a)) |
#define UNCONST(a) ((void *)(uintptr_t)(const void *)(a)) |
|
|
/* FIXME: Intel's compiler? LLVM? pcc? */ |
/* FIXME: Intel's compiler? LLVM? pcc? */ |
Line 89 struct curparse { |
|
Line 90 struct curparse { |
|
struct mdoc *mdoc; /* mdoc parser */ |
struct mdoc *mdoc; /* mdoc parser */ |
struct roff *roff; /* roff parser (!NULL) */ |
struct roff *roff; /* roff parser (!NULL) */ |
struct regset regs; /* roff registers */ |
struct regset regs; /* roff registers */ |
|
int reparse_count; /* finite interpolation stack */ |
enum outt outtype; /* which output to use */ |
enum outt outtype; /* which output to use */ |
out_mdoc outmdoc; /* mdoc output ptr */ |
out_mdoc outmdoc; /* mdoc output ptr */ |
out_man outman; /* man output ptr */ |
out_man outman; /* man output ptr */ |
Line 177 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
Line 179 static const char * const mandocerrs[MANDOCERR_MAX] = |
|
|
|
"generic error", |
"generic error", |
|
|
|
"bad table syntax", |
|
"bad table option", |
|
"bad table layout", |
|
"no table layout cells specified", |
|
"no table data cells specified", |
|
"input stack limit exceeded, infinite loop?", |
"skipping bad character", |
"skipping bad character", |
"skipping text before the first section header", |
"skipping text before the first section header", |
"skipping unknown macro", |
"skipping unknown macro", |
|
|
resize_buf(struct buf *buf, size_t initial) |
resize_buf(struct buf *buf, size_t initial) |
{ |
{ |
|
|
buf->sz = buf->sz ? 2 * buf->sz : initial; |
buf->sz = buf->sz > initial/2 ? 2 * buf->sz : initial; |
buf->buf = realloc(buf->buf, buf->sz); |
buf->buf = realloc(buf->buf, buf->sz); |
if (NULL == buf->buf) { |
if (NULL == buf->buf) { |
perror(NULL); |
perror(NULL); |
Line 519 fdesc(struct curparse *curp) |
|
Line 527 fdesc(struct curparse *curp) |
|
} |
} |
|
|
assert(curp->roff); |
assert(curp->roff); |
if ( ! roff_endparse(curp->roff)) { |
roff_endparse(curp->roff); |
assert(MANDOCLEVEL_FATAL <= file_status); |
|
goto cleanup; |
|
} |
|
|
|
/* |
/* |
* With -Wstop and warnings or errors of at least |
* With -Wstop and warnings or errors of at least |
Line 665 parsebuf(struct curparse *curp, struct buf blk, int st |
|
Line 670 parsebuf(struct curparse *curp, struct buf blk, int st |
|
if (0 == pos && '\0' == blk.buf[i]) |
if (0 == pos && '\0' == blk.buf[i]) |
break; |
break; |
|
|
if (start) |
if (start) { |
curp->line = lnn; |
curp->line = lnn; |
|
curp->reparse_count = 0; |
|
} |
|
|
while (i < (int)blk.sz && (start || '\0' != blk.buf[i])) { |
while (i < (int)blk.sz && (start || '\0' != blk.buf[i])) { |
if ('\n' == blk.buf[i]) { |
if ('\n' == blk.buf[i]) { |
|
|
|
|
switch (rr) { |
switch (rr) { |
case (ROFF_REPARSE): |
case (ROFF_REPARSE): |
parsebuf(curp, ln, 0); |
if (REPARSE_LIMIT >= ++curp->reparse_count) |
|
parsebuf(curp, ln, 0); |
|
else |
|
mmsg(MANDOCERR_ROFFLOOP, curp, |
|
curp->line, pos, NULL); |
pos = 0; |
pos = 0; |
continue; |
continue; |
case (ROFF_APPEND): |
case (ROFF_APPEND): |
|
|
continue; |
continue; |
} else |
} else |
break; |
break; |
case (ROFF_CONT): |
default: |
break; |
break; |
} |
} |
|
|
|
|
* Lastly, push down into the parsers themselves. One |
* Lastly, push down into the parsers themselves. One |
* of these will have already been set in the pset() |
* of these will have already been set in the pset() |
* routine. |
* routine. |
|
* If libroff returns ROFF_TBL, then add it to the |
|
* currently open parse. Since we only get here if |
|
* there does exist data (see tbl_data.c), we're |
|
* guaranteed that something's been allocated. |
*/ |
*/ |
|
|
if (curp->man || curp->mdoc) { |
if (ROFF_TBL == rr) { |
|
assert(curp->man || curp->mdoc); |
|
if (curp->man) |
|
man_addspan(curp->man, roff_span(curp->roff)); |
|
else |
|
mdoc_addspan(curp->mdoc, roff_span(curp->roff)); |
|
|
|
} else if (curp->man || curp->mdoc) { |
rc = curp->man ? |
rc = curp->man ? |
man_parseln(curp->man, |
man_parseln(curp->man, |
curp->line, ln.buf, of) : |
curp->line, ln.buf, of) : |