From 0155a436b089100cbf193169dd5b0ca6b2533d95 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 8 Jul 2003 10:31:18 +0000
Subject: [PATCH] Created new methods: home and cleartoeol(). Using new console
 abstraction functions (e.g. cursor_left/right, cleartoeol). Removed ansi_
 prefix from cursor positioning methods (the old method names remain as
 aliases for backwards compatibility).

---
 src/sbbs3/js_console.cpp | 138 ++++++++++++++++++++++++---------------
 1 file changed, 85 insertions(+), 53 deletions(-)

diff --git a/src/sbbs3/js_console.cpp b/src/sbbs3/js_console.cpp
index 90753bd26f..01783b64a8 100644
--- a/src/sbbs3/js_console.cpp
+++ b/src/sbbs3/js_console.cpp
@@ -587,6 +587,19 @@ js_clear(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
     return(JS_TRUE);
 }
 
+static JSBool
+js_home(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	sbbs_t*		sbbs;
+
+	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
+		return(JS_FALSE);
+
+	sbbs->cursor_home();
+	*rval=JSVAL_VOID;
+    return(JS_TRUE);
+}
+
 static JSBool
 js_clearline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
@@ -600,6 +613,19 @@ js_clearline(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
     return(JS_TRUE);
 }
 
+static JSBool
+js_cleartoeol(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	sbbs_t*		sbbs;
+
+	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
+		return(JS_FALSE);
+
+	sbbs->cleartoeol();
+	*rval=JSVAL_VOID;
+    return(JS_TRUE);
+}
+
 static JSBool
 js_crlf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
@@ -900,7 +926,7 @@ js_ansi(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 }
 
 static JSBool
