=================================================================== RCS file: /cvs/mandoc/read.c,v retrieving revision 1.122 retrieving revision 1.134 diff -u -p -r1.122 -r1.134 --- mandoc/read.c 2015/02/04 18:03:48 1.122 +++ mandoc/read.c 2015/04/18 16:06:41 1.134 @@ -1,4 +1,4 @@ -/* $Id: read.c,v 1.122 2015/02/04 18:03:48 schwarze Exp $ */ +/* $Id: read.c,v 1.134 2015/04/18 16:06:41 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010-2015 Ingo Schwarze @@ -8,9 +8,9 @@ * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -36,19 +37,20 @@ #include #include -#include "mandoc.h" #include "mandoc_aux.h" -#include "libmandoc.h" +#include "mandoc.h" +#include "roff.h" #include "mdoc.h" #include "man.h" +#include "libmandoc.h" #define REPARSE_LIMIT 1000 struct mparse { - struct man *pman; /* persistent man parser */ - struct mdoc *pmdoc; /* persistent mdoc parser */ - struct man *man; /* man parser */ - struct mdoc *mdoc; /* mdoc parser */ + struct roff_man *pman; /* persistent man parser */ + struct roff_man *pmdoc; /* persistent mdoc parser */ + struct roff_man *man; /* man parser */ + struct roff_man *mdoc; /* mdoc parser */ struct roff *roff; /* roff parser (!NULL) */ const struct mchars *mchars; /* character table */ char *sodest; /* filename pointed to by .so */ @@ -109,7 +111,10 @@ static const char * const mandocerrs[MANDOCERR_MAX] = "no document body", "content before first section header", "first section is not \"NAME\"", - "bad NAME section contents", + "NAME section without name", + "NAME section without description", + "description not at the end of NAME", + "bad NAME section content", "missing description line, using \"\"", "sections out of conventional order", "duplicate section title", @@ -136,12 +141,13 @@ static const char * const mandocerrs[MANDOCERR_MAX] = "skipping empty request", "conditional request controls empty scope", "skipping empty macro", + "empty block", "empty argument, using 0n", - "argument count wrong", "missing display type, using -ragged", "list type is not the first argument", "missing -width in -tag list, using 8n", "missing utility name, using \"\"", + "missing function name, using \"\"", "empty head in list item", "empty list item", "missing font type, using \\fR", @@ -149,6 +155,8 @@ static const char * const mandocerrs[MANDOCERR_MAX] = "nothing follows prefix", "empty reference block", "missing -std argument, adding it", + "missing option string, using \"\"", + "missing resource identifier, using \"\"", "missing eqn box, using \"\"", /* related to bad macro arguments */ @@ -158,12 +166,14 @@ static const char * const mandocerrs[MANDOCERR_MAX] = "skipping duplicate display type", "skipping duplicate list type", "skipping -width argument", + "wrong number of cells", "unknown AT&T UNIX version", "comma in function argument", "parenthesis in function name", "invalid content in Rs block", "invalid Boolean argument", "unknown font, skipping request", + "odd number of characters in request", /* related to plain text */ "blank line in fill mode, using .sp", @@ -208,7 +218,6 @@ static const char * const mandocerrs[MANDOCERR_MAX] = /* related to request and macro arguments */ "escaped character not allowed in a name", - "argument count wrong", "NOT IMPLEMENTED: Bd -file", "missing list type, using -item", "missing manual name, using \"\"", @@ -395,7 +404,8 @@ mparse_buf_r(struct mparse *curp, struct buf blk, size MANDOCERR_CHAR_UNSUPP, curp, curp->line, pos, "0x%x", c); i++; - ln.buf[pos++] = '?'; + if (c != '\r') + ln.buf[pos++] = '?'; continue; } @@ -628,7 +638,7 @@ read_whole_file(struct mparse *curp, const char *file, */ if (S_ISREG(st.st_mode)) { - if (st.st_size >= (1U << 31)) { + if (st.st_size > 0x7fffffff) { mandoc_msg(MANDOCERR_TOOLARGE, curp, 0, 0, NULL); return(0); } @@ -838,6 +848,7 @@ mparse_open(struct mparse *curp, int *fd, const char * perror("dup"); exit((int)MANDOCLEVEL_SYSERR); } + signal(SIGPIPE, SIG_DFL); execlp("gunzip", "gunzip", "-c", file, NULL); perror("exec"); exit((int)MANDOCLEVEL_SYSERR); @@ -860,6 +871,7 @@ mparse_wait(struct mparse *curp) perror("wait"); exit((int)MANDOCLEVEL_SYSERR); } + curp->child = 0; if (WIFSIGNALED(status)) { mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0, "gunzip died from signal %d", WTERMSIG(status)); @@ -940,8 +952,8 @@ mparse_free(struct mparse *curp) } void -mparse_result(struct mparse *curp, - struct mdoc **mdoc, struct man **man, char **sodest) +mparse_result(struct mparse *curp, struct roff_man **mdoc, + struct roff_man **man, char **sodest) { if (sodest && NULL != (*sodest = curp->sodest)) {