asarray.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * FILE:    asarray.c
  3.  *
  4.  * AUTHORS: Orion Hodson
  5.  *
  6.  * Copyright (c) 1999-2000 University College London
  7.  * All rights reserved.
  8.  */
  9.  
  10. #ifndef HIDE_SOURCE_STRINGS
  11. static const char cvsid[] = 
  12. "$Id: asarray.c,v 1.3 2002/01/10 23:27:27 wmay Exp $";
  13. #endif /* HIDE_SOURCE_STRINGS */
  14. #include "config_unix.h"
  15. #include "config_win32.h"
  16. #include "debug.h"
  17. #include "memory.h"
  18. #include "util.h"
  19. #include "asarray.h"
  20. typedef struct s_hash_tuple {
  21.         uint32_t hash;
  22.         char *key;
  23.         char *value;
  24.         struct s_hash_tuple *next;
  25. } hash_tuple;
  26. #define ASARRAY_SIZE 11
  27. struct _asarray {
  28.         hash_tuple *table[ASARRAY_SIZE];
  29.         int32_t     nitems[ASARRAY_SIZE];
  30. };
  31. static uint32_t 
  32. asarray_hash(const char *key)
  33. {
  34.         uint32_t hash = 0;
  35.         while(*key != '') {
  36.                 hash = hash * 31;
  37.                 hash += ((uint32_t)*key) + 1;
  38.                 key++;
  39.         }
  40.         return hash;
  41. }
  42. int32_t
  43. asarray_add(asarray *pa, const char *key, const char *value)
  44. {
  45.         hash_tuple *t;
  46.         int row;
  47.         t = (hash_tuple*)xmalloc(sizeof(hash_tuple));
  48.         if (t) {
  49.                 /* transfer values */
  50.                 t->hash  = asarray_hash(key);
  51.                 t->key   = xstrdup(key);
  52.                 t->value = xstrdup(value);
  53.                 /* Add to table */
  54.                 row            = t->hash % ASARRAY_SIZE;
  55.                 t->next        = pa->table[row];
  56.                 pa->table[row] = t;
  57.                 pa->nitems[row]++;
  58.                 return TRUE;
  59.         }
  60.         return FALSE;
  61. }
  62. void
  63. asarray_remove(asarray *pa, const char *key)
  64. {
  65.         hash_tuple **t, *e;
  66.         uint32_t hash;
  67.         int row;
  68.         hash = asarray_hash(key);
  69.         row  = hash % ASARRAY_SIZE;
  70.         t    = &pa->table[row];
  71.         while((*t) != NULL) {
  72.                 if ((hash == (*t)->hash) && 
  73.                     (strcmp(key, (*t)->key) == 0)) {
  74.                         e = *t;
  75.                         *t = e->next;
  76.                         xfree(e->key);
  77.                         xfree(e->value);
  78.                         xfree(e);
  79.                         pa->nitems[row]--;
  80.                         ASSERT(pa->nitems[row] >= 0);
  81.                         break;
  82.                 } else {
  83.                         t = &(*t)->next;
  84.                 }
  85.         }
  86. }
  87. const char* 
  88. asarray_get_key_no(asarray *pa, int32_t index)
  89. {
  90.         int32_t row = 0;
  91.         index += 1;
  92.         while (row < ASARRAY_SIZE && index > pa->nitems[row]) {
  93.                 index -= pa->nitems[row];
  94.                 row++;
  95.         }
  96.         if (row < ASARRAY_SIZE) {
  97.                 hash_tuple *t;
  98.                 t = pa->table[row];
  99.                 while(--index > 0) {
  100.                         ASSERT(t->next != NULL);
  101.                         t = t->next;
  102.                 }
  103.                 return t->key;
  104.         }
  105.         return NULL;
  106. }
  107. /* asarray_lookup points value at actual value        */
  108. /* and return TRUE if key found.                      */
  109. int32_t
  110. asarray_lookup(asarray *pa, const char *key, char **value)
  111. {
  112.         hash_tuple *t;
  113.         int          row;
  114.         uint32_t     hash;
  115.         hash = asarray_hash(key);
  116.         row  = hash % ASARRAY_SIZE;
  117.         t = pa->table[row];
  118.         while(t != NULL) {
  119.                 if (t->hash == hash && strcmp(key, t->key) == 0) {
  120.                         *value = t->value;
  121.                         return TRUE;
  122.                 }
  123.                 t = t->next;
  124.         }
  125.         *value = NULL;
  126.         return FALSE;
  127. }
  128. int32_t
  129. asarray_create(asarray **ppa)
  130. {
  131.         asarray *pa;
  132.         pa = (asarray*)xmalloc(sizeof(asarray));
  133.         if (pa != NULL) {
  134.                 memset(pa, 0, sizeof(asarray));
  135.                 *ppa = pa;
  136.                 return TRUE;
  137.         }
  138.         return FALSE;
  139. }
  140. void
  141. asarray_destroy(asarray **ppa)
  142. {
  143.         asarray    *pa;
  144.         const char *key;
  145.         pa = *ppa;
  146.         ASSERT(pa != NULL);
  147.         while ((key = asarray_get_key_no(pa, 0)) != NULL) {
  148.                 asarray_remove(pa, key);
  149.         }
  150.         xfree(pa);
  151.         *ppa = NULL;
  152.         xmemchk();
  153. }