diff itemlist.c @ 26:526a4c34ee2e noffle

[svn] Applied patch from Jim Hague: support for local groups / new command line options --create and --cancel.
author enz
date Sat, 29 Apr 2000 15:45:56 +0100
parents
children 8e972daaeab9
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/itemlist.c	Sat Apr 29 15:45:56 2000 +0100
@@ -0,0 +1,123 @@
+/*
+  itemlist.c
+
+  $Id: itemlist.c 32 2000-04-29 14:45:56Z enz $
+*/
+
+#include "itemlist.h"
+#include <ctype.h>
+#include <string.h>
+#include <stdlib.h>
+#include "common.h"
+#include "log.h"
+
+struct ItemList
+{
+    char *list;
+    char *separators;
+    char *next;
+    size_t count;
+};
+
+/* Make a new item list. */
+ItemList *
+new_Itl( const char *list, const char *separators )
+{
+    ItemList * res;
+    char *p;
+    Bool inItem;
+
+    res = (ItemList *) malloc( sizeof( ItemList ) );
+    if ( res == NULL )
+    {
+	Log_err( "Malloc of ItemList failed." );
+	exit( EXIT_FAILURE );
+    }
+    
+    res->list = (char *) malloc( strlen(list) + 2 );
+    if ( res->list == NULL )
+    {
+	Log_err( "Malloc of ItemList.list failed." );
+	exit( EXIT_FAILURE );
+    }
+    strcpy( res->list, list );
+
+    if (  ( res->separators = strdup( separators ) ) == NULL )
+    {
+	Log_err( "Malloc of ItemList.separators failed." );
+	exit( EXIT_FAILURE );
+    }
+
+    res->count = 0;
+    res->next = res->list;
+
+    /* Separate items into strings and have final zero-length string. */
+    for( p = res->list, inItem = FALSE; *p != '\0'; p++ )
+    {
+	Bool isSep = ( strchr( separators, p[ 0 ] ) != NULL );
+	
+	if ( inItem )
+	{
+	    if ( isSep )
+	    {
+		p[ 0 ] = '\0';
+		inItem = FALSE;
+		res->count++;
+	    }
+	}
+	else
+	{
+	    if ( ! isSep )
+		inItem = TRUE;
+	}
+    }
+    if ( inItem )
+	res->count++;
+    p[ 1 ] = '\0';
+    return res;
+}
+
+/* Delete an item list. */
+void
+del_Itl( ItemList *self )
+{
+    if ( self == NULL )
+	return;
+    free( self->list );
+    free( self->separators );
+    free( self );
+}
+
+/* Get first item. */
+const char *
+Itl_first( ItemList *self )
+{
+    self->next = self->list;
+    return Itl_next( self );
+}
+
+/* Get next item or NULL. */
+const char *
+Itl_next( ItemList *self )
+{
+    const char *res = self->next;
+
+    if ( res[ 0 ] == '\0' )
+	return NULL;
+
+    while ( strchr( self->separators, res[ 0 ] ) != NULL )
+	res++;
+
+    if ( res[ 0 ] == '\0' && res[ 1 ] == '\0' )
+	return NULL;
+
+    self->next += strlen( res ) + 1;
+    return res;
+}
+
+/* Get count of items in list. */
+size_t
+Itl_count( const ItemList *self )
+{
+    return self->count;
+}