[BACK]Return to compat_ohash.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Diff for /mandoc/compat_ohash.c between version 1.2 and 1.3

version 1.2, 2014/01/04 14:09:28 version 1.3, 2014/06/20 02:10:05
Line 8  int dummy;
Line 8  int dummy;
   
 #else  #else
   
 /*      $OpenBSD$       */  /* $OpenBSD$ */
   
   /* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>
    *
    * Permission to use, copy, modify, and distribute this software for any
    * 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
    * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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
    * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    */
   
 #include <stddef.h>  #include <stddef.h>
 #include <stdint.h>  #include <stdint.h>
 #include <stdlib.h>  #include <stdlib.h>
Line 18  int dummy;
Line 33  int dummy;
   
 struct _ohash_record {  struct _ohash_record {
         uint32_t        hv;          uint32_t        hv;
         const char      *p;          const char      *p;
 };  };
   
 #define DELETED         ((const char *)h)  #define DELETED         ((const char *)h)
Line 27  struct _ohash_record {
Line 42  struct _ohash_record {
 /* Don't bother changing the hash table if the change is small enough.  */  /* Don't bother changing the hash table if the change is small enough.  */
 #define MINSIZE         (1UL << 4)  #define MINSIZE         (1UL << 4)
 #define MINDELETED      4  #define MINDELETED      4
 /* $OpenBSD$ */  
 /* ex:ts=8 sw=4:  
  */  
   
 /* Copyright (c) 1999, 2004 Marc Espie <espie@openbsd.org>  static void ohash_resize(struct ohash *);
  *  
  * Permission to use, copy, modify, and distribute this software for any  
  * 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  
  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF  
  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR 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  
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  
  */  
   
 /* This handles the common case of variable length keys, where the  
   /* This handles the common case of variable length keys, where the
  * key is stored at the end of the record.   * key is stored at the end of the record.
  */   */
 void *  void *
Line 58  ohash_create_entry(struct ohash_info *i, const char *s
Line 58  ohash_create_entry(struct ohash_info *i, const char *s
                 *end = start + strlen(start);                  *end = start + strlen(start);
         p = (i->alloc)(i->key_offset + (*end - start) + 1, i->data);          p = (i->alloc)(i->key_offset + (*end - start) + 1, i->data);
         if (p) {          if (p) {
             memcpy(p+i->key_offset, start, *end-start);                  memcpy(p+i->key_offset, start, *end-start);
             p[i->key_offset + (*end - start)] = '\0';                  p[i->key_offset + (*end - start)] = '\0';
         }          }
         return (void *)p;          return (void *)p;
 }  }
   
 /* hash_delete only frees the hash structure. Use hash_first/hash_next  /* hash_delete only frees the hash structure. Use hash_first/hash_next
  * to free entries as well.  */   * to free entries as well.  */
 void  void
 ohash_delete(struct ohash *h)  ohash_delete(struct ohash *h)
 {  {
         (h->info.hfree)(h->t, sizeof(struct _ohash_record) * h->size,          (h->info.hfree)(h->t, sizeof(struct _ohash_record) * h->size,
Line 76  ohash_delete(struct ohash *h)
Line 76  ohash_delete(struct ohash *h)
 #endif  #endif
 }  }
   
 static void ohash_resize(struct ohash *);  static void
   
 static void  
 ohash_resize(struct ohash *h)  ohash_resize(struct ohash *h)
 {  {
         struct _ohash_record *n;          struct _ohash_record *n;
Line 109  ohash_resize(struct ohash *h)
Line 107  ohash_resize(struct ohash *h)
                                 i += incr;                                  i += incr;
                                 if (i >= ns)                                  if (i >= ns)
                                         i -= ns;                                          i -= ns;
                         }                          }
                         n[i].hv = h->t[j].hv;                          n[i].hv = h->t[j].hv;
                         n[i].p = h->t[j].p;                          n[i].p = h->t[j].p;
                 }                  }
Line 125  ohash_resize(struct ohash *h)
Line 123  ohash_resize(struct ohash *h)
 void *  void *
 ohash_remove(struct ohash *h, unsigned int i)  ohash_remove(struct ohash *h, unsigned int i)
 {  {
         void            *result = (void *)h->t[i].p;          void            *result = (void *)h->t[i].p;
   
         if (result == NULL || result == DELETED)          if (result == NULL || result == DELETED)
                 return NULL;                  return NULL;
Line 160  ohash_insert(struct ohash *h, unsigned int i, void *p)
Line 158  ohash_insert(struct ohash *h, unsigned int i, void *p)
                 h->t[i].p = p;                  h->t[i].p = p;
         } else {          } else {
                 h->t[i].p = p;                  h->t[i].p = p;
         /* Arbitrary resize boundary.  Tweak if not efficient enough.  */                  /* Arbitrary resize boundary.  Tweak if not efficient enough.  */
                 if (++h->total * 4 > h->size * 3)                  if (++h->total * 4 > h->size * 3)
                         ohash_resize(h);                          ohash_resize(h);
         }          }
         return p;          return p;
 }  }
   
 unsigned int  unsigned int
