Arthur de Jong

Open Source / Free Software developer

summaryrefslogtreecommitdiffstats
path: root/common/dict.c
diff options
context:
space:
mode:
authorArthur de Jong <arthur@arthurdejong.org>2009-12-13 11:27:33 +0100
committerArthur de Jong <arthur@arthurdejong.org>2009-12-13 11:27:33 +0100
commitef8cc767b201e4798a060282d4a6f280094bb8cc (patch)
tree4f19eae6870321f280959be4b7b24cd0e38d4c2a /common/dict.c
parent7dd703c9af5f8b4a50f056c47588a9e51d4ea681 (diff)
change dict and set API to perform loops with a list of strings instead of loop_first() and loop_next() functions
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-pam-ldapd@1028 ef36b2f9-881f-0410-afb5-c4e39611909c
Diffstat (limited to 'common/dict.c')
-rw-r--r--common/dict.c69
1 files changed, 42 insertions, 27 deletions
diff --git a/common/dict.c b/common/dict.c
index a0f9f35..128321d 100644
--- a/common/dict.c
+++ b/common/dict.c
@@ -2,7 +2,7 @@
dict.c - dictionary functions
This file is part of the nss-pam-ldapd library.
- Copyright (C) 2007, 2008 Arthur de Jong
+ Copyright (C) 2007, 2008, 2009 Arthur de Jong
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@@ -46,9 +46,6 @@
All the keys are copied in a separate linked list of buffers where each new
buffer that is allocated is larger than the previous one. The first buffer
in the linked list is always the current one.
-
- Note that the initial sizes of hashtable and the loadfactor still need to
- be tuned to the use in this application.
*/
/* an entry stores one key/value pair */
@@ -70,8 +67,6 @@ struct dictionary {
int size; /* size of the hashtable */
int num; /* total number of keys stored */
struct dict_entry **table; /* the hashtable */
- int loop_idx; /* for looping */
- struct dict_entry *loop_entry; /* for looping */
};
/* Simple hash function that computes the hash value of a lower-cased
@@ -243,27 +238,47 @@ int dict_put(DICT *dict,const char *key,void *value)
return 0;
}
-void dict_loop_first(DICT *dict)
-{
- dict->loop_idx=0;
- dict->loop_entry=NULL;
-}
-
-const char *dict_loop_next(DICT *dict,const char **key,void **value)
+const char **dict_keys(DICT *dict)
{
+ int i;
struct dict_entry *entry;
- /* find non-empty entry */
- while ( (dict->loop_idx<dict->size) && (dict->loop_entry==NULL) )
- dict->loop_entry=dict->table[dict->loop_idx++];
- if (dict->loop_entry==NULL)
- return NULL; /* no more entries to check */
- /* save current result and go to next entry */
- entry=dict->loop_entry;
- dict->loop_entry=entry->next;
- /* return results */
- if (key!=NULL)
- *key=entry->key;
- if (value!=NULL)
- *value=entry->value;
- return entry->key;
+ char *buf;
+ const char **values;
+ size_t sz;
+ int num;
+ /* figure out how much memory to allocate */
+ num=0;
+ sz=0;
+ for (i=0;i<dict->size;i++)
+ {
+ entry=dict->table[i];
+ while (entry!=NULL)
+ {
+ num++;
+ sz+=strlen(entry->key)+1;
+ entry=entry->next;
+ }
+ }
+ /* allocate the needed memory */
+ buf=(char *)malloc((num+1)*sizeof(char *)+sz);
+ if (buf==NULL)
+ return NULL;
+ values=(const char **)(void *)buf;
+ buf+=(num+1)*sizeof(char *);
+ /* fill the array with the keys */
+ num=0;
+ for (i=0;i<dict->size;i++)
+ {
+ entry=dict->table[i];
+ while (entry!=NULL)
+ {
+ strcpy(buf,entry->key);
+ values[num++]=buf;
+ buf+=strlen(buf)+1;
+ entry=entry->next;
+ }
+ }
+ values[num]=NULL;
+ /* done */
+ return values;
}