diff options
author | Arthur de Jong <arthur@arthurdejong.org> | 2008-04-19 12:26:44 +0200 |
---|---|---|
committer | Arthur de Jong <arthur@arthurdejong.org> | 2008-04-19 12:26:44 +0200 |
commit | d3ed555ef3e65601f3b952036914eafc10b01d9c (patch) | |
tree | b74838b7d85931c225dbd6a8bab0275e52bb5857 | |
parent | 953a00fd4b8463f9b6ba8616a507746fe8bc56af (diff) |
implement a set that uses the dict module as back-end
git-svn-id: http://arthurdejong.org/svn/nss-pam-ldapd/nss-ldapd@681 ef36b2f9-881f-0410-afb5-c4e39611909c
-rw-r--r-- | common/Makefile.am | 5 | ||||
-rw-r--r-- | common/set.c | 64 | ||||
-rw-r--r-- | common/set.h | 65 | ||||
-rw-r--r-- | tests/Makefile.am | 9 | ||||
-rw-r--r-- | tests/test_set.c | 66 |
5 files changed, 204 insertions, 5 deletions
diff --git a/common/Makefile.am b/common/Makefile.am index 42f20a0..a813da5 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -1,6 +1,6 @@ # Makefile.am - use automake to generate Makefile.in # -# Copyright (C) 2007 Arthur de Jong +# Copyright (C) 2007, 2008 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 @@ -24,4 +24,5 @@ AM_CFLAGS = -fPIC libtio_a_SOURCES = tio.c tio.h -libdict_a_SOURCES = dict.c dict.h +libdict_a_SOURCES = dict.c dict.h \ + set.c set.h diff --git a/common/set.c b/common/set.c new file mode 100644 index 0000000..9efc582 --- /dev/null +++ b/common/set.c @@ -0,0 +1,64 @@ +/* + set.c - set functions + This file is part of the nss-ldapd library. + + Copyright (C) 2008 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 + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA +*/ + +#include "config.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <strings.h> + +#include "set.h" +#include "dict.h" + +SET *set_new(void) +{ + return (SET *)dict_new(); +} + +int set_add(SET *set,const char *value) +{ + return dict_put((DICT *)set,value,set); +} + +int set_contains(SET *set,const char *value) +{ + return dict_get((DICT *)set,value)!=NULL; +} + +void set_free(SET *set) +{ + dict_free((DICT *)set); +} + +void set_loop_first(SET *set) +{ + dict_loop_first((DICT *)set); +} + +const char *set_loop_next(SET *set) +{ + const char *value=NULL; + if (dict_loop_next((DICT *)set,&value,NULL)==NULL) + return NULL; + return value; +} diff --git a/common/set.h b/common/set.h new file mode 100644 index 0000000..f867815 --- /dev/null +++ b/common/set.h @@ -0,0 +1,65 @@ +/* + set.h - set functions + This file is part of the nss-ldapd library. + + Copyright (C) 2008 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 + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA +*/ + +#ifndef _SET_H +#define _SET_H + +#include "compat/attrs.h" + +/* + These functions provide a set of string in an unordered + collection. +*/ +typedef struct set SET; + +/* Create a new instance of a set. Returns NULL + in case of memory allocation errors. */ +SET *set_new(void) + LIKE_MALLOC MUST_USE; + +/* Add a string in the set. The value is duplicated + and can be reused by the caller. + This function returns non-0 in case of memory allocation + errors. All value comparisons are case insensitive. */ +int set_add(SET *set,const char *value); + +/* Return non-zero if the value is in the set. + All value comparisons are case insensitive. */ +int set_contains(SET *set,const char *value) + MUST_USE; + +/* Remove the set from memory. All allocated storage + for the set and the values is freed. */ +void set_free(SET *set); + +/* Function for looping over all set values. + This resets the search to the beginning of the set. + This is required before calling set_loop_next(); */ +void set_loop_first(SET *set); + +/* Function for looping over all set values. + This returns a stored value. NULL is returned when all + values have been returned. */ +const char *set_loop_next(SET *set) + MUST_USE; + +#endif /* _SET_H */ diff --git a/tests/Makefile.am b/tests/Makefile.am index ecfafff..488d229 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1,7 +1,7 @@ # Makefile.am - use automake to generate Makefile.in # # Copyright (C) 2006 West Consulting -# Copyright (C) 2006, 2007 Arthur de Jong +# Copyright (C) 2006, 2007, 2008 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 @@ -18,9 +18,9 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301 USA -TESTS = test_dict test_tio test_cfg test_myldap.sh test_nsscmds.sh +TESTS = test_dict test_set test_tio test_cfg test_myldap.sh test_nsscmds.sh -check_PROGRAMS = test_dict test_tio test_cfg test_myldap +check_PROGRAMS = test_dict test_set test_tio test_cfg test_myldap noinst_PROGRAMS = test_aliases test_ethers test_group test_hosts \ test_netgroup test_networks test_passwd test_protocols \ @@ -40,6 +40,9 @@ AM_CFLAGS = $(PTHREAD_CFLAGS) -g test_dict_SOURCES = test_dict.c ../common/dict.h ../common/dict.c #test_dict_LDADD = ../common/dict.o +test_set_SOURCES = test_set.c ../common/set.h +test_set_LDADD = ../common/libdict.a + test_tio_SOURCES = test_tio.c ../common/tio.h ../common/tio.c test_tio_LDFLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) diff --git a/tests/test_set.c b/tests/test_set.c new file mode 100644 index 0000000..ccd5891 --- /dev/null +++ b/tests/test_set.c @@ -0,0 +1,66 @@ +/* + test_set.c - simple test for the set module + This file is part of the nss-ldapd library. + + Copyright (C) 2008 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 + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA +*/ + +#include "config.h" + +#include <stdio.h> +#include <string.h> +#include <assert.h> + +#include "common/set.h" +#include "compat/attrs.h" + +/* the main program... */ +int main(int UNUSED(argc),char UNUSED(*argv[])) +{ + SET *set; + const char *val; + + /* initialize */ + set=set_new(); + + /* store some entries */ + set_add(set,"key1"); + set_add(set,"key2"); + set_add(set,"key3"); + set_add(set,"KEY2"); + + /* check set contents */ + assert(set_contains(set,"KeY1")); + assert(set_contains(set,"kEy2")); + assert(set_contains(set,"KeY3")); + assert(!set_contains(set,"key4")); + + /* loop over set contents */ + set_loop_first(set); + while ((val=set_loop_next(set))!=NULL) + { + assert( (strcasecmp(val,"key1")==0) || + (strcasecmp(val,"key2")==0) || + (strcasecmp(val,"key3")==0) ); + } + + /* free set */ + set_free(set); + + return 0; +} |