]> git.cameronkatri.com Git - mandoc.git/blobdiff - man.c
Replace the structs mdoc and man by a unified struct roff_man.
[mandoc.git] / man.c
diff --git a/man.c b/man.c
index 4e7a398d9bbe11f8c9ce7d89a7f2d3bb60ca3d8d..29785f3157cb604375bf935835b742ba94b3bff9 100644 (file)
--- a/man.c
+++ b/man.c
@@ -1,4 +1,4 @@
-/*     $Id: man.c,v 1.149 2015/01/30 21:28:46 schwarze Exp $ */
+/*     $Id: man.c,v 1.153 2015/04/18 16:06:40 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2013, 2014, 2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -8,9 +8,9 @@
  * 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
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS 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
 #include <stdio.h>
 #include <string.h>
 
-#include "man.h"
-#include "mandoc.h"
 #include "mandoc_aux.h"
-#include "libman.h"
+#include "mandoc.h"
+#include "roff.h"
+#include "man.h"
 #include "libmandoc.h"
+#include "libman.h"
 
 const  char *const __man_macronames[MAN_MAX] = {
        "br",           "TH",           "SH",           "SS",
@@ -48,36 +49,37 @@ const       char *const __man_macronames[MAN_MAX] = {
 
 const  char * const *man_macronames = __man_macronames;
 
-static void             man_alloc1(struct man *);
-static void             man_breakscope(struct man *, enum mant);
-static void             man_descope(struct man *, int, int);
-static void             man_free1(struct man *);
-static struct man_node *man_node_alloc(struct man *, int, int,
-                               enum man_type, enum mant);
-static void             man_node_append(struct man *, struct man_node *);
-static void             man_node_free(struct man_node *);
-static void             man_node_unlink(struct man *,
-                               struct man_node *);
-static int              man_ptext(struct man *, int, char *, int);
-static int              man_pmacro(struct man *, int, char *, int);
-
-
-const struct man_node *
-man_node(const struct man *man)
+static void             man_alloc1(struct roff_man *);
+static void             man_breakscope(struct roff_man *, int);
+static void             man_descope(struct roff_man *, int, int);
+static void             man_free1(struct roff_man *);
+static struct roff_node *man_node_alloc(struct roff_man *, int, int,
+                               enum roff_type, int);
+static void             man_node_append(struct roff_man *,
+                               struct roff_node *);
+static void             man_node_free(struct roff_node *);
+static void             man_node_unlink(struct roff_man *,
+                               struct roff_node *);
+static int              man_ptext(struct roff_man *, int, char *, int);
+static int              man_pmacro(struct roff_man *, int, char *, int);
+
+
+const struct roff_node *
+man_node(const struct roff_man *man)
 {
 
        return(man->first);
 }
 
-const struct man_meta *
-man_meta(const struct man *man)
+const struct roff_meta *
+man_meta(const struct roff_man *man)
 {
 
        return(&man->meta);
 }
 
 void
-man_reset(struct man *man)
+man_reset(struct roff_man *man)
 {
 
        man_free1(man);
@@ -85,20 +87,20 @@ man_reset(struct man *man)
 }
 
 void
-man_free(struct man *man)
+man_free(struct roff_man *man)
 {
 
        man_free1(man);
        free(man);
 }
 
-struct man *
+struct roff_man *
 man_alloc(struct roff *roff, struct mparse *parse,
        const char *defos, int quick)
 {
-       struct man      *p;
+       struct roff_man *p;
 
-       p = mandoc_calloc(1, sizeof(struct man));
+       p = mandoc_calloc(1, sizeof(*p));
 
        man_hash_init();
        p->parse = parse;
@@ -111,17 +113,17 @@ man_alloc(struct roff *roff, struct mparse *parse,
 }
 
 void
-man_endparse(struct man *man)
+man_endparse(struct roff_man *man)
 {
 
        man_macroend(man);
 }
 
 int
-man_parseln(struct man *man, int ln, char *buf, int offs)
+man_parseln(struct roff_man *man, int ln, char *buf, int offs)
 {
 
-       if (man->last->type != MAN_EQN || ln > man->last->line)
+       if (man->last->type != ROFFT_EQN || ln > man->last->line)
                man->flags |= MAN_NEWLINE;
 
        return (roff_getcontrol(man->roff, buf, &offs) ?
@@ -130,47 +132,47 @@ man_parseln(struct man *man, int ln, char *buf, int offs)
 }
 
 static void
-man_free1(struct man *man)
+man_free1(struct roff_man *man)
 {
 
        if (man->first)
                man_node_delete(man, man->first);
        free(man->meta.title);
-       free(man->meta.source);
+       free(man->meta.os);
        free(man->meta.date);
        free(man->meta.vol);
        free(man->meta.msec);
 }
 
 static void
-man_alloc1(struct man *man)
+man_alloc1(struct roff_man *man)
 {
 
-       memset(&man->meta, 0, sizeof(struct man_meta));
+       memset(&man->meta, 0, sizeof(man->meta));
        man->flags = 0;
-       man->last = mandoc_calloc(1, sizeof(struct man_node));
+       man->last = mandoc_calloc(1, sizeof(*man->last));
        man->first = man->last;
-       man->last->type = MAN_ROOT;
+       man->last->type = ROFFT_ROOT;
        man->last->tok = MAN_MAX;
-       man->next = MAN_NEXT_CHILD;
+       man->next = ROFF_NEXT_CHILD;
 }
 
 
 static void
-man_node_append(struct man *man, struct man_node *p)
+man_node_append(struct roff_man *man, struct roff_node *p)
 {
 
        assert(man->last);
        assert(man->first);
-       assert(p->type != MAN_ROOT);
+       assert(p->type != ROFFT_ROOT);
 
        switch (man->next) {
-       case MAN_NEXT_SIBLING:
+       case ROFF_NEXT_SIBLING:
                man->last->next = p;
                p->prev = man->last;
                p->parent = man->last->parent;
                break;
-       case MAN_NEXT_CHILD:
+       case ROFF_NEXT_CHILD:
                man->last->child = p;
                p->parent = man->last;
                break;
@@ -183,16 +185,16 @@ man_node_append(struct man *man, struct man_node *p)
        p->parent->nchild++;
 
        switch (p->type) {
-       case MAN_BLOCK:
+       case ROFFT_BLOCK:
                if (p->tok == MAN_SH || p->tok == MAN_SS)
                        man->flags &= ~MAN_LITERAL;
                break;
-       case MAN_HEAD:
-               assert(p->parent->type == MAN_BLOCK);
+       case ROFFT_HEAD:
+               assert(p->parent->type == ROFFT_BLOCK);
                p->parent->head = p;
                break;
-       case MAN_BODY:
-               assert(p->parent->type == MAN_BLOCK);
+       case ROFFT_BODY:
+               assert(p->parent->type == ROFFT_BLOCK);
                p->parent->body = p;
                break;
        default:
@@ -202,9 +204,9 @@ man_node_append(struct man *man, struct man_node *p)
        man->last = p;
 
        switch (p->type) {
-       case MAN_TBL:
+       case ROFFT_TBL:
                /* FALLTHROUGH */
