X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=gmqcc.h;h=32028c11c7643e6f6ac087ad12e1aa6aa9cef54d;hp=297f73589dfdb9807831044837ebf623beab05f8;hb=b47e3ebccf562b26671247c2e99f4a0f6bc8e969;hpb=d7be99c9dd85978942ebf27c8fd788e0c19b3edf diff --git a/gmqcc.h b/gmqcc.h index 297f735..32028c1 100644 --- a/gmqcc.h +++ b/gmqcc.h @@ -300,7 +300,8 @@ void util_meminfo (); bool util_filexists (const char *); bool util_strupper (const char *); bool util_strdigit (const char *); -char *_util_Estrdup (const char *, const char *, size_t); +char *_util_Estrdup (const char *, const char *, size_t); +char *_util_Estrdup_empty(const char *, const char *, size_t); void util_debug (const char *, const char *, ...); void util_endianswap (void *, size_t, unsigned int); @@ -329,6 +330,7 @@ int util_asprintf (char **ret, const char *fmt, ...); #endif /*! NOTRACK */ #define util_strdup(X) _util_Estrdup((X), __FILE__, __LINE__) +#define util_strdupe(X) _util_Estrdup_empty((X), __FILE__, __LINE__) /* * A flexible vector implementation: all vector pointers contain some @@ -336,7 +338,7 @@ int util_asprintf (char **ret, const char *fmt, ...); * this data is represented in the structure below. Doing this allows * us to use the array [] to access individual elements from the vector * opposed to using set/get methods. - */ + */ typedef struct { size_t allocated; size_t used; @@ -378,14 +380,6 @@ typedef struct hash_table_t { struct hash_node_t **table; } hash_table_t, *ht; -typedef struct hash_set_t { - size_t bits; - size_t mask; - size_t capacity; - size_t *items; - size_t total; -} hash_set_t, *hs; - /* * hashtable implementation: * @@ -417,51 +411,16 @@ typedef struct hash_set_t { * util_htdel(foo); */ hash_table_t *util_htnew (size_t size); +void util_htrem (hash_table_t *ht, void (*callback)(void *data)); void util_htset (hash_table_t *ht, const char *key, void *value); void util_htdel (hash_table_t *ht); size_t util_hthash(hash_table_t *ht, const char *key); void util_htseth(hash_table_t *ht, const char *key, size_t hash, void *value); +void util_htrmh (hash_table_t *ht, const char *key, size_t bin, void (*cb)(void*)); +void util_htrm (hash_table_t *ht, const char *key, void (*cb)(void*)); void *util_htget (hash_table_t *ht, const char *key); void *util_htgeth(hash_table_t *ht, const char *key, size_t hash); - -/* - * hashset implementation: - * This was designed for pointers: you manage the life of the object yourself - * if you do use this for non-pointers please be warned that the object may not - * be valid if the duration of it exceeds (i.e on stack). So you need to allocate - * yourself, or put those in global scope to ensure duration is for the whole - * runtime. - * - * util_hsnew() -- to make a new hashset - * util_hsadd(set, key) -- to add something in the set - * util_hshas(set, key) -- to check if something is in the set - * util_hsrem(set, key) -- to remove something in the set - * util_hsdel(set) -- to delete the set - * - * example of use: - * - * hs foo = util_hsnew(); - * char *bar = "hello blub\n"; - * char *baz = "hello dale\n"; - * - * util_hsadd(foo, bar); - * util_hsadd(foo, baz); - * util_hsrem(foo, baz); - * - * printf("bar %d | baz %d\n", - * util_hshas(foo, bar), - * util_hshad(foo, baz) - * ); - * - * util_hsdel(foo); - */ - -hash_set_t *util_hsnew(void); -int util_hsadd(hash_set_t *, void *); -int util_hshas(hash_set_t *, void *); -int util_hsrem(hash_set_t *, void *); -void util_hsdel(hash_set_t *); /*===================================================================*/ /*============================ file.c ===============================*/