#ifndef SDCCHASHT_H
#define SDCCHASHT_H
-#ifdef _NO_GC
-
-#include <stdlib.h>
-#define GC_malloc malloc
-#define GC_free free
-#define GC_realloc realloc
-#define GC_malloc_atomic malloc
-
-#else
-
-#include "./gc/gc.h"
-
-#endif
-
-#ifndef ALLOC
-
-#define ALLOC(x,sz) if (!(x = GC_malloc(sz))) \
- { \
- fprintf(stderr,"out of virtual memory %s , %d",__FILE__,__LINE__);\
- exit (1); \
- }
-
-#define ALLOC_ATOMIC(x,sz) if (!(x = GC_malloc_atomic(sz))) \
- { \
- fprintf(stderr,"out of virtual memory %s , %d",__FILE__,__LINE__);\
- exit (1); \
- }
-
-
-
-#endif
+#include "SDCCalloc.h"
/* hashtable item */
typedef struct hashtItem
{
- int key ;
- void *item ;
+ int key;
+ /* Pointer to the key that was hashed for key.
+ Used for a hash table with unique keys. */
+ void *pkey;
+ void *item;
struct hashtItem *next ;
} hashtItem ;
int nItems ;
} hTab ;
-
-
-enum {
+typedef enum {
DELETE_CHAIN = 1,
- DELETE_ITEM };
+ DELETE_ITEM
+} DELETE_ACTION;
/*-----------------------------------------------------------------*/
/* hashtable related functions */
hTab *newHashTable (int);
-void hTabAddItem (hTab **, int , void * );
-void hTabDeleteItem (hTab **, int ,
- void *, int ,
- int (*compareFunc)(void *,void *));
+void hTabAddItem (hTab **, int key, void *item);
+/** Adds a new item to the hash table.
+ @param h The hash table to add to
+ @param key A hashed version of pkey
+ @param pkey A copy of the key. Owned by the
+ hash table after this function.
+ @param item Value for this key.
+*/
+void hTabAddItemLong(hTab **h, int key, void *pkey, void *item);
+/** Finds a item by exact key.
+ Searches all items in the key 'key' for a key that
+ according to 'compare' matches pkey.
+ @param h The hash table to search
+ @param key A hashed version of pkey.
+ @param pkey The key to search for
+ @param compare Returns 0 if pkey == this
+*/
+void * hTabFindByKey(hTab *h, int key, const void *pkey, int (*compare)(const void *, const void *));
+/** Deletes an item with the exact key 'pkey'
+ @see hTabFindByKey
+*/
+int hTabDeleteByKey(hTab **h, int key, const void *pkey, int (*compare)(const void *, const void *));
+
+void hTabDeleteItem (hTab **, int key,
+ const void *item, DELETE_ACTION action,
+ int (*compareFunc)(const void *,const void *));
int hTabIsInTable (hTab *, int , void * ,
int (*compareFunc)(void *,void *));
void *hTabFirstItem (hTab *, int *);
void *hTabNextItemWK (hTab *htab );
void hTabClearAll (hTab *htab);
+/** Find the first item that either is 'item' or which
+ according to 'compareFunc' is the same as item.
+ @param compareFunc strcmp like compare function, may be null.
+*/
+void *hTabFindItem(hTab *htab, int key,
+ void *item, int (*compareFunc)(void *,void *));
+
+void shash_add(hTab **h, const char *szKey, const char *szValue);
+const char *shash_find(hTab *h, const char *szKey);
#endif