]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_macro.c
Fixed STRUCTURE repeat (schwarze@openbsd.org).
[mandoc.git] / mdoc_macro.c
index 7ca21e40be5db9925ccbc689722512bba2c5bc9e..5e46e42787b2f8345e1688f468b76c245e4e93fb 100644 (file)
@@ -1,20 +1,18 @@
-/* $Id: mdoc_macro.c,v 1.4 2009/03/27 14:56:15 kristaps Exp $ */
+/*     $Id: mdoc_macro.c,v 1.14 2009/06/17 19:02:26 kristaps Exp $ */
 /*
- * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@openbsd.org>
+ * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
  * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the
- * above copyright notice and this permission notice appear in all
- * copies.
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
  *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
- * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
- * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 #include <assert.h>
 #include <ctype.h>
 
 #include "libmdoc.h"
 
-/*
- * This has scanning/parsing routines, each of which extract a macro and
- * its arguments and parameters, then know how to progress to the next
- * macro. 
- */
-
-/* FIXME: .Fl, .Ar, .Cd handling of `|'. */
-
 enum   mwarn {
        WIGNE,
        WIMPBRK,
@@ -82,7 +72,7 @@ static        int       swarn(struct mdoc *, enum mdoc_type, int, int,
 /* Central table of library: who gets parsed how. */
 
 const  struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
-       { NULL, 0 }, /* \" */
+       { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Ap */
        { in_line_eoln, MDOC_PROLOGUE }, /* Dd */
        { in_line_eoln, MDOC_PROLOGUE }, /* Dt */
        { in_line_eoln, MDOC_PROLOGUE }, /* Os */
@@ -97,7 +87,7 @@ const struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
        { blk_exp_close, MDOC_EXPLICIT }, /* El */
        { blk_full, MDOC_PARSED }, /* It */
        { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ad */ 
-       { in_line, MDOC_PARSED }, /* An */
+       { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* An */
        { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ar */
        { in_line_eoln, MDOC_CALLABLE }, /* Cd */
        { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Cm */
@@ -109,9 +99,9 @@ const        struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
        { in_line_eoln, 0 }, /* Fd */ 
        { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Fl */
        { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Fn */ 
-       { in_line, MDOC_PARSED }, /* Ft */ 
+       { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ft */ 
        { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ic */ 
-       { in_line_eoln, 0 }, /* In */ 
+       { in_line_eoln, 0 }, /* In */  /* FIXME: historic usage! */
        { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Li */
        { in_line_eoln, 0 }, /* Nd */ 
        { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Nm */ 
@@ -153,7 +143,7 @@ const       struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
        { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Em */ 
        { blk_part_exp, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Eo */
        { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Fx */
-       { in_line, MDOC_PARSED }, /* Ms */
+       { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Ms */
        { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* No */
        { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Ns */
        { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Nx */
@@ -189,10 +179,9 @@ const      struct mdoc_macro __mdoc_macros[MDOC_MAX] = {
        { obsolete, 0 }, /* Fr */
        { in_line_eoln, 0 }, /* Ud */
        { in_line_eoln, 0 }, /* Lb */
-       { in_line_argn, MDOC_CALLABLE | MDOC_PARSED }, /* Ap */
        { in_line, 0 }, /* Lp */ 
-       { in_line, MDOC_PARSED }, /* Lk */ 
-       { in_line, MDOC_PARSED }, /* Mt */ 
+       { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Lk */ 
+       { in_line, MDOC_CALLABLE | MDOC_PARSED }, /* Mt */ 
        { blk_part_imp, MDOC_CALLABLE | MDOC_PARSED }, /* Brq */
        { blk_part_exp, MDOC_CALLABLE | MDOC_PARSED | MDOC_EXPLICIT }, /* Bro */
        { blk_exp_close, MDOC_EXPLICIT | MDOC_CALLABLE | MDOC_PARSED }, /* Brc */
@@ -334,7 +323,7 @@ lookup(struct mdoc *mdoc, int line, int pos, int from, const char *p)
 {
        int              res;
 
-       res = mdoc_tokhash_find(mdoc->htab, p);
+       res = mdoc_hash_find(mdoc->htab, p);
        if (MDOC_PARSED & mdoc_macros[from].flags)
                return(res);
        if (MDOC_MAX == res)
@@ -821,6 +810,8 @@ in_line(MACRO_PROT_ARGS)
                /* FALLTHROUGH */
        case (MDOC_Fl):
                /* FALLTHROUGH */
+       case (MDOC_Lk):
+               /* FALLTHROUGH */
        case (MDOC_Ar):
                nc = 1;
                break;
@@ -876,10 +867,13 @@ in_line(MACRO_PROT_ARGS)
                                if ( ! mdoc_elem_alloc(mdoc, line, ppos, 
                                                        tok, arg))
                                        return(0);
-                               mdoc->next = MDOC_NEXT_SIBLING;
-                       } else if ( ! nc && 0 == cnt)
+                               if ( ! rew_last(mdoc, mdoc->last))
+                                       return(0);
+                       } else if ( ! nc && 0 == cnt) {
+                               mdoc_argv_free(arg);
                                if ( ! pwarn(mdoc, line, ppos, WIGNE))
                                        return(0);
+                       }
                        c = mdoc_macro(mdoc, c, line, la, pos, buf);
                        if (0 == c)
                                return(0);
@@ -929,10 +923,13 @@ in_line(MACRO_PROT_ARGS)
                c = mdoc_elem_alloc(mdoc, line, ppos, tok, arg);
                if (0 == c)
                        return(0);
-               mdoc->next = MDOC_NEXT_SIBLING;
-       } else if ( ! nc && 0 == cnt) 
+               if ( ! rew_last(mdoc, mdoc->last))
+                       return(0);
+       } else if ( ! nc && 0 == cnt) {
+               mdoc_argv_free(arg);
                if ( ! pwarn(mdoc, line, ppos, WIGNE))
                        return(0);
+       }
 
        if (ppos > 1)
                return(1);
@@ -1479,7 +1476,7 @@ phrase(struct mdoc *mdoc, int line, int ppos, char *buf)
                 */
 
                c = quoted ? MDOC_MAX :
-                       mdoc_tokhash_find(mdoc->htab, &buf[la]);
+                       mdoc_hash_find(mdoc->htab, &buf[la]);
 
                if (MDOC_MAX != c) {
                        if ( ! mdoc_macro(mdoc, c, line, la, &i, buf))