diff options
author | goodale <goodale@17b73243-c579-4c4c-a9d2-2d5706c11dac> | 1998-09-29 15:19:21 +0000 |
---|---|---|
committer | goodale <goodale@17b73243-c579-4c4c-a9d2-2d5706c11dac> | 1998-09-29 15:19:21 +0000 |
commit | 839a361ed19863d2a005f10cc2f249a3c58351f3 (patch) | |
tree | 7f6336c05c58650709f0bde5cf018f75dcbb13bc /src/util/StoreNamedData.c | |
parent | cfa95d39b90be4bd69b8b9ece0458c287e328cca (diff) |
Named data storage routines.
git-svn-id: http://svn.cactuscode.org/flesh/trunk@17 17b73243-c579-4c4c-a9d2-2d5706c11dac
Diffstat (limited to 'src/util/StoreNamedData.c')
-rw-r--r-- | src/util/StoreNamedData.c | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/src/util/StoreNamedData.c b/src/util/StoreNamedData.c new file mode 100644 index 00000000..274000cf --- /dev/null +++ b/src/util/StoreNamedData.c @@ -0,0 +1,259 @@ + /*@@ + @file StoreNamedData.c + @date Tue Sep 1 09:57:57 1998 + @author Tom Goodale + @desc + Contains routines to store pointers to miscellaneous named data in + a linked list, and to search the list for a particular piece of data. + @enddesc + + @version $ID$ + @@*/ +#include <stdio.h> +#include <stdlib.h> +#include "StoreNamedData.h" + +static char *rcsid = "$Id$"; + + + /*@@ + @routine StoreNamedData + @date Tue Sep 1 09:59:09 1998 + @author Tom Goodale + @desc + Stores a piece of data in a linked list. + @enddesc + @calls + @calledby + @history + + @endhistory + @var list + @vdesc A pointer to the list to store the data in + @vtype pNamedData ** + @vio inout + @vcomment + This should be a pointer to NULL to create a new list. + @endvar + @var name + @vdesc A string containing the name of the data item + @vtype const char * + @vio in + @vcomment + A new string is created and the data from this string is copied into it. + @endvar + @var data + @vdesc The data to store + @vtype void * + @vio in + @vcomment + This is a void pointer to any sort of data. + @endvar + + @returntype int + @returndesc + This routine returns + 0 on success + 1 if memory allocation failed + @endreturndesc +@@*/ +int StoreNamedData(pNamedData **list, const char *name, void *data) +{ + int return_code; + + pNamedData *new; + + /* Allocate memory for the new element on the list. */ + new = (pNamedData *)malloc(sizeof(pNamedData)); + + if(new) + { + /* Allocate memory for name field in the structure. */ + new->name = malloc((strlen(name)+1)*sizeof(char)); + if(new->name) + { + /* Copy the name. */ + strcpy(new->name, name); + + /* Store the data. */ + new->data = data; + + /* Link it into the list. */ + new->next = (*list); + new->last = NULL; + + if(new->next) new->next->last = new; + + (*list) = new; + + return_code = 0; + } + else + { + free(new); + return_code = 1; + }; + } + else + { + return_code = 1; + }; + + + return return_code; + +} + + /*@@ + @routine GetNamedData + @date Tue Sep 1 10:11:10 1998 + @author Tom Goodale + @desc + Searches a list of named data items and returns the appropriate data. + @enddesc + @calls + @calledby + @history + + @endhistory + @var list + @vdesc The list to store the data in + @vtype pNamedData * + @vio in + @vcomment + If this is a pointer to NULL, the routine returns immediately. + @endvar + @var name + @vdesc A string containing the name of the data item + @vtype const char * + @vio in + @vcomment + The routine searches for an exact match, case dependent. + @endvar + + @returntype void * + @returndesc + This routine returns + a pointer to the data on success + NULL if the list is NULL or the name was not found. + @endreturndesc +@@*/ +void *GetNamedData(pNamedData *list, const char *name) +{ + void *return_val; + + pNamedData *current; + + return_val = NULL; + + if(list) + { + /* Traverse the list */ + for(current = list; current ; current = current->next) + { + /* Compare the name */ + if(!strcmp(current->name, name)) + { + return_val = current->data; + break; + }; + }; + }; + + return return_val; +} + + + /*@@ + @routine DestroyNamedDataList + @date Tue Sep 1 10:40:49 1998 + @author Tom Goodale + @desc + Frees the memory allocated to a a list of named data items. + @enddesc + @calls + @calledby + @history + + @endhistory + @var list + @vdesc The list to destroy. + @vtype pNamedData * + @vio in + @vcomment + If this is a pointer to NULL, the routine returns immediately. + @endvar + +@@*/ +void DestroyNamedDataList(pNamedData *list) +{ + pNamedData *current; + pNamedData *next; + + /* Traverse the list freeing memory. */ + for(current = list; current; current = next) + { + next = current->next; + + free(current); + }; + +} + + +/*#define TEST_StoreNamedData*/ +#ifdef TEST_StoreNamedData + +/* Test routine to allow the above code to be tested independently of + * other code. + */ + +static char first_name[] = "First Item"; +static char first_data[] = "First Data"; +static char second_name[] = "Second Item"; +static char second_data[] = "Second Data"; +static char third_name[] = "Third Item"; +static char third_data[] = "Third Data"; + +#define DETECT_ERROR(error) if(error) {printf("Error on line %d\n", __LINE__); exit(1);} + +int main(void) +{ + pNamedData *list; + + char *data; + + list = NULL; + + /* Test creation of the list. */ + DETECT_ERROR(StoreNamedData(&list, first_name, first_data)); + DETECT_ERROR(StoreNamedData(&list, second_name, second_data)); + DETECT_ERROR(StoreNamedData(&list, third_name, third_data)); + + /* Test accessing the data. */ + if((data = GetNamedData(list, first_name))) + { + printf("Name %s has data %s\n", first_name, data); + }; + + if((data = GetNamedData(list, second_name))) + { + printf("Name %s has data %s\n", second_name, data); + }; + + if((data = GetNamedData(list, third_name))) + { + printf("Name %s has data %s\n", third_name, data); + }; + + /* test destroying the list. */ + DestroyNamedDataList(list); + + list = NULL; + + + return 0; + +} + +#endif |