From 0178043e56c04ef741cbb1cbbc3be3ab973d996c Mon Sep 17 00:00:00 2001
From: "Rob Swindell (on Windows 11)" <rob@synchro.net>
Date: Mon, 3 Feb 2025 11:04:11 -0800
Subject: [PATCH] Correctly center lines of text that contain @-codes, after
 @center@

@-codes weren't expanded before the text length calculation, so the centering
logic (offset in the user's terminal screen) would usually be incorrect as
pointed out by Nelgin in #synchronet when we were discussing the |C @-code
modifier (which is to center an @-code value in a field, not the screen).

This issue was a known limitation of the fix to issue #418 (commit 8987150bd)
but now that we have the expand_atcodes() function (hooray!), this is an
easily solvable problem.

Note: we're now calling center() withOUT the 'msg' parameter set to true,
which means the @center@ code goes back to the previous (to issue #418 fix)
behavior of just using bputs() for the centered text (we don't need the
recursive call to pustmsg() to support @-codes any longer). This was the only
reason that center() grew the optional 'msg' parameter so we likely can remove
that option/feature at some date.
---
 src/sbbs3/putmsg.cpp | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/src/sbbs3/putmsg.cpp b/src/sbbs3/putmsg.cpp
index 2016e08c1c..8ef4acaf0b 100644
--- a/src/sbbs3/putmsg.cpp
+++ b/src/sbbs3/putmsg.cpp
@@ -78,7 +78,9 @@ char sbbs_t::putmsg(const char *buf, int mode, int org_cols, JSObject* obj)
 // Print a message fragment, doesn't save/restore any console states (e.g. attributes, auto-pause)
 char sbbs_t::putmsgfrag(const char* buf, int& mode, int org_cols, JSObject* obj)
 {
-	char                 tmp2[256], tmp3[128];
+	char                 tmp[256];
+	char                 tmp2[256];
+	char                 path[MAX_PATH + 1];
 	char*                str = (char*)buf;
 	uchar                exatr = 0;
 	char                 mark = '\0';
@@ -207,8 +209,8 @@ char sbbs_t::putmsgfrag(const char* buf, int& mode, int org_cols, JSObject* obj)
 				if (i > 0) {
 					tmp2[i] = 0;
 					sys_status |= SS_NEST_PF;     /* keep it only one message deep! */
-					SAFEPRINTF2(tmp3, "%s%s", cfg.text_dir, tmp2);
-					printfile(tmp3, 0);
+					SAFEPRINTF2(path, "%s%s", cfg.text_dir, tmp2);
+					printfile(path, 0);
 					sys_status &= ~SS_NEST_PF;
 				}
 			}
@@ -409,11 +411,11 @@ char sbbs_t::putmsgfrag(const char* buf, int& mode, int org_cols, JSObject* obj)
 				if (memcmp(str + l, "@CENTER@", 8) == 0) {
 					l += 8;
 					i = 0;
-					while (i < (int)sizeof(tmp2) - 1 && str[l] != 0 && str[l] != '\r' && str[l] != '\n')
-						tmp2[i++] = str[l++];
-					tmp2[i] = 0;
-					truncsp(tmp2);
-					center(tmp2, /* msg: */ true);
+					while (i < (int)sizeof(tmp) - 1 && str[l] != 0 && str[l] != '\r' && str[l] != '\n')
+						tmp[i++] = str[l++];
+					tmp[i] = 0;
+					truncsp(tmp);
+					center(expand_atcodes(tmp, tmp2, sizeof tmp2));
 					if (str[l] == '\r')
 						l++;
 					if (str[l] == '\n')
-- 
GitLab