=================================================================== RCS file: /cvs/mandoc/read.c,v retrieving revision 1.205 retrieving revision 1.212 diff -u -p -r1.205 -r1.212 --- mandoc/read.c 2018/12/14 02:16:21 1.205 +++ mandoc/read.c 2019/03/19 16:26:08 1.212 @@ -1,7 +1,7 @@ -/* $Id: read.c,v 1.205 2018/12/14 02:16:21 schwarze Exp $ */ +/* $Id: read.c,v 1.212 2019/03/19 16:26:08 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2010-2018 Ingo Schwarze + * Copyright (c) 2010-2019 Ingo Schwarze * Copyright (c) 2010, 2012 Joerg Sonnenberger * * Permission to use, copy, modify, and distribute this software for any @@ -47,7 +47,6 @@ struct mparse { struct roff *roff; /* roff parser (!NULL) */ struct roff_man *man; /* man parser */ - char *sodest; /* filename pointed to by .so */ struct buf *primary; /* buffer currently being parsed */ struct buf *secondary; /* copy of top level input */ struct buf *loop; /* open .while request line */ @@ -123,15 +122,15 @@ choose_parser(struct mparse *curp) } if (format == MPARSE_MDOC) { - curp->man->macroset = MACROSET_MDOC; + curp->man->meta.macroset = MACROSET_MDOC; if (curp->man->mdocmac == NULL) curp->man->mdocmac = roffhash_alloc(MDOC_Dd, MDOC_MAX); } else { - curp->man->macroset = MACROSET_MAN; + curp->man->meta.macroset = MACROSET_MAN; if (curp->man->manmac == NULL) curp->man->manmac = roffhash_alloc(MAN_TH, MAN_MAX); } - curp->man->first->tok = TOKEN_NONE; + curp->man->meta.first->tok = TOKEN_NONE; } /* @@ -208,7 +207,7 @@ mparse_buf_r(struct mparse *curp, struct buf blk, size if (c & 0x80) { if ( ! (curp->filenc && preconv_encode( &blk, &i, &ln, &pos, &curp->filenc))) { - mandoc_vmsg(MANDOCERR_CHAR_BAD, curp, + mandoc_msg(MANDOCERR_CHAR_BAD, curp->line, pos, "0x%x", c); ln.buf[pos++] = '?'; i++; @@ -221,10 +220,10 @@ mparse_buf_r(struct mparse *curp, struct buf blk, size */ if (c == 0x7f || (c < 0x20 && c != 0x09)) { - mandoc_vmsg(c == 0x00 || c == 0x04 || + mandoc_msg(c == 0x00 || c == 0x04 || c > 0x0a ? MANDOCERR_CHAR_BAD : MANDOCERR_CHAR_UNSUPP, - curp, curp->line, pos, "0x%x", c); + curp->line, pos, "0x%x", c); i++; if (c != '\r') ln.buf[pos++] = '?'; @@ -256,6 +255,8 @@ mparse_buf_r(struct mparse *curp, struct buf blk, size /* XXX Ugly hack to mark the end of the input. */ if (i == blk.sz || blk.buf[i] == '\0') { + if (pos + 2 > ln.sz) + resize_buf(&ln, 256); ln.buf[pos++] = '\n'; ln.buf[pos] = '\0'; } @@ -298,7 +299,7 @@ rerun: if (loop == curp->loop) break; mandoc_msg(MANDOCERR_WHILE_NEST, - curp, curp->line, pos, NULL); + curp->line, pos, NULL); } curp->loop = thisln; loop = NULL; @@ -308,12 +309,12 @@ rerun: case ROFF_LOOPEXIT: if (curp->loop == NULL) { mandoc_msg(MANDOCERR_WHILE_FAIL, - curp, curp->line, pos, NULL); + curp->line, pos, NULL); break; } if (inloop == 0) { mandoc_msg(MANDOCERR_WHILE_INTO, - curp, curp->line, pos, NULL); + curp->line, pos, NULL); curp->loop = loop = NULL; break; } @@ -334,9 +335,9 @@ rerun: case ROFF_IGN: break; case ROFF_CONT: - if (curp->man->macroset == MACROSET_NONE) + if (curp->man->meta.macroset == MACROSET_NONE) choose_parser(curp); - if ((curp->man->macroset == MACROSET_MDOC ? + if ((curp->man->meta.macroset == MACROSET_MDOC ? mdoc_parseln(curp->man, curp->line, ln.buf, of) : man_parseln(curp->man, curp->line, ln.buf, of) ) == 2) @@ -348,7 +349,7 @@ rerun: if (++curp->reparse_count > REPARSE_LIMIT) { /* Abort and return to the top level. */ result = ROFF_IGN; - mandoc_msg(MANDOCERR_ROFFLOOP, curp, + mandoc_msg(MANDOCERR_ROFFLOOP, curp->line, pos, NULL); goto out; } @@ -365,16 +366,17 @@ rerun: case ROFF_SO: if ( ! (curp->options & MPARSE_SO) && (i >= blk.sz || blk.buf[i] == '\0')) { - curp->sodest = mandoc_strdup(ln.buf + of); + curp->man->meta.sodest = + mandoc_strdup(ln.buf + of); goto out; } if ((fd = mparse_open(curp, ln.buf + of)) != -1) { mparse_readfd(curp, fd, ln.buf + of); close(fd); } else { - mandoc_vmsg(MANDOCERR_SO_FAIL, - curp, curp->line, pos, - ".so %s", ln.buf + of); + mandoc_msg(MANDOCERR_SO_FAIL, + curp->line, of, ".so %s: %s", + ln.buf + of, strerror(errno)); ln.sz = mandoc_asprintf(&cp, ".sp\nSee the file %s.\n.sp", ln.buf + of); @@ -409,7 +411,7 @@ rerun: out: if (inloop) { if (result != ROFF_USERRET) - mandoc_msg(MANDOCERR_WHILE_OUTOF, curp, + mandoc_msg(MANDOCERR_WHILE_OUTOF, curp->line, pos, NULL); curp->loop = NULL; } @@ -429,7 +431,7 @@ read_whole_file(struct mparse *curp, int fd, struct bu int gzerrnum, retval; if (fstat(fd, &st) == -1) { - mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0, + mandoc_msg(MANDOCERR_FILE, 0, 0, "fstat: %s", strerror(errno)); return 0; } @@ -443,7 +445,7 @@ read_whole_file(struct mparse *curp, int fd, struct bu if (curp->gzip == 0 && S_ISREG(st.st_mode)) { if (st.st_size > 0x7fffffff) { - mandoc_msg(MANDOCERR_TOOLARGE, curp, 0, 0, NULL); + mandoc_msg(MANDOCERR_TOOLARGE, 0, 0, NULL); return 0; } *with_mmap = 1; @@ -462,12 +464,12 @@ read_whole_file(struct mparse *curp, int fd, struct bu * which this function must not do. */ if ((fd = dup(fd)) == -1) { - mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0, + mandoc_msg(MANDOCERR_FILE, 0, 0, "dup: %s", strerror(errno)); return 0; } if ((gz = gzdopen(fd, "rb")) == NULL) { - mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0, + mandoc_msg(MANDOCERR_FILE, 0, 0, "gzdopen: %s", strerror(errno)); close(fd); return 0; @@ -488,8 +490,7 @@ read_whole_file(struct mparse *curp, int fd, struct bu for (;;) { if (off == fb->sz) { if (fb->sz == (1U << 31)) { - mandoc_msg(MANDOCERR_TOOLARGE, curp, - 0, 0, NULL); + mandoc_msg(MANDOCERR_TOOLARGE, 0, 0, NULL); break; } resize_buf(fb, 65536); @@ -505,7 +506,7 @@ read_whole_file(struct mparse *curp, int fd, struct bu if (ssz == -1) { if (curp->gzip) (void)gzerror(gz, &gzerrnum); - mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0, "read: %s", + mandoc_msg(MANDOCERR_FILE, 0, 0, "read: %s", curp->gzip && gzerrnum != Z_ERRNO ? zError(gzerrnum) : strerror(errno)); break; @@ -514,7 +515,7 @@ read_whole_file(struct mparse *curp, int fd, struct bu } if (curp->gzip && (gzerrnum = gzclose(gz)) != Z_OK) - mandoc_vmsg(MANDOCERR_FILE, curp, 0, 0, "gzclose: %s", + mandoc_msg(MANDOCERR_FILE, 0, 0, "gzclose: %s", gzerrnum == Z_ERRNO ? strerror(errno) : zError(gzerrnum)); if (retval == 0) { @@ -527,9 +528,9 @@ read_whole_file(struct mparse *curp, int fd, struct bu static void mparse_end(struct mparse *curp) { - if (curp->man->macroset == MACROSET_NONE) - curp->man->macroset = MACROSET_MAN; - if (curp->man->macroset == MACROSET_MDOC) + if (curp->man->meta.macroset == MACROSET_NONE) + curp->man->meta.macroset = MACROSET_MAN; + if (curp->man->meta.macroset == MACROSET_MDOC) mdoc_endparse(curp->man); else man_endparse(curp->man); @@ -553,7 +554,7 @@ mparse_readfd(struct mparse *curp, int fd, const char int with_mmap; if (recursion_depth > 64) { - mandoc_msg(MANDOCERR_ROFFLOOP, curp, curp->line, 0, NULL); + mandoc_msg(MANDOCERR_ROFFLOOP, curp->line, 0, NULL); return; } if (read_whole_file(curp, fd, &blk, &with_mmap) == 0) @@ -608,7 +609,7 @@ int mparse_open(struct mparse *curp, const char *file) { char *cp; - int fd; + int fd, save_errno; cp = strrchr(file, '.'); curp->gzip = (cp != NULL && ! strcmp(cp + 1, "gz")); @@ -624,9 +625,11 @@ mparse_open(struct mparse *curp, const char *file) */ if ( ! curp->gzip) { + save_errno = errno; mandoc_asprintf(&cp, "%s.gz", file); fd = open(cp, O_RDONLY); free(cp); + errno = save_errno; if (fd != -1) { curp->gzip = 1; return fd; @@ -635,7 +638,6 @@ mparse_open(struct mparse *curp, const char *file) /* Neither worked, give up. */ - mandoc_msg(MANDOCERR_FILE, curp, 0, 0, strerror(errno)); return -1; } @@ -649,19 +651,19 @@ mparse_alloc(int options, enum mandoc_os os_e, const c curp->options = options; curp->os_s = os_s; - curp->roff = roff_alloc(curp, options); - curp->man = roff_man_alloc(curp->roff, curp, curp->os_s, + curp->roff = roff_alloc(options); + curp->man = roff_man_alloc(curp->roff, curp->os_s, curp->options & MPARSE_QUICK ? 1 : 0); if (curp->options & MPARSE_MDOC) { - curp->man->macroset = MACROSET_MDOC; + curp->man->meta.macroset = MACROSET_MDOC; if (curp->man->mdocmac == NULL) curp->man->mdocmac = roffhash_alloc(MDOC_Dd, MDOC_MAX); } else if (curp->options & MPARSE_MAN) { - curp->man->macroset = MACROSET_MAN; + curp->man->meta.macroset = MACROSET_MAN; if (curp->man->manmac == NULL) curp->man->manmac = roffhash_alloc(MAN_TH, MAN_MAX); } - curp->man->first->tok = TOKEN_NONE; + curp->man->meta.first->tok = TOKEN_NONE; curp->man->meta.os_e = os_e; return curp; } @@ -673,8 +675,6 @@ mparse_reset(struct mparse *curp) roff_man_reset(curp->man); free_buf_list(curp->secondary); curp->secondary = NULL; - free(curp->sodest); - curp->sodest = NULL; curp->gzip = 0; } @@ -686,21 +686,20 @@ mparse_free(struct mparse *curp) roff_man_free(curp->man); roff_free(curp->roff); free_buf_list(curp->secondary); - free(curp->sodest); free(curp); } -void -mparse_result(struct mparse *curp, struct roff_man **man, - char **sodest) +struct roff_meta * +mparse_result(struct mparse *curp) { - - if (sodest && NULL != (*sodest = curp->sodest)) { - *man = NULL; - return; + roff_state_reset(curp->man); + if (curp->options & MPARSE_VALIDATE) { + if (curp->man->meta.macroset == MACROSET_MDOC) + mdoc_validate(curp->man); + else + man_validate(curp->man); } - if (man) - *man = curp->man; + return &curp->man->meta; } void