From 31911a55fec1ed257cf12ef81749efd80fccec96 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Fri, 13 Dec 2002 01:51:47 +0000
Subject: [PATCH] scfg.colors (loaded from attr.cfg) is now a dynamically
 allocated array, allowing additional sysop-configurable color attribute
 definitions.

---
 src/sbbs3/load_cfg.c | 29 ++++++++++++++++++++++-------
 src/sbbs3/sbbsdefs.h |  3 ++-
 src/sbbs3/scfgdefs.h |  3 ++-
 3 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/src/sbbs3/load_cfg.c b/src/sbbs3/load_cfg.c
index aa57620b6e..f66ed1faaf 100644
--- a/src/sbbs3/load_cfg.c
+++ b/src/sbbs3/load_cfg.c
@@ -38,6 +38,8 @@
 #include "sbbs.h"
 
 static void prep_cfg(scfg_t* cfg);
+static void free_attr_cfg(scfg_t* cfg);
+
 char *	readtext(long *line, FILE *stream);
 int 	lprintf(char *fmt, ...);
 
@@ -240,6 +242,7 @@ void DLLCALL free_cfg(scfg_t* cfg)
 	free_file_cfg(cfg);
 	free_chat_cfg(cfg);
 	free_xtrn_cfg(cfg);
+	free_attr_cfg(cfg);
 }
 
 void DLLCALL free_text(char* text[])
@@ -404,8 +407,8 @@ char *readtext(long *line,FILE *stream)
 /****************************************************************************/
 BOOL read_attr_cfg(scfg_t* cfg, char* error)
 {
+	char*	p;
     char    str[256],fname[13];
-    int     i;
 	long	offset=0;
     FILE    *instream;
 
@@ -415,19 +418,31 @@ BOOL read_attr_cfg(scfg_t* cfg, char* error)
 		sprintf(error,"%d opening %s",errno,str);
 		return(FALSE); 
 	}
-	for(i=0;i<TOTAL_COLORS && !feof(instream) && !ferror(instream);i++) {
-		readline(&offset,str,4,instream);
-		cfg->color[i]=attrstr(str); 
+	FREE_AND_NULL(cfg->color);
+	for(cfg->total_colors=0;!feof(instream) && !ferror(instream);cfg->total_colors++) {
+		if(readline(&offset,str,4,instream)==NULL)
+			break;
+		if((p=realloc(cfg->color,cfg->total_colors+1))==NULL)
+			break;
+		cfg->color=p;
+		cfg->color[cfg->total_colors]=attrstr(str); 
 	}
-	if(i<TOTAL_COLORS) {
-		sprintf(error,"Less than TOTAL_COLORS (%u) defined in %s"
-			,TOTAL_COLORS,fname);
+	if(cfg->total_colors<MIN_COLORS) {
+		sprintf(error,"Less than MIN_COLORS (%lu<%u) defined in %s"
+			,cfg->total_colors,MIN_COLORS,fname);
 		return(FALSE); 
 	}
 	fclose(instream);
 	return(TRUE);
 }
 
+static void free_attr_cfg(scfg_t* cfg)
+{
+	if(cfg->color!=NULL)
+		FREE_AND_NULL(cfg->color);
+	cfg->total_colors=0;
+}
+
 char* DLLCALL prep_dir(char* base, char* path)
 {
 #ifdef __unix__
diff --git a/src/sbbs3/sbbsdefs.h b/src/sbbs3/sbbsdefs.h
index 9ee8748cb0..50b7f2ef88 100644
--- a/src/sbbs3/sbbsdefs.h
+++ b/src/sbbs3/sbbsdefs.h
@@ -336,7 +336,8 @@ enum {
 	,clr_chatremote
 	,clr_multichat
 	,clr_external
-	,TOTAL_COLORS };
+	,MIN_COLORS 
+};
 
 enum {								/* Values for xtrn_t.type				*/
 	 XTRN_NONE						/* No data file needed					*/
diff --git a/src/sbbs3/scfgdefs.h b/src/sbbs3/scfgdefs.h
index 819d6bea3b..a3ff83fcbc 100644
--- a/src/sbbs3/scfgdefs.h
+++ b/src/sbbs3/scfgdefs.h
@@ -574,7 +574,8 @@ typedef struct
 	ushort	sec_warn;				/* Seconds before inactivity warning */
 	ushort	sec_hangup; 			/* Seconds before inactivity hang-up */
 
-	char 	color[TOTAL_COLORS];	/* Different colors for the BBS */
+	char* 	color;					/* Different colors for the BBS */
+	ulong	total_colors;
 	ulong	ctrlkey_passthru;		/* Bits represent control keys NOT handled by inkey() */
 
 	char 	wfc_cmd[10][LEN_CMD+1];    /* 0-9 WFC DOS commands */
-- 
GitLab