mirror of
https://github.com/lxsang/ant-http
synced 2024-11-14 15:58:22 +01:00
139 lines
3.2 KiB
C
139 lines
3.2 KiB
C
#include "dictionary.h"
|
|
|
|
dictionary dict()
|
|
{
|
|
dictionary d = (dictionary)malloc(HASHSIZE*sizeof(association));
|
|
for(int i=0; i< HASHSIZE;i++)
|
|
d[i] = NULL;
|
|
return d;
|
|
}
|
|
unsigned hash(const char* key)
|
|
{
|
|
unsigned hashval;
|
|
for (hashval = 0; *key != '\0'; key++)
|
|
hashval = *key + 31 * hashval;
|
|
return hashval % HASHSIZE;
|
|
}
|
|
association dlookup(dictionary dic,const char* key)
|
|
{
|
|
association np;
|
|
if(dic == NULL) return NULL;
|
|
for (np = dic[hash(key)]; np != NULL; np = np->next)
|
|
{
|
|
if(!np || !np->key)
|
|
{
|
|
return NULL;
|
|
}
|
|
if (strcmp(key, np->key) == 0)
|
|
return np; /* found */
|
|
}
|
|
return NULL; /* not found */
|
|
}
|
|
association __put_el_with_key(dictionary dic, const char* key)
|
|
{
|
|
association np;
|
|
unsigned hashval;
|
|
if(dic == NULL) return NULL;
|
|
if ((np = dlookup(dic,key)) == NULL) { /* not found */
|
|
np = (association) malloc(sizeof(*np));
|
|
if (np == NULL || (np->key = strdup(key)) == NULL)
|
|
return NULL;
|
|
hashval = hash(key);
|
|
np->next = dic[hashval];
|
|
dic[hashval] = np;
|
|
}
|
|
return np;
|
|
}
|
|
association dput(dictionary dic,const char* key, const char* value)
|
|
{
|
|
if(IS_INT(value))
|
|
return dput_i(dic,key,atoi(value));
|
|
else if(IS_FLOAT(value))
|
|
return dput_f(dic,key,atof(value));
|
|
else
|
|
return dput_s(dic,key,value);
|
|
}
|
|
association dput_s(dictionary dic,const char* key, const char* value)
|
|
{
|
|
association np = __put_el_with_key(dic,key);
|
|
if(np == NULL) return NULL;
|
|
if(value == NULL) np->value.s="";
|
|
else if ((np->value.s = strdup(value)) == NULL)
|
|
return NULL;
|
|
return np;
|
|
}
|
|
association dput_i(dictionary dic,const char* key, int value)
|
|
{
|
|
association np = __put_el_with_key(dic,key);
|
|
if(np == NULL) return NULL;
|
|
np->value.i = value;
|
|
return np;
|
|
}
|
|
association dput_f(dictionary dic,const char* key, float value)
|
|
{
|
|
association np = __put_el_with_key(dic,key);
|
|
if(np == NULL) return NULL;
|
|
np->value.f = value;
|
|
return np;
|
|
}
|
|
association dput_p(dictionary dic,const char* key, void* value)
|
|
{
|
|
association np = __put_el_with_key(dic,key);
|
|
if(np == NULL) return NULL;
|
|
np->value.p = value;
|
|
return np;
|
|
}
|
|
int dremove(dictionary dic, const char* key)
|
|
{
|
|
if(dic == NULL) return 0;
|
|
int hashval = hash(key);
|
|
association np = dic[hashval];
|
|
if(np!=NULL && strcmp(key,np->key)==0)
|
|
{
|
|
dic[hashval] = np->next;
|
|
return 1;
|
|
}
|
|
for (np= dic[hashval]; np != NULL; np = np->next)
|
|
if (np->next!=NULL&&strcmp(key, np->next->key) == 0)
|
|
{
|
|
np->next = np->next->next; /* found */
|
|
return 1;
|
|
}
|
|
return 0; /* not found */
|
|
|
|
}
|
|
/**
|
|
* Get the string data by key
|
|
* @param dic the dictionary
|
|
* @param key @
|
|
* @return the string value
|
|
*/
|
|
char* dvalue(dictionary dic,const char* key)
|
|
{
|
|
association as = dlookup(dic,key);
|
|
if(as == NULL) return NULL;
|
|
return as->value.s;
|
|
}
|
|
|
|
int dvalue_i(dictionary dic, const char* key)
|
|
{
|
|
association as = dlookup(dic,key);
|
|
if(as == NULL) return 0;
|
|
return as->value.i;
|
|
}
|
|
float dvalue_f(dictionary dic, const char* key)
|
|
{
|
|
association as = dlookup(dic,key);
|
|
if(as == NULL) return 0;
|
|
return as->value.f;
|
|
}
|
|
void* dvalue_p(dictionary dic, const char* key)
|
|
{
|
|
association as = dlookup(dic,key);
|
|
if(as == NULL) return NULL;
|
|
return as->value.p;
|
|
}
|
|
|
|
void freedict(dictionary dic){free(dic);}
|
|
|