]> git.cameronkatri.com Git - mandoc.git/blobdiff - man.c
Added some new manuals (mdoc.3 mandoc_char.7).
[mandoc.git] / man.c
diff --git a/man.c b/man.c
index d424570f35c2e6e778caea49793690c8b84aa96d..56822f40b64fea5b1baa550e45b24c268603e247 100644 (file)
--- a/man.c
+++ b/man.c
@@ -1,4 +1,4 @@
-/* $Id: man.c,v 1.10 2009/03/26 11:16:21 kristaps Exp $ */
+/* $Id: man.c,v 1.13 2009/03/27 14:56:15 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@openbsd.org>
  *
@@ -31,7 +31,8 @@ const char *const __man_macronames[MAN_MAX] = {
        "TP",           "LP",           "PP",           "P",
        "IP",           "HP",           "SM",           "SB",
        "BI",           "IB",           "BR",           "RB",
-       "R",            "B",            "I",            "IR"
+       "R",            "B",            "I",            "IR",
+       "RI",           "br"
        };
 
 const  char * const *man_macronames = __man_macronames;
@@ -268,6 +269,25 @@ man_ptext(struct man *m, int line, char *buf)
        if ( ! man_word_alloc(m, line, 0, buf))
                return(0);
        m->next = MAN_NEXT_SIBLING;
+
+       /*
+        * If this is one of the zany NLINE macros that consumes the
+        * next line of input as being influenced, then close out the
+        * existing macro "scope" and continue processing.
+        */
+
+       if ( ! (MAN_NLINE & m->flags))
+               return(1);
+
+       m->flags &= ~MAN_NLINE;
+       m->last = m->last->parent;
+
+       assert(MAN_ROOT != m->last->type);
+       if ( ! man_valid_post(m))
+               return(0);
+       if ( ! man_action_post(m))
+               return(0);
+
        return(1);
 }
 
@@ -275,13 +295,17 @@ man_ptext(struct man *m, int line, char *buf)
 int
 man_pmacro(struct man *m, int ln, char *buf)
 {
-       int               i, j, c, ppos;
+       int               i, j, c, ppos, fl;
        char              mac[5];
+       struct man_node  *n;
 
        /* Comments and empties are quickly ignored. */
 
+       n = m->last;
+       fl = MAN_NLINE & m->flags;
+
        if (0 == buf[1])
-               return(1);
+               goto out;
 
        i = 1;
 
@@ -290,14 +314,14 @@ man_pmacro(struct man *m, int ln, char *buf)
                while (buf[i] && ' ' == buf[i])
                        i++;
                if (0 == buf[i])
-                       return(1);
+                       goto out;
        }
 
        ppos = i;
 
        if (buf[i] && '\\' == buf[i])
                if (buf[i + 1] && '\"' == buf[i + 1])
-                       return(1);
+                       goto out;
 
        /* Copy the first word into a nil-terminated buffer. */
 
@@ -344,6 +368,28 @@ man_pmacro(struct man *m, int ln, char *buf)
        if ( ! man_macro(m, c, ln, ppos, &i, buf))
                goto err;
 
+out:
+       if (fl) {
+               /*
+                * A NLINE macro has been immediately followed with
+                * another.  Close out the preceeding macro's scope, and
+                * continue.
+                */
+               assert(MAN_ROOT != m->last->type);
+               assert(m->last->parent);
+               assert(MAN_ROOT != m->last->parent->type);
+
+               if (n != m->last)
+                       m->last = m->last->parent;
+
+               if ( ! man_valid_post(m))
+                       return(0);
+               if ( ! man_action_post(m))
+                       return(0);
+               m->next = MAN_NEXT_SIBLING;
+               m->flags &= ~MAN_NLINE;
+       } 
+
        return(1);
 
 err:   /* Error out. */