]> git.cameronkatri.com Git - mandoc.git/blobdiff - macro.c
Strings abstracted into dynamically-created C files.
[mandoc.git] / macro.c
diff --git a/macro.c b/macro.c
index 673eec303a4e0136804b757b5ce5e5c15196a7c1..939ac3bdc3bc20dafb9a1b301e3645d10ce7bcd0 100644 (file)
--- a/macro.c
+++ b/macro.c
@@ -1,4 +1,4 @@
-/* $Id: macro.c,v 1.54 2009/02/27 09:39:40 kristaps Exp $ */
+/* $Id: macro.c,v 1.57 2009/03/06 14:13:47 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
  * macro. 
  */
 
+/* 
+ * FIXME: don't use static mdoc_argv values, as they require us to do a
+ * complicated copy-over when actually assigning them to dynamic memory.
+ */
+
 #include "private.h"
 
 static int       macro_obsolete(MACRO_PROT_ARGS);
@@ -179,6 +184,7 @@ const       struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
        { macro_constant, 0 }, /* Hf */
        { macro_obsolete, 0 }, /* Fr */
        { macro_constant, 0 }, /* Ud */
+       { macro_constant, 0 }, /* Lb */
 };
 
 const  struct mdoc_macro * const mdoc_macros = __mdoc_macros;
@@ -517,7 +523,9 @@ rewind_subblock(enum mdoc_type type, struct mdoc *mdoc,
                        break;
                else if (rewind_dobreak(tok, n))
                        continue;
-               return(mdoc_perr(mdoc, line, ppos, "scope breaks prior %s", mdoc_node2a(n)));
+               return(mdoc_perr(mdoc, line, ppos, 
+                       "scope breaks %s", MDOC_ROOT == n->type ?
+                       "<root>" : mdoc_macronames[n->tok]));
        }
 
        assert(n);
@@ -541,8 +549,8 @@ rewind_expblock(struct mdoc *mdoc, int tok, int line, int ppos)
                else if (rewind_dobreak(tok, n))
                        continue;
                return(mdoc_perr(mdoc, line, ppos, 
-                                       "scope breaks prior %s", 
-                                       mdoc_node2a(n)));
+                       "scope breaks %s", MDOC_ROOT == n->type ?
+                       "<root>" : mdoc_macronames[n->tok]));
        }
 
        assert(n);
@@ -566,8 +574,8 @@ rewind_impblock(struct mdoc *mdoc, int tok, int line, int ppos)
                else if (rewind_dobreak(tok, n))
                        continue;
                return(mdoc_perr(mdoc, line, ppos, 
-                                       "scope breaks prior %s", 
-                                       mdoc_node2a(n)));
+                       "scope breaks %s", MDOC_ROOT == n->type ?
+                       "<root>" : mdoc_macronames[n->tok]));
        }
 
        assert(n);
@@ -796,6 +804,8 @@ macro_text(MACRO_PROT_ARGS)
                        return(0);
                }
 
+               /* FIXME: .Fl and .Ar handling of `|'. */
+
                if (ARGS_QWORD != w && mdoc_isdelim(p)) {
                        if (0 == lastpunct && ! rewind_elem(mdoc, tok)) {
                                mdoc_argv_free(argc, argv);
@@ -1176,21 +1186,25 @@ static int
 macro_constant_delimited(MACRO_PROT_ARGS)
 {
        int               lastarg, flushed, j, c, maxargs, argc,
-                         igndelim;
+                         igndelim, ignargs;
        struct mdoc_arg   argv[MDOC_LINEARG_MAX];
        char             *p;
 
        lastarg = ppos;
        flushed = 0;
 
+       
+       /* 
+        * Maximum arguments per macro.  Some of these have none and
+        * exit as soon as they're parsed.
+        */
+
        switch (tok) {
        case (MDOC_No):
                /* FALLTHROUGH */
        case (MDOC_Ns):
                /* FALLTHROUGH */
        case (MDOC_Ux):
-               /* FALLTHROUGH */
-       case (MDOC_St):
                maxargs = 0;
                break;
        default:
@@ -1198,6 +1212,12 @@ macro_constant_delimited(MACRO_PROT_ARGS)
                break;
        }
 
+       /* 
+        * Whether to ignore delimiter characters.  `Pf' accepts its
+        * first token as a parameter no matter what it looks like (if
+        * it's text).
+        */
+
        switch (tok) {
        case (MDOC_Pf):
                igndelim = 1;
@@ -1207,20 +1227,38 @@ macro_constant_delimited(MACRO_PROT_ARGS)
                break;
        }
 
-       for (argc = 0; argc < MDOC_LINEARG_MAX; argc++) {
-               lastarg = *pos;
-               c = mdoc_argv(mdoc, line, tok, &argv[argc], pos, buf);
-               if (ARGV_EOLN == c)
-                       break;
-               if (ARGV_WORD == c) {
-                       *pos = lastarg;
-                       break;
-               } else if (ARGV_ARG == c)
-                       continue;
-               mdoc_argv_free(argc, argv);
-               return(0);
+       /* 
+        * Whether to ignore arguments: `St', for example, handles its
+        * argument-like parameters as regular parameters.
+        */
+
+       switch (tok) {
+       case (MDOC_St):
+               ignargs = 1;
+               break;
+       default:
+               ignargs = 0;
+               break;
        }
 
+       argc = 0;
+
+       if ( ! ignargs)
+               for ( ; argc < MDOC_LINEARG_MAX; argc++) {
+                       lastarg = *pos;
+                       c = mdoc_argv(mdoc, line, tok, 
+                                       &argv[argc], pos, buf);
+                       if (ARGV_EOLN == c)
+                               break;
+                       if (ARGV_WORD == c) {
+                               *pos = lastarg;
+                               break;
+                       } else if (ARGV_ARG == c)
+                               continue;
+                       mdoc_argv_free(argc, argv);
+                       return(0);
+               }
+
        if (MDOC_LINEARG_MAX == argc) {
                mdoc_argv_free(argc - 1, argv);
                return(perr(mdoc, line, ppos, EARGVLIM));