=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/read.c,v retrieving revision 1.22 retrieving revision 1.23 diff -c -r1.22 -r1.23 *** src/usr.bin/mandoc/read.c 2014/03/19 21:50:59 1.22 --- src/usr.bin/mandoc/read.c 2014/03/19 22:20:36 1.23 *************** *** 1,4 **** ! /* $Id: read.c,v 1.22 2014/03/19 21:50:59 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze --- 1,4 ---- ! /* $Id: read.c,v 1.23 2014/03/19 22:20:36 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2014 Ingo Schwarze *************** *** 51,56 **** --- 51,57 ---- 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; *************** *** 482,487 **** --- 483,494 ---- 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 *************** *** 666,672 **** return; } ! if ( ! (curp->man || curp->mdoc)) { mandoc_msg(MANDOCERR_NOTMANUAL, curp, 1, 0, NULL); curp->file_status = MANDOCLEVEL_FATAL; return; --- 673,679 ---- return; } ! if ( ! (curp->mdoc || curp->man || curp->sodest)) { mandoc_msg(MANDOCERR_NOTMANUAL, curp, 1, 0, NULL); curp->file_status = MANDOCLEVEL_FATAL; return; *************** *** 773,778 **** --- 780,788 ---- curp->file_status = MANDOCLEVEL_OK; curp->mdoc = NULL; curp->man = NULL; + + free(curp->sodest); + curp->sodest = NULL; } void *************** *** 789,801 **** free(curp->secondary->buf); free(curp->secondary); free(curp); } void ! mparse_result(struct mparse *curp, struct mdoc **mdoc, struct man **man) { if (mdoc) *mdoc = curp->mdoc; if (man) --- 799,818 ---- free(curp->secondary->buf); free(curp->secondary); + free(curp->sodest); free(curp); } void ! 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)