diff --git a/src/xpdev/ini_file.c b/src/xpdev/ini_file.c index d8a78050925450eb367f420e927e7928712b4581..e85f0536b089f8d77ba69e2cb50315053ccc704c 100644 --- a/src/xpdev/ini_file.c +++ b/src/xpdev/ini_file.c @@ -147,17 +147,16 @@ char** iniGetStringList(FILE* fp, const char* section, const char* key SAFECOPY(list,value); - if((lp=malloc(sizeof(char*)))==NULL) + if((lp=strListAlloc())==NULL) return(NULL); token=strtok(list,sep); while(token!=NULL) { truncsp(token); - if(strListAdd(&lp,token,items++)==NULL) + if(strListAddAt(&lp,token,items++)==NULL) break; token=strtok(NULL,sep); } - return(lp); } @@ -194,11 +193,9 @@ char** iniGetSectionList(FILE* fp, const char* prefix) char str[INI_MAX_LINE_LEN]; ulong items=0; - if((lp=malloc(sizeof(char*)))==NULL) + if((lp=strListAlloc())==NULL) return(NULL); - *lp=NULL; - if(fp==NULL) return(lp); @@ -219,7 +216,7 @@ char** iniGetSectionList(FILE* fp, const char* prefix) if(prefix!=NULL) if(strnicmp(p,prefix,strlen(prefix))!=0) continue; - if(strListAdd(&lp,p,items++)==NULL) + if(strListAddAt(&lp,p,items++)==NULL) break; } @@ -234,11 +231,9 @@ char** iniGetKeyList(FILE* fp, const char* section) char str[INI_MAX_LINE_LEN]; ulong items=0; - if((lp=malloc(sizeof(char*)))==NULL) + if((lp=strListAlloc())==NULL) return(NULL); - *lp=NULL; - if(fp==NULL) return(lp); @@ -261,7 +256,7 @@ char** iniGetKeyList(FILE* fp, const char* section) continue; *tp=0; truncsp(p); - if(strListAdd(&lp,p,items++)==NULL) + if(strListAddAt(&lp,p,items++)==NULL) break; } diff --git a/src/xpdev/str_list.c b/src/xpdev/str_list.c index 5551726fe001fb61030e684b8aa9359f82082c3f..eb6de295075d349156aee0db152258a821735069 100644 --- a/src/xpdev/str_list.c +++ b/src/xpdev/str_list.c @@ -38,6 +38,17 @@ #include <stdlib.h> /* malloc */ #include "str_list.h" +char** strListAlloc() +{ + char** list; + + if((list=malloc(sizeof(char*)))==NULL) + return(NULL); + + list[0]=NULL; /* terminated by default */ + return(list); +} + size_t strListCount(char** list) { size_t i; @@ -51,13 +62,10 @@ size_t strListCount(char** list) return(i); } -char** strListAdd(char*** list, char* str, size_t count) +char** strListAddAt(char*** list, char* str, size_t count) { char** lp; - if(!count) - count=strListCount(*list); - if((lp=realloc(*list,sizeof(char*)*(count+2)))==NULL) return(NULL); @@ -71,6 +79,12 @@ char** strListAdd(char*** list, char* str, size_t count) return(lp); } + +char** strListAdd(char*** list, char* str) +{ + return strListAddAt(list,str,strListCount(*list)); +} + void strListFree(char*** list) { size_t i; diff --git a/src/xpdev/str_list.h b/src/xpdev/str_list.h index 351aa78d1d5253c3c1709c79fdb3c08b6a048dd9..b7e7c929ba967181e68c927ee6e5d1be6b97d9ab 100644 --- a/src/xpdev/str_list.h +++ b/src/xpdev/str_list.h @@ -44,17 +44,22 @@ extern "C" { #endif -/* Pass a pointer to a string list, the string to add, and the current list count if known */ -/* (or 0 if unknown) */ +/* Returns an allocated and terminated string list */ +char** strListAlloc(void); + +/* Frees the strings in the list (and the list itself) */ +void strListFree(char*** list); + +/* Pass a pointer to a string list, the string to add */ /* Returns the updated list or NULL on error */ -char** strListAdd(char*** list, char* str, size_t count); +char** strListAdd(char*** list, char* str); + +/* Adds a string into the list at a specific index */ +char** strListAddAt(char*** list, char* str, size_t index); /* Count the number of strings in the list and returns the count */ size_t strListCount(char** list); -/* Frees the strings in the list (and the list itself) */ -void strListFree(char*** list); - #if defined(__cplusplus) } #endif