]> git.cameronkatri.com Git - mandoc.git/blobdiff - roff.c
document the semantics of operation keywords
[mandoc.git] / roff.c
diff --git a/roff.c b/roff.c
index 4903ee8c247b7b7e323458c0ff582cf30dcda864..5fcde6e4490965d6923a6c41cd4b2dc09d64cb92 100644 (file)
--- a/roff.c
+++ b/roff.c
@@ -1,4 +1,4 @@
-/*     $Id: roff.c,v 1.224 2014/08/01 17:27:44 schwarze Exp $ */
+/*     $Id: roff.c,v 1.229 2014/09/07 00:21:53 schwarze Exp $ */
 /*
  * Copyright (c) 2010, 2011, 2012 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010-2014 Ingo Schwarze <schwarze@openbsd.org>
@@ -15,9 +15,9 @@
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
-#ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
+
+#include <sys/types.h>
 
 #include <assert.h>
 #include <ctype.h>
@@ -27,8 +27,8 @@
 
 #include "mandoc.h"
 #include "mandoc_aux.h"
-#include "libroff.h"
 #include "libmandoc.h"
+#include "libroff.h"
 
 /* Maximum number of nested if-else conditionals. */
 #define        RSTACK_MAX      128
@@ -60,6 +60,7 @@ enum  rofft {
        ROFF_nh,
        ROFF_nr,
        ROFF_ns,
+       ROFF_pl,
        ROFF_ps,
        ROFF_rm,
        ROFF_rr,
@@ -122,6 +123,7 @@ struct      roff {
        int              options; /* parse options */
        int              rstacksz; /* current size limit of rstack */
        int              rstackpos; /* position in rstack */
+       int              format; /* current file in mdoc or man format */
        char             control; /* control character */
 };
 
@@ -255,6 +257,7 @@ static      struct roffmac   roffs[ROFF_MAX] = {
        { "nh", roff_line_ignore, NULL, NULL, 0, NULL },
        { "nr", roff_nr, NULL, NULL, 0, NULL },
        { "ns", roff_line_ignore, NULL, NULL, 0, NULL },
+       { "pl", roff_line_ignore, NULL, NULL, 0, NULL },
        { "ps", roff_line_ignore, NULL, NULL, 0, NULL },
        { "rm", roff_rm, NULL, NULL, 0, NULL },
        { "rr", roff_rr, NULL, NULL, 0, NULL },
@@ -456,6 +459,7 @@ roff_reset(struct roff *r)
 {
 
        roff_free1(r);
+       r->format = r->options & (MPARSE_MDOC | MPARSE_MAN);
        r->control = 0;
 }
 
@@ -475,6 +479,7 @@ roff_alloc(struct mparse *parse, int options)
        r = mandoc_calloc(1, sizeof(struct roff));
        r->parse = parse;
        r->options = options;
+       r->format = options & (MPARSE_MDOC | MPARSE_MAN);
        r->rstackpos = -1;
 
        roffhash_init();
@@ -756,6 +761,15 @@ roff_parseln(struct roff *r, int ln, char **bufp,
                return(roff_parsetext(bufp, szp, pos, offs));
        }
 
+       /* Skip empty request lines. */
+
+       if ((*bufp)[pos] == '"') {
+               mandoc_msg(MANDOCERR_COMMENT_BAD, r->parse,
+                   ln, pos, NULL);
+               return(ROFF_IGN);
+       } else if ((*bufp)[pos] == '\0')
+               return(ROFF_IGN);
+
        /*
         * If a scope is open, go to the child handler for that macro,
         * as it may want to preprocess before doing anything with it.
@@ -1776,10 +1790,13 @@ roff_Dd(ROFF_ARGS)
 {
        const char *const       *cp;
 
-       if (0 == ((MPARSE_MDOC | MPARSE_QUICK) & r->options))
+       if ((r->options & (MPARSE_MDOC | MPARSE_QUICK)) == 0)
                for (cp = __mdoc_reserved; *cp; cp++)
                        roff_setstr(r, *cp, NULL, 0);
 
+       if (r->format == 0)
+               r->format = MPARSE_MDOC;
+
        return(ROFF_CONT);
 }
 
@@ -1788,10 +1805,13 @@ roff_TH(ROFF_ARGS)
 {
        const char *const       *cp;
 
-       if (0 == (MPARSE_QUICK & r->options))
+       if ((r->options & MPARSE_QUICK) == 0)
                for (cp = __man_reserved; *cp; cp++)
                        roff_setstr(r, *cp, NULL, 0);
 
+       if (r->format == 0)
+               r->format = MPARSE_MAN;
+
        return(ROFF_CONT);
 }
 
@@ -2307,6 +2327,13 @@ roff_strdup(const struct roff *r, const char *p)
        return(res);
 }
 
+int
+roff_getformat(const struct roff *r)
+{
+
+       return(r->format);
+}
+
 /*
  * Find out whether a line is a macro line or not.
  * If it is, adjust the current position and return one; if it isn't,