]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc.c
Small fix to preserve trailing semicolons in examples.
[mandoc.git] / mdoc.c
diff --git a/mdoc.c b/mdoc.c
index 53f85216042a1631f81a33cbe51f2ece1108428f..b1059eadc20b3e33b6a290096bc947c99d8c5329 100644 (file)
--- a/mdoc.c
+++ b/mdoc.c
@@ -1,6 +1,6 @@
-/*     $Id: mdoc.c,v 1.143 2010/05/31 15:50:48 kristaps Exp $ */
+/*     $Id: mdoc.c,v 1.145 2010/05/31 21:32:57 kristaps Exp $ */
 /*
 /*
- * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
+ * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@bsd.lv>
  *
  * 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
@@ -561,14 +561,15 @@ mdoc_ptext(struct mdoc *m, int line, char *buf, int offs)
        n = m->last;
 
        /*
        n = m->last;
 
        /*
-        * Diver directly into list processing if we're encountering a
+        * Divert directly to list processing if we're encountering a
         * columnar MDOC_BLOCK with or without a prior MDOC_BLOCK entry
         * columnar MDOC_BLOCK with or without a prior MDOC_BLOCK entry
-        * (if it's a MDOC_BODY that means it's open, in which case we
-        * should process within its context).
+        * (a MDOC_BODY means it's already open, in which case we should
+        * process within its context in the normal way).
         */
 
        if (MDOC_Bl == n->tok && MDOC_BODY == n->type &&
                        LIST_column == n->data.list) {
         */
 
        if (MDOC_Bl == n->tok && MDOC_BODY == n->type &&
                        LIST_column == n->data.list) {
+               /* `Bl' is open without any children. */
                m->flags |= MDOC_FREECOL;
                return(mdoc_macro(m, MDOC_It, line, offs, &offs, buf));
        }
                m->flags |= MDOC_FREECOL;
                return(mdoc_macro(m, MDOC_It, line, offs, &offs, buf));
        }
@@ -577,6 +578,7 @@ mdoc_ptext(struct mdoc *m, int line, char *buf, int offs)
                        NULL != n->parent &&
                        MDOC_Bl == n->parent->tok &&
                        LIST_column == n->parent->data.list) {
                        NULL != n->parent &&
                        MDOC_Bl == n->parent->tok &&
                        LIST_column == n->parent->data.list) {
+               /* `Bl' has block-level `It' children. */
                m->flags |= MDOC_FREECOL;
                return(mdoc_macro(m, MDOC_It, line, offs, &offs, buf));
        }
                m->flags |= MDOC_FREECOL;
                return(mdoc_macro(m, MDOC_It, line, offs, &offs, buf));
        }
@@ -593,6 +595,7 @@ mdoc_ptext(struct mdoc *m, int line, char *buf, int offs)
                case '-':
                        if (mandoc_hyph(buf + offs, c))
                                *c = ASCII_HYPH;
                case '-':
                        if (mandoc_hyph(buf + offs, c))
                                *c = ASCII_HYPH;
+                       ws = NULL;
                        break;
                case ' ':
                        if (NULL == ws)
                        break;
                case ' ':
                        if (NULL == ws)
@@ -677,6 +680,7 @@ macrowarn(struct mdoc *m, int ln, const char *buf, int offs)
                        buf, strlen(buf) > 3 ? "..." : "");
 
        /* FIXME: logic should be in driver. */
                        buf, strlen(buf) > 3 ? "..." : "");
 
        /* FIXME: logic should be in driver. */
+       /* FIXME: broken, will error out and not omit a message. */
        return(MDOC_IGN_MACRO & m->pflags ? rc : 0);
 }
 
        return(MDOC_IGN_MACRO & m->pflags ? rc : 0);
 }
 
@@ -688,9 +692,10 @@ macrowarn(struct mdoc *m, int ln, const char *buf, int offs)
 int
 mdoc_pmacro(struct mdoc *m, int ln, char *buf, int offs)
 {
 int
 mdoc_pmacro(struct mdoc *m, int ln, char *buf, int offs)
 {
-       enum mdoct      tok;
-       int             i, j, sv;
-       char            mac[5];
+       enum mdoct        tok;
+       int               i, j, sv;
+       char              mac[5];
+       struct mdoc_node *n;
 
        /* Empty lines are ignored. */
 
 
        /* Empty lines are ignored. */
 
@@ -758,10 +763,51 @@ mdoc_pmacro(struct mdoc *m, int ln, char *buf, int offs)
                if ( ! mdoc_pmsg(m, ln, i - 1, MANDOCERR_EOLNSPACE))
                        goto err;
 
                if ( ! mdoc_pmsg(m, ln, i - 1, MANDOCERR_EOLNSPACE))
                        goto err;
 
-       /* 
-        * Begin recursive parse sequence.  Since we're at the start of
-        * the line, we don't need to do callable/parseable checks.
+       /*
+        * If an initial macro or a list invocation, divert directly
+        * into macro processing.
+        */
+
+       if (NULL == m->last || MDOC_It == tok || MDOC_El == tok) {
+               if ( ! mdoc_macro(m, tok, ln, sv, &i, buf)) 
+                       goto err;
+               return(1);
+       }
+
+       n = m->last;
+       assert(m->last);
+
+       /*
+        * If the first macro of a `Bl -column', open an `It' block
+        * context around the parsed macro.
         */
         */
+
+       if (MDOC_Bl == n->tok && MDOC_BODY == n->type &&
+                       LIST_column == n->data.list) {
+               m->flags |= MDOC_FREECOL;
+               if ( ! mdoc_macro(m, MDOC_It, ln, sv, &sv, buf)) 
+                       goto err;
+               return(1);
+       }
+
+       /*
+        * If we're following a block-level `It' within a `Bl -column'
+        * context (perhaps opened in the above block or in ptext()),
+        * then open an `It' block context around the parsed macro.
+        */
+
+       if (MDOC_It == n->tok && MDOC_BLOCK == n->type &&
+                       NULL != n->parent &&
+                       MDOC_Bl == n->parent->tok &&
+                       LIST_column == n->parent->data.list) {
+               m->flags |= MDOC_FREECOL;
+               if ( ! mdoc_macro(m, MDOC_It, ln, sv, &sv, buf)) 
+                       goto err;
+               return(1);
+       }
+
+       /* Normal processing of a macro. */
+
        if ( ! mdoc_macro(m, tok, ln, sv, &i, buf)) 
                goto err;
 
        if ( ! mdoc_macro(m, tok, ln, sv, &i, buf)) 
                goto err;