]> git.cameronkatri.com Git - mandoc.git/commitdiff
Simplify and make tag_put() more efficient by integrating tag_get()
authorIngo Schwarze <schwarze@openbsd.org>
Sat, 25 Jul 2015 14:28:59 +0000 (14:28 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Sat, 25 Jul 2015 14:28:59 +0000 (14:28 +0000)
into it and by only handling NUL-terminated strings.
Minus 25 lines of code, no functional change.

mdoc_term.c
tag.c
tag.h

index 3eea9d1341f4646cb1a8c54b756a3be025479b76..e0e1d380acbf66909d26355feb5b99a7834a1330 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.323 2015/07/25 14:23:08 schwarze Exp $ */
+/*     $Id: mdoc_term.c,v 1.324 2015/07/25 14:28:59 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012-2015 Ingo Schwarze <schwarze@openbsd.org>
@@ -1481,10 +1481,8 @@ termp_fn_pre(DECL_ARGS)
        term_word(p, n->string);
        term_fontpop(p);
 
-       if (n->sec == SEC_DESCRIPTION) {
-               if ( ! tag_get(n->string, 0, ++fn_prio))
-                       tag_put(n->string, 0, fn_prio, p->line);
-       }
+       if (n->sec == SEC_DESCRIPTION)
+               tag_put(n->string, ++fn_prio, p->line);
 
        if (pretty) {
                term_flushln(p);
@@ -2280,9 +2278,8 @@ termp_er_pre(DECL_ARGS)
        if (n->sec == SEC_ERRORS &&
            (n->parent->tok == MDOC_It ||
             (n->parent->tok == MDOC_Bq &&
-             n->parent->parent->parent->tok == MDOC_It)) &&
-           ! tag_get(n->child->string, 0, 1))
-               tag_put(n->child->string, 0, 1, p->line);
+             n->parent->parent->parent->tok == MDOC_It)))
+               tag_put(n->child->string, 1, p->line);
        return(1);
 }
 
@@ -2296,8 +2293,7 @@ termp_tag_pre(DECL_ARGS)
            (n->parent->tok == MDOC_It ||
             (n->parent->tok == MDOC_Xo &&
              n->parent->parent->prev == NULL &&
-             n->parent->parent->parent->tok == MDOC_It)) &&
-           ! tag_get(n->child->string, 0, 1))
-               tag_put(n->child->string, 0, 1, p->line);
+             n->parent->parent->parent->tok == MDOC_It)))
+               tag_put(n->child->string, 1, p->line);
        return(1);
 }
diff --git a/tag.c b/tag.c
index 8ce576f4797304d5f519974ed344a42a025e1270..0202066359148828f632dabb3f98a282a6b63972 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -1,4 +1,4 @@
-/*      $Id: tag.c,v 1.4 2015/07/25 14:02:06 schwarze Exp $    */
+/*      $Id: tag.c,v 1.5 2015/07/25 14:28:59 schwarze Exp $    */
 /*
  * Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -78,49 +78,27 @@ tag_init(void)
 }
 
 /*
- * Return the line number where a term is defined,
- * or 0 if the term is unknown.
- */
-size_t
-tag_get(const char *s, size_t len, int prio)
-{
-       struct tag_entry        *entry;
-       const char              *end;
-       unsigned int             slot;
-
-       if (tag_fd == -1)
-               return(0);
-       if (len == 0)
-               len = strlen(s);
-       end = s + len;
-       slot = ohash_qlookupi(&tag_data, s, &end);
-       entry = ohash_find(&tag_data, slot);
-       return((entry == NULL || prio < entry->prio) ? 0 : entry->line);
-}
-
-/*
- * Set the line number where a term is defined.
+ * Set the line number where a term is defined,
+ * unless it is already defined at a higher priority.
  */
 void
-tag_put(const char *s, size_t len, int prio, size_t line)
+tag_put(const char *s, int prio, size_t line)
 {
        struct tag_entry        *entry;
-       const char              *end;
+       size_t                   len;
        unsigned int             slot;
 
        if (tag_fd == -1)
                return;
-       if (len == 0)
-               len = strlen(s);
-       end = s + len;
-       slot = ohash_qlookupi(&tag_data, s, &end);
+       slot = ohash_qlookup(&tag_data, s);
        entry = ohash_find(&tag_data, slot);
        if (entry == NULL) {
-               entry = mandoc_malloc(sizeof(*entry) + len + 1);
+               len = strlen(s) + 1;
+               entry = mandoc_malloc(sizeof(*entry) + len);
                memcpy(entry->s, s, len);
-               entry->s[len] = '\0';
                ohash_insert(&tag_data, slot, entry);
-       }
+       } else if (entry->prio <= prio)
+               return;
        entry->line = line;
        entry->prio = prio;
 }
diff --git a/tag.h b/tag.h
index b6030bb4ef543ae7869d0112f5d5354544d9821d..34a7eee2cd08dc9dde198851b63400d08d033033 100644 (file)
--- a/tag.h
+++ b/tag.h
@@ -1,4 +1,4 @@
-/*      $Id: tag.h,v 1.3 2015/07/25 14:02:06 schwarze Exp $    */
+/*      $Id: tag.h,v 1.4 2015/07/25 14:28:59 schwarze Exp $    */
 /*
  * Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -18,8 +18,7 @@
 __BEGIN_DECLS
 
 char   *tag_init(void);
-size_t  tag_get(const char *, size_t, int);
-void    tag_put(const char *, size_t, int, size_t);
+void    tag_put(const char *, int, size_t);
 void    tag_write(void);
 void    tag_unlink(void);