diff --git a/src/xpdev/ini_file.c b/src/xpdev/ini_file.c index 14ee5cda1cdeebb0d30c93e0df673e764acfc28e..52ae722e8ed89e26ab96b42ac01a790b97ccf16c 100644 --- a/src/xpdev/ini_file.c +++ b/src/xpdev/ini_file.c @@ -153,7 +153,7 @@ str_list_t iniGetStringList(FILE* fp, const char* section, const char* key token=strtok(list,sep); while(token!=NULL) { truncsp(token); - if(strListAdd(&lp,token,items++)==NULL) + if(strListAppend(&lp,token,items++)==NULL) break; token=strtok(NULL,sep); } @@ -216,7 +216,7 @@ str_list_t iniGetSectionList(FILE* fp, const char* prefix) if(prefix!=NULL) if(strnicmp(p,prefix,strlen(prefix))!=0) continue; - if(strListAdd(&lp,p,items++)==NULL) + if(strListAppend(&lp,p,items++)==NULL) break; } @@ -256,7 +256,7 @@ str_list_t iniGetKeyList(FILE* fp, const char* section) continue; *tp=0; truncsp(p); - if(strListAdd(&lp,p,items++)==NULL) + if(strListAppend(&lp,p,items++)==NULL) break; } diff --git a/src/xpdev/link_list.c b/src/xpdev/link_list.c index 6688486c4f9904184aa8d1a2e4771a4a584278d9..5b639082d7fc77280fdba5129c35c40e6ff96299 100644 --- a/src/xpdev/link_list.c +++ b/src/xpdev/link_list.c @@ -187,7 +187,7 @@ str_list_t listStringList(const link_list_t* list) for(node=list->first; node!=NULL; node=node->next) { if(node->data!=NULL) - strListAdd(&str_list, node->data); + strListAppend(&str_list, node->data, STR_LIST_APPEND); } MUTEX_UNLOCK(list); @@ -210,7 +210,7 @@ str_list_t listSubStringList(const list_node_t* node, long max) for(count=0; count<max && node!=NULL; node=node->next) { if(node->data!=NULL) { - strListAdd(&str_list, node->data); + strListAppend(&str_list, node->data, STR_LIST_APPEND); count++; } } @@ -344,12 +344,11 @@ static list_node_t* list_add_node(link_list_t* list, list_node_t* node, list_nod if(after==list->last) /* append to list */ list->last = node; - if(after==NULL) { /* insert at beginning of list */ + if(after==FIRST_NODE) { /* insert at beginning of list */ if(list->first!=NULL) list->first->prev = node; list->first = node; - } - if(after!=NULL) { + } else { if(after->next!=NULL) { after->next->prev = node; node->next = after->next; @@ -509,7 +508,7 @@ void* listRemoveNode(link_list_t* list, list_node_t* node) if(list==NULL) return(NULL); - if(node==NULL) + if(node==FIRST_NODE) node=list->first; if(node==NULL) return(NULL); @@ -552,7 +551,7 @@ long listRemoveNodes(link_list_t* list, list_node_t* node, long max) MUTEX_LOCK(list); - if(node==NULL) + if(node==FIRST_NODE) node=list->first; for(count=0; node!=NULL && count<max; node=node->next, count++) diff --git a/src/xpdev/link_list.h b/src/xpdev/link_list.h index 73875fe5b8a6b1ae9fd9ad77a1e82accd551ce35..8f5a81aa300c5bc08f23db2ddc99494a96f82fc5 100644 --- a/src/xpdev/link_list.h +++ b/src/xpdev/link_list.h @@ -49,6 +49,8 @@ extern "C" { #endif +#define FIRST_NODE NULL /* Special value to specify first node in list */ + /* Valid link_list_t.flags bits */ #define LINK_LIST_MALLOC (1<<0) /* List/node allocated with malloc() */ #define LINK_LIST_ALWAYS_FREE (1<<1) /* Always free node data when removing */ @@ -137,13 +139,13 @@ long listMerge(link_list_t* dest, const link_list_t* src, list_node_t* after); /* Convenience macros for pushing, popping, and inserting nodes */ #define listPushNode(list, data) listAddNode(list, data, listLastNode(list)) -#define listInsertNode(link, data) listAddNode(list, data, NULL) +#define listInsertNode(link, data) listAddNode(list, data, FIRST_NODE) #define listPushNodeData(list, data, length) listAddNodeData(list, data, length, listLastNode(list)) -#define listInsertNodeData(list, data, length) listAddNodeData(list, data, length, NULL) +#define listInsertNodeData(list, data, length) listAddNodeData(list, data, length, FIRST_NODE) #define listPushNodeString(list, str) listAddNodeString(list, str, listLastNode(list)) -#define listInsertNodeString(list, str) listAddNodeString(list, str, NULL) +#define listInsertNodeString(list, str) listAddNodeString(list, str, FIRST_NODE) #define listPushStringList(list, str_list) listAddStringList(list, str_list, listLastNode(list)) -#define listInsertStringList(list, str_list) listAddStringList(list, str_list, NULL) +#define listInsertStringList(list, str_list) listAddStringList(list, str_list, FIRST_NODE) #define listPopNode(list) listRemoveNode(list, listLastNode(list)) /* Remove node from list, returning the node's data (if not free'd) */ diff --git a/src/xpdev/str_list.c b/src/xpdev/str_list.c index ba8baf8dccb09df8eaf56baee7d4b83f8f6cf943..cd37866c336d3d44d98207f5e0076d12cc2d1930 100644 --- a/src/xpdev/str_list.c +++ b/src/xpdev/str_list.c @@ -122,7 +122,7 @@ str_list_t strListRemove(str_list_t* list, size_t index) return(lp); } -str_list_t strListAdd(str_list_t* list, const char* str, size_t index) +str_list_t strListAppend(str_list_t* list, const char* str, size_t index) { char* buf; @@ -131,20 +131,20 @@ str_list_t strListAdd(str_list_t* list, const char* str, size_t index) strcpy(buf,str); - if(index==0) + if(index==STR_LIST_APPEND) index=strListCount(*list); return(str_list_append(list,buf,index)); } -str_list_t strListAddList(str_list_t* list, const str_list_t add_list) +str_list_t strListAppendList(str_list_t* list, const str_list_t add_list) { size_t i; size_t count; count=strListCount(*list); for(i=0; add_list[i]!=NULL; i++) - strListAdd(list,add_list[i],count++); + strListAppend(list,add_list[i],count++); return(*list); } @@ -181,7 +181,7 @@ str_list_t strListSplit(str_list_t* list, char* str, const char* delimit) } for(token = strtok(str, delimit); token!=NULL; token=strtok(NULL, delimit)) - strListAdd(list, token, 0); + strListAppend(list, token, STR_LIST_APPEND); return(*list); } @@ -272,9 +272,9 @@ void strListFree(str_list_t* list) } } -str_list_t strListReadFile(FILE* fp, str_list_t* list, size_t max_line_len) +str_list_t strListReadFile(FILE* fp, str_list_t* list, size_t max_line_len, BOOL pad) { - char* buf; + char* buf=NULL; size_t count; if(max_line_len<1) @@ -285,17 +285,22 @@ str_list_t strListReadFile(FILE* fp, str_list_t* list, size_t max_line_len) return(NULL); } - if((buf=malloc(max_line_len+1))==NULL) - return(NULL); - count = strListCount(*list); while(!feof(fp)) { + if(buf==NULL && (buf=malloc(max_line_len+1))==NULL) + return(NULL); + if(fgets(buf,max_line_len+1,fp)==NULL) break; - strListAdd(list, buf, count++); + if(pad) { + str_list_append(list, buf, count++); + buf=NULL; + } else + strListAppend(list, buf, count++); } - free(buf); + if(buf) + free(buf); return(*list); } diff --git a/src/xpdev/str_list.h b/src/xpdev/str_list.h index 3c5ac129108a3d7210e8007e7997c5112b4f272a..6d3fe8a05761f74522ff05598f02b38da7020b7c 100644 --- a/src/xpdev/str_list.h +++ b/src/xpdev/str_list.h @@ -38,12 +38,15 @@ #ifndef _STR_LIST_H #define _STR_LIST_H +#include <stdio.h> /* FILE */ #include "gen_defs.h" #if defined(__cplusplus) extern "C" { #endif +#define STR_LIST_APPEND (~0) + typedef char** str_list_t; /* Returns an allocated and terminated string list */ @@ -57,10 +60,10 @@ void strListFreeStrings(str_list_t list); /* Pass a pointer to a string list, the string to add (append) */ /* Returns the updated list or NULL on error */ -str_list_t strListAdd(str_list_t* list, const char* str, size_t index); +str_list_t strListAppend(str_list_t* list, const char* str, size_t index); /* Append a string list onto another string list */ -str_list_t strListAddList(str_list_t* list, const str_list_t append_list); +str_list_t strListAppendList(str_list_t* list, const str_list_t append_list); /* Inserts a string into the list at a specific index */ str_list_t strListInsert(str_list_t* list, const char* str, size_t index); @@ -98,7 +101,7 @@ void strListSortAlphaCaseReverse(str_list_t list); /* Read lines from file appending each line to string list */ /* Pass NULL list to have list allocated for you */ -str_list_t strListReadFile(FILE* fp, str_list_t* list, size_t max_line_len); +str_list_t strListReadFile(FILE* fp, str_list_t* list, size_t max_line_len, BOOL pad); /* Write to file (fp) each string in the list, optionally separated by separator (e.g. "\n") */ size_t strListWriteFile(FILE* fp, const str_list_t list, const char* separator);