]> git.cameronkatri.com Git - mandoc.git/blobdiff - main.c
Move check for closing punctuation into its own function. This will
[mandoc.git] / main.c
diff --git a/main.c b/main.c
index ca7eb35b24605016a3ff69a2129038eb5efc8961..496024e1c3ea94c5c10cb0b176ff830776a9b2aa 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,4 +1,4 @@
-/*     $Id: main.c,v 1.147 2011/03/07 01:35:51 schwarze Exp $ */
+/*     $Id: main.c,v 1.151 2011/03/16 15:28:35 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2011 Ingo Schwarze <schwarze@openbsd.org>
@@ -42,7 +42,6 @@
 #endif
 
 #define        REPARSE_LIMIT   1000
 #endif
 
 #define        REPARSE_LIMIT   1000
-#define        UNCONST(a)      ((void *)(uintptr_t)(const void *)(a))
 
 /* FIXME: Intel's compiler?  LLVM?  pcc?  */
 
 
 /* FIXME: Intel's compiler?  LLVM?  pcc?  */
 
@@ -78,11 +77,13 @@ enum        outt {
 };
 
 struct curparse {
 };
 
 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 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 */
        enum intt         inttype;      /* which parser to use */
        struct man       *pman;         /* persistent man parser */
        struct mdoc      *pmdoc;        /* persistent mdoc parser */
@@ -241,8 +242,6 @@ static      void              version(void) __attribute__((noreturn));
 static int               woptions(struct curparse *, char *);
 
 static const char       *progname;
 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[])
 
 int
 main(int argc, char *argv[])
@@ -261,6 +260,7 @@ main(int argc, char *argv[])
        curp.inttype = INTT_AUTO;
        curp.outtype = OUTT_ASCII;
        curp.wlevel  = MANDOCLEVEL_FATAL;
        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:")))
 
        /* LINTED */
        while (-1 != (c = getopt(argc, argv, "m:O:T:VW:")))
@@ -301,7 +301,7 @@ main(int argc, char *argv[])
 
        while (*argv) {
                ffile(*argv, &curp);
 
        while (*argv) {
                ffile(*argv, &curp);
-               if (MANDOCLEVEL_OK != exit_status && curp.wstop)
+               if (MANDOCLEVEL_OK != curp.exit_status && curp.wstop)
                        break;
                ++argv;
        }
                        break;
                ++argv;
        }
@@ -315,7 +315,7 @@ main(int argc, char *argv[])
        if (curp.roff)
                roff_free(curp.roff);
 
        if (curp.roff)
                roff_free(curp.roff);
 
-       return((int)exit_status);
+       return((int)curp.exit_status);
 }
 
 
 }
 
 
@@ -360,7 +360,7 @@ ffile(const char *file, struct curparse *curp)
 
        if (-1 == (curp->fd = open(curp->file, O_RDONLY, 0))) {
                perror(curp->file);
 
        if (-1 == (curp->fd = open(curp->file, O_RDONLY, 0))) {
                perror(curp->file);
-               exit_status = MANDOCLEVEL_SYSERR;
+               curp->exit_status = MANDOCLEVEL_SYSERR;
                return;
        }
 
                return;
        }
 
@@ -378,7 +378,7 @@ pfile(const char *file, struct curparse *curp)
 
        if (-1 == (fd = open(file, O_RDONLY, 0))) {
                perror(file);
 
        if (-1 == (fd = open(file, O_RDONLY, 0))) {
                perror(file);
-               file_status = MANDOCLEVEL_SYSERR;
+               curp->file_status = MANDOCLEVEL_SYSERR;
                return(0);
        }
 
                return(0);
        }
 
@@ -396,7 +396,7 @@ pfile(const char *file, struct curparse *curp)
        if (-1 == close(fd))
                perror(file);
 
        if (-1 == close(fd))
                perror(file);
 
-       return(MANDOCLEVEL_FATAL > file_status ? 1 : 0);
+       return(MANDOCLEVEL_FATAL > curp->file_status ? 1 : 0);
 }
 
 
 }
 
 
@@ -500,7 +500,7 @@ fdesc(struct curparse *curp)
 
        curp->mdoc = NULL;
        curp->man = NULL;
 
        curp->mdoc = NULL;
        curp->man = NULL;
-       file_status = MANDOCLEVEL_OK;
+       curp->file_status = MANDOCLEVEL_OK;
 
        /* Make sure the mandotory roff parser is initialised. */
 
 
        /* Make sure the mandotory roff parser is initialised. */
 
@@ -513,26 +513,26 @@ fdesc(struct curparse *curp)
 
        pdesc(curp);
 
 
        pdesc(curp);
 
-       if (MANDOCLEVEL_FATAL <= file_status)
+       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);
                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;
