hashtbl.h
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:6k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
  2. /*
  3.  * The contents of this file are subject to the Mozilla Public
  4.  * License Version 1.1 (the "License"); you may not use this file
  5.  * except in compliance with the License. You may obtain a copy of
  6.  * the License at http://www.mozilla.org/MPL/
  7.  * 
  8.  * Software distributed under the License is distributed on an "AS
  9.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  10.  * implied. See the License for the specific language governing
  11.  * rights and limitations under the License.
  12.  * 
  13.  * The Original Code is the Netscape security libraries.
  14.  * 
  15.  * The Initial Developer of the Original Code is Netscape
  16.  * Communications Corporation.  Portions created by Netscape are 
  17.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  18.  * Rights Reserved.
  19.  * 
  20.  * Contributor(s):
  21.  * 
  22.  * Alternatively, the contents of this file may be used under the
  23.  * terms of the GNU General Public License Version 2 or later (the
  24.  * "GPL"), in which case the provisions of the GPL are applicable 
  25.  * instead of those above.  If you wish to allow use of your 
  26.  * version of this file only under the terms of the GPL and not to
  27.  * allow others to use your version of this file under the MPL,
  28.  * indicate your decision by deleting the provisions above and
  29.  * replace them with the notice and other provisions required by
  30.  * the GPL.  If you do not delete the provisions above, a recipient
  31.  * may use your version of this file under either the MPL or the
  32.  * GPL.
  33.  */
  34. #ifndef __SSM_HASHTBL_H__
  35. #define __SSM_HASHTBL_H__
  36. #include "nspr.h"
  37. #include "prtypes.h"
  38. #include "prmem.h"
  39. #include "seccomon.h"
  40. #include "secitem.h"
  41. #include "ssmdefs.h"
  42. /* It's a cheap method of hashing; we use the lower HASH_USE_LOW_BITS 
  43.    bits of the key to determine what bucket it fits in. 
  44.    Oh, what a hack. */
  45. #define HASH_USE_LOW_BITS 4
  46. #define HASH_NUM_BUCKETS (1 << HASH_USE_LOW_BITS)
  47. typedef PRInt32 SSMHashKey;
  48. struct _ssm_hashbucket
  49. {
  50.     SSMHashKey *m_keys;
  51.     void **m_values;
  52.     PRIntn m_size;
  53.     PRIntn m_allocSize;
  54. };
  55. typedef struct _ssm_hashbucket SSMHashBucket;
  56. struct _ssm_hashtbl 
  57. {
  58.     SSMHashBucket m_buckets[HASH_NUM_BUCKETS];
  59.     PRIntn m_size;
  60.     PRMonitor * m_hashLock;
  61. };
  62. typedef struct _ssm_hashtbl SSMHashTable;
  63. /************************************************************
  64. ** FUNCTION: SSM_HashInsert
  65. ** DESCRIPTION: Insert a new data item keyed by (key) into (hash).
  66. ** INPUTS:
  67. **   hash
  68. **     The hash into which the item is to be inserted.
  69. **   key
  70. **     The key used to store the item.
  71. **   value
  72. **     The item to be inserted.
  73. ** RETURNS:
  74. **   If successful, returns PR_SUCCESS.
  75. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  76. **      if it is available.
  77. **
  78. *************************************************************/
  79. SSMStatus SSM_HashInsert(SSMHashTable *hash, SSMHashKey key, void *value);
  80. /************************************************************
  81. ** FUNCTION: SSM_HashFind
  82. ** DESCRIPTION: Get the item whose key is (key).
  83. ** INPUTS:
  84. **   hash
  85. **     The hash from which the item is to be retrieved.
  86. **   key
  87. **     The key used to store the item.
  88. **   value
  89. **     The item to be returned. Set to NULL if no suitable
  90. **     item is found.
  91. ** RETURNS:
  92. **   If successful, returns PR_SUCCESS.
  93. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  94. **      if it is available.
  95. **
  96. *************************************************************/
  97. SSMStatus SSM_HashFind(SSMHashTable *hash, SSMHashKey key, void **value);
  98. /************************************************************
  99. ** FUNCTION: SSM_HashRemove
  100. ** DESCRIPTION: Remove from a hash the item whose key is (key).
  101. ** INPUTS:
  102. **   hash
  103. **     The hash from which the item is to be removed.
  104. **   key
  105. **     The key used to store the item.
  106. **   value
  107. **     The value removed from the hash.
  108. ** RETURNS:
  109. **   If successful, returns PR_SUCCESS.
  110. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  111. **      if it is available.
  112. **
  113. *************************************************************/
  114. SSMStatus SSM_HashRemove(SSMHashTable *hash, SSMHashKey key, void **value);
  115. /************************************************************
  116. ** FUNCTION: SSM_HashKeys
  117. ** DESCRIPTION: Get keys for all items stored in the hash.
  118. ** INPUTS:
  119. **   hash
  120. **     The hash from which the keys are to be returned.
  121. **   keys
  122. **     Returns an array of keys. The array is allocated using PR_Malloc.
  123. **   numKeys
  124. **     Returns the number of keys in the array.
  125. ** RETURNS:
  126. **   If successful, returns PR_SUCCESS.
  127. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  128. **      if it is available.
  129. **
  130. *************************************************************/
  131. SSMStatus SSM_HashKeys(SSMHashTable *hash, SSMHashKey **keys, PRIntn *numKeys);
  132. /************************************************************
  133. ** FUNCTION: SSM_HashCount
  134. ** DESCRIPTION: Returns a count of the number of items in the hash.
  135. ** INPUTS:
  136. **   hash
  137. **     The hash to be counted.
  138. **   numItems
  139. **     Returns the number of items in the hash.
  140. ** RETURNS:
  141. **   If successful, returns PR_SUCCESS.
  142. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  143. **      if it is available.
  144. **
  145. *************************************************************/
  146. SSMStatus SSM_HashCount(SSMHashTable *hash, PRIntn *numItems);
  147. /************************************************************
  148. ** FUNCTION: SSM_HashDestroy
  149. ** DESCRIPTION: Destroy a hash. Items in the hash are not freed.
  150. ** INPUTS:
  151. **   hash
  152. **     The hash to be destroyed.
  153. ** RETURNS:
  154. **   If successful, returns PR_SUCCESS.
  155. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  156. **      if it is available.
  157. **
  158. *************************************************************/
  159. SSMStatus SSM_HashDestroy(SSMHashTable *hash);
  160. /************************************************************
  161. ** FUNCTION: SSM_HashCreate
  162. ** DESCRIPTION: Create and initialize a hash.
  163. p** INPUTS:
  164. **   hash
  165. **     Returns the newly created hash.
  166. ** RETURNS:
  167. **   If successful, returns PR_SUCCESS.
  168. **   If failed, returns either PR_FAILURE or the underlying NSPR error,
  169. **      if it is available.
  170. **
  171. *************************************************************/
  172. SSMStatus SSM_HashCreate(SSMHashTable **hash);
  173. #endif /* __SSM_HASHTBL_H__ */