From ab122ee3d3a522b34526f6c0adaaae4d76630eec Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Deuc=D0=B5?= <shurd@sasktel.net>
Date: Fri, 10 Jan 2025 03:16:51 -0500
Subject: [PATCH] Remove xp_printf() Borland support, and update JS format

Borland doesn't need this, and making the new feature work with it
would be immensely painful, so just disable the files in Borland.

Also, now the JS format()/printf()/etc. can use field specifiers.
---
 src/sbbs3/js_sprintf.c | 26 ++++++++++++-----
 src/xpdev/xpprintf.c   | 66 +++---------------------------------------
 src/xpdev/xpprintf.h   | 11 ++++---
 3 files changed, 29 insertions(+), 74 deletions(-)

diff --git a/src/sbbs3/js_sprintf.c b/src/sbbs3/js_sprintf.c
index 8f898a1e3d..3b93012d6c 100644
--- a/src/sbbs3/js_sprintf.c
+++ b/src/sbbs3/js_sprintf.c
@@ -39,15 +39,25 @@ js_sprintf(JSContext *cx, uint argn, uintN argc, jsval *argv)
 
 	p=op;
 	p=xp_asprintf_start(p);
-    for(; argn<argc; argn++) {
-		if(JSVAL_IS_DOUBLE(argv[argn]))
-			p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_DOUBLE,JSVAL_TO_DOUBLE(argv[argn]));
-		else if(JSVAL_IS_INT(argv[argn]))
-			p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,JSVAL_TO_INT(argv[argn]));
-		else if(JSVAL_IS_BOOLEAN(argv[argn]) && xp_printf_get_type(p)!=XP_PRINTF_TYPE_CHARP)
-			p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,JSVAL_TO_BOOLEAN(argv[argn]));
+	int cur = 0;
+	for (;;) {
+		int next = xp_printf_get_next(p);
+		if (next < 0)
+			break;
+		if (next > 0 && next != (cur + 1))
+			cur = next;
+		else
+			cur++;
+		if (cur > argc)
+			break;
+		if(JSVAL_IS_DOUBLE(argv[cur]))
+			p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_DOUBLE,JSVAL_TO_DOUBLE(argv[cur]));
+		else if(JSVAL_IS_INT(argv[cur]))
+			p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,JSVAL_TO_INT(argv[cur]));
+		else if(JSVAL_IS_BOOLEAN(argv[cur]) && xp_printf_get_type(p)!=XP_PRINTF_TYPE_CHARP)
+			p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,JSVAL_TO_BOOLEAN(argv[cur]));
 		else {
-			JSVALUE_TO_RASTRING(cx, argv[argn], p2, &p2_sz, NULL);
+			JSVALUE_TO_RASTRING(cx, argv[cur], p2, &p2_sz, NULL);
 			if(JS_IsExceptionPending(cx))
 				JS_ClearPendingException(cx);
 			if(p2==NULL) {
diff --git a/src/xpdev/xpprintf.c b/src/xpdev/xpprintf.c
index e7fdca0d88..af459876c3 100644
--- a/src/xpdev/xpprintf.c
+++ b/src/xpdev/xpprintf.c
@@ -19,6 +19,8 @@
  * Note: If this box doesn't appear square, then you need to fix your tabs.	*
  ****************************************************************************/
 
+#if !defined(__BORLANDC__)
+
 #if defined(__linux__) && !defined(_GNU_SOURCE)
 	#define _GNU_SOURCE	// asprintf() on Linux
 #endif
@@ -75,12 +77,8 @@ struct arg_table_entry {
 		unsigned uint_type;
 		long long_type;
 		unsigned long ulong_type;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 		long long longlong_type;
-#endif
-#if defined(XP_PRINTF_TYPE_ULONGLONG)
 		unsigned long long ulonglong_type;
-#endif
 		char *charp_type;
 		double double_type;
 		long double longdouble_type;
@@ -294,11 +292,9 @@ int xp_printf_get_type(const char *format)
 				case 'l':
 					correct_type=XP_PRINTF_TYPE_LONG;
 					break;
-#if defined(XP_PRINTF_TYPE_ULONGLONG)
 				case 'l'|'l'<<8:
 					correct_type=XP_PRINTF_TYPE_LONGLONG;
 					break;
-#endif
 				case 'j':
 					correct_type=XP_PRINTF_TYPE_INTMAX;
 					break;
@@ -331,11 +327,9 @@ int xp_printf_get_type(const char *format)
 				case 'l':
 					correct_type=XP_PRINTF_TYPE_ULONG;
 					break;
-#if defined(XP_PRINTF_TYPE_ULONGLONG)
 				case 'l'|'l'<<8:
 					correct_type=XP_PRINTF_TYPE_ULONGLONG;
 					break;
-#endif
 				case 'j':
 					correct_type=XP_PRINTF_TYPE_UINTMAX;
 					break;
@@ -449,10 +443,8 @@ char* xp_asprintf_next(char *format, int type, ...)
 	unsigned int	ui=0;
 	long int		l=0;
 	unsigned long int	ul=0;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 	long long int	ll=0;
 	unsigned long long int	ull=0;
-#endif
 	double			d=0;
 	long double		ld=0;
 	char*			cp=NULL;
@@ -693,11 +685,9 @@ char* xp_asprintf_next(char *format, int type, ...)
 					case 'l':
 						correct_type=XP_PRINTF_TYPE_LONG;
 						break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 					case 'l'|'l'<<8:
 						correct_type=XP_PRINTF_TYPE_LONGLONG;
 						break;
-#endif
 					case 'j':
 						correct_type=XP_PRINTF_TYPE_INTMAX;
 						break;
@@ -730,11 +720,9 @@ char* xp_asprintf_next(char *format, int type, ...)
 					case 'l':
 						correct_type=XP_PRINTF_TYPE_ULONG;
 						break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 					case 'l'|'l'<<8:
 						correct_type=XP_PRINTF_TYPE_ULONGLONG;
 						break;
-#endif
 					case 'j':
 						correct_type=XP_PRINTF_TYPE_UINTMAX;
 						break;
@@ -825,14 +813,12 @@ char* xp_asprintf_next(char *format, int type, ...)
 		case XP_PRINTF_TYPE_ULONG:
 			ul=va_arg(vars, unsigned long int);
 			break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 		case XP_PRINTF_TYPE_LONGLONG:
 			ll=va_arg(vars, long long int);
 			break;
 		case XP_PRINTF_TYPE_ULONGLONG:
 			ull=va_arg(vars, unsigned long long int);
 			break;
-#endif
 		case XP_PRINTF_TYPE_CHARP:
 			cp=va_arg(vars, char*);
 			break;
@@ -866,14 +852,12 @@ char* xp_asprintf_next(char *format, int type, ...)
 						case XP_PRINTF_TYPE_ULONG:
 							i=ul;
 							break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 						case XP_PRINTF_TYPE_LONGLONG:
 							i=ll;
 							break;
 						case XP_PRINTF_TYPE_ULONGLONG:
 							i=ull;
 							break;
-#endif
 						case XP_PRINTF_TYPE_CHARP:
 							if(cp)
 								i=*cp;
@@ -908,14 +892,12 @@ char* xp_asprintf_next(char *format, int type, ...)
 						case XP_PRINTF_TYPE_ULONG:
 							i=ul;
 							break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 						case XP_PRINTF_TYPE_LONGLONG:
 							i=ll;
 							break;
 						case XP_PRINTF_TYPE_ULONGLONG:
 							i=ull;
 							break;
-#endif
 						case XP_PRINTF_TYPE_CHARP:
 							if (cp)
 								i=strtol(cp, NULL, 0);
@@ -948,14 +930,12 @@ char* xp_asprintf_next(char *format, int type, ...)
 						case XP_PRINTF_TYPE_ULONG:
 							ui=ul;
 							break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 						case XP_PRINTF_TYPE_LONGLONG:
 							ui=ll;
 							break;
 						case XP_PRINTF_TYPE_ULONGLONG:
 							ui=ull;
 							break;
-#endif
 						case XP_PRINTF_TYPE_CHARP:
 							if (cp)
 								ui=strtoul(cp, NULL, 0);
@@ -988,14 +968,12 @@ char* xp_asprintf_next(char *format, int type, ...)
 						case XP_PRINTF_TYPE_ULONG:
 							l=ul;
 							break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 						case XP_PRINTF_TYPE_LONGLONG:
 							l=ll;
 							break;
 						case XP_PRINTF_TYPE_ULONGLONG:
 							l=ull;
 							break;
-#endif
 						case XP_PRINTF_TYPE_CHARP:
 							if (cp)
 								l=strtol(cp, NULL, 0);
@@ -1028,14 +1006,12 @@ char* xp_asprintf_next(char *format, int type, ...)
 						case XP_PRINTF_TYPE_LONG:
 							ul=l;
 							break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 						case XP_PRINTF_TYPE_LONGLONG:
 							ul=ll;
 							break;
 						case XP_PRINTF_TYPE_ULONGLONG:
 							ul=ull;
 							break;
-#endif
 						case XP_PRINTF_TYPE_CHARP:
 							if (cp)
 								ul=strtoul(cp, NULL, 0);
@@ -1056,7 +1032,6 @@ char* xp_asprintf_next(char *format, int type, ...)
 							break;
 					}
 					break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 				case XP_PRINTF_TYPE_LONGLONG:
 					switch(type) {
 						case XP_PRINTF_TYPE_CHAR:
@@ -1133,7 +1108,6 @@ char* xp_asprintf_next(char *format, int type, ...)
 							break;
 					}
 					break;
-#endif
 				case XP_PRINTF_TYPE_CHARP:
 					num_str[0]=0;
 					switch(type) {
@@ -1154,7 +1128,6 @@ char* xp_asprintf_next(char *format, int type, ...)
 							sprintf(num_str, "%lu", ul);
 							cp=num_str;
 							break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 						case XP_PRINTF_TYPE_LONGLONG:
 							/* ToDo MSVC doesn't like this */
 							sprintf(num_str, "%lld", ll);
@@ -1165,7 +1138,6 @@ char* xp_asprintf_next(char *format, int type, ...)
 							sprintf(num_str, "%llu", ull);
 							cp=num_str;
 							break;
-#endif
 						case XP_PRINTF_TYPE_DOUBLE:
 							sprintf(num_str, "%f", d);
 							cp=num_str;
@@ -1200,14 +1172,12 @@ char* xp_asprintf_next(char *format, int type, ...)
 						case XP_PRINTF_TYPE_ULONG:
 							d=ul;
 							break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 						case XP_PRINTF_TYPE_LONGLONG:
 							d=ll;
 							break;
 						case XP_PRINTF_TYPE_ULONGLONG:
 							d=ull;
 							break;
-#endif
 						case XP_PRINTF_TYPE_CHARP:
 							if (cp)
 								d=strtod(cp, NULL);
@@ -1240,21 +1210,15 @@ char* xp_asprintf_next(char *format, int type, ...)
 						case XP_PRINTF_TYPE_ULONG:
 							ld=ul;
 							break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 						case XP_PRINTF_TYPE_LONGLONG:
 							ld=ll;
 							break;
 						case XP_PRINTF_TYPE_ULONGLONG:
 							ld=ull;
 							break;
-#endif
 						case XP_PRINTF_TYPE_CHARP:
 							if (cp)
-#if defined(__BORLANDC__)
-								ld=strtod(cp, NULL);
-#else
 								ld=strtold(cp, NULL);
-#endif
 							else
 								ld = 0.0L;
 							break;
@@ -1285,14 +1249,12 @@ char* xp_asprintf_next(char *format, int type, ...)
 						case XP_PRINTF_TYPE_ULONG:
 							pntr=(void *)((uintptr_t)ul);
 							break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 						case XP_PRINTF_TYPE_LONGLONG:
 							pntr=(void *)((intptr_t)ll);
 							break;
 						case XP_PRINTF_TYPE_ULONGLONG:
 							pntr=(void *)((uintptr_t)ull);
 							break;
-#endif
 						case XP_PRINTF_TYPE_CHARP:
 							pntr=(void *)(cp);
 							break;
@@ -1322,21 +1284,15 @@ char* xp_asprintf_next(char *format, int type, ...)
 						case XP_PRINTF_TYPE_ULONG:
 							s=ul;
 							break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 						case XP_PRINTF_TYPE_LONGLONG:
 							s=ll;
 							break;
 						case XP_PRINTF_TYPE_ULONGLONG:
 							s=ull;
 							break;
-#endif
 						case XP_PRINTF_TYPE_CHARP:
 							if (cp)
-#if defined(__BORLANDC__)
-								s=strtoul(cp, NULL, 0);
-#else
 								s=strtoull(cp, NULL, 0);
-#endif
 							else
 								s = 0;
 							break;
@@ -1374,14 +1330,12 @@ char* xp_asprintf_next(char *format, int type, ...)
 		case XP_PRINTF_TYPE_ULONG:
 			j=asprintf(&entry, fmt_nofield, ul);
 			break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 		case XP_PRINTF_TYPE_LONGLONG:
 			j=asprintf(&entry, fmt_nofield, ll);
 			break;
 		case XP_PRINTF_TYPE_ULONGLONG:
 			j=asprintf(&entry, fmt_nofield, ull);
 			break;
-#endif
 		case XP_PRINTF_TYPE_CHARP:
 			if(cp==NULL)
 				j=asprintf(&entry, fmt_nofield, "<null>");
@@ -1590,16 +1544,12 @@ build_arg_table(const char *format, va_list va)
 			case XP_PRINTF_TYPE_ULONG:
 				ret[i].ulong_type = va_arg(wva, unsigned long);
 				break;
-#ifdef XP_PRINTF_TYPE_LONGLONG
 			case XP_PRINTF_TYPE_LONGLONG:
 				ret[i].longlong_type = va_arg(wva, long long);
 				break;
-#endif
-#ifdef XP_PRINTF_TYPE_ULONGLONG
 			case XP_PRINTF_TYPE_ULONGLONG:
 				ret[i].ulonglong_type = va_arg(wva, unsigned long long);
 				break;
-#endif
 			case XP_PRINTF_TYPE_CHARP:
 				ret[i].charp_type = va_arg(wva, char *);
 				break;
@@ -1680,14 +1630,12 @@ char* xp_vasprintf(const char *format, va_list va)
 				case XP_PRINTF_TYPE_ULONG:
 					next=xp_asprintf_next(working, type, va_arg(wva, unsigned long));
 					break;
-	#if defined(XP_PRINTF_TYPE_LONGLONG)
 				case XP_PRINTF_TYPE_LONGLONG:
 					next=xp_asprintf_next(working, type, va_arg(wva, long long));
 					break;
 				case XP_PRINTF_TYPE_ULONGLONG:
 					next=xp_asprintf_next(working, type, va_arg(wva, unsigned long long));
 					break;
-	#endif
 				case XP_PRINTF_TYPE_CHARP:
 					next=xp_asprintf_next(working, type, va_arg(wva, char *));
 					break;
@@ -1735,16 +1683,12 @@ char* xp_vasprintf(const char *format, va_list va)
 				case XP_PRINTF_TYPE_ULONG:
 					next=xp_asprintf_next(working, type, atable[curpos - 1].ulong_type);
 					break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 				case XP_PRINTF_TYPE_LONGLONG:
 					next=xp_asprintf_next(working, type, atable[curpos - 1].longlong_type);
 					break;
-#endif
-#if defined(XP_PRINTF_TYPE_ULONGLONG)
 				case XP_PRINTF_TYPE_ULONGLONG:
 					next=xp_asprintf_next(working, type, atable[curpos - 1].ulonglong_type);
 					break;
-#endif
 				case XP_PRINTF_TYPE_CHARP:
 					next=xp_asprintf_next(working, type, atable[curpos - 1].charp_type);
 					break;
@@ -1799,9 +1743,7 @@ int main(int argc, char *argv[])
 	char	*format;
 	char	*p;
 	int	i,j;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 	long long L;
-#endif
 	long l;
 	char *cp;
 	double d;
@@ -1844,12 +1786,10 @@ int main(int argc, char *argv[])
 				l=atol(argv[j]+1);
 				p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_LONG,l);
 				break;
-#if defined(XP_PRINTF_TYPE_LONGLONG)
 			case 'L':
 				L=strtoll(argv[j]+1, NULL, 10);
 				p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_LONGLONG,L);
 				break;
-#endif
 			case 's':
 				cp=argv[j]+1;
 				p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_CHARP,cp);