Line 179  ohash_first(struct ohash *h, unsigned int *pos)
Line 177  ohash_first(struct ohash *h, unsigned int *pos)
         *pos = 0;          *pos = 0;
         return ohash_next(h, pos);          return ohash_next(h, pos);
 }  }
   
 void *  void *
 ohash_next(struct ohash *h, unsigned int *pos)  ohash_next(struct ohash *h, unsigned int *pos)
 {  {
         for (; *pos < h->size; (*pos)++)          for (; *pos < h->size; (*pos)++)
                 if (h->t[*pos].p != DELETED && h->t[*pos].p != NULL)                  if (h->t[*pos].p != DELETED && h->t[*pos].p != NULL)
                         return (void *)h->t[(*pos)++].p;                          return (void *)h->t[(*pos)++].p;
         return NULL;          return NULL;
 }  }
   
 void  void
 ohash_init(struct ohash *h, unsigned int size, struct ohash_info *info)  ohash_init(struct ohash *h, unsigned int size, struct ohash_info *info)
 {  {
         h->size = 1UL << size;          h->size = 1UL << size;
Line 227  ohash_interval(const char *s, const char **e)
Line 225  ohash_interval(const char *s, const char **e)
 }  }
   
 unsigned int  unsigned int
 ohash_lookup_interval(struct ohash *h, const char *start, const char *end,  ohash_lookup_interval(struct ohash *h, const char *start, const char *end,
     uint32_t hv)      uint32_t hv)
 {  {
         unsigned int    i, incr;          unsigned int    i, incr;
         unsigned int    empty;          unsigned int    empty;
   
 #ifdef STATS_HASH  #ifdef STATS_HASH
         STAT_HASH_LOOKUP++;          STAT_HASH_LOOKUP++;
 #endif  #endif
Line 246  ohash_lookup_interval(struct ohash *h, const char *sta
Line 244  ohash_lookup_interval(struct ohash *h, const char *sta
                 if (h->t[i].p == DELETED) {                  if (h->t[i].p == DELETED) {
                         if (empty == NONE)                          if (empty == NONE)
                                 empty = i;                                  empty = i;
                 } else if (h->t[i].hv == hv &&                  } else if (h->t[i].hv == hv &&
                     strncmp(h->t[i].p+h->info.key_offset, start,                      strncmp(h->t[i].p+h->info.key_offset, start,
                         end - start) == 0 &&                          end - start) == 0 &&
                     (h->t[i].p+h->info.key_offset)[end-start] == '\0') {                      (h->t[i].p+h->info.key_offset)[end-start] == '\0') {
                         if (empty != NONE) {                          if (empty != NONE) {
                                 h->t[empty].hv = hv;                                  h->t[empty].hv = hv;
                                 h->t[empty].p = h->t[i].p;                                  h->t[empty].p = h->t[i].p;
                                 h->t[i].p = DELETED;                                  h->t[i].p = DELETED;
Line 263  ohash_lookup_interval(struct ohash *h, const char *sta
Line 261  ohash_lookup_interval(struct ohash *h, const char *sta
                         }                          }
                 }                  }
                 i += incr;                  i += incr;
                 if (i >= h->size)                  if (i >= h->size)
                         i -= h->size;                          i -= h->size;
         }          }
   
         /* Found an empty position.  */          /* Found an empty position.  */
         if (empty != NONE)          if (empty != NONE)
                 i = empty;                  i = empty;
         h->t[i].hv = hv;          h->t[i].hv = hv;
         return i;          return i;
Line 279  ohash_lookup_memory(struct ohash *h, const char *k, si
Line 277  ohash_lookup_memory(struct ohash *h, const char *k, si
 {  {
         unsigned int    i, incr;          unsigned int    i, incr;
         unsigned int    empty;          unsigned int    empty;
   
 #ifdef STATS_HASH  #ifdef STATS_HASH
         STAT_HASH_LOOKUP++;          STAT_HASH_LOOKUP++;
 #endif  #endif
Line 293  ohash_lookup_memory(struct ohash *h, const char *k, si
Line 291  ohash_lookup_memory(struct ohash *h, const char *k, si
                 if (h->t[i].p == DELETED) {                  if (h->t[i].p == DELETED) {
                         if (empty == NONE)                          if (empty == NONE)
                                 empty = i;                                  empty = i;
                 } else if (h->t[i].hv == hv &&                  } else if (h->t[i].hv == hv &&
                     memcmp(h->t[i].p+h->info.key_offset, k, size) == 0) {                      memcmp(h->t[i].p+h->info.key_offset, k, size) == 0) {
                         if (empty != NONE) {                          if (empty != NONE) {
                                 h->t[empty].hv = hv;                                  h->t[empty].hv = hv;
                                 h->t[empty].p = h->t[i].p;                                  h->t[empty].p = h->t[i].p;
                                 h->t[i].p = DELETED;                                  h->t[i].p = DELETED;
Line 307  ohash_lookup_memory(struct ohash *h, const char *k, si
Line 305  ohash_lookup_memory(struct ohash *h, const char *k, si
                         }       return i;                          }       return i;
                 }                  }
                 i += incr;                  i += incr;
                 if (i >= h->size)                  if (i >= h->size)
                         i -= h->size;                          i -= h->size;
         }          }
   
         /* Found an empty position.  */          /* Found an empty position.  */
         if (empty != NONE)          if (empty != NONE)
                 i = empty;                  i = empty;
         h->t[i].hv = hv;          h->t[i].hv = hv;
         return i;          return i;

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3

CVSweb