db_dict.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:5k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxtypes.h"
  36. // #include "hlxclib/stdio.h"
  37. #include "hlxclib/string.h"
  38. #include <ctype.h>
  39. #include "hxassert.h"
  40. #include "debug.h"
  41. #include "db_misc.h"
  42. #ifdef _SYMBIAN
  43. //XXXgfw Wow, symbian's unistd.h #defines remove to be unlink.
  44. //Very uncool.
  45. #undef remove
  46. #endif
  47. #include "watchlst.h"
  48. #include "property.h"
  49. #include "db_dict_abs.h"
  50. #include "db_dict.h"
  51. #include "hxstrutl.h"
  52. #include "hxheap.h"
  53. #ifdef _DEBUG
  54. #undef HX_THIS_FILE
  55. static const char HX_THIS_FILE[] = __FILE__;
  56. #endif
  57. // Chris Torek's hash function
  58. UINT32
  59. hash_torek(const char *key)
  60. {
  61.     UINT32 h = 0x31fe;
  62.     while (*key)
  63. h = h*33 + *key++;
  64.     return h;
  65. }
  66. HX_RESULT
  67. DB_dict::init()
  68. {
  69.     _table = new DB_node*[_size];
  70.     if(!_table)
  71.     {
  72.         return HXR_OUTOFMEMORY;
  73.     }
  74.     memset(_table, 0, HX_SAFESIZE_T(sizeof(void *) * _size));
  75.     return HXR_OK;
  76. }
  77. void
  78. DB_dict::strtolower(char* str)
  79. {
  80.     for (; *str != 0; str++)
  81. if (isupper(*str))
  82.     *str = tolower(*str);
  83. }
  84. // Need func ptr, in case strcasecmp is a macro
  85. static int FuncStrcasecmp(const char* a, const char* b)
  86. {
  87.     return strcasecmp(a,b);
  88. }
  89. DB_dict::DB_dict()
  90.           : DB_implem(0, 16, hash_torek, FuncStrcasecmp)
  91. {
  92.     init();
  93. }
  94. DB_dict::DB_dict(DB_node* parent, Keytype nbuckets,
  95.                Keytype (*hash)(const char*), 
  96.                        int (*compare)(const char*, const char*))
  97.    : DB_implem(parent, nbuckets, hash, compare)
  98. {
  99.     init();
  100.     DPRINTF(D_REGISTRY, ("DB_dict(this(%p)) -- DB_node(parent(%p))n",
  101.     this, parent));
  102. }
  103. DB_dict::~DB_dict()
  104. {
  105.     for (Keytype i = 0; i < _size; i++)
  106.     {
  107. DB_node* nexte;
  108. for (DB_node* e = _table[i]; e != 0; e = nexte)
  109. {
  110.     nexte = e->next;
  111.     delete e->obj;
  112.     delete e;
  113. }
  114.     }
  115.     delete[] _table;
  116. }
  117. Keytype
  118. DB_dict::del(const char * key)
  119. {
  120.     DB_node* e, **ep;
  121.     char* k = (char *)key;
  122.     strtolower(k);
  123.     Keytype h = _hash(k);
  124.     for (ep = &_table[h%_size]; (e = *ep) != 0; ep = &e->next)
  125.     {
  126. if (h != e->hash)
  127.     continue;
  128. *ep = e->next;
  129. delete e->obj;
  130. delete e;
  131. --_count;
  132. return h;
  133.     }
  134.     return 0;       
  135. }
  136. Keytype
  137. DB_dict::del(DB_node* node)
  138. {
  139.     DB_node* e, **ep;
  140.     Keytype h = node->hash;
  141.     for (ep = &_table[h%_size]; (e = *ep) != 0; ep = &e->next)
  142.     {
  143. if (node != e)
  144.     continue;
  145. *ep = e->next;
  146. delete e->obj;
  147. delete e;
  148. --_count;
  149. return h;
  150.     }
  151.     return 0;       
  152. }
  153. DB_node *
  154. DB_dict::next(DB_node * e)
  155. {
  156.     if (e->next)
  157. return e->next;
  158.     Keytype h = e->hash % _size;
  159.     for (Keytype i = h+1; i < _size; i++)
  160. if (_table[i] != 0)
  161.     return _table[i];
  162.     return 0;
  163. }
  164. DB_node *    
  165. DB_dict::add(char * key_str, Property * new_p)
  166. {
  167.     strtolower(key_str);
  168.     Keytype h = _hash(key_str);
  169.     DB_node* e, *nexte;
  170.     _count++;
  171.     // Grow the table if 66% full
  172.     Keytype nb = _count*3;
  173.     if (nb > _size*2)
  174.     {
  175. DB_node** tab = new DB_node*[nb];
  176.         if( !tab )
  177.         {
  178.             _count--;
  179.             return NULL;
  180.         }
  181. Keytype i;
  182. memset(tab, 0, HX_SAFESIZE_T(sizeof(void *) * nb));
  183. for (i = 0; i < _size; i++)
  184. {
  185.     for (e = _table[i]; e != 0; e = nexte)
  186.     {
  187. nexte = e->next;
  188. e->next = tab[e->hash%nb];
  189. tab[e->hash%nb] = e;
  190.     }
  191. }
  192. delete[] _table;
  193. _table = tab;
  194. _size = nb;
  195.     }
  196.     e =  new DB_node;
  197.     if (e)
  198.     {
  199. e->next = _table[h%_size];
  200. e->hash = h;
  201. e->obj = new_p;
  202. e->owner_db = this;
  203. _table[h%_size] = e;
  204. return e;
  205.     }
  206.     else
  207. return 0;
  208. }
  209. DB_node *  
  210. DB_dict::find(char * key_str)
  211. {
  212.     char* k = key_str;
  213.     strtolower(k);
  214.     Keytype h = _hash(k);
  215.     for (DB_node* e = _table[h%_size]; e != 0; e = e->next)
  216. if (strcasecmp(k, e->get_data()->get_key_str()) == 0)
  217.     return e;
  218.     return 0;
  219. }