From 09f89ab5005f3ab98c5467eedef1d20388efe277 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Sat, 4 Oct 2003 09:13:02 +0000
Subject: [PATCH] Added attr_push/attr_pop, and move right CTRL-A support

---
 src/sbbs3/js_global.c | 47 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 46 insertions(+), 1 deletion(-)

diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c
index d344ecabd8..09935845ac 100644
--- a/src/sbbs3/js_global.c
+++ b/src/sbbs3/js_global.c
@@ -832,6 +832,8 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 	time_t		now;
 	BOOL		nodisplay=FALSE;
 	scfg_t*		cfg;
+	uchar   	attr_stack[64]; /* Saved attributes (stack) */
+	int     	attr_sp;                /* Attribute stack pointer */
 
 	if((cfg=(scfg_t*)JS_GetPrivate(cx,obj))==NULL)		/* Will this work?  Ask DM */
 		return(JS_FALSE);
@@ -907,6 +909,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 					{
 						esccount++;
 						tmpbuf[j++]=inbuf[i];
+						tmpbuf[j++]=inbuf[++i];
 					}
 					else if(exascii) {
 						ch=inbuf[i];
@@ -1111,9 +1114,23 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 			}
 			else if(ctrl_a && tmpbuf[i]==1)		/* CTRL-A codes */
 			{
+/*				j+=sprintf(outbuf+j,"<!-- CTRL-A-%c (%u) -->",tmpbuf[i+1],tmpbuf[i+1]); */
 				if(nodisplay && tmpbuf[i+1] != ')')
 					continue;
-				switch(toupper(tmpbuf[i+1]))
+				if(tmpbuf[i+1]>0x7f)
+				{
+					j+=sprintf(outbuf+j,"%s%s%s",HTML_COLOR_PREFIX,htmlansi[0],HTML_COLOR_SUFFIX);
+					lastcolor=0;
+					l=tmpbuf[i+1]-0x7f;
+					if(l>81-hpos)
+						l=81-hpos;
+					for(k=0; k<l; k++)
+					{
+						j+=sprintf(outbuf+j,"%s","&nbsp;");
+						hpos++;
+					}
+				}
+				else switch(toupper(tmpbuf[i+1]))
 				{
 					case 'K':
 						fg=0;
@@ -1169,6 +1186,34 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 					case 'I':
 						blink=TRUE;
 						break;
+					case '+':
+						if(attr_sp<(int)sizeof(attr_stack))
+							attr_stack[attr_sp++]=(blink?(1<<7):0) | (bg << 4) | (bold?(1<<3):0) | fg;
+					case '-':
+						if(attr_sp>0)
+						{
+							blink=(attr_stack[--attr_sp]&(1<<7))?TRUE:FALSE;
+							bg=(attr_stack[attr_sp] >> 4) & 7;
+							blink=(attr_stack[attr_sp]&(1<<3))?TRUE:FALSE;
+							fg=attr_stack[attr_sp] & 7;
+						}
+						else if(bold || blink || bg)
+						{
+							bold=FALSE;
+							blink=FALSE;
+							fg=7;
+							bg=0;
+						}
+						break;
+					case '_':
+						if(blink || bg)
+						{
+							bold=FALSE;
+							blink=FALSE;
+							fg=7;
+							bg=0;
+						}
+						break;
 					case 'N':
 						bold=FALSE;
 						blink=FALSE;
-- 
GitLab