]> git.cameronkatri.com Git - mandoc.git/commitdiff
Add -man support for tables. Like -mdoc, this consists of an
authorKristaps Dzonsons <kristaps@bsd.lv>
Sat, 1 Jan 2011 12:59:17 +0000 (12:59 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Sat, 1 Jan 2011 12:59:17 +0000 (12:59 +0000)
external-facing function man_addspan() (this required shuffling around
the descope routine) and hooks elsewhere.

Also fixed mdoc.c's post-validation of tables.

man.3
man.c
man.h
man_html.c
man_term.c
man_validate.c
mdoc.c

diff --git a/man.3 b/man.3
index 826c6bdad5b9485b22d9673ec4a645d8cf1b6227..e72b5297987d2a7ff51ad0ecdda390d5dc5634d0 100644 (file)
--- a/man.3
+++ b/man.3
@@ -1,4 +1,4 @@
-.\"    $Id: man.3,v 1.27 2010/12/17 11:41:45 kristaps Exp $
+.\"    $Id: man.3,v 1.28 2011/01/01 12:59:17 kristaps Exp $
 .\"
 .\" Copyright (c) 2009-2010 Kristaps Dzonsons <kristaps@bsd.lv>
 .\"
 .\"
 .\" Copyright (c) 2009-2010 Kristaps Dzonsons <kristaps@bsd.lv>
 .\"
@@ -14,7 +14,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: December 17 2010 $
+.Dd $Mdocdate: January 1 2011 $
 .Dt MAN 3
 .Os
 .Sh NAME
 .Dt MAN 3
 .Os
 .Sh NAME
 .In mandoc.h
 .In man.h
 .Vt extern const char * const * man_macronames;
 .In mandoc.h
 .In man.h
 .Vt extern const char * const * man_macronames;
+.Ft int
+.Fo man_addspan
+.Fa "struct man *man"
+.Fa "const struct tbl_span *span"
+.Fc
 .Ft "struct man *"
 .Fo man_alloc
 .Fa "struct regset *regs"
 .Ft "struct man *"
 .Fo man_alloc
 .Fa "struct regset *regs"
@@ -101,6 +106,9 @@ for details.
 .El
 .Ss Functions
 .Bl -ohang
 .El
 .Ss Functions
 .Bl -ohang
+.It Fn man_addspan
+Add a table span to the parsing stream.
+Returns 0 on failure, 1 on success.
 .It Fn man_alloc
 Allocates a parsing structure.
 The
 .It Fn man_alloc
 Allocates a parsing structure.
 The
diff --git a/man.c b/man.c
index 2792921d10a617106ed6f8ce20c6b2a487d4a7e2..0bdbf59c707542bfbbd1100a86f01db9094b0d49 100644 (file)
--- a/man.c
+++ b/man.c
@@ -1,4 +1,4 @@
-/*     $Id: man.c,v 1.93 2011/01/01 10:51:30 kristaps Exp $ */
+/*     $Id: man.c,v 1.94 2011/01/01 12:59:17 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -48,6 +48,8 @@ static        struct man_node *man_node_alloc(int, int,
                                enum man_type, enum mant);
 static int              man_node_append(struct man *, 
                                struct man_node *);
                                enum man_type, enum mant);
 static int              man_node_append(struct man *, 
                                struct man_node *);
+static int              man_span_alloc(struct man *, 
+                               const struct tbl_span *);
 static void             man_node_free(struct man_node *);
 static void             man_node_unlink(struct man *, 
                                struct man_node *);
 static void             man_node_free(struct man_node *);
 static void             man_node_unlink(struct man *, 
                                struct man_node *);
@@ -55,6 +57,7 @@ static        int              man_ptext(struct man *, int, char *, int);
 static int              man_pmacro(struct man *, int, char *, int);
 static void             man_free1(struct man *);
 static void             man_alloc1(struct man *);
 static int              man_pmacro(struct man *, int, char *, int);
 static void             man_free1(struct man *);
 static void             man_alloc1(struct man *);
+static int              man_descope(struct man *, int, int);
 
 
 const struct man_node *
 
 
 const struct man_node *
@@ -212,6 +215,8 @@ man_node_append(struct man *man, struct man_node *p)
        man->last = p;
 
        switch (p->type) {
        man->last = p;
 
        switch (p->type) {
+       case (MAN_TBL):
+               /* FALLTHROUGH */
        case (MAN_TEXT):
                if ( ! man_valid_post(man))
                        return(0);
        case (MAN_TEXT):
                if ( ! man_valid_post(man))
                        return(0);
@@ -289,6 +294,20 @@ man_block_alloc(struct man *m, int line, int pos, enum mant tok)
        return(1);
 }
 
        return(1);
 }
 