-js_ansi_save(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+js_pushxy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	sbbs_t*		sbbs;
 
@@ -913,7 +939,7 @@ js_ansi_save(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 }
 
 static JSBool
-js_ansi_restore(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+js_popxy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	sbbs_t*		sbbs;
 
@@ -926,7 +952,7 @@ js_ansi_restore(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
 }
 
 static JSBool
-js_ansi_gotoxy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+js_gotoxy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	int32		x=1,y=1;
 	jsval		val;
@@ -952,7 +978,7 @@ js_ansi_gotoxy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
 
 
 static JSBool
-js_ansi_getxy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+js_getxy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	sbbs_t*		sbbs;
 	int			x,y;
@@ -975,9 +1001,21 @@ js_ansi_getxy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
     return(JS_TRUE);
 }
 
+static JSBool
+js_cursor_home(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+{
+	sbbs_t*		sbbs;
+
+	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
+		return(JS_FALSE);
+
+	sbbs->cursor_home();
+	*rval=JSVAL_VOID;
+    return(JS_TRUE);
+}
 
 static JSBool
-js_ansi_up(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+js_cursor_up(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	int32		val=1;
 	sbbs_t*		sbbs;
@@ -985,17 +1023,14 @@ js_ansi_up(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if(argc) {
-		JS_ValueToInt32(cx,argv[0],&val);
-		sbbs->rprintf("\x1b[%dA",val);
-	} else
-		sbbs->rputs("\x1b[A");
+	JS_ValueToInt32(cx,argv[0],&val);
+	sbbs->cursor_up(val);
 	*rval=JSVAL_VOID;
     return(JS_TRUE);
 }
 
 static JSBool
-js_ansi_down(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+js_cursor_down(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	int32		val=1;
 	sbbs_t*		sbbs;
@@ -1003,17 +1038,14 @@ js_ansi_down(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if(argc) {
-		JS_ValueToInt32(cx,argv[0],&val);
-		sbbs->rprintf("\x1b[%dB",val);
-	} else
-		sbbs->rputs("\x1b[B");
+	JS_ValueToInt32(cx,argv[0],&val);
+	sbbs->cursor_down(val);
 	*rval=JSVAL_VOID;
     return(JS_TRUE);
 }
 
 static JSBool
-js_ansi_right(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+js_cursor_right(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	int32		val=1;
 	sbbs_t*		sbbs;
@@ -1021,17 +1053,14 @@ js_ansi_right(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if(argc) {
-		JS_ValueToInt32(cx,argv[0],&val);
-		sbbs->rprintf("\x1b[%dC",val);
-	} else
-		sbbs->rputs("\x1b[C");
+	JS_ValueToInt32(cx,argv[0],&val);
+	sbbs->cursor_right(val);
 	*rval=JSVAL_VOID;
     return(JS_TRUE);
 }
 
 static JSBool
-js_ansi_left(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+js_cursor_left(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	int32		val=1;
 	sbbs_t*		sbbs;
@@ -1039,17 +1068,14 @@ js_ansi_left(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 	if((sbbs=(sbbs_t*)JS_GetContextPrivate(cx))==NULL)
 		return(JS_FALSE);
 
-	if(argc) {
-		JS_ValueToInt32(cx,argv[0],&val);
-		sbbs->rprintf("\x1b[%dD",val);
-	} else
-		sbbs->rputs("\x1b[D");
+	JS_ValueToInt32(cx,argv[0],&val);
+	sbbs->cursor_left(val);
 	*rval=JSVAL_VOID;
     return(JS_TRUE);
 }
 
 static JSBool
-js_ansi_getlines(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
+js_getlines(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 {
 	sbbs_t*		sbbs;
 
@@ -1140,11 +1166,17 @@ static jsMethodSpec js_console_functions[] = {
 	,JSDOCSTR("print a mnemonics string")
 	},		
 	{"clear",           js_clear,			0, JSTYPE_VOID,		""
-	,JSDOCSTR("clear screen")
-	},		
+	,JSDOCSTR("clear screen and home cursor")
+	},
+	{"home",            js_cursor_home,		0, JSTYPE_VOID,		""
+	,JSDOCSTR("send cursor to home position (x,y:1,1)")
+	},
 	{"clearline",       js_clearline,		0, JSTYPE_VOID,		""
 	,JSDOCSTR("clear current line")
 	},		
+	{"cleartoeol",      js_cleartoeol,		0, JSTYPE_VOID,		""
+	,JSDOCSTR("clear to end-of-line (ANSI)")
+	},		
 	{"crlf",            js_crlf,			0, JSTYPE_VOID,		""
 	,JSDOCSTR("output a carriage-return/line-feed pair (new-line)")
 	},		
@@ -1191,44 +1223,44 @@ static jsMethodSpec js_console_functions[] = {
 	{"ansi",			js_ansi,			1, JSTYPE_STRING,	JSDOCSTR("number attribute")
 	,JSDOCSTR("returns ANSI encoding of specified attribute")
 	},		
-	{"pushxy",			js_ansi_save,		0, JSTYPE_ALIAS	},
-	{"ansi_pushxy",		js_ansi_save,		0, JSTYPE_ALIAS	},
-	{"ansi_save",		js_ansi_save,		0, JSTYPE_VOID,		""
-	,JSDOCSTR("save current cursor position (AKA ansi_pushxy)")
+	{"ansi_save",		js_pushxy,			0, JSTYPE_ALIAS	},
+	{"ansi_pushxy",		js_pushxy,			0, JSTYPE_ALIAS	},
+	{"pushxy",			js_pushxy,			0, JSTYPE_VOID,		""
+	,JSDOCSTR("save current cursor position (AKA ansi_save)")
 	},
-	{"popxy",			js_ansi_restore,	0, JSTYPE_ALIAS },
-	{"ansi_popxy",		js_ansi_restore,	0, JSTYPE_ALIAS },
-	{"ansi_restore",	js_ansi_restore,	0, JSTYPE_VOID,		""
-	,JSDOCSTR("restore saved cursor position (AKA ansi_popxy)")
+	{"ansi_restore",	js_popxy,			0, JSTYPE_ALIAS },
+	{"ansi_popxy",		js_popxy,			0, JSTYPE_ALIAS },
+	{"popxy",			js_popxy,			0, JSTYPE_VOID,		""
+	,JSDOCSTR("restore saved cursor position (AKA ansi_restore)")
 	},
-	{"gotoxy",			js_ansi_gotoxy,		1, JSTYPE_ALIAS },
-	{"ansi_gotoxy",		js_ansi_gotoxy,		1, JSTYPE_VOID,		JSDOCSTR("number x,y")
+	{"ansi_gotoxy",		js_gotoxy,			1, JSTYPE_ALIAS },
+	{"gotoxy",			js_gotoxy,			1, JSTYPE_VOID,		JSDOCSTR("number x,y")
 	,JSDOCSTR("Move cursor to a specific screen coordinate (ANSI), "
 	"arguments can be separate x and y cooridinates or an object with x and y properites "
 	"(like that returned from <tt>console.getxy()</tt>)")
 	},
-	{"up",				js_ansi_up,			0, JSTYPE_ALIAS },
-	{"ansi_up",			js_ansi_up,			0, JSTYPE_VOID,		JSDOCSTR("[number rows]")
+	{"ansi_up",			js_cursor_up,		0, JSTYPE_ALIAS },
+	{"up",				js_cursor_up,		0, JSTYPE_VOID,		JSDOCSTR("[number rows]")
 	,JSDOCSTR("Move cursor up one or more rows (ANSI)")
 	},
-	{"down",			js_ansi_down,		0, JSTYPE_ALIAS },
-	{"ansi_down",		js_ansi_down,		0, JSTYPE_VOID,		JSDOCSTR("[number rows]")
+	{"ansi_down",		js_cursor_down,		0, JSTYPE_ALIAS },
+	{"down",			js_cursor_down,		0, JSTYPE_VOID,		JSDOCSTR("[number rows]")
 	,JSDOCSTR("Move cursor down one or more rows (ANSI)")
 	},
-	{"right",			js_ansi_right,		0, JSTYPE_ALIAS },
-	{"ansi_right",		js_ansi_right,		0, JSTYPE_VOID,		JSDOCSTR("[number columns]")
+	{"ansi_right",		js_cursor_right,	0, JSTYPE_ALIAS },
+	{"right",			js_cursor_right,	0, JSTYPE_VOID,		JSDOCSTR("[number columns]")
 	,JSDOCSTR("Move cursor right one or more columns (ANSI)")
 	},
-	{"left",			js_ansi_left,		0, JSTYPE_ALIAS },
-	{"ansi_left",		js_ansi_left,		0, JSTYPE_VOID,		JSDOCSTR("[number columns]")
+	{"ansi_left",		js_cursor_left,		0, JSTYPE_ALIAS },
+	{"left",			js_cursor_left,		0, JSTYPE_VOID,		JSDOCSTR("[number columns]")
 	,JSDOCSTR("Move cursor left one or more columns (ANSI)")
 	},
-	{"getlines",		js_ansi_getlines,	0, JSTYPE_ALIAS },
-	{"ansi_getlines",	js_ansi_getlines,	0, JSTYPE_VOID,		""
+	{"ansi_getlines",	js_getlines,		0, JSTYPE_ALIAS },
+	{"getlines",		js_getlines,		0, JSTYPE_VOID,		""
 	,JSDOCSTR("Auto-detect the number of rows/lines on the user's terminal (ANSI)")
 	},
-	{"getxy",			js_ansi_getxy,		0, JSTYPE_ALIAS },
-	{"ansi_getxy",		js_ansi_getxy,		0, JSTYPE_OBJECT,	""
+	{"ansi_getxy",		js_getxy,			0, JSTYPE_ALIAS },
+	{"getxy",			js_getxy,			0, JSTYPE_OBJECT,	""
 	,JSDOCSTR("Returns the current cursor position as an object (with x and y properties)")
 	},
 	{"lock_input",		js_lock_input,		1, JSTYPE_VOID,		JSDOCSTR("[boolean lock]")
-- 
GitLab