From 178c84bef5dc7439c04eda0af9109c28585e6fc1 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Wed, 12 Oct 2005 22:50:10 +0000
Subject: [PATCH] Added support for !include lines in .ini files to
 iniReadFile(), for use with the iniGet* functions. The other iniRead*
 functions do not support include files and ultimately the FILE* based API
 should probably be deprecated (and eventually go away) anyway.

---
 src/xpdev/ini_file.c | 62 ++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 57 insertions(+), 5 deletions(-)

diff --git a/src/xpdev/ini_file.c b/src/xpdev/ini_file.c
index 3a3dd52aa5..b25ad1e869 100644
--- a/src/xpdev/ini_file.c
+++ b/src/xpdev/ini_file.c
@@ -53,6 +53,8 @@
 #define INI_OPEN_SECTION_CHAR	'['
 #define INI_CLOSE_SECTION_CHAR	']'
 #define INI_NEW_SECTION			((char*)~0)
+#define INI_INCLUDE_DIRECTIVE	"!include"
+#define INI_INCLUDE_MAX			10000
 
 static ini_style_t default_style;
 
@@ -1534,17 +1536,46 @@ BOOL iniCloseFile(FILE* fp)
 
 str_list_t iniReadFile(FILE* fp)
 {
+	char		str[INI_MAX_LINE_LEN];
+	char*		p;
 	size_t		i;
+	size_t		inc_len;
+	size_t		inc_counter=0;
 	str_list_t	list;
+	FILE*		insert_fp=NULL;
 	
 	rewind(fp);
 
 	list = strListReadFile(fp, NULL, INI_MAX_LINE_LEN);
-	if(list!=NULL) {
-		/* truncate new-line chars off end of strings */
-		for(i=0; list[i]!=NULL; i++)
-			truncnl(list[i]);
-	}
+	if(list==NULL)
+		return(NULL);
+
+	/* Look for !include directives */
+	inc_len=strlen(INI_INCLUDE_DIRECTIVE);
+	for(i=0; list[i]!=NULL; i++)
+		if(strnicmp(list[i],INI_INCLUDE_DIRECTIVE,inc_len)==0) {
+			p=list[i]+inc_len;
+			FIND_WHITESPACE(p);
+			SKIP_WHITESPACE(p);
+			truncsp(p);
+			if(inc_counter >= INI_INCLUDE_MAX)
+				SAFEPRINTF2(str, ";%s - MAXIMUM INCLUDES REACHED: %u", list[i], INI_INCLUDE_MAX);
+			else if((insert_fp=fopen(p,"r"))==NULL)
+				SAFEPRINTF2(str, ";%s - FAILURE: %s", list[i], STRERROR(errno));
+			else
+				SAFEPRINTF(str, ";%s", list[i]);
+			strListReplace(list, i, str);
+			if(insert_fp!=NULL) {
+				strListInsertFile(insert_fp, &list, i+1, INI_MAX_LINE_LEN);
+				fclose(insert_fp);
+				insert_fp=NULL;
+				inc_counter++;
+			}
+		}
+
+	/* truncate new-line chars off end of strings */
+	for(i=0; list[i]!=NULL; i++)
+		truncnl(list[i]);
 
 	return(list);
 }
@@ -1562,3 +1593,24 @@ BOOL iniWriteFile(FILE* fp, const str_list_t list)
 
 	return(count == strListCount(list));
 }
+
+#ifdef INI_FILE_TEST
+void main(int argc, char** argv)
+{
+	int			i;
+	size_t		l;
+	FILE*		fp;
+	str_list_t	list;
+
+	for(i=1;i<argc;i++) {
+		if((fp=iniOpenFile(argv[i],FALSE)) == NULL)
+			continue;
+		if((list=iniReadFile(fp)) != NULL) {
+			for(l=0;list[l];l++)
+				printf("%s\n", list[l]);
+			strListFree(&list);
+		}
+		fclose(fp);
+	}
+}
+#endif
-- 
GitLab