+static int
+man_span_alloc(struct man *m, const struct tbl_span *span)
+{
+       struct man_node *n;
+
+       /* FIXME: grab from span */
+       n = man_node_alloc(0, 0, MAN_TBL, MAN_MAX);
+
+       if ( ! man_node_append(m, n))
+               return(0);
+
+       m->next = MAN_NEXT_SIBLING;
+       return(1);
+}
 
 int
 man_word_alloc(struct man *m, int line, int pos, const char *word)
 
 int
 man_word_alloc(struct man *m, int line, int pos, const char *word)
@@ -339,6 +358,40 @@ man_node_delete(struct man *m, struct man_node *p)
 }
 
 
 }
 
 
+int
+man_addspan(struct man *m, const struct tbl_span *sp)
+{
+
+       if ( ! man_span_alloc(m, sp))
+               return(0);
+       return(man_descope(m, 0, 0));
+}
+
+static int
+man_descope(struct man *m, int line, int offs)
+{
+       /*
+        * Co-ordinate what happens with having a next-line scope open:
+        * first close out the element scope (if applicable), then close
+        * out the block scope (also if applicable).
+        */
+
+       if (MAN_ELINE & m->flags) {
+               m->flags &= ~MAN_ELINE;
+               if ( ! man_unscope(m, m->last->parent, MANDOCERR_MAX))
+                       return(0);
+       }
+
+       if ( ! (MAN_BLINE & m->flags))
+               return(1);
+       m->flags &= ~MAN_BLINE;
+
+       if ( ! man_unscope(m, m->last->parent, MANDOCERR_MAX))
+               return(0);
+       return(man_body_alloc(m, line, offs, m->last->tok));
+}
+
+
 static int
 man_ptext(struct man *m, int line, char *buf, int offs)
 {
 static int
 man_ptext(struct man *m, int line, char *buf, int offs)
 {
@@ -358,7 +411,7 @@ man_ptext(struct man *m, int line, char *buf, int offs)
        if (MAN_LITERAL & m->flags) {
                if ( ! man_word_alloc(m, line, offs, buf + offs))
                        return(0);
        if (MAN_LITERAL & m->flags) {
                if ( ! man_word_alloc(m, line, offs, buf + offs))
                        return(0);
-               goto descope;
+               return(man_descope(m, line, offs));
        }
 
        /* Pump blank lines directly into the backend. */
        }
 
        /* Pump blank lines directly into the backend. */
@@ -370,7 +423,7 @@ man_ptext(struct man *m, int line, char *buf, int offs)
                /* Allocate a blank entry. */
                if ( ! man_word_alloc(m, line, offs, ""))
                        return(0);
                /* Allocate a blank entry. */
                if ( ! man_word_alloc(m, line, offs, ""))
                        return(0);
-               goto descope;
+               return(man_descope(m, line, offs));
        }
 
        /* 
        }
 
        /* 
@@ -407,26 +460,7 @@ man_ptext(struct man *m, int line, char *buf, int offs)
        if (mandoc_eos(buf, (size_t)i, 0))
                m->last->flags |= MAN_EOS;
 
        if (mandoc_eos(buf, (size_t)i, 0))
                m->last->flags |= MAN_EOS;
 
-descope:
-       /*
-        * Co-ordinate what happens with having a next-line scope open:
-        * first close out the element scope (if applicable), then close
-        * out the block scope (also if applicable).
-        */
-
-       if (MAN_ELINE & m->flags) {
-               m->flags &= ~MAN_ELINE;
-               if ( ! man_unscope(m, m->last->parent, MANDOCERR_MAX))
-                       return(0);
-       }
-
-       if ( ! (MAN_BLINE & m->flags))
-               return(1);
-       m->flags &= ~MAN_BLINE;
-
-       if ( ! man_unscope(m, m->last->parent, MANDOCERR_MAX))
-               return(0);
-       return(man_body_alloc(m, line, offs, m->last->tok));
+       return(man_descope(m, line, offs));
 }
 
 
 }
 
 
