=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/mandoc/main.c,v retrieving revision 1.74 retrieving revision 1.75 diff -c -r1.74 -r1.75 *** src/usr.bin/mandoc/main.c 2011/03/20 23:36:42 1.74 --- src/usr.bin/mandoc/main.c 2011/04/21 22:59:54 1.75 *************** *** 1,4 **** ! /* $Id: main.c,v 1.74 2011/03/20 23:36:42 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze --- 1,4 ---- ! /* $Id: main.c,v 1.75 2011/04/21 22:59:54 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze *************** *** 35,41 **** #include "roff.h" #define REPARSE_LIMIT 1000 - #define UNCONST(a) ((void *)(uintptr_t)(const void *)(a)) typedef void (*out_mdoc)(void *, const struct mdoc *); typedef void (*out_man)(void *, const struct man *); --- 35,40 ---- *************** *** 63,73 **** }; 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 intt inttype; /* which parser to use */ struct man *pman; /* persistent man parser */ struct mdoc *pmdoc; /* persistent mdoc parser */ --- 62,74 ---- }; struct curparse { ! 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 */ *************** *** 217,223 **** static void ffile(const char *, struct curparse *); static int pfile(const char *, struct curparse *); static int moptions(enum intt *, char *); ! static int mmsg(enum mandocerr, void *, int, int, const char *); static void pset(const char *, int, struct curparse *); static int toptions(struct curparse *, char *); --- 218,224 ---- static void ffile(const char *, struct curparse *); static int pfile(const char *, struct curparse *); static int moptions(enum intt *, char *); ! static void mmsg(enum mandocerr, void *, int, int, const char *); static void pset(const char *, int, struct curparse *); static int toptions(struct curparse *, char *); *************** *** 226,233 **** 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[]) --- 227,232 ---- *************** *** 246,251 **** --- 245,251 ---- 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:"))) *************** *** 286,292 **** while (*argv) { ffile(*argv, &curp); ! if (MANDOCLEVEL_OK != exit_status && curp.wstop) break; ++argv; } --- 286,292 ---- while (*argv) { ffile(*argv, &curp); ! if (MANDOCLEVEL_OK != curp.exit_status && curp.wstop) break; ++argv; } *************** *** 300,306 **** if (curp.roff) roff_free(curp.roff); ! return((int)exit_status); } --- 300,306 ---- if (curp.roff) roff_free(curp.roff); ! return((int)curp.exit_status); } *************** *** 345,351 **** if (-1 == (curp->fd = open(curp->file, O_RDONLY, 0))) { perror(curp->file); ! exit_status = MANDOCLEVEL_SYSERR; return; } --- 345,351 ---- if (-1 == (curp->fd = open(curp->file, O_RDONLY, 0))) { perror(curp->file); ! curp->exit_status = MANDOCLEVEL_SYSERR; return; } *************** *** 363,369 **** if (-1 == (fd = open(file, O_RDONLY, 0))) { perror(file); ! file_status = MANDOCLEVEL_SYSERR; return(0); } --- 363,369 ---- if (-1 == (fd = open(file, O_RDONLY, 0))) { perror(file); ! curp->file_status = MANDOCLEVEL_SYSERR; return(0); } *************** *** 381,387 **** if (-1 == close(fd)) perror(file); ! return(MANDOCLEVEL_FATAL > file_status ? 1 : 0); } --- 381,387 ---- if (-1 == close(fd)) perror(file); ! return(MANDOCLEVEL_FATAL > curp->file_status ? 1 : 0); } *************** *** 390,400 **** { buf->sz = buf->sz > initial/2 ? 2 * buf->sz : initial; ! buf->buf = realloc(buf->buf, buf->sz); ! if (NULL == buf->buf) { ! perror(NULL); ! exit((int)MANDOCLEVEL_SYSERR); ! } } --- 390,396 ---- { buf->sz = buf->sz > initial/2 ? 2 * buf->sz : initial; ! buf->buf = mandoc_realloc(buf->buf, buf->sz); } *************** *** 485,491 **** curp->mdoc = NULL; curp->man = NULL; ! file_status = MANDOCLEVEL_OK; /* Make sure the mandotory roff parser is initialised. */ --- 481,487 ---- curp->mdoc = NULL; curp->man = NULL; ! curp->file_status = MANDOCLEVEL_OK; /* Make sure the mandotory roff parser is initialised. */ *************** *** 498,523 **** pdesc(curp); ! if (MANDOCLEVEL_FATAL <= 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; goto cleanup; } /* Clean up the parse routine ASTs. */ if (curp->mdoc && ! mdoc_endparse(curp->mdoc)) { ! assert(MANDOCLEVEL_FATAL <= file_status); goto cleanup; } if (curp->man && ! man_endparse(curp->man)) { ! assert(MANDOCLEVEL_FATAL <= file_status); goto cleanup; } --- 494,519 ---- pdesc(curp); ! 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); ! curp->file_status = MANDOCLEVEL_FATAL; goto cleanup; } /* Clean up the parse routine ASTs. */ if (curp->mdoc && ! mdoc_endparse(curp->mdoc)) { ! assert(MANDOCLEVEL_FATAL <= curp->file_status); goto cleanup; } if (curp->man && ! man_endparse(curp->man)) { ! assert(MANDOCLEVEL_FATAL <= curp->file_status); goto cleanup; } *************** *** 529,535 **** * the requested level, do not produce output. */ ! if (MANDOCLEVEL_OK != file_status && curp->wstop) goto cleanup; /* If unset, allocate output dev now (if applicable). */ --- 525,531 ---- * the requested level, do not produce output. */ ! if (MANDOCLEVEL_OK != curp->file_status && curp->wstop) goto cleanup; /* If unset, allocate output dev now (if applicable). */ *************** *** 604,611 **** assert(curp->roff); roff_reset(curp->roff); ! if (exit_status < file_status) ! exit_status = file_status; return; } --- 600,607 ---- assert(curp->roff); roff_reset(curp->roff); ! if (curp->exit_status < curp->file_status) ! curp->exit_status = curp->file_status; return; } *************** *** 624,630 **** */ if ( ! read_whole_file(curp, &blk, &with_mmap)) { ! file_status = MANDOCLEVEL_SYSERR; return; } --- 620,626 ---- */ if ( ! read_whole_file(curp, &blk, &with_mmap)) { ! curp->file_status = MANDOCLEVEL_SYSERR; return; } *************** *** 640,645 **** --- 636,646 ---- 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) { *************** *** 651,662 **** 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; --- 652,657 ---- *************** *** 793,799 **** pos = 0; continue; case (ROFF_APPEND): ! pos = strlen(ln.buf); continue; case (ROFF_RERUN): goto rerun; --- 788,794 ---- pos = 0; continue; case (ROFF_APPEND): ! pos = (int)strlen(ln.buf); continue; case (ROFF_RERUN): goto rerun; *************** *** 801,807 **** pos = 0; continue; case (ROFF_ERR): ! assert(MANDOCLEVEL_FATAL <= file_status); break; case (ROFF_SO): if (pfile(ln.buf + of, curp)) { --- 796,802 ---- pos = 0; continue; case (ROFF_ERR): ! assert(MANDOCLEVEL_FATAL <= curp->file_status); break; case (ROFF_SO): if (pfile(ln.buf + of, curp)) { *************** *** 818,824 **** * call, make sure we don't continue parsing. */ ! if (MANDOCLEVEL_FATAL <= file_status) break; /* --- 813,819 ---- * call, make sure we don't continue parsing. */ ! if (MANDOCLEVEL_FATAL <= curp->file_status) break; /* *************** *** 866,872 **** curp->line, ln.buf, of); if (0 == rc) { ! assert(MANDOCLEVEL_FATAL <= file_status); break; } --- 861,867 ---- curp->line, ln.buf, of); if (0 == rc) { ! assert(MANDOCLEVEL_FATAL <= curp->file_status); break; } *************** *** 1026,1032 **** return(1); } ! static int mmsg(enum mandocerr t, void *arg, int ln, int col, const char *msg) { struct curparse *cp; --- 1021,1027 ---- return(1); } ! static void mmsg(enum mandocerr t, void *arg, int ln, int col, const char *msg) { struct curparse *cp; *************** *** 1039,1045 **** cp = (struct curparse *)arg; if (level < cp->wlevel) ! return(1); fprintf(stderr, "%s:%d:%d: %s: %s", cp->file, ln, col + 1, mandoclevels[level], mandocerrs[t]); --- 1034,1040 ---- cp = (struct curparse *)arg; if (level < cp->wlevel) ! return; fprintf(stderr, "%s:%d:%d: %s: %s", cp->file, ln, col + 1, mandoclevels[level], mandocerrs[t]); *************** *** 1047,1054 **** fprintf(stderr, ": %s", msg); fputc('\n', stderr); ! if (file_status < level) ! file_status = level; ! ! return(level < MANDOCLEVEL_FATAL); } --- 1042,1047 ---- fprintf(stderr, ": %s", msg); fputc('\n', stderr); ! if (cp->file_status < level) ! cp->file_status = level; }