@@ -1867,3 +1807,5 @@ int main(int argc, char *argv[])
 }
 
 #endif
+
+#endif
diff --git a/src/xpdev/xpprintf.h b/src/xpdev/xpprintf.h
index ed9114ddc8..fbc090a489 100644
--- a/src/xpdev/xpprintf.h
+++ b/src/xpdev/xpprintf.h
@@ -22,6 +22,8 @@
 #ifndef _XPPRINTF_H_
 #define _XPPRINTF_H_
 
+#if !defined(__BORLANDC__)
+
 #include <stdarg.h>
 #include "wrapdll.h"
 
@@ -36,10 +38,8 @@
 #define XP_PRINTF_TYPE_USHORT		XP_PRINTF_TYPE_UINT
 #define XP_PRINTF_TYPE_LONG			4
 #define XP_PRINTF_TYPE_ULONG		5
-#if !defined(__BORLANDC__)
-	#define XP_PRINTF_TYPE_LONGLONG		6
-	#define XP_PRINTF_TYPE_ULONGLONG	7
-#endif
+#define XP_PRINTF_TYPE_LONGLONG		6
+#define XP_PRINTF_TYPE_ULONGLONG	7
 #define XP_PRINTF_TYPE_CHARP		8
 #define XP_PRINTF_TYPE_DOUBLE		9
 #define XP_PRINTF_TYPE_FLOAT		XP_PRINTF_TYPE_DOUBLE	/* Floats are promoted to doubles */
@@ -61,6 +61,7 @@ DLLEXPORT char* xp_asprintf_next(char *format, int type, ...);
 DLLEXPORT char* xp_asprintf_end(char *format, size_t *endlen);
 DLLEXPORT char* xp_asprintf(const char *format, ...);
 DLLEXPORT char* xp_vasprintf(const char *format, va_list va);
+DLLEXPORT int xp_printf_get_next(char *format);
 DLLEXPORT int xp_printf_get_type(const char *format);
 #if defined(_MSC_VER) || defined(__MSVCRT__) || defined(__BORLANDC__)
 DLLEXPORT int vasprintf(char **strptr, const char *format, va_list va);
@@ -72,3 +73,5 @@ DLLEXPORT int asprintf(char **strptr, const char *format, ...);
 #endif
 
 #endif
+
+#endif
-- 
GitLab