]> git.cameronkatri.com Git - mandoc.git/blobdiff - mdoc_macro.c
Fixed STRUCTURE repeat (schwarze@openbsd.org).
[mandoc.git] / mdoc_macro.c
index 151c023dc0e1bb7b9a236e051bf0add3f766d5d5..5e46e42787b2f8345e1688f468b76c245e4e93fb 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_macro.c,v 1.10 2009/06/11 19:56:14 kristaps Exp $ */
+/*     $Id: mdoc_macro.c,v 1.14 2009/06/17 19:02:26 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -22,8 +22,6 @@
 
 #include "libmdoc.h"
 
-/* FIXME: .Fl, .Ar, .Cd handling of `|'. */
-
 enum   mwarn {
        WIGNE,
        WIMPBRK,
@@ -74,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 */
@@ -101,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 */ 
@@ -145,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 */
@@ -181,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 */
@@ -813,6 +810,8 @@ in_line(MACRO_PROT_ARGS)
                /* FALLTHROUGH */
        case (MDOC_Fl):
                /* FALLTHROUGH */
+       case (MDOC_Lk):
+               /* FALLTHROUGH */
        case (MDOC_Ar):
                nc = 1;
                break;
@@ -868,7 +867,8 @@ in_line(MACRO_PROT_ARGS)
                                if ( ! mdoc_elem_alloc(mdoc, line, ppos, 
                                                        tok, arg))
                                        return(0);
-                               mdoc->next = MDOC_NEXT_SIBLING;
+                               if ( ! rew_last(mdoc, mdoc->last))
+                                       return(0);
                        } else if ( ! nc && 0 == cnt) {
                                mdoc_argv_free(arg);
                                if ( ! pwarn(mdoc, line, ppos, WIGNE))
@@ -923,7 +923,8 @@ in_line(MACRO_PROT_ARGS)
                c = mdoc_elem_alloc(mdoc, line, ppos, tok, arg);
                if (0 == c)
                        return(0);
-               mdoc->next = MDOC_NEXT_SIBLING;
+               if ( ! rew_last(mdoc, mdoc->last))
+                       return(0);
        } else if ( ! nc && 0 == cnt) {
                mdoc_argv_free(arg);
                if ( ! pwarn(mdoc, line, ppos, WIGNE))