From 8e1e5c9c58b545b75806034fdf435e804496a122 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Fri, 28 May 2004 10:06:06 +0000
Subject: [PATCH] Created strListDelete() and strListReplace(). Changed some
 return types to more logical/useful values.

---
 src/xpdev/str_list.c | 121 ++++++++++++++++++++++++++++++-------------
 src/xpdev/str_list.h |  20 ++++---
 2 files changed, 99 insertions(+), 42 deletions(-)

diff --git a/src/xpdev/str_list.c b/src/xpdev/str_list.c
index cd37866c33..74ccab6d1e 100644
--- a/src/xpdev/str_list.c
+++ b/src/xpdev/str_list.c
@@ -64,7 +64,7 @@ size_t strListCount(const str_list_t list)
 	return(i);
 }
 
-static str_list_t str_list_append(str_list_t* list, char* str, size_t index)
+static char* str_list_append(str_list_t* list, char* str, size_t index)
 {
 	str_list_t lp;
 
@@ -75,10 +75,10 @@ static str_list_t str_list_append(str_list_t* list, char* str, size_t index)
 	lp[index++]=str;
 	lp[index]=NULL;	/* terminate list */
 
-	return(lp);
+	return(str);
 }
 
-static str_list_t str_list_insert(str_list_t* list, char* str, size_t index)
+static char* str_list_insert(str_list_t* list, char* str, size_t index)
 {
 	size_t	i;
 	size_t	count;
@@ -97,16 +97,21 @@ static str_list_t str_list_insert(str_list_t* list, char* str, size_t index)
 		lp[i]=lp[i-1];
 	lp[index]=str;
 
-	return(lp);
+	return(str);
 }
 
-str_list_t strListRemove(str_list_t* list, size_t index)
+char* strListRemove(str_list_t* list, size_t index)
 {
+	char*	str;
 	size_t	i;
 	size_t	count;
 	str_list_t lp;
 
 	count = strListCount(*list);
+
+	if(index==STR_LIST_LAST_INDEX && count)
+		index = count-1;
+
 	if(index >= count)	/* invalid index, do nothing */
 		return(NULL);
 
@@ -115,14 +120,49 @@ str_list_t strListRemove(str_list_t* list, size_t index)
 		return(NULL);
 
 	*list=lp;
+	str=lp[index];
 	for(i=index; i<count; i++)
 		lp[i]=lp[i+1];
 	lp[count]=NULL;
 
-	return(lp);
+	return(str);
+}
+
+BOOL strListDelete(str_list_t* list, size_t index)
+{
+	char*	str;
+
+	if((str=strListRemove(list, index))==NULL)
+		return(FALSE);
+
+	free(str);
+
+	return(TRUE);
+}
+
+char* strListReplace(const str_list_t list, size_t index, const char* str)
+{
+	char*	buf;
+	size_t	count;
+
+	count = strListCount(list);
+
+	if(index==STR_LIST_LAST_INDEX && count)
+		index = count-1;
+
+	if(index >= count)	/* invalid index, do nothing */
+		return(NULL);
+
+	if((buf=(char*)realloc(list[index],strlen(str)+1))==NULL)
+		return(NULL);
+
+	list[index]=buf;
+	strcpy(buf,str);
+
+	return(buf);
 }
 
-str_list_t strListAppend(str_list_t* list, const char* str, size_t index)
+char* strListAppend(str_list_t* list, const char* str, size_t index)
 {
 	char* buf;
 
@@ -131,13 +171,13 @@ str_list_t strListAppend(str_list_t* list, const char* str, size_t index)
 
 	strcpy(buf,str);
 
-	if(index==STR_LIST_APPEND)
+	if(index==STR_LIST_LAST_INDEX)
 		index=strListCount(*list);
 
 	return(str_list_append(list,buf,index));
 }
 
-str_list_t	strListAppendList(str_list_t* list, const str_list_t add_list)
+size_t	strListAppendList(str_list_t* list, const str_list_t add_list)
 {
 	size_t	i;
 	size_t	count;
@@ -146,10 +186,10 @@ str_list_t	strListAppendList(str_list_t* list, const str_list_t add_list)
 	for(i=0; add_list[i]!=NULL; i++)
 		strListAppend(list,add_list[i],count++);
 
-	return(*list);
+	return(count);
 }
 
-str_list_t strListInsert(str_list_t* list, const char* str, size_t index)
+char* strListInsert(str_list_t* list, const char* str, size_t index)
 {
 	char* buf;
 
@@ -161,29 +201,37 @@ str_list_t strListInsert(str_list_t* list, const char* str, size_t index)
 	return(str_list_insert(list,buf,index));
 }
 
-str_list_t	strListInsertList(str_list_t* list, const str_list_t add_list, size_t index)
+size_t strListInsertList(str_list_t* list, const str_list_t add_list, size_t index)
 {
 	size_t	i;
 
+
 	for(i=0; add_list[i]!=NULL; i++)
-		strListInsert(list,add_list[i],index++);
+		if(strListInsert(list,add_list[i],index++)==NULL)
+			break;
 
-	return(*list);
+	return(i);
 }
 
