From f50ae72ec3417cae55dd4e085991c01af9fdc5f1 Mon Sep 17 00:00:00 2001 From: Martin Nagy Date: Wed, 11 Feb 2009 20:37:59 +0100 Subject: Initial commit --- contrib/zkt/strlist.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 contrib/zkt/strlist.c (limited to 'contrib/zkt/strlist.c') diff --git a/contrib/zkt/strlist.c b/contrib/zkt/strlist.c new file mode 100644 index 0000000..81a84bc --- /dev/null +++ b/contrib/zkt/strlist.c @@ -0,0 +1,166 @@ +/***************************************************************** +** +** @(#) strlist.c (c) Mar 2005 Holger Zuleger +** +** TODO: Maybe we should use a special type for the list: +** typedef struct { char cnt; char list[0+1]; } strlist__t; +** This results in better type control of the function parameters +** +** Copyright (c) Mar 2005, Holger Zuleger HZnet. All rights reserved. +** +** This software is open source. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** Redistributions of source code must retain the above copyright notice, +** this list of conditions and the following disclaimer. +** +** Redistributions in binary form must reproduce the above copyright notice, +** this list of conditions and the following disclaimer in the documentation +** and/or other materials provided with the distribution. +** +** Neither the name of Holger Zuleger HZnet nor the names of its contributors may +** be used to endorse or promote products derived from this software without +** specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +** TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +** PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE +** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +** POSSIBILITY OF SUCH DAMAGE. +** +*****************************************************************/ + +#ifdef TEST +# include +#endif +#include +#include +#include "strlist.h" + + +/***************************************************************** +** prepstrlist (str, delim) +** prepare a string with delimeters to a so called strlist. +** 'str' is a list of substrings delimeted by 'delim' +** The # of strings is stored at the first byte of the allocated +** memory. Every substring is stored as a '\0' terminated C-String. +** The function returns a pointer to dynamic allocated memory +*****************************************************************/ +char *prepstrlist (const char *str, const char *delim) +{ + char *p; + char *new; + int len; + int cnt; + + if ( str == NULL ) + return NULL; + + len = strlen (str); + if ( (new = malloc (len + 2)) == NULL ) + return new; + + cnt = 0; + p = new; + for ( *p++ = '\0'; *str; str++ ) + { + if ( strchr (delim, *str) == NULL ) + *p++ = *str; + else if ( p[-1] != '\0' ) + { + *p++ = '\0'; + cnt++; + } + } + *p = '\0'; /*terminate string */ + if ( p[-1] != '\0' ) + cnt++; + *new = cnt & 0xFF; + + return new; +} + +/***************************************************************** +** isinlist (str, list) +** check if 'list' contains 'str' +*****************************************************************/ +int isinlist (const char *str, const char *list) +{ + int cnt; + + if ( list == NULL || *list == '\0' ) + return 1; + if ( str == NULL || *str == '\0' ) + return 0; + + cnt = *list; + while ( cnt-- > 0 ) + { + list++; + if ( strcmp (str, list) == 0 ) + return 1; + list += strlen (list); + } + + return 0; +} + +/***************************************************************** +** unprepstrlist (list, delimc) +*****************************************************************/ +char *unprepstrlist (char *list, char delimc) +{ + char *p; + int cnt; + + cnt = *list & 0xFF; + p = list; + for ( *p++ = delimc; cnt > 1; p++ ) + if ( *p == '\0' ) + { + *p = delimc; + cnt--; + } + + return list; +} + +#ifdef TEST +main (int argc, char *argv[]) +{ + FILE *fp; + char *p; + char *searchlist = NULL; + char group[255]; + + if ( argc > 1 ) + searchlist = prepstrlist (argv[1], LISTDELIM); + + printf ("searchlist: %d entrys: \n", searchlist[0]); + if ( (fp = fopen ("/etc/group", "r")) == NULL ) + exit (fprintf (stderr, "can't open file\n")); + + while ( fscanf (fp, "%[^:]:%*[^\n]\n", group) != EOF ) + if ( isinlist (group, searchlist) ) + printf ("%s\n", group); + + fclose (fp); + + printf ("searchlist: \"%s\"\n", unprepstrlist (searchlist, *LISTDELIM)); + for ( p = searchlist; *p; p++ ) + if ( *p < 32 ) + printf ("<%d>", *p); + else + printf ("%c", *p); + printf ("\n"); +} +#endif -- cgit