version 1.42, 2014/01/06 00:53:33 |
version 1.45, 2014/03/19 22:20:43 |
|
|
enum mandoclevel file_status; /* status of current parse */ |
enum mandoclevel file_status; /* status of current parse */ |
enum mandoclevel wlevel; /* ignore messages below this */ |
enum mandoclevel wlevel; /* ignore messages below this */ |
int line; /* line number in the file */ |
int line; /* line number in the file */ |
enum mparset inttype; /* which parser to use */ |
int options; /* parser options */ |
struct man *pman; /* persistent man parser */ |
struct man *pman; /* persistent man parser */ |
struct mdoc *pmdoc; /* persistent mdoc parser */ |
struct mdoc *pmdoc; /* persistent mdoc parser */ |
struct man *man; /* man parser */ |
struct man *man; /* man parser */ |
struct mdoc *mdoc; /* mdoc parser */ |
struct mdoc *mdoc; /* mdoc parser */ |
struct roff *roff; /* roff parser (!NULL) */ |
struct roff *roff; /* roff parser (!NULL) */ |
|
char *sodest; /* filename pointed to by .so */ |
int reparse_count; /* finite interp. stack */ |
int reparse_count; /* finite interp. stack */ |
mandocmsg mmsg; /* warning/error message handler */ |
mandocmsg mmsg; /* warning/error message handler */ |
const char *file; |
const char *file; |
struct buf *secondary; |
struct buf *secondary; |
char *defos; /* default operating system */ |
char *defos; /* default operating system */ |
int quick; /* abort the parse early */ |
|
}; |
}; |
|
|
static void resize_buf(struct buf *, size_t); |
static void resize_buf(struct buf *, size_t); |
Line 255 pset(const char *buf, int pos, struct mparse *curp) |
|
Line 255 pset(const char *buf, int pos, struct mparse *curp) |
|
return; |
return; |
} |
} |
|
|
switch (curp->inttype) { |
if (MPARSE_MDOC & curp->options) { |
case (MPARSE_MDOC): |
|
if (NULL == curp->pmdoc) |
if (NULL == curp->pmdoc) |
curp->pmdoc = mdoc_alloc(curp->roff, curp, |
curp->pmdoc = mdoc_alloc( |
curp->defos, curp->quick); |
curp->roff, curp, curp->defos, |
|
MPARSE_QUICK & curp->options ? 1 : 0); |
assert(curp->pmdoc); |
assert(curp->pmdoc); |
curp->mdoc = curp->pmdoc; |
curp->mdoc = curp->pmdoc; |
return; |
return; |
case (MPARSE_MAN): |
} else if (MPARSE_MAN & curp->options) { |
if (NULL == curp->pman) |
if (NULL == curp->pman) |
curp->pman = man_alloc(curp->roff, curp, |
curp->pman = man_alloc(curp->roff, curp, |
curp->quick); |
MPARSE_QUICK & curp->options ? 1 : 0); |
assert(curp->pman); |
assert(curp->pman); |
curp->man = curp->pman; |
curp->man = curp->pman; |
return; |
return; |
default: |
|
break; |
|
} |
} |
|
|
if (pos >= 3 && 0 == memcmp(buf, ".Dd", 3)) { |
if (pos >= 3 && 0 == memcmp(buf, ".Dd", 3)) { |
if (NULL == curp->pmdoc) |
if (NULL == curp->pmdoc) |
curp->pmdoc = mdoc_alloc(curp->roff, curp, |
curp->pmdoc = mdoc_alloc( |
curp->defos, curp->quick); |
curp->roff, curp, curp->defos, |
|
MPARSE_QUICK & curp->options ? 1 : 0); |
assert(curp->pmdoc); |
assert(curp->pmdoc); |
curp->mdoc = curp->pmdoc; |
curp->mdoc = curp->pmdoc; |
return; |
return; |
} |
} |
|
|
if (NULL == curp->pman) |
if (NULL == curp->pman) |
curp->pman = man_alloc(curp->roff, curp, curp->quick); |
curp->pman = man_alloc(curp->roff, curp, |
|
MPARSE_QUICK & curp->options ? 1 : 0); |
assert(curp->pman); |
assert(curp->pman); |
curp->man = curp->pman; |
curp->man = curp->pman; |
} |
} |
|
|
assert(MANDOCLEVEL_FATAL <= curp->file_status); |
assert(MANDOCLEVEL_FATAL <= curp->file_status); |
break; |
break; |
case (ROFF_SO): |
case (ROFF_SO): |
|
if (0 == (MPARSE_SO & curp->options) && |
|
(i >= (int)blk.sz || '\0' == blk.buf[i])) { |
|
curp->sodest = mandoc_strdup(ln.buf + of); |
|
free(ln.buf); |
|
return; |
|
} |
/* |
/* |
* We remove `so' clauses from our lookaside |
* We remove `so' clauses from our lookaside |
* buffer because we're going to descend into |
* buffer because we're going to descend into |
Line 677 mparse_end(struct mparse *curp) |
|
Line 683 mparse_end(struct mparse *curp) |
|
return; |
return; |
} |
} |
|
|
if ( ! (curp->man || curp->mdoc)) { |
if ( ! (curp->mdoc || curp->man || curp->sodest)) { |
mandoc_msg(MANDOCERR_NOTMANUAL, curp, 1, 0, NULL); |
mandoc_msg(MANDOCERR_NOTMANUAL, curp, 1, 0, NULL); |
curp->file_status = MANDOCLEVEL_FATAL; |
curp->file_status = MANDOCLEVEL_FATAL; |
return; |
return; |
|
|
} |
} |
|
|
struct mparse * |
struct mparse * |
mparse_alloc(enum mparset inttype, enum mandoclevel wlevel, |
mparse_alloc(int options, enum mandoclevel wlevel, |
mandocmsg mmsg, char *defos, int quick) |
mandocmsg mmsg, char *defos) |
{ |
{ |
struct mparse *curp; |
struct mparse *curp; |
|
|
Line 774 mparse_alloc(enum mparset inttype, enum mandoclevel wl |
|
Line 780 mparse_alloc(enum mparset inttype, enum mandoclevel wl |
|
|
|
curp = mandoc_calloc(1, sizeof(struct mparse)); |
curp = mandoc_calloc(1, sizeof(struct mparse)); |
|
|
|
curp->options = options; |
curp->wlevel = wlevel; |
curp->wlevel = wlevel; |
curp->mmsg = mmsg; |
curp->mmsg = mmsg; |
curp->inttype = inttype; |
|
curp->defos = defos; |
curp->defos = defos; |
curp->quick = quick; |
|
|
|
curp->roff = roff_alloc(inttype, curp); |
curp->roff = roff_alloc(curp, options); |
return(curp); |
return(curp); |
} |
} |
|
|
Line 800 mparse_reset(struct mparse *curp) |
|
Line 805 mparse_reset(struct mparse *curp) |
|
curp->file_status = MANDOCLEVEL_OK; |
curp->file_status = MANDOCLEVEL_OK; |
curp->mdoc = NULL; |
curp->mdoc = NULL; |
curp->man = NULL; |
curp->man = NULL; |
|
|
|
free(curp->sodest); |
|
curp->sodest = NULL; |
} |
} |
|
|
void |
void |
Line 816 mparse_free(struct mparse *curp) |
|
Line 824 mparse_free(struct mparse *curp) |
|
free(curp->secondary->buf); |
free(curp->secondary->buf); |
|
|
free(curp->secondary); |
free(curp->secondary); |
|
free(curp->sodest); |
free(curp); |
free(curp); |
} |
} |
|
|
void |
void |
mparse_result(struct mparse *curp, struct mdoc **mdoc, struct man **man) |
mparse_result(struct mparse *curp, |
|
struct mdoc **mdoc, struct man **man, char **sodest) |
{ |
{ |
|
|
|
if (sodest && NULL != (*sodest = curp->sodest)) { |
|
*mdoc = NULL; |
|
*man = NULL; |
|
return; |
|
} |
if (mdoc) |
if (mdoc) |
*mdoc = curp->mdoc; |
*mdoc = curp->mdoc; |
if (man) |
if (man) |