diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c index 2ee6631ea13c61c6dd3576b90a85baacf7256d45..d98f9316068614ba5f4860dba1772a4a6170255d 100644 --- a/src/sbbs3/js_global.c +++ b/src/sbbs3/js_global.c @@ -1115,6 +1115,37 @@ js_strip_ctrl(JSContext *cx, uintN argc, jsval *arglist) return(JS_TRUE); } +static JSBool +js_strip_ansi(JSContext *cx, uintN argc, jsval *arglist) +{ + jsval *argv=JS_ARGV(cx, arglist); + char* buf = NULL; + JSString* js_str; + jsrefcount rc; + + JS_SET_RVAL(cx, arglist, JSVAL_VOID); + + if(argc==0 || JSVAL_IS_VOID(argv[0])) + return JS_TRUE; + + JSVALUE_TO_MSTRING(cx, argv[0], buf, NULL) + HANDLE_PENDING(cx, buf); + if(buf==NULL) + return JS_TRUE; + + rc=JS_SUSPENDREQUEST(cx); + strip_ansi(buf); + JS_RESUMEREQUEST(cx, rc); + + js_str = JS_NewStringCopyZ(cx, buf); + free(buf); + if(js_str==NULL) + return JS_FALSE; + + JS_SET_RVAL(cx, arglist, STRING_TO_JSVAL(js_str)); + return JS_TRUE; +} + static JSBool js_strip_exascii(JSContext *cx, uintN argc, jsval *arglist) { @@ -4574,6 +4605,10 @@ static jsSyncMethodSpec js_global_functions[] = { ,JSDOCSTR("strip control characters from string, returns modified string") ,310 }, + {"strip_ansi", js_strip_ansi, 1, JSTYPE_STRING, JSDOCSTR("text") + ,JSDOCSTR("strip all ANSI terminal control sequences from string, returns modified string") + ,31802 + }, {"strip_exascii", js_strip_exascii, 1, JSTYPE_STRING, JSDOCSTR("text") ,JSDOCSTR("strip all extended-ASCII characters from string, returns modified string") ,310 diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h index c46e5cb6b169f669beb8258de53866b1287b1789..db1111c679cdc6208beeb7ccad69b4cd3675334d 100644 --- a/src/sbbs3/sbbs.h +++ b/src/sbbs3/sbbs.h @@ -1221,6 +1221,7 @@ extern "C" { DLLEXPORT BOOL trashcan(scfg_t* cfg, const char *insearch, const char *name); DLLEXPORT char * trashcan_fname(scfg_t* cfg, const char *name, char* fname, size_t); DLLEXPORT str_list_t trashcan_list(scfg_t* cfg, const char* name); + DLLEXPORT char * strip_ansi(char* str); DLLEXPORT char * strip_exascii(const char *str, char* dest); DLLEXPORT char * strip_space(const char *str, char* dest); DLLEXPORT char * prep_file_desc(const char *str, char* dest); diff --git a/src/sbbs3/str_util.c b/src/sbbs3/str_util.c index 61b50955073ba23d9171ef7680535abba33d17e7..8b170bdd658486f6e02c4d729dd2155bc65ddc88 100644 --- a/src/sbbs3/str_util.c +++ b/src/sbbs3/str_util.c @@ -89,6 +89,25 @@ char* strip_ctrl(const char *str, char* dest) return dest; } +char* strip_ansi(char* str) +{ + char* s = str; + char* d = str; + while(*s != '\0') { + if(*s == ESC && *(s + 1) == '[') { + s += 2; + while(*s != '\0' && (*s < '@' || *s > '~')) + s++; + if(*s != '\0') // Skip "final byte"" + s++; + } else { + *(d++) = *(s++); + } + } + *d = '\0'; + return str; +} + char* strip_exascii(const char *str, char* dest) { int i,j;