diff --git a/src/xpdev/str_list.c b/src/xpdev/str_list.c index 87ab14db8d1302e50ececb88a554d5acd23e2fda..8c411537451ce248e557ed801c7ce991595708df 100644 --- a/src/xpdev/str_list.c +++ b/src/xpdev/str_list.c @@ -39,7 +39,7 @@ #include "genwrap.h" /* stricmp */ #include "str_list.h" -str_list_t strListAlloc() +str_list_t strListInit() { str_list_t list; @@ -63,7 +63,7 @@ size_t strListCount(const str_list_t list) return(i); } -str_list_t strListAddAt(str_list_t* list, const char* str, size_t count) +static str_list_t str_list_add_at(str_list_t* list, char* str, size_t count) { str_list_t lp; @@ -71,27 +71,47 @@ str_list_t strListAddAt(str_list_t* list, const char* str, size_t count) return(NULL); *list=lp; - if((lp[count]=(char*)malloc(strlen(str)+1))==NULL) - return(NULL); - - strcpy(lp[count++],str); + lp[count++]=str; lp[count]=NULL; /* terminate list */ return(lp); } +str_list_t strListAddAt(str_list_t* list, const char* str, size_t count) +{ + char* buf; + + if((buf=(char*)malloc(strlen(str)+1))==NULL) + return(NULL); + + strcpy(buf,str); + + return(str_list_add_at(list,buf,count)); +} + str_list_t strListAdd(str_list_t* list, const char* str) { return strListAddAt(list,str,strListCount(*list)); } +str_list_t strListAddList(str_list_t* list, str_list_t add_list) +{ + size_t i,j; + + j=strListCount(*list); + for(i=0;add_list[i];i++) + strListAddAt(list,add_list[i],j++); + + return(*list); +} + str_list_t strListSplit(str_list_t* list, char* str, const char* delimit) { char* token; if(list==NULL) { - if((*list = strListAlloc())==NULL) + if((*list = strListInit())==NULL) return(NULL); } @@ -117,6 +137,17 @@ str_list_t strListSplitCopy(str_list_t* list, const char* str, const char* delim return(*list); } +str_list_t strListMerge(str_list_t* list, str_list_t add_list) +{ + size_t i,j; + + j=strListCount(*list); + for(i=0;add_list[i];i++) + str_list_add_at(list,add_list[i],j++); + + return(*list); +} + static int strListCompareAlpha(const void *arg1, const void *arg2) { return stricmp(*(char**)arg1, *(char**)arg2); diff --git a/src/xpdev/str_list.h b/src/xpdev/str_list.h index bf657abf47dee8f20f3fb2cb37561c841a54fd69..5c0236c7ceec4efaeec66482a9ea976bfabac38c 100644 --- a/src/xpdev/str_list.h +++ b/src/xpdev/str_list.h @@ -47,7 +47,7 @@ extern "C" { typedef char** str_list_t; /* Returns an allocated and terminated string list */ -str_list_t strListAlloc(void); +str_list_t strListInit(void); /* Frees the strings in the list (and the list itself) */ void strListFree(str_list_t* list); @@ -59,6 +59,9 @@ str_list_t strListAdd(str_list_t* list, const char* str); /* Adds a string into the list at a specific index */ str_list_t strListAddAt(str_list_t* list, const char* str, size_t index); +/* Append a string list onto an another string */ +str_list_t strListAddList(str_list_t* list, str_list_t append_list); + /* Add to an exiting or new string list by splitting specified string (str) */ /* into multiple strings, separated by one of the delimit characters */ str_list_t strListSplit(str_list_t* list, char* str, const char* delimit); @@ -66,11 +69,17 @@ str_list_t strListSplit(str_list_t* list, char* str, const char* delimit); /* Same as above, but copies str to temporary heap buffer first */ str_list_t strListSplitCopy(str_list_t* list, const char* str, const char* delimit); +/* Merge 2 string lists (no copying of string data) */ +str_list_t strListMerge(str_list_t* list, str_list_t append_list); + /* Count the number of strings in the list and returns the count */ size_t strListCount(const str_list_t list); +/* Sort the strings in the string list */ void strListSortAlpha(str_list_t list); void strListSortAlphaReverse(str_list_t list); + +/* Case-sensitive sorting */ void strListSortAlphaCase(str_list_t list); void strListSortAlphaCaseReverse(str_list_t list);