=================================================================== RCS file: /cvs/mandoc/main.c,v retrieving revision 1.10 retrieving revision 1.15 diff -u -p -r1.10 -r1.15 --- mandoc/main.c 2009/03/23 14:22:11 1.10 +++ mandoc/main.c 2009/03/25 21:03:13 1.15 @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.10 2009/03/23 14:22:11 kristaps Exp $ */ +/* $Id: main.c,v 1.15 2009/03/25 21:03:13 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -34,7 +34,7 @@ extern int getsubopt(char **, char * const *, char # ifndef __dead # define __dead __attribute__((__noreturn__)) # endif -#elif defined(__FreeBSD__) +#elif defined(__dead2) # ifndef __dead # define __dead __dead2 # endif @@ -54,6 +54,10 @@ struct curparse { #define WARN_WERR (1 << 2) /* Warnings->errors. */ }; +#define IGN_SCOPE (1 << 0) /* Flag to ignore scope. */ +#define IGN_ESCAPE (1 << 1) /* Flag to ignore bad escapes. */ +#define IGN_MACRO (1 << 2) /* Flag to ignore unknown macros. */ + enum intt { INTT_MDOC = 0, INTT_MAN @@ -67,7 +71,8 @@ enum outt { OUTT_LINT }; -typedef int (*out_run)(void *, const struct mdoc *); +typedef int (*out_run)(void *, const struct man *, + const struct mdoc *); typedef void (*out_free)(void *); extern char *__progname; @@ -75,8 +80,10 @@ extern char *__progname; extern void *ascii_alloc(void); extern void *latin1_alloc(void); extern void *utf8_alloc(void); -extern int terminal_run(void *, const struct mdoc *); -extern int tree_run(void *, const struct mdoc *); +extern int terminal_run(void *, const struct man *, + const struct mdoc *); +extern int tree_run(void *, const struct man *, + const struct mdoc *); extern void terminal_free(void *); static int foptions(int *, char *); @@ -84,7 +91,8 @@ static int toptions(enum outt *, char *); static int moptions(enum intt *, char *); static int woptions(int *, char *); static int merr(void *, int, int, const char *); -static int mwarn(void *, int, int, +static int manwarn(void *, int, int, const char *); +static int mdocwarn(void *, int, int, enum mdoc_warn, const char *); static int file(struct buf *, struct buf *, const char *, @@ -100,8 +108,9 @@ __dead static void usage(void); int main(int argc, char *argv[]) { - int c, rc, fflags; - struct mdoc_cb cb; + int c, rc, fflags, pflags; + struct mdoc_cb mdoccb; + struct man_cb mancb; struct man *man; struct mdoc *mdoc; void *outdata; @@ -188,22 +197,36 @@ main(int argc, char *argv[]) * screen. XXX - for now, no path for debugging messages. */ - cb.mdoc_msg = NULL; - cb.mdoc_err = merr; - cb.mdoc_warn = mwarn; + mdoccb.mdoc_msg = NULL; + mdoccb.mdoc_err = merr; + mdoccb.mdoc_warn = mdocwarn; + mancb.man_err = merr; + mancb.man_warn = manwarn; + bzero(&ln, sizeof(struct buf)); bzero(&blk, sizeof(struct buf)); man = NULL; mdoc = NULL; + pflags = 0; switch (inttype) { case (INTT_MAN): - man = man_alloc(); + if (fflags & IGN_MACRO) + pflags |= MAN_IGN_MACRO; + + man = man_alloc(&curp, pflags, &mancb); break; default: - mdoc = mdoc_alloc(&curp, fflags, &cb); + if (fflags & IGN_SCOPE) + pflags |= MDOC_IGN_SCOPE; + if (fflags & IGN_ESCAPE) + pflags |= MDOC_IGN_ESCAPE; + if (fflags & IGN_MACRO) + pflags |= MDOC_IGN_MACRO; + + mdoc = mdoc_alloc(&curp, pflags, &mdoccb); break; } @@ -219,20 +242,16 @@ main(int argc, char *argv[]) if (c && NULL == outrun) rc = 1; -#if 0 - else if (c && outrun && (*outrun)(outdata, mdoc)) + else if (c && outrun && (*outrun)(outdata, man, mdoc)) rc = 1; -#endif } else { while (*argv) { curp.file = *argv; c = file(&blk, &ln, *argv, man, mdoc); if ( ! c) break; -#if 0 - if (outrun && ! (*outrun)(outdata, mdoc)) + if (outrun && ! (*outrun)(outdata, man, mdoc)) break; -#endif if (man) man_reset(man); if (mdoc) @@ -272,7 +291,9 @@ __dead static void usage(void) { - (void)fprintf(stderr, "usage: %s\n", __progname); + (void)fprintf(stderr, "usage: %s [-V] [-foption...] " + "[-mformat] [-Toutput] [-Werr...]\n", + __progname); exit(1); /* NOTREACHED */ } @@ -443,13 +464,13 @@ foptions(int *fflags, char *arg) while (*arg) switch (getsubopt(&arg, toks, &v)) { case (0): - *fflags |= MDOC_IGN_SCOPE; + *fflags |= IGN_SCOPE; break; case (1): - *fflags |= MDOC_IGN_ESCAPE; + *fflags |= IGN_ESCAPE; break; case (2): - *fflags |= MDOC_IGN_MACRO; + *fflags |= IGN_MACRO; break; default: warnx("bad argument: -f%s", arg); @@ -514,7 +535,7 @@ merr(void *arg, int line, int col, const char *msg) static int -mwarn(void *arg, int line, int col, +mdocwarn(void *arg, int line, int col, enum mdoc_warn type, const char *msg) { struct curparse *curp; @@ -549,3 +570,23 @@ mwarn(void *arg, int line, int col, } +static int +manwarn(void *arg, int line, int col, const char *msg) +{ + struct curparse *curp; + + curp = (struct curparse *)arg; + + if ( ! (curp->wflags & WARN_WSYNTAX)) + return(1); + + warnx("%s:%d: syntax warning: %s (column %d)", + curp->file, line, msg, col); + + if ( ! (curp->wflags & WARN_WERR)) + return(1); + + warnx("%s: considering warnings as errors", + __progname); + return(0); +}