+               curp->file_status = MANDOCLEVEL_FATAL;
                goto cleanup;
        }
 
        /* Clean up the parse routine ASTs. */
 
        if (curp->mdoc && ! mdoc_endparse(curp->mdoc)) {
                goto cleanup;
        }
 
        /* Clean up the parse routine ASTs. */
 
        if (curp->mdoc && ! mdoc_endparse(curp->mdoc)) {
-               assert(MANDOCLEVEL_FATAL <= file_status);
+               assert(MANDOCLEVEL_FATAL <= curp->file_status);
                goto cleanup;
        }
 
        if (curp->man && ! man_endparse(curp->man)) {
                goto cleanup;
        }
 
        if (curp->man && ! man_endparse(curp->man)) {
-               assert(MANDOCLEVEL_FATAL <= file_status);
+               assert(MANDOCLEVEL_FATAL <= curp->file_status);
                goto cleanup;
        }
 
                goto cleanup;
        }
 
@@ -544,7 +544,7 @@ fdesc(struct curparse *curp)
         * the requested level, do not produce output.
         */
 
         * the requested level, do not produce output.
         */
 
-       if (MANDOCLEVEL_OK != file_status && curp->wstop)
+       if (MANDOCLEVEL_OK != curp->file_status && curp->wstop)
                goto cleanup;
 
        /* If unset, allocate output dev now (if applicable). */
                goto cleanup;
 
        /* If unset, allocate output dev now (if applicable). */
@@ -619,8 +619,8 @@ fdesc(struct curparse *curp)
        assert(curp->roff);
        roff_reset(curp->roff);
 
        assert(curp->roff);
        roff_reset(curp->roff);
 
-       if (exit_status < file_status)
-               exit_status = file_status;
+       if (curp->exit_status < curp->file_status)
+               curp->exit_status = curp->file_status;
 
        return;
 }
 
        return;
 }
@@ -639,7 +639,7 @@ pdesc(struct curparse *curp)
         */
 
        if ( ! read_whole_file(curp, &blk, &with_mmap)) {
         */
 
        if ( ! read_whole_file(curp, &blk, &with_mmap)) {
-               file_status = MANDOCLEVEL_SYSERR;
+               curp->file_status = MANDOCLEVEL_SYSERR;
                return;
        }
 
                return;
        }
 
@@ -655,6 +655,11 @@ pdesc(struct curparse *curp)
                free(blk.buf);
 }
 
                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)
 {
 static void
 parsebuf(struct curparse *curp, struct buf blk, int start)
 {
@@ -666,12 +671,6 @@ parsebuf(struct curparse *curp, struct buf blk, int start)
        int              lnn; /* line number in the real file */
        unsigned char    c;
 
        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; 
        memset(&ln, 0, sizeof(struct buf));
 
        lnn = curp->line; 
@@ -808,7 +807,7 @@ rerun:
                        pos = 0;
                        continue;
                case (ROFF_APPEND):
                        pos = 0;
                        continue;
                case (ROFF_APPEND):
-                       pos = strlen(ln.buf);
+                       pos = (int)strlen(ln.buf);
                        continue;
                case (ROFF_RERUN):
                        goto rerun;
                        continue;
                case (ROFF_RERUN):
                        goto rerun;
@@ -816,7 +815,7 @@ rerun:
                        pos = 0;
                        continue;
                case (ROFF_ERR):
                        pos = 0;
                        continue;
                case (ROFF_ERR):
-                       assert(MANDOCLEVEL_FATAL <= file_status);
+                       assert(MANDOCLEVEL_FATAL <= curp->file_status);
                        break;
                case (ROFF_SO):
                        if (pfile(ln.buf + of, curp)) {
                        break;
                case (ROFF_SO):
                        if (pfile(ln.buf + of, curp)) {
@@ -833,7 +832,7 @@ rerun:
                 * call, make sure we don't continue parsing.
                 */
 
                 * call, make sure we don't continue parsing.
                 */
 
-               if (MANDOCLEVEL_FATAL <= file_status)
+               if (MANDOCLEVEL_FATAL <= curp->file_status)
                        break;
 
                /*
                        break;
 
                /*
@@ -881,7 +880,7 @@ rerun:
                                        curp->line, ln.buf, of);
 
                if (0 == rc) {
                                        curp->line, ln.buf, of);
 
                if (0 == rc) {
-                       assert(MANDOCLEVEL_FATAL <= file_status);
+                       assert(MANDOCLEVEL_FATAL <= curp->file_status);
                        break;
                }
 
                        break;
                }
 
@@ -1062,8 +1061,8 @@ mmsg(enum mandocerr t, void *arg, int ln, int col, const char *msg)
                fprintf(stderr, ": %s", msg);
        fputc('\n', stderr);
 
                fprintf(stderr, ": %s", msg);
        fputc('\n', stderr);
 
-       if (file_status < level)
-               file_status = level;
+       if (cp->file_status < level)
+               cp->file_status = level;
        
        return(level < MANDOCLEVEL_FATAL);
 }
        
        return(level < MANDOCLEVEL_FATAL);
 }