]> git.cameronkatri.com Git - mandoc.git/commitdiff
mdocterm now using new API.
authorKristaps Dzonsons <kristaps@bsd.lv>
Sun, 8 Mar 2009 13:52:29 +0000 (13:52 +0000)
committerKristaps Dzonsons <kristaps@bsd.lv>
Sun, 8 Mar 2009 13:52:29 +0000 (13:52 +0000)
mdoc.h
mdocterm.c
term.c

diff --git a/mdoc.h b/mdoc.h
index 39b88d4753f1456d31c9ae89c9db9918c2b8a42a..740da2a589d3092968d8f2596f357cb89ddf82d5 100644 (file)
--- a/mdoc.h
+++ b/mdoc.h
@@ -1,4 +1,4 @@
-/* $Id: mdoc.h,v 1.38 2009/03/08 11:41:22 kristaps Exp $ */
+/* $Id: mdoc.h,v 1.39 2009/03/08 13:52:29 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -29,6 +29,8 @@
 
 /* What follows is a list of ALL possible macros. */
 
+/* TODO: Brq et al. */
+
 #define        MDOC___          0
 #define        MDOC_Dd          1
 #define        MDOC_Dt          2
index 9758549528195d6ed8bcec6c0fd70eafc0ec1d4a..da84f179890f302879b3ea0749985b6da504eef7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mdocterm.c,v 1.34 2009/03/06 14:13:47 kristaps Exp $ */
+/* $Id: mdocterm.c,v 1.35 2009/03/08 13:52:29 kristaps Exp $ */
 /*
  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -490,7 +490,7 @@ body(struct termp *p, struct termpair *ppair,
                        if ( ! (*termacts[node->tok].pre)(p, &pair, meta, node))
                                dochild = 0;
        } else /* MDOC_TEXT == node->type */
-               word(p, node->data.text.string);
+               word(p, node->string);
 
        /* Children. */
 
diff --git a/term.c b/term.c
index a4c75df634ca48554f1f48b66a48964b68cc5e6b..cda44539f9d6d78646b38ba992f77a4c47cb9496 100644 (file)
--- a/term.c
+++ b/term.c
@@ -1,4 +1,4 @@
-/* $Id: term.c,v 1.43 2009/03/06 14:13:47 kristaps Exp $ */
+/* $Id: term.c,v 1.44 2009/03/08 13:52:29 kristaps Exp $ */
 /*
  * Copyright (c) 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -83,12 +83,10 @@ const       int ttypes[TTYPE_NMAX] = {
        TERMP_BOLD              /* TTYPE_DIAG */
 };
 
-static int               arg_hasattr(int, size_t, 
-                               const struct mdoc_arg *);
-static int               arg_getattr(int, size_t, 
-                               const struct mdoc_arg *);
-static size_t            arg_offset(const struct mdoc_arg *);
-static size_t            arg_width(const struct mdoc_arg *);
+static int               arg_hasattr(int, const struct mdoc_node *);
+static int               arg_getattr(int, const struct mdoc_node *);
+static size_t            arg_offset(const struct mdoc_argv *);
+static size_t            arg_width(const struct mdoc_argv *);
 static int               arg_listtype(const struct mdoc_node *);
 
 /*
@@ -282,7 +280,7 @@ const struct termact *termacts = __termacts;
 
 
 static size_t
-arg_width(const struct mdoc_arg *arg)
+arg_width(const struct mdoc_argv *arg)
 {
        size_t           v;
        int              i, len;
@@ -314,14 +312,14 @@ arg_width(const struct mdoc_arg *arg)
 static int
 arg_listtype(const struct mdoc_node *n)
 {
-       const struct mdoc_block *bl;
        int              i, len;
 
-       bl = &n->data.block;
-       len = (int)bl->argc;
+       assert(MDOC_BLOCK == n->type);
+
+       len = n->args ? n->args->argc : 0;
 
        for (i = 0; i < len; i++) 
-               switch (bl->argv[i].arg) {
+               switch (n->args->argv[i].arg) {
                case (MDOC_Bullet):
                        /* FALLTHROUGH */
                case (MDOC_Dash):
@@ -339,7 +337,7 @@ arg_listtype(const struct mdoc_node *n)
                case (MDOC_Item):
                        /* FALLTHROUGH */
                case (MDOC_Ohang):
-                       return(bl->argv[i].arg);
+                       return(n->args->argv[i].arg);
                default:
                        break;
                }