diff --git a/man.h b/man.h
index a45eac2b87810df11aae55aba4de3cd4d38fc35d..581f55ffc417b5237789167c5c1586d07164e40f 100644 (file)
--- a/man.h
+++ b/man.h
@@ -1,4 +1,4 @@
-/*     $Id: man.h,v 1.49 2010/12/26 14:44:13 kristaps Exp $ */
+/*     $Id: man.h,v 1.50 2011/01/01 12:59:17 kristaps Exp $ */
 /*
  * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -66,7 +66,8 @@ enum  man_type {
        MAN_ROOT,
        MAN_BLOCK,
        MAN_HEAD,
        MAN_ROOT,
        MAN_BLOCK,
        MAN_HEAD,
-       MAN_BODY
+       MAN_BODY,
+       MAN_TBL
 };
 
 /* 
 };
 
 /* 
@@ -100,6 +101,7 @@ struct      man_node {
        char            *string; /* TEXT node argument */
        struct man_node *head; /* BLOCK node HEAD ptr */
        struct man_node *body; /* BLOCK node BODY ptr */
        char            *string; /* TEXT node argument */
        struct man_node *head; /* BLOCK node HEAD ptr */
        struct man_node *body; /* BLOCK node BODY ptr */
+       const struct tbl_span *span; /* TBL */
 };
 
 /*
 };
 
 /*
@@ -117,6 +119,8 @@ struct      man      *man_alloc(struct regset *, void *, mandocmsg);
 void             man_reset(struct man *);
 int              man_parseln(struct man *, int, char *, int);
 int              man_endparse(struct man *);
 void             man_reset(struct man *);
 int              man_parseln(struct man *, int, char *, int);
 int              man_endparse(struct man *);
+int              man_addspan(struct man *,
+                       const struct tbl_span *);
 
 const struct man_node *man_node(const struct man *);
 const struct man_meta *man_meta(const struct man *);
 
 const struct man_node *man_node(const struct man *);
 const struct man_meta *man_meta(const struct man *);
index 4bcdf3dc79aa7bc4010ff39e8acd8c6b8e0b4c35..31015adbe4077e3634accf6b999b6ebf3efd00a7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_html.c,v 1.57 2010/12/24 00:46:49 kristaps Exp $ */
+/*     $Id: man_html.c,v 1.58 2011/01/01 12:59:17 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -198,10 +198,10 @@ print_man_node(MAN_ARGS)
                break;
        case (MAN_TEXT):
                print_text(h, n->string);
                break;
        case (MAN_TEXT):
                print_text(h, n->string);
-
                if (MANH_LITERAL & mh->fl)
                        print_otag(h, TAG_BR, 0, NULL);
                if (MANH_LITERAL & mh->fl)
                        print_otag(h, TAG_BR, 0, NULL);
-
+               return;
+       case (MAN_TBL):
                return;
        default:
                /* 
                return;
        default:
                /* 
@@ -226,17 +226,10 @@ print_man_node(MAN_ARGS)
 
        bufinit(h);
 
 
        bufinit(h);
 
-       switch (n->type) {
-       case (MAN_ROOT):
+       if (MAN_ROOT == n->type) 
                man_root_post(m, n, mh, h);
                man_root_post(m, n, mh, h);
-               break;
-       case (MAN_TEXT):
-               break;
-       default:
-               if (mans[n->tok].post)
-                       (*mans[n->tok].post)(m, n, mh, h);
-               break;
-       }
+       else if (mans[n->tok].post)
+               (*mans[n->tok].post)(m, n, mh, h);
 }
 
 
 }
 
 
index 77e88aee223731ac676425df4b50122a2932c98f..4517e98d6babbacdebfd67661aa97022055472be 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_term.c,v 1.90 2010/12/08 10:58:22 kristaps Exp $ */
+/*     $Id: man_term.c,v 1.91 2011/01/01 12:59:17 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -865,6 +865,8 @@ print_man_node(DECL_ARGS)
                        p->maxrmargin = rmax;
                }
                break;
                        p->maxrmargin = rmax;
                }
                break;
+       case (MAN_TBL):
+               break;
        default:
                if ( ! (MAN_NOTEXT & termacts[n->tok].flags))
                        term_fontrepl(p, TERMFONT_NONE);
        default:
                if ( ! (MAN_NOTEXT & termacts[n->tok].flags))
                        term_fontrepl(p, TERMFONT_NONE);
@@ -876,11 +878,17 @@ print_man_node(DECL_ARGS)
        if (c && n->child)
                print_man_nodelist(p, mt, n->child, m);
 
        if (c && n->child)
                print_man_nodelist(p, mt, n->child, m);
 
-       if (MAN_TEXT != n->type) {
+       switch (n->type) {
+       case (MAN_TEXT):
+               /* FALLTHROUGH */
+       case (MAN_TBL):
+               break;
+       default:
                if (termacts[n->tok].post)
                        (*termacts[n->tok].post)(p, mt, n, m);
                if ( ! (MAN_NOTEXT & termacts[n->tok].flags))
                        term_fontrepl(p, TERMFONT_NONE);
                if (termacts[n->tok].post)
                        (*termacts[n->tok].post)(p, mt, n, m);
                if ( ! (MAN_NOTEXT & termacts[n->tok].flags))
                        term_fontrepl(p, TERMFONT_NONE);
