=================================================================== RCS file: /cvs/mandoc/main.c,v retrieving revision 1.147 retrieving revision 1.151 diff -u -p -r1.147 -r1.151 --- mandoc/main.c 2011/03/07 01:35:51 1.147 +++ mandoc/main.c 2011/03/16 15:28:35 1.151 @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.147 2011/03/07 01:35:51 schwarze Exp $ */ +/* $Id: main.c,v 1.151 2011/03/16 15:28:35 kristaps Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze @@ -42,7 +42,6 @@ #endif #define REPARSE_LIMIT 1000 -#define UNCONST(a) ((void *)(uintptr_t)(const void *)(a)) /* FIXME: Intel's compiler? LLVM? pcc? */ @@ -78,11 +77,13 @@ enum outt { }; struct curparse { - const char *file; /* Current parse. */ - int fd; /* Current parse. */ - int line; /* Line number in the file. */ - enum mandoclevel wlevel; /* Ignore messages below this. */ - int wstop; /* Stop after a file with a warning. */ + enum mandoclevel exit_status; /* status of all file parses */ + const char *file; /* current file-name */ + enum mandoclevel file_status; /* error status of current parse */ + int fd; /* current file-descriptor */ + int line; /* line number in the file */ + enum mandoclevel wlevel; /* ignore messages below this */ + int wstop; /* stop after a file with a warning */ enum intt inttype; /* which parser to use */ struct man *pman; /* persistent man parser */ struct mdoc *pmdoc; /* persistent mdoc parser */ @@ -241,8 +242,6 @@ static void version(void) __attribute__((noreturn)) static int woptions(struct curparse *, char *); static const char *progname; -static enum mandoclevel file_status = MANDOCLEVEL_OK; -static enum mandoclevel exit_status = MANDOCLEVEL_OK; int main(int argc, char *argv[]) @@ -261,6 +260,7 @@ main(int argc, char *argv[]) curp.inttype = INTT_AUTO; curp.outtype = OUTT_ASCII; curp.wlevel = MANDOCLEVEL_FATAL; + curp.exit_status = MANDOCLEVEL_OK; /* LINTED */ while (-1 != (c = getopt(argc, argv, "m:O:T:VW:"))) @@ -301,7 +301,7 @@ main(int argc, char *argv[]) while (*argv) { ffile(*argv, &curp); - if (MANDOCLEVEL_OK != exit_status && curp.wstop) + if (MANDOCLEVEL_OK != curp.exit_status && curp.wstop) break; ++argv; } @@ -315,7 +315,7 @@ main(int argc, char *argv[]) if (curp.roff) roff_free(curp.roff); - return((int)exit_status); + return((int)curp.exit_status); } @@ -360,7 +360,7 @@ ffile(const char *file, struct curparse *curp) if (-1 == (curp->fd = open(curp->file, O_RDONLY, 0))) { perror(curp->file); - exit_status = MANDOCLEVEL_SYSERR; + curp->exit_status = MANDOCLEVEL_SYSERR; return; } @@ -378,7 +378,7 @@ pfile(const char *file, struct curparse *curp) if (-1 == (fd = open(file, O_RDONLY, 0))) { perror(file); - file_status = MANDOCLEVEL_SYSERR; + curp->file_status = MANDOCLEVEL_SYSERR; return(0); } @@ -396,7 +396,7 @@ pfile(const char *file, struct curparse *curp) if (-1 == close(fd)) perror(file); - return(MANDOCLEVEL_FATAL > file_status ? 1 : 0); + return(MANDOCLEVEL_FATAL > curp->file_status ? 1 : 0); } @@ -500,7 +500,7 @@ fdesc(struct curparse *curp) curp->mdoc = NULL; curp->man = NULL; - file_status = MANDOCLEVEL_OK; + curp->file_status = MANDOCLEVEL_OK; /* Make sure the mandotory roff parser is initialised. */ @@ -513,26 +513,26 @@ fdesc(struct curparse *curp) pdesc(curp); - if (MANDOCLEVEL_FATAL <= file_status) + if (MANDOCLEVEL_FATAL <= curp->file_status) goto cleanup; /* NOTE a parser may not have been assigned, yet. */ if ( ! (curp->man || curp->mdoc)) { fprintf(stderr, "%s: Not a manual\n", curp->file); - file_status = MANDOCLEVEL_FATAL; + curp->file_status = MANDOCLEVEL_FATAL; goto cleanup; } /* Clean up the parse routine ASTs. */ if (curp->mdoc && ! mdoc_endparse(curp->mdoc)) { - assert(MANDOCLEVEL_FATAL <= file_status); + assert(MANDOCLEVEL_FATAL <= curp->file_status); goto cleanup; } if (curp->man && ! man_endparse(curp->man)) { - assert(MANDOCLEVEL_FATAL <= file_status); + assert(MANDOCLEVEL_FATAL <= curp->file_status); goto cleanup; } @@ -544,7 +544,7 @@ fdesc(struct curparse *curp) * the requested level, do not produce output. */ - if (MANDOCLEVEL_OK != file_status && curp->wstop) + if (MANDOCLEVEL_OK != curp->file_status && curp->wstop) goto cleanup; /* If unset, allocate output dev now (if applicable). */ @@ -619,8 +619,8 @@ fdesc(struct curparse *curp) assert(curp->roff); roff_reset(curp->roff); - if (exit_status < file_status) - exit_status = file_status; + if (curp->exit_status < curp->file_status) + curp->exit_status = curp->file_status; return; } @@ -639,7 +639,7 @@ pdesc(struct curparse *curp) */ if ( ! read_whole_file(curp, &blk, &with_mmap)) { - file_status = MANDOCLEVEL_SYSERR; + curp->file_status = MANDOCLEVEL_SYSERR; return; } @@ -655,6 +655,11 @@ pdesc(struct curparse *curp) free(blk.buf); } +/* + * Main parse routine for an opened file. This is called for each + * opened file and simply loops around the full input file, possibly + * nesting (i.e., with `so'). + */ static void parsebuf(struct curparse *curp, struct buf blk, int start) { @@ -666,12 +671,6 @@ parsebuf(struct curparse *curp, struct buf blk, int st int lnn; /* line number in the real file */ unsigned char c; - /* - * Main parse routine for an opened file. This is called for - * each opened file and simply loops around the full input file, - * possibly nesting (i.e., with `so'). - */ - memset(&ln, 0, sizeof(struct buf)); lnn = curp->line; @@ -808,7 +807,7 @@ rerun: pos = 0; continue; case (ROFF_APPEND): - pos = strlen(ln.buf); + pos = (int)strlen(ln.buf); continue; case (ROFF_RERUN): goto rerun; @@ -816,7 +815,7 @@ rerun: pos = 0; continue; case (ROFF_ERR): - assert(MANDOCLEVEL_FATAL <= file_status); + assert(MANDOCLEVEL_FATAL <= curp->file_status); break; case (ROFF_SO): if (pfile(ln.buf + of, curp)) { @@ -833,7 +832,7 @@ rerun: * call, make sure we don't continue parsing. */ - if (MANDOCLEVEL_FATAL <= file_status) + if (MANDOCLEVEL_FATAL <= curp->file_status) break; /* @@ -881,7 +880,7 @@ rerun: curp->line, ln.buf, of); if (0 == rc) { - assert(MANDOCLEVEL_FATAL <= file_status); + assert(MANDOCLEVEL_FATAL <= curp->file_status); break; } @@ -1062,8 +1061,8 @@ mmsg(enum mandocerr t, void *arg, int ln, int col, con fprintf(stderr, ": %s", msg); fputc('\n', stderr); - if (file_status < level) - file_status = level; + if (cp->file_status < level) + cp->file_status = level; return(level < MANDOCLEVEL_FATAL); }