=================================================================== RCS file: /cvs/mandoc/read.c,v retrieving revision 1.42 retrieving revision 1.46 diff -u -p -r1.42 -r1.46 --- mandoc/read.c 2014/01/06 00:53:33 1.42 +++ mandoc/read.c 2014/03/23 11:25:26 1.46 @@ -1,4 +1,4 @@ -/* $Id: read.c,v 1.42 2014/01/06 00:53:33 schwarze Exp $ */ +/* $Id: read.c,v 1.46 2014/03/23 11:25:26 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze @@ -37,6 +37,7 @@ #include #include "mandoc.h" +#include "mandoc_aux.h" #include "libmandoc.h" #include "mdoc.h" #include "man.h" @@ -53,18 +54,18 @@ struct mparse { enum mandoclevel file_status; /* status of current parse */ enum mandoclevel wlevel; /* ignore messages below this */ 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 mdoc *pmdoc; /* persistent mdoc parser */ struct man *man; /* man parser */ struct mdoc *mdoc; /* mdoc parser */ struct roff *roff; /* roff parser (!NULL) */ + char *sodest; /* filename pointed to by .so */ int reparse_count; /* finite interp. stack */ mandocmsg mmsg; /* warning/error message handler */ const char *file; struct buf *secondary; char *defos; /* default operating system */ - int quick; /* abort the parse early */ }; static void resize_buf(struct buf *, size_t); @@ -255,36 +256,36 @@ pset(const char *buf, int pos, struct mparse *curp) return; } - switch (curp->inttype) { - case (MPARSE_MDOC): + if (MPARSE_MDOC & curp->options) { if (NULL == curp->pmdoc) - curp->pmdoc = mdoc_alloc(curp->roff, curp, - curp->defos, curp->quick); + curp->pmdoc = mdoc_alloc( + curp->roff, curp, curp->defos, + MPARSE_QUICK & curp->options ? 1 : 0); assert(curp->pmdoc); curp->mdoc = curp->pmdoc; return; - case (MPARSE_MAN): + } else if (MPARSE_MAN & curp->options) { if (NULL == curp->pman) curp->pman = man_alloc(curp->roff, curp, - curp->quick); + MPARSE_QUICK & curp->options ? 1 : 0); assert(curp->pman); curp->man = curp->pman; return; - default: - break; } if (pos >= 3 && 0 == memcmp(buf, ".Dd", 3)) { if (NULL == curp->pmdoc) - curp->pmdoc = mdoc_alloc(curp->roff, curp, - curp->defos, curp->quick); + curp->pmdoc = mdoc_alloc( + curp->roff, curp, curp->defos, + MPARSE_QUICK & curp->options ? 1 : 0); assert(curp->pmdoc); curp->mdoc = curp->pmdoc; return; } 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); curp->man = curp->pman; } @@ -491,6 +492,12 @@ rerun: assert(MANDOCLEVEL_FATAL <= curp->file_status); break; 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 * buffer because we're going to descend into @@ -677,7 +684,7 @@ mparse_end(struct mparse *curp) return; } - if ( ! (curp->man || curp->mdoc)) { + if ( ! (curp->mdoc || curp->man || curp->sodest)) { mandoc_msg(MANDOCERR_NOTMANUAL, curp, 1, 0, NULL); curp->file_status = MANDOCLEVEL_FATAL; return; @@ -765,8 +772,8 @@ out: } struct mparse * -mparse_alloc(enum mparset inttype, enum mandoclevel wlevel, - mandocmsg mmsg, char *defos, int quick) +mparse_alloc(int options, enum mandoclevel wlevel, + mandocmsg mmsg, char *defos) { struct mparse *curp; @@ -774,13 +781,12 @@ mparse_alloc(enum mparset inttype, enum mandoclevel wl curp = mandoc_calloc(1, sizeof(struct mparse)); + curp->options = options; curp->wlevel = wlevel; curp->mmsg = mmsg; - curp->inttype = inttype; curp->defos = defos; - curp->quick = quick; - curp->roff = roff_alloc(inttype, curp); + curp->roff = roff_alloc(curp, options); return(curp); } @@ -800,6 +806,9 @@ mparse_reset(struct mparse *curp) curp->file_status = MANDOCLEVEL_OK; curp->mdoc = NULL; curp->man = NULL; + + free(curp->sodest); + curp->sodest = NULL; } void @@ -816,13 +825,20 @@ mparse_free(struct mparse *curp) free(curp->secondary->buf); free(curp->secondary); + free(curp->sodest); free(curp); } 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) *mdoc = curp->mdoc; if (man)