+               break;
        }
 
        if (MAN_EOS & n->flags)
        }
 
        if (MAN_EOS & n->flags)
index d3665d6b28ef1acd4c5b783f6a4016cea43a870c..bcfcbacfa40b7ebf4d4f21852e2628bce328b76f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: man_validate.c,v 1.56 2010/12/08 10:58:22 kristaps Exp $ */
+/*     $Id: man_validate.c,v 1.57 2011/01/01 12:59:17 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  *
@@ -117,10 +117,16 @@ man_valid_pre(struct man *m, struct man_node *n)
 {
        v_check         *cp;
 
 {
        v_check         *cp;
 
-       if (MAN_TEXT == n->type)
-               return(1);
-       if (MAN_ROOT == n->type)
+       switch (n->type) {
+       case (MAN_TEXT):
+               /* FALLTHROUGH */
+       case (MAN_ROOT):
+               /* FALLTHROUGH */
+       case (MAN_TBL):
                return(1);
                return(1);
+       default:
+               break;
+       }
 
        if (NULL == (cp = man_valids[n->tok].pres))
                return(1);
 
        if (NULL == (cp = man_valids[n->tok].pres))
                return(1);
@@ -145,6 +151,8 @@ man_valid_post(struct man *m)
                return(check_text(m, m->last));
        case (MAN_ROOT):
                return(check_root(m, m->last));
                return(check_text(m, m->last));
        case (MAN_ROOT):
                return(check_root(m, m->last));
+       case (MAN_TBL):
+               return(1);
        default:
                break;
        }
        default:
                break;
        }
diff --git a/mdoc.c b/mdoc.c
index d408449e75609a7a775f2eb63febb77524a40f58..1ec309f852d8efb32fd89d53746818802b6cf90b 100644 (file)
--- a/mdoc.c
+++ b/mdoc.c
@@ -1,4 +1,4 @@
-/*     $Id: mdoc.c,v 1.175 2011/01/01 12:18:37 kristaps Exp $ */
+/*     $Id: mdoc.c,v 1.176 2011/01/01 12:59:17 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
 /*
  * Copyright (c) 2008, 2009, 2010 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010 Ingo Schwarze <schwarze@openbsd.org>
@@ -391,6 +391,8 @@ node_append(struct mdoc *mdoc, struct mdoc_node *p)
        mdoc->last = p;
 
        switch (p->type) {
        mdoc->last = p;
 
        switch (p->type) {
+       case (MDOC_TBL):
+               /* FALLTHROUGH */
        case (MDOC_TEXT):
                if ( ! mdoc_valid_post(mdoc))
                        return(0);
        case (MDOC_TEXT):
                if ( ! mdoc_valid_post(mdoc))
                        return(0);