=================================================================== RCS file: /cvs/mandoc/main.c,v retrieving revision 1.155 retrieving revision 1.169 diff -u -p -r1.155 -r1.169 --- mandoc/main.c 2011/03/20 16:02:05 1.155 +++ mandoc/main.c 2014/01/06 00:53:33 1.169 @@ -1,7 +1,8 @@ -/* $Id: main.c,v 1.155 2011/03/20 16:02:05 kristaps Exp $ */ +/* $Id: main.c,v 1.169 2014/01/06 00:53:33 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2010, 2011 Ingo Schwarze + * Copyright (c) 2010, 2011, 2012 Ingo Schwarze + * Copyright (c) 2010 Joerg Sonnenberger * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -30,7 +31,6 @@ #include "main.h" #include "mdoc.h" #include "man.h" -#include "roff.h" #if !defined(__GNUC__) || (__GNUC__ < 2) # if !defined(lint) @@ -44,7 +44,10 @@ typedef void (*out_free)(void *); enum outt { OUTT_ASCII = 0, /* -Tascii */ + OUTT_LOCALE, /* -Tlocale */ + OUTT_UTF8, /* -Tutf8 */ OUTT_TREE, /* -Ttree */ + OUTT_MAN, /* -Tman */ OUTT_HTML, /* -Thtml */ OUTT_XHTML, /* -Txhtml */ OUTT_LINT, /* -Tlint */ @@ -54,7 +57,6 @@ enum outt { struct curparse { struct mparse *mp; - const char *file; /* current file-name */ enum mandoclevel wlevel; /* ignore messages below this */ int wstop; /* stop after a file with a warning */ enum outt outtype; /* which output to use */ @@ -65,125 +67,6 @@ struct curparse { char outopts[BUFSIZ]; /* buf of output opts */ }; -static const char * const mandoclevels[MANDOCLEVEL_MAX] = { - "SUCCESS", - "RESERVED", - "WARNING", - "ERROR", - "FATAL", - "BADARG", - "SYSERR" -}; - -static const char * const mandocerrs[MANDOCERR_MAX] = { - "ok", - - "generic warning", - - /* related to the prologue */ - "no title in document", - "document title should be all caps", - "unknown manual section", - "date missing, using today's date", - "cannot parse date, using it verbatim", - "prologue macros out of order", - "duplicate prologue macro", - "macro not allowed in prologue", - "macro not allowed in body", - - /* related to document structure */ - ".so is fragile, better use ln(1)", - "NAME section must come first", - "bad NAME section contents", - "manual name not yet set", - "sections out of conventional order", - "duplicate section name", - "section not in conventional manual section", - - /* related to macros and nesting */ - "skipping obsolete macro", - "skipping paragraph macro", - "skipping no-space macro", - "blocks badly nested", - "child violates parent syntax", - "nested displays are not portable", - "already in literal mode", - - /* related to missing macro arguments */ - "skipping empty macro", - "argument count wrong", - "missing display type", - "list type must come first", - "tag lists require a width argument", - "missing font type", - "skipping end of block that is not open", - - /* related to bad macro arguments */ - "skipping argument", - "duplicate argument", - "duplicate display type", - "duplicate list type", - "unknown AT&T UNIX version", - "bad Boolean value", - "unknown font", - "unknown standard specifier", - "bad width argument", - - /* related to plain text */ - "blank line in non-literal context", - "tab in non-literal context", - "end of line whitespace", - "bad comment style", - "unknown escape sequence", - "unterminated quoted string", - - "generic error", - - /* related to tables */ - "bad table syntax", - "bad table option", - "bad table layout", - "no table layout cells specified", - "no table data cells specified", - "ignore data in cell", - "data block still open", - "ignoring extra data cells", - - "input stack limit exceeded, infinite loop?", - "skipping bad character", - "escaped character not allowed in a name", - "skipping text before the first section header", - "skipping unknown macro", - "NOT IMPLEMENTED, please use groff: skipping request", - "line scope broken", - "argument count wrong", - "skipping end of block that is not open", - "missing end of block", - "scope open on exit", - "uname(3) system call failed", - "macro requires line argument(s)", - "macro requires body argument(s)", - "macro requires argument(s)", - "missing list type", - "line argument(s) will be lost", - "body argument(s) will be lost", - - "generic fatal error", - - "column syntax is inconsistent", - "NOT IMPLEMENTED: .Bd -file", - "line scope broken, syntax violated", - "argument count wrong, violates syntax", - "child violates parent syntax", - "argument count wrong, violates syntax", - "NOT IMPLEMENTED: .so with absolute path or \"..\"", - "no document body", - "no document prologue", - "static buffer exhausted", -}; - -static void evt_close(void *, const char *); -static int evt_open(void *, const char *); static int moptions(enum mparset *, char *); static void mmsg(enum mandocerr, enum mandoclevel, const char *, int, int, const char *); @@ -203,6 +86,7 @@ main(int argc, char *argv[]) struct curparse curp; enum mparset type; enum mandoclevel rc; + char *defos; progname = strrchr(argv[0], '/'); if (progname == NULL) @@ -215,10 +99,24 @@ main(int argc, char *argv[]) type = MPARSE_AUTO; curp.outtype = OUTT_ASCII; curp.wlevel = MANDOCLEVEL_FATAL; + defos = NULL; /* LINTED */ - while (-1 != (c = getopt(argc, argv, "m:O:T:VW:"))) + while (-1 != (c = getopt(argc, argv, "I:m:O:T:VW:"))) switch (c) { + case ('I'): + if (strncmp(optarg, "os=", 3)) { + fprintf(stderr, "-I%s: Bad argument\n", + optarg); + return((int)MANDOCLEVEL_BADARG); + } + if (defos) { + fprintf(stderr, "-I%s: Duplicate argument\n", + optarg); + return((int)MANDOCLEVEL_BADARG); + } + defos = mandoc_strdup(optarg + 3); + break; case ('m'): if ( ! moptions(&type, optarg)) return((int)MANDOCLEVEL_BADARG); @@ -243,8 +141,14 @@ main(int argc, char *argv[]) /* NOTREACHED */ } - curp.mp = mparse_alloc(type, evt_open, evt_close, curp.wlevel, mmsg, &curp); + curp.mp = mparse_alloc(type, curp.wlevel, mmsg, defos, 0); + /* + * Conditionally start up the lookaside buffer before parsing. + */ + if (OUTT_MAN == curp.outtype) + mparse_keep(curp.mp); + argc -= optind; argv += optind; @@ -264,6 +168,7 @@ main(int argc, char *argv[]) (*curp.outfree)(curp.outdata); if (curp.mp) mparse_free(curp.mp); + free(defos); return((int)rc); } @@ -282,35 +187,18 @@ usage(void) fprintf(stderr, "usage: %s " "[-V] " - "[-foption] " + "[-Ios=name] " "[-mformat] " "[-Ooption] " "[-Toutput] " - "[-Werr] " - "[file...]\n", + "[-Wlevel]\n" + "\t [file ...]\n", progname); exit((int)MANDOCLEVEL_BADARG); } -static int -evt_open(void *arg, const char *file) -{ - - evt_close(arg, file); - return(1); -} - static void -evt_close(void *arg, const char *file) -{ - struct curparse *p; - - p = (struct curparse *)arg; - p->file = file; -} - -static void parse(struct curparse *curp, int fd, const char *file, enum mandoclevel *level) { @@ -344,10 +232,20 @@ parse(struct curparse *curp, int fd, switch (curp->outtype) { case (OUTT_XHTML): curp->outdata = xhtml_alloc(curp->outopts); + curp->outfree = html_free; break; case (OUTT_HTML): curp->outdata = html_alloc(curp->outopts); + curp->outfree = html_free; break; + case (OUTT_UTF8): + curp->outdata = utf8_alloc(curp->outopts); + curp->outfree = ascii_free; + break; + case (OUTT_LOCALE): + curp->outdata = locale_alloc(curp->outopts); + curp->outfree = ascii_free; + break; case (OUTT_ASCII): curp->outdata = ascii_alloc(curp->outopts); curp->outfree = ascii_free; @@ -370,16 +268,23 @@ parse(struct curparse *curp, int fd, case (OUTT_XHTML): curp->outman = html_man; curp->outmdoc = html_mdoc; - curp->outfree = html_free; break; case (OUTT_TREE): curp->outman = tree_man; curp->outmdoc = tree_mdoc; break; + case (OUTT_MAN): + curp->outmdoc = man_mdoc; + curp->outman = man_man; + break; case (OUTT_PDF): /* FALLTHROUGH */ case (OUTT_ASCII): /* FALLTHROUGH */ + case (OUTT_UTF8): + /* FALLTHROUGH */ + case (OUTT_LOCALE): + /* FALLTHROUGH */ case (OUTT_PS): curp->outman = terminal_man; curp->outmdoc = terminal_mdoc; @@ -435,8 +340,14 @@ toptions(struct curparse *curp, char *arg) curp->wlevel = MANDOCLEVEL_WARNING; } else if (0 == strcmp(arg, "tree")) curp->outtype = OUTT_TREE; + else if (0 == strcmp(arg, "man")) + curp->outtype = OUTT_MAN; else if (0 == strcmp(arg, "html")) curp->outtype = OUTT_HTML; + else if (0 == strcmp(arg, "utf8")) + curp->outtype = OUTT_UTF8; + else if (0 == strcmp(arg, "locale")) + curp->outtype = OUTT_LOCALE; else if (0 == strcmp(arg, "xhtml")) curp->outtype = OUTT_XHTML; else if (0 == strcmp(arg, "ps")) @@ -497,7 +408,8 @@ mmsg(enum mandocerr t, enum mandoclevel lvl, fprintf(stderr, "%s:%d:%d: %s: %s", file, line, col + 1, - mandoclevels[lvl], mandocerrs[t]); + mparse_strlevel(lvl), + mparse_strerror(t)); if (msg) fprintf(stderr, ": %s", msg);