]> git.cameronkatri.com Git - mandoc.git/blobdiff - main.c
Fill in more version notes.
[mandoc.git] / main.c
diff --git a/main.c b/main.c
index c9905f0b5cd67028cdd220fcbf123cbda13f7322..b28b285b6bd86514af281e22da7ecfff2daf7c33 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,6 +1,7 @@
-/*     $Id: main.c,v 1.94 2010/06/30 20:32:15 schwarze Exp $ */
+/*     $Id: main.c,v 1.100 2010/07/25 11:44:31 kristaps Exp $ */
 /*
 /*
- * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
+ * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
  *
  * Permission to use, copy, modify, and distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -22,6 +23,7 @@
 #include <sys/stat.h>
 
 #include <assert.h>
 #include <sys/stat.h>
 
 #include <assert.h>
+#include <ctype.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdint.h>
 #include <fcntl.h>
 #include <stdio.h>
 #include <stdint.h>
@@ -30,7 +32,6 @@
 #include <unistd.h>
 
 #include "mandoc.h"
 #include <unistd.h>
 
 #include "mandoc.h"
-#include "regs.h"
 #include "main.h"
 #include "mdoc.h"
 #include "man.h"
 #include "main.h"
 #include "mdoc.h"
 #include "man.h"
@@ -67,7 +68,8 @@ enum  outt {
        OUTT_HTML,
        OUTT_XHTML,
        OUTT_LINT,
        OUTT_HTML,
        OUTT_XHTML,
        OUTT_LINT,
-       OUTT_PS
+       OUTT_PS,
+       OUTT_PDF
 };
 
 struct curparse {
 };
 
 struct curparse {
@@ -110,6 +112,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "list type must come first",
        "bad standard",
        "bad library",
        "list type must come first",
        "bad standard",
        "bad library",
+       "tab in non-literal context",
        "bad escape sequence",
        "unterminated quoted string",
        "argument requires the width argument",
        "bad escape sequence",
        "unterminated quoted string",
        "argument requires the width argument",
@@ -120,6 +123,7 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "unknown manual section",
        "section not in conventional manual section",
        "end of line whitespace",
        "unknown manual section",
        "section not in conventional manual section",
        "end of line whitespace",
+       "blocks badly nested",
        "scope open on exit",
 
        "generic error",
        "scope open on exit",
 
        "generic error",
@@ -143,7 +147,6 @@ static      const char * const      mandocerrs[MANDOCERR_MAX] = {
        "bad comment style",
        "unknown macro will be lost",
        "line scope broken",
        "bad comment style",
        "unknown macro will be lost",
        "line scope broken",
-       "scope broken",
        "argument count wrong",
        "request scope close w/none open",
        "scope already open",
        "argument count wrong",
        "request scope close w/none open",
        "scope already open",
@@ -153,16 +156,17 @@ static    const char * const      mandocerrs[MANDOCERR_MAX] = {
        "no title in document",
        "missing list type",
        "missing display type",
        "no title in document",
        "missing list type",
        "missing display type",
+       "missing font type",
        "line argument(s) will be lost",
        "body argument(s) will be lost",
 
        "generic fatal error",
 
        "column syntax is inconsistent",
        "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",
        "unsupported display type",
        "displays may not be nested",
        "unsupported display type",
-       "no scope to rewind: syntax violated",
+       "blocks badly nested",
+       "no such block is open",
        "scope broken, syntax violated",
        "line scope broken, syntax violated",
        "argument count wrong, violates syntax",
        "scope broken, syntax violated",
        "line scope broken, syntax violated",
        "argument count wrong, violates syntax",
@@ -490,6 +494,26 @@ fdesc(struct curparse *curp)
                                ++lnn;
                                break;
                        }
                                ++lnn;
                                break;
                        }
+
+                       /* 
+                        * Warn about bogus characters.  If you're using
+                        * non-ASCII encoding, you're screwing your
+                        * readers.  Since I'd rather this not happen,
+                        * I'll be helpful and drop these characters so
+                        * we don't display gibberish.  Note to manual
+                        * writers: use special characters.
+                        */
+
+                       if ( ! isgraph((u_char)blk.buf[i]) &&
+                                       ! isblank((u_char)blk.buf[i])) {
+                               if ( ! mmsg(MANDOCERR_BADCHAR, curp, 
+                                               lnn_start, pos, 
+                                               "ignoring byte"))
+                                       goto bailout;
+                               i++;
+                               continue;
+                       }
+
                        /* Trailing backslash is like a plain character. */
                        if ('\\' != blk.buf[i] || i + 1 == (int)blk.sz) {
                                if (pos >= (int)ln.sz)
                        /* Trailing backslash is like a plain character. */
                        if ('\\' != blk.buf[i] || i + 1 == (int)blk.sz) {
                                if (pos >= (int)ln.sz)
@@ -607,9 +631,13 @@ fdesc(struct curparse *curp)
                        curp->outdata = ascii_alloc(curp->outopts);
                        curp->outfree = ascii_free;
                        break;
                        curp->outdata = ascii_alloc(curp->outopts);
                        curp->outfree = ascii_free;
                        break;
+               case (OUTT_PDF):
+                       curp->outdata = pdf_alloc(curp->outopts);
+                       curp->outfree = pspdf_free;
+                       break;
                case (OUTT_PS):
                        curp->outdata = ps_alloc(curp->outopts);
                case (OUTT_PS):
                        curp->outdata = ps_alloc(curp->outopts);
-                       curp->outfree = ps_free;
+                       curp->outfree = pspdf_free;
                        break;
                default:
                        break;
                        break;
                default:
                        break;
@@ -627,6 +655,8 @@ fdesc(struct curparse *curp)
                        curp->outman = tree_man;
                        curp->outmdoc = tree_mdoc;
                        break;
                        curp->outman = tree_man;
                        curp->outmdoc = tree_mdoc;
                        break;
+               case (OUTT_PDF):
+                       /* FALLTHROUGH */
                case (OUTT_ASCII):
                        /* FALLTHROUGH */
                case (OUTT_PS):
                case (OUTT_ASCII):
                        /* FALLTHROUGH */
                case (OUTT_PS):
@@ -761,6 +791,8 @@ toptions(struct curparse *curp, char *arg)
                curp->outtype = OUTT_XHTML;
        else if (0 == strcmp(arg, "ps"))
                curp->outtype = OUTT_PS;
                curp->outtype = OUTT_XHTML;
        else if (0 == strcmp(arg, "ps"))
                curp->outtype = OUTT_PS;
+       else if (0 == strcmp(arg, "pdf"))
+               curp->outtype = OUTT_PDF;
        else {
                fprintf(stderr, "%s: Bad argument\n", arg);
                return(0);
        else {
                fprintf(stderr, "%s: Bad argument\n", arg);
                return(0);