diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2010-06-30 20:32:15 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2010-06-30 20:32:15 +0000 |
commit | 29b34f0893cc1c3b889a1ebd5475c51e9c39893f (patch) | |
tree | 9cf94b4277f7d3169b09094fa5963966e133ef1b | |
parent | ede8bcaa90143c5c1db99caeef3eb5c8fafb3ea4 (diff) | |
download | mandoc-29b34f0893cc1c3b889a1ebd5475c51e9c39893f.tar.gz |
improve error reporting:
* avoid error exit code after mere warnings
* add ERROR: and FATAL: to messages when appropriate
* sort the code in mmsg() to make it easier on the eye
* make the mandocerrs[] list easier to maintain
* update a few comments in mandoc.h
ok kristaps@
-rw-r--r-- | main.c | 70 | ||||
-rw-r--r-- | mandoc.h | 16 |
2 files changed, 53 insertions, 33 deletions
@@ -99,6 +99,9 @@ struct curparse { static const char * const mandocerrs[MANDOCERR_MAX] = { "ok", + + "generic warning", + "text should be uppercase", "sections out of conventional order", "section name repeats", @@ -118,6 +121,9 @@ static const char * const mandocerrs[MANDOCERR_MAX] = { "section not in conventional manual section", "end of line whitespace", "scope open on exit", + + "generic error", + "NAME section must come first", "bad Boolean value", "child violates parent syntax", @@ -149,6 +155,9 @@ static const char * const mandocerrs[MANDOCERR_MAX] = { "missing display type", "line argument(s) will be lost", "body argument(s) will be lost", + + "generic fatal error", + "column syntax is inconsistent", "missing font type", "displays may not be nested", @@ -182,8 +191,8 @@ static void version(void) __attribute__((noreturn)); static int woptions(int *, char *); static const char *progname; -static int with_error; -static int with_warning; +static int with_fatal; +static int with_error; int main(int argc, char *argv[]) @@ -246,7 +255,7 @@ main(int argc, char *argv[]) while (*argv) { ffile(*argv, &curp); - if (with_error && !(curp.fflags & FL_IGN_ERRORS)) + if (with_fatal && !(curp.fflags & FL_IGN_ERRORS)) break; ++argv; } @@ -260,7 +269,7 @@ main(int argc, char *argv[]) if (curp.roff) roff_free(curp.roff); - return((with_warning || with_error) ? + return((with_fatal || with_error) ? EXIT_FAILURE : EXIT_SUCCESS); } @@ -338,7 +347,7 @@ ffile(const char *file, struct curparse *curp) curp->file = file; if (-1 == (curp->fd = open(curp->file, O_RDONLY, 0))) { perror(curp->file); - with_error = 1; + with_fatal = 1; return; } @@ -379,7 +388,7 @@ read_whole_file(struct curparse *curp, struct buf *fb, int *with_mmap) if (-1 == fstat(curp->fd, &st)) { perror(curp->file); - with_error = 1; + with_fatal = 1; return(0); } @@ -394,7 +403,7 @@ read_whole_file(struct curparse *curp, struct buf *fb, int *with_mmap) if (st.st_size >= (1U << 31)) { fprintf(stderr, "%s: input too large\n", curp->file); - with_error = 1; + with_fatal = 1; return(0); } *with_mmap = 1; @@ -438,7 +447,7 @@ read_whole_file(struct curparse *curp, struct buf *fb, int *with_mmap) free(fb->buf); fb->buf = NULL; - with_error = 1; + with_fatal = 1; return(0); } @@ -654,7 +663,7 @@ fdesc(struct curparse *curp) return; bailout: - with_error = 1; + with_fatal = 1; goto cleanup; } @@ -839,30 +848,37 @@ static int mmsg(enum mandocerr t, void *arg, int ln, int col, const char *msg) { struct curparse *cp; + const char *level; + int rc; cp = (struct curparse *)arg; - - if (t <= MANDOCERR_ERROR) { - if ( ! (cp->wflags & WARN_WALL)) + level = NULL; + rc = 1; + + if (t >= MANDOCERR_FATAL) { + with_fatal = 1; + level = "FATAL"; + rc = 0; + } else { + if ( ! (WARN_WALL & cp->wflags)) return(1); - with_warning = 1; - } else - with_error = 1; - - fprintf(stderr, "%s:%d:%d: %s", cp->file, - ln, col + 1, mandocerrs[t]); + if (t >= MANDOCERR_ERROR) { + with_error = 1; + level = "ERROR"; + } + if (WARN_WERR & cp->wflags) { + with_fatal = 1; + rc = 0; + } + } + fprintf(stderr, "%s:%d:%d:", cp->file, ln, col + 1); + if (level) + fprintf(stderr, " %s:", level); + fprintf(stderr, " %s", mandocerrs[t]); if (msg) fprintf(stderr, ": %s", msg); - fputc('\n', stderr); - /* This is superfluous, but whatever. */ - if (t > MANDOCERR_ERROR) - return(0); - if (cp->wflags & WARN_WERR) { - with_error = 1; - return(0); - } - return(1); + return(rc); } @@ -25,6 +25,9 @@ __BEGIN_DECLS enum mandocerr { MANDOCERR_OK, + + MANDOCERR_WARNING, /* ===== end of warnings ===== */ + MANDOCERR_UPPERCASE, /* text should be uppercase */ MANDOCERR_SECOOO, /* sections out of conventional order */ MANDOCERR_SECREP, /* section name repeats */ @@ -38,14 +41,15 @@ enum mandocerr { MANDOCERR_NOWIDTHARG, /* argument requires the width argument */ /* FIXME: merge with MANDOCERR_IGNARGV. */ MANDOCERR_WIDTHARG, /* superfluous width argument */ - MANDOCERR_IGNARGV, /* macro ignoring argv */ + MANDOCERR_IGNARGV, /* ignoring argument */ MANDOCERR_BADDATE, /* bad date argument */ MANDOCERR_BADWIDTH, /* bad width argument */ MANDOCERR_BADMSEC, /* unknown manual section */ MANDOCERR_SECMSEC, /* section not in conventional manual section */ MANDOCERR_EOLNSPACE, /* end of line whitespace */ MANDOCERR_SCOPEEXIT, /* scope open on exit */ -#define MANDOCERR_WARNING MANDOCERR_SCOPEEXIT + + MANDOCERR_ERROR, /* ===== end of errors ===== */ MANDOCERR_NAMESECFIRST, /* NAME section must come first */ MANDOCERR_BADBOOL, /* bad Boolean value */ @@ -79,7 +83,8 @@ enum mandocerr { MANDOCERR_DISPTYPE, /* missing display type */ MANDOCERR_ARGSLOST, /* line argument(s) will be lost */ MANDOCERR_BODYLOST, /* body argument(s) will be lost */ -#define MANDOCERR_ERROR MANDOCERR_BODYLOST + + MANDOCERR_FATAL, /* ===== end of fatal errors ===== */ MANDOCERR_COLUMNS, /* column syntax is inconsistent */ /* FIXME: this should be a MANDOCERR_ERROR */ @@ -87,7 +92,7 @@ enum mandocerr { /* FIXME: this should be a MANDOCERR_ERROR */ MANDOCERR_NESTEDDISP, /* displays may not be nested */ MANDOCERR_BADDISP, /* unsupported display type */ - MANDOCERR_SYNTNOSCOPE, /* request scope close w/none open */ + MANDOCERR_SYNTNOSCOPE, /* no scope to rewind: syntax violated */ MANDOCERR_SYNTSCOPE, /* scope broken, syntax violated */ MANDOCERR_SYNTLINESCOPE, /* line scope broken, syntax violated */ MANDOCERR_SYNTARGVCOUNT, /* argument count wrong, violates syntax */ @@ -95,9 +100,8 @@ enum mandocerr { MANDOCERR_SYNTARGCOUNT, /* argument count wrong, violates syntax */ MANDOCERR_NODOCBODY, /* no document body */ MANDOCERR_NODOCPROLOG, /* no document prologue */ - MANDOCERR_UTSNAME, /* utsname() system call failed */ + MANDOCERR_UTSNAME, /* utsname system call failed */ MANDOCERR_MEM, /* memory exhausted */ -#define MANDOCERR_FATAL MANDOCERR_MEM MANDOCERR_MAX }; |