diff --git a/src/sbbs3/con_out.cpp b/src/sbbs3/con_out.cpp index 00bc8d127d56ffda74eb06c347a87593f511fd90..b72e8ecdc70a80d6f61aa971131fd63b477d591a 100644 --- a/src/sbbs3/con_out.cpp +++ b/src/sbbs3/con_out.cpp @@ -179,6 +179,17 @@ void sbbs_t::outchar(char ch) { int i; + /* + * outchar_esc values: + * 0: No sequence + * 1: ESC + * 2: CSI + * 3: Final byte + * 4: APS, DCS, PM, or OSC + * 5: SOS + * 6: ESC inside of SOS + */ + if(console&CON_ECHO_OFF) return; if(ch==ESC) @@ -186,6 +197,10 @@ void sbbs_t::outchar(char ch) else if(outchar_esc==1) { if(ch=='[') outchar_esc++; + else if(ch=='_' || ch=='P' || ch == '^' || ch == ']') + outchar_esc=4; + else if(ch=='X') + outchar_esc=5; else outchar_esc=0; } @@ -193,6 +208,24 @@ void sbbs_t::outchar(char ch) if(ch>='@' && ch<='~') outchar_esc++; } + else if(outchar_esc==4) { // APS, DCS, PM, or OSC + if (ch == ESC) + outchar_esc = 1; + if (!((ch >= 0x08 && ch <= 0x0d) || (ch >= 0x20 && ch <= 0x7e))) + outchar_esc = 0; + } + else if(outchar_esc==5) { // SOS + if (ch == ESC) + outchar_esc++; + } + else if(outchar_esc==6) { // ESC inside SOS + if (ch == '\\') + outchar_esc = 1; + else if (ch == 'X') + outchar_esc = 0; + else + outchar_esc = 5; + } else outchar_esc=0; if(term_supports(NO_EXASCII) && ch&0x80)