@file dictionary.c
@author N. Devillard
@date Sep 2007
- @version $Revision: 1.27 $
@brief Implements a dictionary for string variables.
This module implements a simple dictionary object, i.e. a list
/*--------------------------------------------------------------------------*/
/*
- $Id: dictionary.c,v 1.27 2007-11-23 21:39:18 ndevilla Exp $
- $Revision: 1.27 $
*/
/*---------------------------------------------------------------------------
Includes
---------------------------------------------------------------------------*/
-#include "dictionary.h"
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#include <atalk/dictionary.h>
+#include <atalk/compat.h>
#include <stdio.h>
#include <stdlib.h>
Private functions
---------------------------------------------------------------------------*/
+#define MAXKEYSIZE 1024
+static char *makekey(const char *section, const char *entry)
+{
+ static char buf[MAXKEYSIZE];
+
+ strlcpy(buf, section, MAXKEYSIZE);
+ if (entry) {
+ strlcat(buf, ":", MAXKEYSIZE);
+ strlcat(buf, entry, MAXKEYSIZE);
+ }
+
+ return buf;
+}
+
/* Doubles the allocated size associated to a pointer */
/* 'size' is the current allocated size. */
static void * mem_double(void * ptr, int size)
by comparing the key itself in last resort.
*/
/*--------------------------------------------------------------------------*/
-unsigned dictionary_hash(char * key)
+unsigned atalkdict_hash(char * key)
{
int len ;
unsigned hash ;
dictionary, give size=0.
*/
/*--------------------------------------------------------------------------*/
-dictionary * dictionary_new(int size)
+dictionary * atalkdict_new(int size)
{
dictionary * d ;
Deallocate a dictionary object and all memory associated to it.
*/
/*--------------------------------------------------------------------------*/
-void dictionary_del(dictionary * d)
+void atalkdict_del(dictionary * d)
{
int i ;
dictionary object, you should not try to free it or modify it.
*/
/*--------------------------------------------------------------------------*/
-char * dictionary_get(dictionary * d, char * key, char * def)
+const char * atalkdict_get(const dictionary * d, const char *section, const char * key, const char * def)
{
unsigned hash ;
int i ;
- hash = dictionary_hash(key);
+ hash = atalkdict_hash(makekey(section, key));
for (i=0 ; i<d->size ; i++) {
if (d->key[i]==NULL)
continue ;
/* Compare hash */
if (hash==d->hash[i]) {
/* Compare string, to avoid hash collisions */
- if (!strcmp(key, d->key[i])) {
+ if (!strcmp(makekey(section, key), d->key[i])) {
return d->val[i] ;
}
}
or the key are considered as errors: the function will return immediately
in such a case.
- Notice that if you dictionary_set a variable to NULL, a call to
- dictionary_get will return a NULL value: the variable will be found, and
+ Notice that if you atalkdict_set a variable to NULL, a call to
+ atalkdict_get will return a NULL value: the variable will be found, and
its value (NULL) is returned. In other words, setting the variable
content to NULL is equivalent to deleting the variable from the
dictionary. It is not possible (in this implementation) to have a key in
This function returns non-zero in case of failure.
*/
/*--------------------------------------------------------------------------*/
-int dictionary_set(dictionary * d, char * key, char * val)
+int atalkdict_set(dictionary * d, char *section, char * key, char * val)
{
int i ;
unsigned hash ;
- if (d==NULL || key==NULL) return -1 ;
+ if (d==NULL || section==NULL) return -1 ;
/* Compute hash for this key */
- hash = dictionary_hash(key) ;
+ hash = atalkdict_hash(makekey(section, key));
/* Find if value is already in dictionary */
if (d->n>0) {
for (i=0 ; i<d->size ; i++) {
if (d->key[i]==NULL)
continue ;
if (hash==d->hash[i]) { /* Same hash value */
- if (!strcmp(key, d->key[i])) { /* Same key */
+ if (!strcmp(makekey(section, key), d->key[i])) { /* Same key */
/* Found a value: modify and return */
if (d->val[i]!=NULL)
free(d->val[i]);
}
}
/* Copy key */
- d->key[i] = xstrdup(key);
+ d->key[i] = xstrdup(makekey(section, key));
d->val[i] = val ? xstrdup(val) : NULL ;
d->hash[i] = hash;
d->n ++ ;
key cannot be found.
*/
/*--------------------------------------------------------------------------*/
-void dictionary_unset(dictionary * d, char * key)
+void atalkdict_unset(dictionary * d, char *section, char * key)
{
unsigned hash ;
int i ;
return;
}
- hash = dictionary_hash(key);
+ hash = atalkdict_hash(makekey(section, key));
for (i=0 ; i<d->size ; i++) {
if (d->key[i]==NULL)
continue ;
/* Compare hash */
if (hash==d->hash[i]) {
/* Compare string, to avoid hash collisions */
- if (!strcmp(key, d->key[i])) {
+ if (!strcmp(makekey(section, key), d->key[i])) {
/* Found key */
break ;
}
output file pointers.
*/
/*--------------------------------------------------------------------------*/
-void dictionary_dump(dictionary * d, FILE * out)
+void atalkdict_dump(dictionary * d, FILE * out)
{
int i ;
}
return ;
}
-
-
-/* Test code */
-#ifdef TESTDIC
-#define NVALS 20000
-int main(int argc, char *argv[])
-{
- dictionary * d ;
- char * val ;
- int i ;
- char cval[90] ;
-
- /* Allocate dictionary */
- printf("allocating...\n");
- d = dictionary_new(0);
-
- /* Set values in dictionary */
- printf("setting %d values...\n", NVALS);
- for (i=0 ; i<NVALS ; i++) {
- sprintf(cval, "%04d", i);
- dictionary_set(d, cval, "salut");
- }
- printf("getting %d values...\n", NVALS);
- for (i=0 ; i<NVALS ; i++) {
- sprintf(cval, "%04d", i);
- val = dictionary_get(d, cval, DICT_INVALID_KEY);
- if (val==DICT_INVALID_KEY) {
- printf("cannot get value for key [%s]\n", cval);
- }
- }
- printf("unsetting %d values...\n", NVALS);
- for (i=0 ; i<NVALS ; i++) {
- sprintf(cval, "%04d", i);
- dictionary_unset(d, cval);
- }
- if (d->n != 0) {
- printf("error deleting values\n");
- }
- printf("deallocating...\n");
- dictionary_del(d);
- return 0 ;
-}
-#endif
-/* vim: set ts=4 et sw=4 tw=75 */