]> git.cameronkatri.com Git - mandoc.git/blobdiff - man.c
Clean up consts (noted by Joerg Sonnenberger and Ulrich Sporlein).
[mandoc.git] / man.c
diff --git a/man.c b/man.c
index 5763c9ea948aebbe5dee427e8cab5164b6a2dadc..4a64d700953d9bc2d28753f014ddf5c5e8e39962 100644 (file)
--- a/man.c
+++ b/man.c
@@ -1,4 +1,4 @@
-/*     $Id: man.c,v 1.36 2009/08/21 13:18:32 kristaps Exp $ */
+/*     $Id: man.c,v 1.41 2009/09/23 11:53:45 kristaps Exp $ */
 /*
  * Copyright (c) 2008, 2009 Kristaps Dzonsons <kristaps@kth.se>
  *
@@ -14,6 +14,8 @@
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
+#include <sys/types.h>
+
 #include <assert.h>
 #include <ctype.h>
 #include <stdarg.h>
@@ -54,7 +56,7 @@ const char *const __man_macronames[MAN_MAX] = {
        "R",            "B",            "I",            "IR",
        "RI",           "na",           "i",            "sp",
        "nf",           "fi",           "r",            "RE",
-       "RS",           "DT"
+       "RS",           "DT",           "UC"
        };
 
 const  char * const *man_macronames = __man_macronames;
@@ -105,9 +107,6 @@ man_free(struct man *man)
 {
 
        man_free1(man);
-
-       if (man->htab)
-               man_hash_free(man->htab);
        free(man);
 }
 
@@ -125,14 +124,11 @@ man_alloc(void *data, int pflags, const struct man_cb *cb)
                return(NULL);
        }
 
+       man_hash_init();
+
        p->data = data;
        p->pflags = pflags;
        (void)memcpy(&p->cb, cb, sizeof(struct man_cb));
-
-       if (NULL == (p->htab = man_hash_alloc())) {
-               free(p);
-               return(NULL);
-       }
        return(p);
 }
 
@@ -378,14 +374,15 @@ man_node_free(struct man_node *p)
 void
 man_node_freelist(struct man_node *p)
 {
+       struct man_node *n;
 
        if (p->child)
                man_node_freelist(p->child);
-       if (p->next)
-               man_node_freelist(p->next);
-
        assert(0 == p->nchild);
+       n = p->next;
        man_node_free(p);
+       if (n)
+               man_node_freelist(n);
 }
 
 
@@ -492,6 +489,12 @@ man_pmacro(struct man *m, int ln, char *buf)
                        break;
                else if (' ' == buf[i])
                        break;
+
+               /* Check for invalid characters. */
+
+               if (isgraph((u_char)buf[i]))
+                       continue;
+               return(man_perr(m, ln, i, WNPRINT));
        }
 
        mac[j] = 0;
@@ -506,7 +509,7 @@ man_pmacro(struct man *m, int ln, char *buf)
                return(1);
        }
        
-       if (MAN_MAX == (c = man_hash_find(m->htab, mac))) {
+       if (MAN_MAX == (c = man_hash_find(mac))) {
                if ( ! (MAN_IGN_MACRO & m->pflags)) {
                        (void)man_perr(m, ln, ppos, WMACRO);
                        goto err;
@@ -526,6 +529,7 @@ man_pmacro(struct man *m, int ln, char *buf)
        if (m->flags & MAN_ELINE) {
                n = m->last;
                assert(NULL == n->child);
+               assert(0 == n->nchild);
                if ( ! man_nwarn(m, n, WLNSCOPE))
                        return(0);
 
@@ -534,10 +538,12 @@ man_pmacro(struct man *m, int ln, char *buf)
                        assert(n == n->prev->next);
                        n->prev->next = NULL;
                        m->last = n->prev;
+                       m->next = MAN_NEXT_SIBLING;
                } else {
                        assert(n == n->parent->child);
                        n->parent->child = NULL;
                        m->last = n->parent;
+                       m->next = MAN_NEXT_CHILD;
                }
 
                man_node_free(n);