@@ -350,7 +348,7 @@ arg_listtype(const struct mdoc_node *n)
 
 
 static size_t
-arg_offset(const struct mdoc_arg *arg)
+arg_offset(const struct mdoc_argv *arg)
 {
 
        /* TODO */
@@ -364,20 +362,22 @@ arg_offset(const struct mdoc_arg *arg)
 
 
 static int
-arg_hasattr(int arg, size_t argc, const struct mdoc_arg *argv)
+arg_hasattr(int arg, const struct mdoc_node *n)
 {
 
-       return(-1 != arg_getattr(arg, argc, argv));
+       return(-1 != arg_getattr(arg, n));
 }
 
 
 static int
-arg_getattr(int arg, size_t argc, const struct mdoc_arg *argv)
+arg_getattr(int arg, const struct mdoc_node *n)
 {
        int              i;
 
-       for (i = 0; i < (int)argc; i++) 
-               if (argv[i].arg == arg)
+       if (NULL == n->args)
+               return(-1);
+       for (i = 0; i < (int)n->args->argc; i++) 
+               if (n->args->argv[i].arg == arg)
                        return(i);
        return(-1);
 }
@@ -414,15 +414,10 @@ termp_dq_post(DECL_ARGS)
 static int
 termp_it_pre_block(DECL_ARGS)
 {
-       const struct mdoc_node  *n;
-       const struct mdoc_block *bl;
-
-       n = node->parent->parent;
-       bl = &n->data.block;
 
        newln(p);
-       if ( ! arg_hasattr(MDOC_Compact, bl->argc, bl->argv))
-               if (node->prev || n->prev)
+       if ( ! arg_hasattr(MDOC_Compact, node->parent->parent))
+               if (node->prev || node->parent->parent->prev)
                        vspace(p);
 
        return(1);
@@ -433,7 +428,7 @@ termp_it_pre_block(DECL_ARGS)
 static int
 termp_it_pre(DECL_ARGS)
 {
-       const struct mdoc_block *bl;
+       const struct mdoc_node *bl;
        char             buf[7];
        int              i, type;
        size_t           width, offset;
@@ -443,8 +438,8 @@ termp_it_pre(DECL_ARGS)
 
        /* Get ptr to list block, type, etc. */
 
-       bl = &node->parent->parent->parent->data.block;
-       type = arg_listtype(node->parent->parent->parent);
+       bl = node->parent->parent->parent;
+       type = arg_listtype(bl);
 
        /* Save parent attributes. */
 
@@ -454,11 +449,11 @@ termp_it_pre(DECL_ARGS)
 
        /* Get list width and offset. */
 
-       i = arg_getattr(MDOC_Width, bl->argc, bl->argv);
-       width = i >= 0 ? arg_width(&bl->argv[i]) : 0;
+       i = arg_getattr(MDOC_Width, bl);
+       width = i >= 0 ? arg_width(&bl->args->argv[i]) : 0;
 
-       i = arg_getattr(MDOC_Offset, bl->argc, bl->argv);
-       offset = i >= 0 ? arg_offset(&bl->argv[i]) : 0;
+       i = arg_getattr(MDOC_Offset, bl);
+       offset = i >= 0 ? arg_offset(&bl->args->argv[i]) : 0;
 
        /* 
         * List-type can override the width in the case of fixed-head
@@ -725,10 +720,12 @@ termp_st_pre(DECL_ARGS)
 {
        const char      *cp;
 
-       /* XXX - if child isn't text? */
-       if (node->child) 
-               if ((cp = mdoc_a2st(node->child->data.text.string)))
+       if (node->child) {
+               if (MDOC_TEXT != node->child->type)
+                       errx(1, "expected text line arguments");
+               if ((cp = mdoc_a2st(node->child->string)))
                        word(p, cp);
+       }
        return(0);
 }
 
@@ -750,15 +747,16 @@ termp_rv_pre(DECL_ARGS)
 {
        int              i;
 
-       i = arg_getattr(MDOC_Std, node->data.elem.argc, 
-                       node->data.elem.argv);
-       assert(i >= 0);
+       if (-1 == (i = arg_getattr(MDOC_Std, node)))
+               errx(1, "expected -std argument");
+       if (1 != node->args->argv[i].sz)
+               errx(1, "expected -std argument");
 
        newln(p);
        word(p, "The");
 
        p->flags |= ttypes[TTYPE_FUNC_NAME];
-       word(p, *node->data.elem.argv[i].value);
+       word(p, *node->args->argv[i].value);
        p->flags &= ~ttypes[TTYPE_FUNC_NAME];
 
                word(p, "() function returns the value 0 if successful;");
@@ -781,13 +779,14 @@ termp_ex_pre(DECL_ARGS)
 {
        int              i;
 
-       i = arg_getattr(MDOC_Std, node->data.elem.argc, 
-                       node->data.elem.argv);
-       assert(i >= 0);
+       if (-1 == (i = arg_getattr(MDOC_Std, node)))
+               errx(1, "expected -std argument");
+       if (1 != node->args->argv[i].sz)
+               errx(1, "expected -std argument");
 
        word(p, "The");
        p->flags |= ttypes[TTYPE_PROG];
-       word(p, *node->data.elem.argv[i].value);
+       word(p, *node->args->argv[i].value);
        p->flags &= ~ttypes[TTYPE_PROG];
                word(p, "utility exits 0 on success, and >0 if an error occurs.");
 
@@ -833,20 +832,22 @@ termp_xr_pre(DECL_ARGS)
 {
        const struct mdoc_node *n;
 
-       n = node->child;
-       assert(n);
+       if (NULL == (n = node->child))
+               errx(1, "expected text line argument");
+       if (MDOC_TEXT != n->type)
+               errx(1, "expected text line argument");
 
-       assert(MDOC_TEXT == n->type);
-       word(p, n->data.text.string);
+       word(p, n->string);
 
        if (NULL == (n = n->next)) 
                return(0);
+       if (MDOC_TEXT != n->type)
+               errx(1, "expected text line argument");
 
-       assert(MDOC_TEXT == n->type);
        p->flags |= TERMP_NOSPACE;
        word(p, "(");
        p->flags |= TERMP_NOSPACE;
-       word(p, n->data.text.string);
+       word(p, n->string);
        p->flags |= TERMP_NOSPACE;
        word(p, ")");
 
@@ -1066,22 +1067,25 @@ termp_fn_pre(DECL_ARGS)
 {
        const struct mdoc_node *n;
 
-       assert(node->child);
-       assert(MDOC_TEXT == node->child->type);
+       if (NULL == node->child)
+               errx(1, "expected text line arguments");
+       if (MDOC_TEXT != node->child->type)
+               errx(1, "expected text line arguments");
 
        /* FIXME: can be "type funcname" "type varname"... */
 
        p->flags |= ttypes[TTYPE_FUNC_NAME];
-       word(p, node->child->data.text.string);
+       word(p, node->child->string);
        p->flags &= ~ttypes[TTYPE_FUNC_NAME];
 
        word(p, "(");
 
        p->flags |= TERMP_NOSPACE;
        for (n = node->child->next; n; n = n->next) {
-               assert(MDOC_TEXT == n->type);
+               if (MDOC_TEXT != n->type)
+                       errx(1, "expected text line arguments");
                p->flags |= ttypes[TTYPE_FUNC_ARG];
-               word(p, n->data.text.string);
+               word(p, n->string);
                p->flags &= ~ttypes[TTYPE_FUNC_ARG];
                if (n->next)
                        word(p, ",");
@@ -1129,10 +1133,11 @@ termp_fa_pre(DECL_ARGS)
        }
 
        for (n = node->child; n; n = n->next) {
-               assert(MDOC_TEXT == n->type);
+               if (MDOC_TEXT != n->type)
+                       errx(1, "expected text line arguments");
 
                p->flags |= ttypes[TTYPE_FUNC_ARG];
-               word(p, n->data.text.string);
+               word(p, n->string);
                p->flags &= ~ttypes[TTYPE_FUNC_ARG];
 
                if (n->next)
@@ -1160,9 +1165,8 @@ termp_va_pre(DECL_ARGS)
 static int
 termp_bd_pre(DECL_ARGS)
 {
-       const struct mdoc_block *bl;
        const struct mdoc_node  *n;
-       int              i, type;
+       int                      i, type;
 
        if (MDOC_BLOCK == node->type) {
                if (node->prev)
@@ -1171,11 +1175,14 @@ termp_bd_pre(DECL_ARGS)
        } else if (MDOC_BODY != node->type)
                return(1);
 
+       if (NULL == node->parent->args)
+               errx(1, "missing display type");
+
        pair->offset = p->offset;
-       bl = &node->parent->data.block;
 
-       for (type = -1, i = 0; i < (int)bl->argc; i++) {
-               switch (bl->argv[i].arg) {
+       for (type = -1, i = 0; 
+                       i < (int)node->parent->args->argc; i++) {
+               switch (node->parent->args->argv[i].arg) {
                case (MDOC_Ragged):
                        /* FALLTHROUGH */
                case (MDOC_Filled):
@@ -1183,23 +1190,24 @@ termp_bd_pre(DECL_ARGS)
                case (MDOC_Unfilled):
                        /* FALLTHROUGH */
                case (MDOC_Literal):
-                       type = bl->argv[i].arg;
-                       i = (int)bl->argc;
+                       type = node->parent->args->argv[i].arg;
+                       i = (int)node->parent->args->argc;
                        break;
                default:
-                       errx(1, "display type not supported");
+                       break;
                }
        }
 
-       assert(-1 != type);
+       if (NULL == node->parent->args)
+               errx(1, "missing display type");
 
-       i = arg_getattr(MDOC_Offset, bl->argc, bl->argv);
+       i = arg_getattr(MDOC_Offset, node->parent);
        if (-1 != i) {
-               assert(1 == bl->argv[i].sz);
-               p->offset += arg_offset(&bl->argv[i]);
+               if (1 != node->args->argv[i].sz)
+                       errx(1, "expected single value");
+               p->offset += arg_offset(&node->args->argv[i]);
        }
 
-
        switch (type) {
        case (MDOC_Literal):
                /* FALLTHROUGH */
@@ -1216,7 +1224,7 @@ termp_bd_pre(DECL_ARGS)
                        warnx("non-text children not yet allowed");
                        continue;
                }
-               word(p, n->data.text.string);
+               word(p, n->string);
                flushln(p);
        }
 
@@ -1495,8 +1503,9 @@ termp_at_pre(DECL_ARGS)
        att = NULL;
 
        if (node->child) {
-               assert(MDOC_TEXT == node->child->type);
-               att = mdoc_a2att(node->child->data.text.string);
+               if (MDOC_TEXT != node->child->type)
+                       errx(1, "expected text line argument");
+               att = mdoc_a2att(node->child->string);
        }
 
        if (NULL == att)
@@ -1572,8 +1581,9 @@ termp_fo_pre(DECL_ARGS)
 
        p->flags |= ttypes[TTYPE_FUNC_NAME];
        for (n = node->child; n; n = n->next) {
-               assert(MDOC_TEXT == n->type);
-               word(p, n->data.text.string);
+               if (MDOC_TEXT != n->type)
+                       errx(1, "expected text line argument");
+               word(p, n->string);
        }
        p->flags &= ~ttypes[TTYPE_FUNC_NAME];
 
@@ -1599,31 +1609,27 @@ static int
 termp_bf_pre(DECL_ARGS)
 {
        const struct mdoc_node  *n;
-       const struct mdoc_block *b;
 
-       /* XXX - we skip over possible trailing HEAD tokens. */
-
-       if (MDOC_HEAD == node->type)
+       if (MDOC_HEAD == node->type) {
                return(0);
-       else if (MDOC_BLOCK != node->type)
+       else if (MDOC_BLOCK != node->type)
                return(1);
 
-       b = &node->data.block;
-
-       if (NULL == (n = b->head->child)) {
-               if (arg_hasattr(MDOC_Emphasis, b->argc, b->argv))
+       if (NULL == (n = node->head->child)) {
+               if (arg_hasattr(MDOC_Emphasis, node))
                        TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_EMPH]);
-               else if (arg_hasattr(MDOC_Symbolic, b->argc, b->argv))
+               else if (arg_hasattr(MDOC_Symbolic, node))
                        TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_SYMB]);
 
                return(1);
        } 
 
-       assert(MDOC_TEXT == n->type);
+       if (MDOC_TEXT != n->type)
+               errx(1, "expected text line arguments");
 
-       if (0 == strcmp("Em", n->data.text.string))
+       if (0 == strcmp("Em", n->string))
                TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_EMPH]);
-       else if (0 == strcmp("Sy", n->data.text.string))
+       else if (0 == strcmp("Sy", n->string))
                TERMPAIR_SETFLAG(p, pair, ttypes[TTYPE_EMPH]);
 
        return(1);