summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2013-08-10 09:35:06 +0200
committerSebastien Helleu <flashcode@flashtux.org>2013-08-10 09:35:06 +0200
commitd12c9efdbc0009b626c34c740225b8fc75b75b21 (patch)
tree932464b0e8bffdd0f43e63964ccaef2d8d15a3bc
parente407c41c5c784465cc263d228520a68a1c0044ad (diff)
downloadweechat-d12c9efdbc0009b626c34c740225b8fc75b75b21.zip
core: change type of hashtable key hash to unsigned long, return item pointer in functions hashtable_set(_with_size)
The key hash has been changed from unsigned int to unsigned long, and now the callback can return any value (not only between 0 and size-1), the modulo is computed after the call to the callback by the hashtable functions. Functions hashtable_set and hashtable_set_with_size were returning 1 if OK, 0 if error. Now they return pointer to hashtable item, or NULL if error.
-rw-r--r--doc/en/weechat_plugin_api.en.txt22
-rw-r--r--doc/fr/weechat_plugin_api.fr.txt22
-rw-r--r--doc/it/weechat_plugin_api.it.txt26
-rw-r--r--src/core/wee-hashtable.c69
-rw-r--r--src/core/wee-hashtable.h25
-rw-r--r--src/plugins/weechat-plugin.h19
6 files changed, 104 insertions, 79 deletions
diff --git a/doc/en/weechat_plugin_api.en.txt b/doc/en/weechat_plugin_api.en.txt
index fbc9c85c3..0f6f5410e 100644
--- a/doc/en/weechat_plugin_api.en.txt
+++ b/doc/en/weechat_plugin_api.en.txt
@@ -3281,8 +3281,8 @@ Prototype:
struct t_hashtable *weechat_hashtable_new (int size,
const char *type_keys,
const char *type_values,
- unsigned int (*callback_hash_key)(struct t_hashtable *hashtable,
- const void *key),
+ unsigned long (*callback_hash_key)(struct t_hashtable *hashtable,
+ const void *key),
int (*callback_keycmp)(struct t_hashtable *hashtable,
const void *key1,
const void *key2));
@@ -3343,7 +3343,7 @@ This function is not available in scripting API.
weechat_hashtable_set_with_size
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-_New in version 0.3.3._
+_New in version 0.3.3, updated in 0.4.2._
Add or update item in a hashtable with size for key and value.
@@ -3351,9 +3351,9 @@ Prototype:
[source,C]
----------------------------------------
-int weechat_hashtable_set_with_size (struct t_hashtable *hashtable,
- const void *key, int key_size,
- const void *value, int value_size);
+struct t_hashtable_item *weechat_hashtable_set_with_size (struct t_hashtable *hashtable,
+ const void *key, int key_size,
+ const void *value, int value_size);
----------------------------------------
Arguments:
@@ -3368,7 +3368,7 @@ Arguments:
Return value:
-* 1 if ok, 0 if error
+* pointer to item created/updated, NULL if error
C example:
@@ -3384,7 +3384,7 @@ This function is not available in scripting API.
weechat_hashtable_set
^^^^^^^^^^^^^^^^^^^^^
-_New in version 0.3.3._
+_New in version 0.3.3, updated in 0.4.2._
Add or update item in a hashtable.
@@ -3392,8 +3392,8 @@ Prototype:
[source,C]
----------------------------------------
-int weechat_hashtable_set (struct t_hashtable *hashtable,
- const void *key, const void *value);
+struct t_hashtable_item *weechat_hashtable_set (struct t_hashtable *hashtable,
+ const void *key, const void *value);
----------------------------------------
Arguments:
@@ -3404,7 +3404,7 @@ Arguments:
Return value:
-* 1 if ok, 0 if error
+* pointer to item created/updated, NULL if error
C example:
diff --git a/doc/fr/weechat_plugin_api.fr.txt b/doc/fr/weechat_plugin_api.fr.txt
index 188cb5cf0..31598a1dc 100644
--- a/doc/fr/weechat_plugin_api.fr.txt
+++ b/doc/fr/weechat_plugin_api.fr.txt
@@ -3320,8 +3320,8 @@ Prototype :
struct t_hashtable *weechat_hashtable_new (int size,
const char *type_keys,
const char *type_values,
- unsigned int (*callback_hash_key)(struct t_hashtable *hashtable,
- const void *key),
+ unsigned long (*callback_hash_key)(struct t_hashtable *hashtable,
+ const void *key),
int (*callback_keycmp)(struct t_hashtable *hashtable,
const void *key1,
const void *key2));
@@ -3384,7 +3384,7 @@ Cette fonction n'est pas disponible dans l'API script.
weechat_hashtable_set_with_size
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-_Nouveau dans la version 0.3.3._
+_Nouveau dans la version 0.3.3, mis à jour dans la 0.4.2._
Ajoute ou met à jour une entrée dans une hashtable avec une taille pour la clé
et la valeur.
@@ -3393,9 +3393,9 @@ Prototype :
[source,C]
----------------------------------------
-int weechat_hashtable_set_with_size (struct t_hashtable *hashtable,
- const void *key, int key_size,
- const void *value, int value_size);
+struct t_hashtable_item *weechat_hashtable_set_with_size (struct t_hashtable *hashtable,
+ const void *key, int key_size,
+ const void *value, int value_size);
----------------------------------------
Paramètres :
@@ -3410,7 +3410,7 @@ Paramètres :
Valeur de retour :
-* 1 si ok, 0 en cas d'erreur
+* pointeur vers l'item créé/mis à jour, NULL en cas d'erreur
Exemple en C :
@@ -3426,7 +3426,7 @@ Cette fonction n'est pas disponible dans l'API script.
weechat_hashtable_set
^^^^^^^^^^^^^^^^^^^^^
-_Nouveau dans la version 0.3.3._
+_Nouveau dans la version 0.3.3, mis à jour dans la 0.4.2._
Ajoute ou met à jour une entrée dans la hashtable.
@@ -3434,8 +3434,8 @@ Prototype :
[source,C]
----------------------------------------
-int weechat_hashtable_set (struct t_hashtable *hashtable,
- const void *key, const void *value);
+struct t_hashtable_item *weechat_hashtable_set (struct t_hashtable *hashtable,
+ const void *key, const void *value);
----------------------------------------
Paramètres :
@@ -3446,7 +3446,7 @@ Paramètres :
Valeur de retour :
-* 1 si ok, 0 en cas d'erreur
+* pointeur vers l'item créé/mis à jour, NULL en cas d'erreur
Exemple en C :
diff --git a/doc/it/weechat_plugin_api.it.txt b/doc/it/weechat_plugin_api.it.txt
index 3e1955738..77a811ff1 100644
--- a/doc/it/weechat_plugin_api.it.txt
+++ b/doc/it/weechat_plugin_api.it.txt
@@ -3284,8 +3284,8 @@ Prototipo:
struct t_hashtable *weechat_hashtable_new (int size,
const char *type_keys,
const char *type_values,
- unsigned int (*callback_hash_key)(struct t_hashtable *hashtable,
- const void *key),
+ unsigned long (*callback_hash_key)(struct t_hashtable *hashtable,
+ const void *key),
int (*callback_keycmp)(struct t_hashtable *hashtable,
const void *key1,
const void *key2));
@@ -3348,7 +3348,8 @@ Questa funzione non è disponibile nelle API per lo scripting.
weechat_hashtable_set_with_size
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-_Novità nella versione 0.3.3._
+// TRANSLATION MISSING
+_Novità nella versione 0.3.3, updated in 0.4.2._
Aggiunge o aggiorna un elemento nella tabella hash con la dimensione per la
chiave ed il valore.
@@ -3357,9 +3358,9 @@ Prototipo:
[source,C]
----------------------------------------
-int weechat_hashtable_set_with_size (struct t_hashtable *hashtable,
- const void *key, int key_size,
- const void *value, int value_size);
+struct t_hashtable_item *weechat_hashtable_set_with_size (struct t_hashtable *hashtable,
+ const void *key, int key_size,
+ const void *value, int value_size);
----------------------------------------
Argomenti:
@@ -3374,7 +3375,8 @@ Argomenti:
Valore restituito:
-* 1 se ok, 0 in caso di errore
+// TRANSLATION MISSING
+* pointer to item created/updated, NULL if error
Esempio in C:
@@ -3390,7 +3392,8 @@ Questa funzione non è disponibile nelle API per lo scripting.
weechat_hashtable_set
^^^^^^^^^^^^^^^^^^^^^
-_Novità nella versione 0.3.3._
+// TRANSLATION MISSING
+_Novità nella versione 0.3.3, updated in 0.4.2._
Aggiunge o aggiorna un elemento nella tabella hash.
@@ -3398,8 +3401,8 @@ Prototipo:
[source,C]
----------------------------------------
-int weechat_hashtable_set (struct t_hashtable *hashtable,
- const void *key, const void *value);
+struct t_hashtable_item *weechat_hashtable_set (struct t_hashtable *hashtable,
+ const void *key, const void *value);
----------------------------------------
Argomenti:
@@ -3410,7 +3413,8 @@ Argomenti:
Valore restituito:
-* 1 se ok, 0 in caso di errore
+// TRANSLATION MISSING
+* pointer to item created/updated, NULL if error
Esempio in C:
diff --git a/src/core/wee-hashtable.c b/src/core/wee-hashtable.c
index 5f2835f0a..b9e677a2a 100644
--- a/src/core/wee-hashtable.c
+++ b/src/core/wee-hashtable.c
@@ -67,16 +67,36 @@ hashtable_get_type (const char *type)
}
/*
+ * Hashes a string using a variant of djb2 hash.
+ *
+ * Returns the hash of the string.
+ */
+
+unsigned long
+hashtable_hash_key_djb2 (const char *string)
+{
+ unsigned long hash;
+ const char *ptr_string;
+
+ hash = 5381;
+ for (ptr_string = string; ptr_string[0]; ptr_string++)
+ {
+ hash ^= (hash << 5) + (hash >> 2) + (int)(ptr_string[0]);
+ }
+
+ return hash;
+}
+
+/*
* Hashes a key (default callback).
*
- * Returns an unsigned integer between 0 and size-1.
+ * Returns the hash of the key, depending on the type.
*/
-unsigned int
+unsigned long
hashtable_hash_key_default_cb (struct t_hashtable *hashtable, const void *key)
{
unsigned long hash;
- const char *ptr_key;
hash = 0;
@@ -86,12 +106,7 @@ hashtable_hash_key_default_cb (struct t_hashtable *hashtable, const void *key)
hash = (unsigned long)(*((int *)key));
break;
case HASHTABLE_STRING:
- /* variant of djb2 hash */
- hash = 5381;
- for (ptr_key = (const char *)key; ptr_key[0]; ptr_key++)
- {
- hash ^= (hash << 5) + (hash >> 2) + (int)(ptr_key[0]);
- }
+ hash = hashtable_hash_key_djb2 ((const char *)key);
break;
case HASHTABLE_POINTER:
hash = (unsigned long)((void *)key);
@@ -105,7 +120,7 @@ hashtable_hash_key_default_cb (struct t_hashtable *hashtable, const void *key)
break;
}
- return hash % hashtable->size;
+ return hash;
}
/*
@@ -352,28 +367,26 @@ hashtable_free_value (struct t_hashtable *hashtable,
*
* The size arguments are used only for type "buffer".
*
- * Returns:
- * 1: OK
- * 0: error
+ * Returns pointer to item created/updated, NULL if error.
*/
-int
+struct t_hashtable_item *
hashtable_set_with_size (struct t_hashtable *hashtable,
const void *key, int key_size,
const void *value, int value_size)
{
- unsigned int hash;
+ unsigned long hash;
struct t_hashtable_item *ptr_item, *pos_item, *new_item;
if (!hashtable || !key
|| ((hashtable->type_keys == HASHTABLE_BUFFER) && (key_size <= 0))
|| ((hashtable->type_values == HASHTABLE_BUFFER) && (value_size <= 0)))
{
- return 0;
+ return NULL;
}
/* search position for item in hashtable */
- hash = hashtable->callback_hash_key (hashtable, key);
+ hash = hashtable->callback_hash_key (hashtable, key) % hashtable->size;
pos_item = NULL;
for (ptr_item = hashtable->htable[hash];
ptr_item
@@ -390,13 +403,13 @@ hashtable_set_with_size (struct t_hashtable *hashtable,
hashtable_alloc_type (hashtable->type_values,
value, value_size,
&ptr_item->value, &ptr_item->value_size);
- return 1;
+ return ptr_item;
}
/* create new item */
new_item = malloc (sizeof (*new_item));
if (!new_item)
- return 0;
+ return NULL;
/* set key and value */
hashtable_alloc_type (hashtable->type_keys,
@@ -428,7 +441,7 @@ hashtable_set_with_size (struct t_hashtable *hashtable,
hashtable->items_count++;
- return 1;
+ return new_item;
}
/*
@@ -437,12 +450,10 @@ hashtable_set_with_size (struct t_hashtable *hashtable,
* Note: this function can be called *only* if key AND value are *not* of type
* "buffer".
*
- * Returns:
- * 1: OK
- * 0: error
+ * Returns pointer to item created/updated, NULL if error.
*/
-int
+struct t_hashtable_item *
hashtable_set (struct t_hashtable *hashtable,
const void *key, const void *value)
{
@@ -458,15 +469,15 @@ hashtable_set (struct t_hashtable *hashtable,
struct t_hashtable_item *
hashtable_get_item (struct t_hashtable *hashtable, const void *key,
- unsigned int *hash)
+ unsigned long *hash)
{
- unsigned int key_hash;
+ unsigned long key_hash;
struct t_hashtable_item *ptr_item;
if (!hashtable || !key)
return NULL;
- key_hash = hashtable->callback_hash_key (hashtable, key);
+ key_hash = hashtable->callback_hash_key (hashtable, key) % hashtable->size;
if (hash)
*hash = key_hash;
for (ptr_item = hashtable->htable[key_hash];
@@ -1098,7 +1109,7 @@ hashtable_add_to_infolist (struct t_hashtable *hashtable,
void
hashtable_remove_item (struct t_hashtable *hashtable,
struct t_hashtable_item *item,
- unsigned int hash)
+ unsigned long hash)
{
if (!hashtable || !item)
return;
@@ -1128,7 +1139,7 @@ void
hashtable_remove (struct t_hashtable *hashtable, const void *key)
{
struct t_hashtable_item *ptr_item;
- unsigned int hash;
+ unsigned long hash;
if (!hashtable || !key)
return;
diff --git a/src/core/wee-hashtable.h b/src/core/wee-hashtable.h
index 456368062..40f373879 100644
--- a/src/core/wee-hashtable.h
+++ b/src/core/wee-hashtable.h
@@ -23,8 +23,8 @@
struct t_hashtable;
struct t_infolist_item;
-typedef unsigned int (t_hashtable_hash_key)(struct t_hashtable *hashtable,
- const void *key);
+typedef unsigned long (t_hashtable_hash_key)(struct t_hashtable *hashtable,
+ const void *key);
typedef int (t_hashtable_keycmp)(struct t_hashtable *hashtable,
const void *key1, const void *key2);
typedef void (t_hashtable_free_key)(struct t_hashtable *hashtable,
@@ -40,9 +40,9 @@ typedef void (t_hashtable_map_string)(void *data,
/*
* Hashtable is a structure with an array "htable", each entry is a pointer
- * to a linked list, and it is read with hashed key (as unsigned int).
+ * to a linked list, and it is read with hashed key (as unsigned long).
* Keys with same hashed key are grouped in a linked list pointed by htable.
- * htable is not sorted, linked list is sorted.
+ * The htable is not sorted, the linked list is sorted.
*
* Example of a hashtable with size 8 and 6 items added inside, items are:
* "weechat", "fast", "light", "extensible", "chat", "client"
@@ -112,16 +112,23 @@ struct t_hashtable
/* never asked) */
};
+extern unsigned long hashtable_hash_key_djb2 (const char *string);
extern struct t_hashtable *hashtable_new (int size,
const char *type_keys,
const char *type_values,
t_hashtable_hash_key *hash_key_cb,
t_hashtable_keycmp *keycmp_cb);
-extern int hashtable_set_with_size (struct t_hashtable *hashtable,
- const void *key, int key_size,
- const void *value, int value_size);
-extern int hashtable_set (struct t_hashtable *hashtable, const void *key,
- const void *value);
+extern struct t_hashtable_item *hashtable_set_with_size (struct t_hashtable *hashtable,
+ const void *key,
+ int key_size,
+ const void *value,
+ int value_size);
+extern struct t_hashtable_item *hashtable_set (struct t_hashtable *hashtable,
+ const void *key,
+ const void *value);
+extern struct t_hashtable_item *hashtable_get_item (struct t_hashtable *hashtable,
+ const void *key,
+ unsigned long *hash);
extern void *hashtable_get (struct t_hashtable *hashtable, const void *key);
extern int hashtable_has_key (struct t_hashtable *hashtable, const void *key);
extern void hashtable_map (struct t_hashtable *hashtable,
diff --git a/src/plugins/weechat-plugin.h b/src/plugins/weechat-plugin.h
index d0d672616..654538c05 100644
--- a/src/plugins/weechat-plugin.h
+++ b/src/plugins/weechat-plugin.h
@@ -52,7 +52,7 @@ struct timeval;
* please change the date with current one; for a second change at same
* date, increment the 01, otherwise please keep 01.
*/
-#define WEECHAT_PLUGIN_API_VERSION "20130804-01"
+#define WEECHAT_PLUGIN_API_VERSION "20130810-01"
/* macros for defining plugin infos */
#define WEECHAT_PLUGIN_NAME(__name) \
@@ -323,16 +323,19 @@ struct t_weechat_plugin
struct t_hashtable *(*hashtable_new) (int size,
const char *type_keys,
const char *type_values,
- unsigned int (*callback_hash_key)(struct t_hashtable *hashtable,
- const void *key),
+ unsigned long (*callback_hash_key)(struct t_hashtable *hashtable,
+ const void *key),
int (*callback_keycmp)(struct t_hashtable *hashtable,
const void *key1,
const void *key2));
- int (*hashtable_set_with_size) (struct t_hashtable *hashtable,
- const void *key, int key_size,
- const void *value, int value_size);
- int (*hashtable_set) (struct t_hashtable *hashtable, const void *key,
- const void *value);
+ struct t_hashtable_item *(*hashtable_set_with_size) (struct t_hashtable *hashtable,
+ const void *key,
+ int key_size,
+ const void *value,
+ int value_size);
+ struct t_hashtable_item *(*hashtable_set) (struct t_hashtable *hashtable,
+ const void *key,
+ const void *value);
void *(*hashtable_get) (struct t_hashtable *hashtable, const void *key);
int (*hashtable_has_key) (struct t_hashtable *hashtable, const void *key);
void (*hashtable_map) (struct t_hashtable *hashtable,