=================================================================== RCS file: /cvs/mandoc/read.c,v retrieving revision 1.26 retrieving revision 1.31 diff -u -p -r1.26 -r1.31 --- mandoc/read.c 2011/11/07 01:24:40 1.26 +++ mandoc/read.c 2012/07/18 11:11:12 1.31 @@ -1,4 +1,4 @@ -/* $Id: read.c,v 1.26 2011/11/07 01:24:40 schwarze Exp $ */ +/* $Id: read.c,v 1.31 2012/07/18 11:11:12 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,7 @@ #include "libmandoc.h" #include "mdoc.h" #include "man.h" +#include "main.h" #ifndef MAP_FILE #define MAP_FILE 0 @@ -64,13 +66,13 @@ struct mparse { void *arg; /* argument to mmsg */ const char *file; struct buf *secondary; + char *defos; /* default operating system */ }; static void resize_buf(struct buf *, size_t); static void mparse_buf_r(struct mparse *, struct buf, int); static void mparse_readfd_r(struct mparse *, int, const char *, int); static void pset(const char *, int, struct mparse *); -static void pdesc(struct mparse *, const char *, int); static int read_whole_file(const char *, int, struct buf *, int *); static void mparse_end(struct mparse *); @@ -104,7 +106,6 @@ static const char * const mandocerrs[MANDOCERR_MAX] = ".so is fragile, better use ln(1)", "NAME section must come first", "bad NAME section contents", - "manual name not yet set", "sections out of conventional order", "duplicate section name", "section not in conventional manual section", @@ -112,6 +113,7 @@ static const char * const mandocerrs[MANDOCERR_MAX] = /* related to macros and nesting */ "skipping obsolete macro", "skipping paragraph macro", + "moving paragraph macro out of list", "skipping no-space macro", "blocks badly nested", "child violates parent syntax", @@ -172,6 +174,7 @@ static const char * const mandocerrs[MANDOCERR_MAX] = "input stack limit exceeded, infinite loop?", "skipping bad character", "escaped character not allowed in a name", + "manual name not yet set", "skipping text before the first section header", "skipping unknown macro", "NOT IMPLEMENTED, please use groff: skipping request", @@ -246,7 +249,8 @@ pset(const char *buf, int pos, struct mparse *curp) switch (curp->inttype) { case (MPARSE_MDOC): if (NULL == curp->pmdoc) - curp->pmdoc = mdoc_alloc(curp->roff, curp); + curp->pmdoc = mdoc_alloc(curp->roff, curp, + curp->defos); assert(curp->pmdoc); curp->mdoc = curp->pmdoc; return; @@ -262,7 +266,8 @@ pset(const char *buf, int pos, struct mparse *curp) if (pos >= 3 && 0 == memcmp(buf, ".Dd", 3)) { if (NULL == curp->pmdoc) - curp->pmdoc = mdoc_alloc(curp->roff, curp); + curp->pmdoc = mdoc_alloc(curp->roff, curp, + curp->defos); assert(curp->pmdoc); curp->mdoc = curp->pmdoc; return; @@ -325,9 +330,9 @@ mparse_buf_r(struct mparse *curp, struct buf blk, int * Warn about bogus characters. If you're using * non-ASCII encoding, you're screwing your * readers. Since I'd rather this not happen, - * I'll be helpful and drop these characters so - * we don't display gibberish. Note to manual - * writers: use special characters. + * I'll be helpful and replace these characters + * with "?", so we don't display gibberish. + * Note to manual writers: use special characters. */ c = (unsigned char) blk.buf[i]; @@ -335,8 +340,11 @@ mparse_buf_r(struct mparse *curp, struct buf blk, int if ( ! (isascii(c) && (isgraph(c) || isblank(c)))) { mandoc_msg(MANDOCERR_BADCHAR, curp, - curp->line, pos, "ignoring byte"); + curp->line, pos, NULL); i++; + if (pos >= (int)ln.sz) + resize_buf(&ln, 256); + ln.buf[pos++] = '?'; continue; } @@ -544,38 +552,6 @@ rerun: free(ln.buf); } -static void -pdesc(struct mparse *curp, const char *file, int fd) -{ - struct buf blk; - int with_mmap; - - /* - * Run for each opened file; may be called more than once for - * each full parse sequence if the opened file is nested (i.e., - * from `so'). Simply sucks in the whole file and moves into - * the parse phase for the file. - */ - - if ( ! read_whole_file(file, fd, &blk, &with_mmap)) { - curp->file_status = MANDOCLEVEL_SYSERR; - return; - } - - /* Line number is per-file. */ - - curp->line = 1; - - mparse_buf_r(curp, blk, 1); - -#ifdef HAVE_MMAP - if (with_mmap) - munmap(blk.buf, blk.sz); - else -#endif - free(blk.buf); -} - static int read_whole_file(const char *file, int fd, struct buf *fb, int *with_mmap) { @@ -671,29 +647,72 @@ mparse_end(struct mparse *curp) } static void -mparse_readfd_r(struct mparse *curp, int fd, const char *file, int re) +mparse_parse_buffer(struct mparse *curp, struct buf blk, const char *file, + int re) { const char *svfile; + /* Line number is per-file. */ + svfile = curp->file; + curp->file = file; + curp->line = 1; + + mparse_buf_r(curp, blk, 1); + + if (0 == re && MANDOCLEVEL_FATAL > curp->file_status) + mparse_end(curp); + + curp->file = svfile; +} + +enum mandoclevel +mparse_readmem(struct mparse *curp, const void *buf, size_t len, + const char *file) +{ + struct buf blk; + + blk.buf = UNCONST(buf); + blk.sz = len; + + mparse_parse_buffer(curp, blk, file, 0); + return(curp->file_status); +} + +static void +mparse_readfd_r(struct mparse *curp, int fd, const char *file, int re) +{ + struct buf blk; + int with_mmap; + if (-1 == fd) if (-1 == (fd = open(file, O_RDONLY, 0))) { perror(file); curp->file_status = MANDOCLEVEL_SYSERR; return; } + /* + * Run for each opened file; may be called more than once for + * each full parse sequence if the opened file is nested (i.e., + * from `so'). Simply sucks in the whole file and moves into + * the parse phase for the file. + */ - svfile = curp->file; - curp->file = file; + if ( ! read_whole_file(file, fd, &blk, &with_mmap)) { + curp->file_status = MANDOCLEVEL_SYSERR; + return; + } - pdesc(curp, file, fd); + mparse_parse_buffer(curp, blk, file, re); - if (0 == re && MANDOCLEVEL_FATAL > curp->file_status) - mparse_end(curp); +#ifdef HAVE_MMAP + if (with_mmap) + munmap(blk.buf, blk.sz); + else +#endif + free(blk.buf); if (STDIN_FILENO != fd && -1 == close(fd)) perror(file); - - curp->file = svfile; } enum mandoclevel @@ -705,7 +724,8 @@ mparse_readfd(struct mparse *curp, int fd, const char } struct mparse * -mparse_alloc(enum mparset inttype, enum mandoclevel wlevel, mandocmsg mmsg, void *arg) +mparse_alloc(enum mparset inttype, enum mandoclevel wlevel, + mandocmsg mmsg, void *arg, char *defos) { struct mparse *curp; @@ -717,6 +737,7 @@ mparse_alloc(enum mparset inttype, enum mandoclevel wl curp->mmsg = mmsg; curp->arg = arg; curp->inttype = inttype; + curp->defos = defos; curp->roff = roff_alloc(curp); return(curp);