-str_list_t strListSplit(str_list_t* list, char* str, const char* delimit)
+str_list_t strListSplit(str_list_t* lp, char* str, const char* delimit)
 {
+	size_t	count;
 	char*	token;
+	str_list_t	list;
 
-	if(list==NULL) {
-		if((*list = strListInit())==NULL)
-			return(NULL);
-	}
+	if(lp==NULL) {
+		if((list = strListInit())==NULL)
+			return(0);
+		lp=&list;
+		count=0;
+	} else
+		count=strListCount(*lp);
 
 	for(token = strtok(str, delimit); token!=NULL; token=strtok(NULL, delimit))
-		strListAppend(list, token, STR_LIST_APPEND);
+		if(strListAppend(lp, token, count++)==NULL)
+			break;
 
-	return(*list);
+	return(*lp);
 }
 
 str_list_t strListSplitCopy(str_list_t* list, const char* str, const char* delimit)
@@ -195,22 +243,23 @@ str_list_t strListSplitCopy(str_list_t* list, const char* str, const char* delim
 
 	strcpy(buf,str);
 
-	*list = strListSplit(list,buf,delimit);
+	*list=strListSplit(list,buf,delimit);
 
 	free(buf);
 
 	return(*list);
 }
 
-str_list_t	strListMerge(str_list_t* list, str_list_t add_list)
+size_t	strListMerge(str_list_t* list, str_list_t add_list)
 {
-	size_t	i,j;
+	size_t	i;
+	size_t	count;
 
-	j=strListCount(*list);
+	count=strListCount(*list);
 	for(i=0; add_list[i]!=NULL; i++)
-		str_list_append(list,add_list[i],j++);
+		str_list_append(list,add_list[i],count++);
 
-	return(*list);
+	return(i);
 }
 
 static int strListCompareAlpha(const void *arg1, const void *arg2)
@@ -272,20 +321,22 @@ void strListFree(str_list_t* list)
 	}
 }
 
-str_list_t strListReadFile(FILE* fp, str_list_t* list, size_t max_line_len, BOOL pad)
+str_list_t strListReadFile(FILE* fp, str_list_t* lp, size_t max_line_len, BOOL pad)
 {
 	char*		buf=NULL;
 	size_t		count;
+	str_list_t	list;
 
 	if(max_line_len<1)
 		max_line_len=2048;
 
-	if(list==NULL) {
-		if((*list = strListInit())==NULL)
+	if(lp==NULL) {
+		if((list = strListInit())==NULL)
 			return(NULL);
+		lp=&list;
 	}
 
-	count = strListCount(*list);
+	count = strListCount(*lp);
 	while(!feof(fp)) {
 		if(buf==NULL && (buf=malloc(max_line_len+1))==NULL)
 			return(NULL);
@@ -293,16 +344,16 @@ str_list_t strListReadFile(FILE* fp, str_list_t* list, size_t max_line_len, BOOL
 		if(fgets(buf,max_line_len+1,fp)==NULL)
 			break;
 		if(pad) {
-			str_list_append(list, buf, count++);
+			str_list_append(lp, buf, count++);
 			buf=NULL;
 		} else
-			strListAppend(list, buf, count++);
+			strListAppend(lp, buf, count++);
 	}
 
-	if(buf)
+	if(buf!=NULL)
 		free(buf);
 
-	return(*list);
+	return(*lp);
 }
 
 size_t strListWriteFile(FILE* fp, const str_list_t list, const char* separator)
diff --git a/src/xpdev/str_list.h b/src/xpdev/str_list.h
index 6d3fe8a057..2fcb7d7f6d 100644
--- a/src/xpdev/str_list.h
+++ b/src/xpdev/str_list.h
@@ -45,7 +45,7 @@
 extern "C" {
 #endif
 
-#define STR_LIST_APPEND		(~0)
+#define STR_LIST_LAST_INDEX	(~0)
 
 typedef char** str_list_t;
 
@@ -60,19 +60,25 @@ 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	strListAppend(str_list_t* list, const char* str, size_t index);
+char*		strListAppend(str_list_t* list, const char* str, size_t index);
 
 /* Append a string list onto another string list */
-str_list_t	strListAppendList(str_list_t* list, const str_list_t append_list);
+size_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);
+char*		strListInsert(str_list_t* list, const char* str, size_t index);
 
 /* Insert a string list into another string list */
-str_list_t	strListInsertList(str_list_t* list, const str_list_t append_list, size_t index);
+size_t	strListInsertList(str_list_t* list, const str_list_t append_list, size_t index);
 
 /* Remove a string at a specific index */
-str_list_t	strListRemove(str_list_t* list, size_t index);
+char*		strListRemove(str_list_t* list, size_t index);
+
+/* Remove and free a string at a specific index */
+BOOL		strListDelete(str_list_t* list, size_t index);
+
+/* Replace a string at a specific index */
+char*		strListReplace(const str_list_t list, size_t index, const char* str);
 
 /* Add to an exiting or new string list by splitting specified string (str) */
 /* into multiple strings, separated by one of the delimit characters */
@@ -82,7 +88,7 @@ str_list_t	strListSplit(str_list_t* list, char* str, const char* delimit);
 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);
+size_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);
-- 
GitLab