-       case MAN_TEXT:
+       case ROFFT_TEXT:
                man_valid_post(man);
                break;
        default:
@@ -212,13 +214,13 @@ man_node_append(struct man *man, struct man_node *p)
        }
 }
 
-static struct man_node *
-man_node_alloc(struct man *man, int line, int pos,
-               enum man_type type, enum mant tok)
+static struct roff_node *
+man_node_alloc(struct roff_man *man, int line, int pos,
+               enum roff_type type, int tok)
 {
-       struct man_node *p;
+       struct roff_node *p;
 
-       p = mandoc_calloc(1, sizeof(struct man_node));
+       p = mandoc_calloc(1, sizeof(*p));
        p->line = line;
        p->pos = pos;
        p->type = type;
@@ -231,60 +233,60 @@ man_node_alloc(struct man *man, int line, int pos,
 }
 
 void
-man_elem_alloc(struct man *man, int line, int pos, enum mant tok)
+man_elem_alloc(struct roff_man *man, int line, int pos, int tok)
 {
-       struct man_node *p;
+       struct roff_node *p;
 
-       p = man_node_alloc(man, line, pos, MAN_ELEM, tok);
+       p = man_node_alloc(man, line, pos, ROFFT_ELEM, tok);
        man_node_append(man, p);
-       man->next = MAN_NEXT_CHILD;
+       man->next = ROFF_NEXT_CHILD;
 }
 
 void
-man_head_alloc(struct man *man, int line, int pos, enum mant tok)
+man_head_alloc(struct roff_man *man, int line, int pos, int tok)
 {
-       struct man_node *p;
+       struct roff_node *p;
 
-       p = man_node_alloc(man, line, pos, MAN_HEAD, tok);
+       p = man_node_alloc(man, line, pos, ROFFT_HEAD, tok);
        man_node_append(man, p);
-       man->next = MAN_NEXT_CHILD;
+       man->next = ROFF_NEXT_CHILD;
 }
 
 void
-man_body_alloc(struct man *man, int line, int pos, enum mant tok)
+man_body_alloc(struct roff_man *man, int line, int pos, int tok)
 {
-       struct man_node *p;
+       struct roff_node *p;
 
-       p = man_node_alloc(man, line, pos, MAN_BODY, tok);
+       p = man_node_alloc(man, line, pos, ROFFT_BODY, tok);
        man_node_append(man, p);
-       man->next = MAN_NEXT_CHILD;
+       man->next = ROFF_NEXT_CHILD;
 }
 
 void
-man_block_alloc(struct man *man, int line, int pos, enum mant tok)
+man_block_alloc(struct roff_man *man, int line, int pos, int tok)
 {
-       struct man_node *p;
+       struct roff_node *p;
 
-       p = man_node_alloc(man, line, pos, MAN_BLOCK, tok);
+       p = man_node_alloc(man, line, pos, ROFFT_BLOCK, tok);
        man_node_append(man, p);
-       man->next = MAN_NEXT_CHILD;
+       man->next = ROFF_NEXT_CHILD;
 }
 
 void
-man_word_alloc(struct man *man, int line, int pos, const char *word)
+man_word_alloc(struct roff_man *man, int line, int pos, const char *word)
 {
-       struct man_node *n;
+       struct roff_node *n;
 
-       n = man_node_alloc(man, line, pos, MAN_TEXT, MAN_MAX);
+       n = man_node_alloc(man, line, pos, ROFFT_TEXT, MAN_MAX);
        n->string = roff_strdup(man->roff, word);
        man_node_append(man, n);
-       man->next = MAN_NEXT_SIBLING;
+       man->next = ROFF_NEXT_SIBLING;
 }
 
 void
-man_word_append(struct man *man, const char *word)
+man_word_append(struct roff_man *man, const char *word)
 {
-       struct man_node *n;
+       struct roff_node *n;
        char            *addstr, *newstr;
 
        n = man->last;
@@ -293,7 +295,7 @@ man_word_append(struct man *man, const char *word)
        free(addstr);
        free(n->string);
        n->string = newstr;
-       man->next = MAN_NEXT_SIBLING;
+       man->next = ROFF_NEXT_SIBLING;
 }
 
 /*
@@ -301,7 +303,7 @@ man_word_append(struct man *man, const char *word)
  * node from its context; for that, see man_node_unlink().
  */
 static void
-man_node_free(struct man_node *p)
+man_node_free(struct roff_node *p)
 {
 
        free(p->string);
@@ -309,7 +311,7 @@ man_node_free(struct man_node *p)
 }
 
 void
-man_node_delete(struct man *man, struct man_node *p)
+man_node_delete(struct roff_man *man, struct roff_node *p)
 {
 
        while (p->child)
@@ -320,34 +322,34 @@ man_node_delete(struct man *man, struct man_node *p)
 }
 
 void
-man_addeqn(struct man *man, const struct eqn *ep)
+man_addeqn(struct roff_man *man, const struct eqn *ep)
 {
-       struct man_node *n;
+       struct roff_node *n;
 
-       n = man_node_alloc(man, ep->ln, ep->pos, MAN_EQN, MAN_MAX);
+       n = man_node_alloc(man, ep->ln, ep->pos, ROFFT_EQN, MAN_MAX);
        n->eqn = ep;
        if (ep->ln > man->last->line)
                n->flags |= MAN_LINE;
        man_node_append(man, n);
-       man->next = MAN_NEXT_SIBLING;
+       man->next = ROFF_NEXT_SIBLING;
        man_descope(man, ep->ln, ep->pos);
 }
 
 void
-man_addspan(struct man *man, const struct tbl_span *sp)
+man_addspan(struct roff_man *man, const struct tbl_span *sp)
 {
-       struct man_node *n;
+       struct roff_node *n;
 
        man_breakscope(man, MAN_MAX);
-       n = man_node_alloc(man, sp->line, 0, MAN_TBL, MAN_MAX);
+       n = man_node_alloc(man, sp->line, 0, ROFFT_TBL, MAN_MAX);
        n->span = sp;
        man_node_append(man, n);
-       man->next = MAN_NEXT_SIBLING;
+       man->next = ROFF_NEXT_SIBLING;
        man_descope(man, sp->line, 0);
 }
 
 static void
-man_descope(struct man *man, int line, int offs)
+man_descope(struct roff_man *man, int line, int offs)
 {
        /*
         * Co-ordinate what happens with having a next-line scope open:
@@ -367,7 +369,7 @@ man_descope(struct man *man, int line, int offs)
 }
 
 static int
-man_ptext(struct man *man, int line, char *buf, int offs)
+man_ptext(struct roff_man *man, int line, char *buf, int offs)
 {
        int              i;
 
@@ -392,7 +394,7 @@ man_ptext(struct man *man, int line, char *buf, int offs)
                if (man->last->tok != MAN_SH &&
                    man->last->tok != MAN_SS) {
                        man_elem_alloc(man, line, offs, MAN_sp);
-                       man->next = MAN_NEXT_SIBLING;
+                       man->next = ROFF_NEXT_SIBLING;
                }
                return(1);
        }
@@ -435,11 +437,11 @@ man_ptext(struct man *man, int line, char *buf, int offs)
 }
 
 static int
-man_pmacro(struct man *man, int ln, char *buf, int offs)
+man_pmacro(struct roff_man *man, int ln, char *buf, int offs)
 {
-       struct man_node *n;
+       struct roff_node *n;
        const char      *cp;
-       enum mant        tok;
+       int              tok;
        int              i, ppos;
        int              bline;
        char             mac[5];
@@ -511,7 +513,7 @@ man_pmacro(struct man *man, int ln, char *buf, int offs)
 
        if (man->quick && tok == MAN_SH) {
                n = man->last;
-               if (n->type == MAN_BODY &&
+               if (n->type == ROFFT_BODY &&
                    strcmp(n->prev->child->string, "NAME"))
                        return(2);
        }
@@ -535,9 +537,9 @@ man_pmacro(struct man *man, int ln, char *buf, int offs)
 }
 
 void
-man_breakscope(struct man *man, enum mant tok)
+man_breakscope(struct roff_man *man, int tok)
 {
-       struct man_node *n;
+       struct roff_node *n;
 
        /*
         * An element next line scope is open,
@@ -548,7 +550,7 @@ man_breakscope(struct man *man, enum mant tok)
        if (man->flags & MAN_ELINE && (tok == MAN_MAX ||
            ! (man_macros[tok].flags & MAN_NSCOPED))) {
                n = man->last;
-               assert(n->type != MAN_TEXT);
+               assert(n->type != ROFFT_TEXT);
                if (man_macros[n->tok].flags & MAN_NSCOPED)
                        n = n->parent;
 
@@ -570,14 +572,14 @@ man_breakscope(struct man *man, enum mant tok)
        if (man->flags & MAN_BLINE && (tok == MAN_MAX ||
            man_macros[tok].flags & MAN_BSCOPE)) {
                n = man->last;
-               if (n->type == MAN_TEXT)
+               if (n->type == ROFFT_TEXT)
                        n = n->parent;
                if ( ! (man_macros[n->tok].flags & MAN_BSCOPE))
                        n = n->parent;
 
-               assert(n->type == MAN_HEAD);
+               assert(n->type == ROFFT_HEAD);
                n = n->parent;
-               assert(n->type == MAN_BLOCK);
+               assert(n->type == ROFFT_BLOCK);
                assert(man_macros[n->tok].flags & MAN_SCOPED);
 
                mandoc_vmsg(MANDOCERR_BLK_LINE, man->parse,
@@ -595,7 +597,7 @@ man_breakscope(struct man *man, enum mant tok)
  * point will also be adjusted accordingly.
  */
 static void
-man_node_unlink(struct man *man, struct man_node *n)
+man_node_unlink(struct roff_man *man, struct roff_node *n)
 {
 
        /* Adjust siblings. */
@@ -620,10 +622,10 @@ man_node_unlink(struct man *man, struct man_node *n)
                /*assert(NULL == n->next);*/
                if (n->prev) {
                        man->last = n->prev;
-                       man->next = MAN_NEXT_SIBLING;
+                       man->next = ROFF_NEXT_SIBLING;
                } else {
                        man->last = n->parent;
-                       man->next = MAN_NEXT_CHILD;
+                       man->next = ROFF_NEXT_CHILD;
                }
        }
 
@@ -632,7 +634,7 @@ man_node_unlink(struct man *man, struct man_node *n)
 }
 
 const struct mparse *
-man_mparse(const struct man *man)
+man_mparse(const struct roff_man *man)
 {
 
        assert(man && man->parse);
@@ -640,12 +642,12 @@ man_mparse(const struct man *man)
 }
 
 void
-man_deroff(char **dest, const struct man_node *n)
+man_deroff(char **dest, const struct roff_node *n)
 {
        char    *cp;
        size_t   sz;
 
-       if (n->type != MAN_TEXT) {
+       if (n->type != ROFFT_TEXT) {
                for (n = n->child; n; n = n->next)
                        man_deroff(dest, n);
                return;