=================================================================== RCS file: /cvs/mandoc/main.c,v retrieving revision 1.5 retrieving revision 1.14 diff -u -p -r1.5 -r1.14 --- mandoc/main.c 2009/03/20 19:56:25 1.5 +++ mandoc/main.c 2009/03/25 15:17:49 1.14 @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.5 2009/03/20 19:56:25 kristaps Exp $ */ +/* $Id: main.c,v 1.14 2009/03/25 15:17:49 kristaps Exp $ */ /* * Copyright (c) 2008, 2009 Kristaps Dzonsons * @@ -27,12 +27,17 @@ #include #include "mdoc.h" +#include "man.h" #ifdef __linux__ extern int getsubopt(char **, char * const *, char **); # ifndef __dead # define __dead __attribute__((__noreturn__)) # endif +#elif defined(__dead2) +# ifndef __dead +# define __dead __dead2 +# endif #endif struct buf { @@ -49,15 +54,21 @@ struct curparse { #define WARN_WERR (1 << 2) /* Warnings->errors. */ }; -enum outt { - OUTT_ASCII, +enum intt { + INTT_MDOC = 0, + INTT_MAN +}; + +enum outt { + OUTT_ASCII = 0, OUTT_LATIN1, OUTT_UTF8, OUTT_TREE, 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; @@ -65,49 +76,64 @@ 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 *); -__dead static void version(void); -__dead static void usage(void); static int foptions(int *, char *); 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 *, struct mdoc *); +static int file(struct buf *, struct buf *, + const char *, + struct man *, struct mdoc *); static int fdesc(struct buf *, struct buf *, - const char *, int, struct mdoc *); + const char *, int, + struct man *, struct mdoc *); +__dead static void version(void); +__dead static void usage(void); + int main(int argc, char *argv[]) { - int c, rc, fflags, wflags; - struct mdoc_cb cb; + int c, rc, fflags; + struct mdoc_cb mdoccb; + struct man_cb mancb; + struct man *man; struct mdoc *mdoc; void *outdata; enum outt outtype; + enum intt inttype; struct buf ln, blk; out_run outrun; out_free outfree; struct curparse curp; - fflags = wflags = 0; + fflags = 0; outtype = OUTT_ASCII; + inttype = INTT_MDOC; bzero(&curp, sizeof(struct curparse)); /* LINTED */ - while (-1 != (c = getopt(argc, argv, "f:VW:T:"))) + while (-1 != (c = getopt(argc, argv, "f:m:VW:T:"))) switch (c) { case ('f'): if ( ! foptions(&fflags, optarg)) return(0); break; + case ('m'): + if ( ! moptions(&inttype, optarg)) + return(0); + break; case ('T'): if ( ! toptions(&outtype, optarg)) return(0); @@ -167,37 +193,55 @@ 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)); - mdoc = mdoc_alloc(&curp, fflags, &cb); + man = NULL; + mdoc = NULL; + switch (inttype) { + case (INTT_MAN): + man = man_alloc(&curp, &mancb); + break; + default: + mdoc = mdoc_alloc(&curp, fflags, &mdoccb); + break; + } + /* * Loop around available files. */ if (NULL == *argv) { curp.file = ""; - c = fdesc(&blk, &ln, "stdin", STDIN_FILENO, mdoc); rc = 0; + c = fdesc(&blk, &ln, "stdin", + STDIN_FILENO, man, mdoc); + if (c && NULL == outrun) rc = 1; - else if (c && outrun && (*outrun)(outdata, mdoc)) + else if (c && outrun && (*outrun)(outdata, man, mdoc)) rc = 1; } else { while (*argv) { curp.file = *argv; - c = file(&blk, &ln, *argv, mdoc); + c = file(&blk, &ln, *argv, man, mdoc); if ( ! c) break; - if (outrun && ! (*outrun)(outdata, mdoc)) + if (outrun && ! (*outrun)(outdata, man, mdoc)) break; - /* Reset the parser for another file. */ - mdoc_reset(mdoc); + if (man) + man_reset(man); + if (mdoc) + mdoc_reset(mdoc); + argv++; } rc = NULL == *argv; @@ -209,9 +253,11 @@ main(int argc, char *argv[]) free(ln.buf); if (outfree) (*outfree)(outdata); + if (mdoc) + mdoc_free(mdoc); + if (man) + man_free(man); - mdoc_free(mdoc); - return(rc ? EXIT_SUCCESS : EXIT_FAILURE); } @@ -230,15 +276,17 @@ __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 */ } static int -file(struct buf *blk, struct buf *ln, - const char *file, struct mdoc *mdoc) +file(struct buf *blk, struct buf *ln, const char *file, + struct man *man, struct mdoc *mdoc) { int fd, c; @@ -247,7 +295,7 @@ file(struct buf *blk, struct buf *ln, return(0); } - c = fdesc(blk, ln, file, fd, mdoc); + c = fdesc(blk, ln, file, fd, man, mdoc); if (-1 == close(fd)) warn("%s", file); @@ -258,25 +306,28 @@ file(struct buf *blk, struct buf *ln, static int fdesc(struct buf *blk, struct buf *ln, - const char *f, int fd, struct mdoc *mdoc) + const char *f, int fd, + struct man *man, struct mdoc *mdoc) { size_t sz; ssize_t ssz; struct stat st; int j, i, pos, lnn; + assert( ! (man && mdoc)); + /* * Two buffers: ln and buf. buf is the input buffer, optimised * for each file's block size. ln is a line buffer. Both * growable, hence passed in by ptr-ptr. */ - if (-1 == fstat(fd, &st)) { + sz = BUFSIZ; + + if (-1 == fstat(fd, &st)) warnx("%s", f); - sz = BUFSIZ; - } else - sz = (unsigned)BUFSIZ > st.st_blksize ? - (size_t)BUFSIZ : st.st_blksize; + else if ((size_t)st.st_blksize > sz) + sz = st.st_blksize; if (sz > blk->sz) { blk->buf = realloc(blk->buf, sz); @@ -324,18 +375,40 @@ fdesc(struct buf *blk, struct buf *ln, } ln->buf[pos] = 0; - if ( ! mdoc_parseln(mdoc, lnn, ln->buf)) + if (mdoc && ! mdoc_parseln(mdoc, lnn, ln->buf)) return(0); + if (man && ! man_parseln(man, lnn, ln->buf)) + return(0); lnn++; pos = 0; } } - return(mdoc_endparse(mdoc)); + if (mdoc) + return(mdoc_endparse(mdoc)); + + return(man_endparse(man)); } static int +moptions(enum intt *tflags, char *arg) +{ + + if (0 == strcmp(arg, "mdoc")) + *tflags = INTT_MDOC; + else if (0 == strcmp(arg, "man")) + *tflags = INTT_MAN; + else { + warnx("bad argument: -m%s", arg); + return(0); + } + + return(1); +} + + +static int toptions(enum outt *tflags, char *arg) { @@ -447,7 +520,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; @@ -482,3 +555,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); +}