Cleanup and rename replace_color() to put_color(), including sanity-checking of

foreground color code - this ensures that if a wild color code makes it this
far, it doesn't crash the client.



git-svn-id: svn://svn.code.sf.net/p/bitchx/code/trunk@121 13b04d17-f746-0410-82c6-800466cd88b0
This commit is contained in:
Kevin Easton
2011-04-08 13:10:05 +00:00
parent fd9980b9c7
commit 780ac2c149
2 changed files with 32 additions and 18 deletions

View File

@@ -1,5 +1,7 @@
[Changes 1.2c01] [Changes 1.2c01]
* [1.1s01] Sanity check color codes, fixes a potential crash. (caf)
* Add /FSET USERMODE_OTHER to correctly format user mode changes where the * Add /FSET USERMODE_OTHER to correctly format user mode changes where the
source isn't the same as the target, reported by gauze. (caf) source isn't the same as the target, reported by gauze. (caf)

View File

@@ -88,7 +88,7 @@ static int display_color (long color1, long color2);
static void display_normal (void); static void display_normal (void);
static char display_altcharset (int flag); static char display_altcharset (int flag);
static char *replace_color (int, int); static void put_color (int, int);
const u_char *BX_skip_ctl_c_seq (const u_char *start, int *lhs, int *rhs, int proper); const u_char *BX_skip_ctl_c_seq (const u_char *start, int *lhs, int *rhs, int proper);
@@ -904,7 +904,7 @@ static int altc = OFF;
display_blink(blink); display_blink(blink);
display_underline(undl); display_underline(undl);
display_altcharset(altc); display_altcharset(altc);
tputs_x(replace_color(-2, -2)); /* Reinstate color */ put_color(-2, -2); /* Reinstate color */
output_line(str); output_line(str);
@@ -914,7 +914,7 @@ static int altc = OFF;
blink = display_blink(OFF); blink = display_blink(OFF);
altc = display_altcharset(OFF); altc = display_altcharset(OFF);
#else #else
tputs_x(replace_color(-2,-2)); put_color(-2,-2);
output_line(str); output_line(str);
#endif #endif
term_newline(); term_newline();
@@ -1348,7 +1348,7 @@ static int display_color (long color1, long color2)
else else
doing_color = 1; doing_color = 1;
tputs_x(replace_color(color1, color2)); put_color(color1, color2);
return doing_color; return doing_color;
} }
@@ -2922,16 +2922,28 @@ unsigned char *BX_strip_ansi (const unsigned char *str)
} }
/* /*
* Meant as an argument to strip_ansi(). This version will replace ANSI * put_color()
* color changes with terminal specific color changes. *
* Converts ^C color code pairs into terminal specific color changes,
* and sends them to the terminal.
*
* Code foreground background
* -----------------------------------------------------------
* 0 to 15 MIRC-style color codes MIRC-style color codes
* 30 to 37 term colors 0 to 7 (invalid)
* 40 to 37 (invalid) term colors 0 to 7
* 50 to 57 term colors 8 to 15 term colors 8 to 15
* 58 (invalid) blinking on
*
* Setting both foreground and background to -1 sets the terminal
* to "normal", and setting both to -2 re-applies the last set colors.
*/ */
char *replace_color(int fore, int back) void put_color(int fore, int back)
{ {
static char retbuf[512]; char retbuf[512];
char *ptr = retbuf;
static int last_fore = -2, last_back = -2; static int last_fore = -2, last_back = -2;
static int fore_conv[] = { const static int fore_conv[] = {
15, 0, 4, 2, 1, 3, 5, 9, /* 0-7 */ 15, 0, 4, 2, 1, 3, 5, 9, /* 0-7 */
11, 10, 6, 14, 12, 13, 8, 7, /* 8-15 */ 11, 10, 6, 14, 12, 13, 8, 7, /* 8-15 */
15, 0, 0, 0, 0, 0, 0, 0, /* 16-23 */ 15, 0, 0, 0, 0, 0, 0, 0, /* 16-23 */
@@ -2941,7 +2953,7 @@ static char retbuf[512];
0, 0, 8, 9, 10, 11, 12, 13, /* 48-55 */ 0, 0, 8, 9, 10, 11, 12, 13, /* 48-55 */
14, 15 /* 56-57 */ 14, 15 /* 56-57 */
}; };
static int back_conv[] = { const static int back_conv[] = {
7, 0, 4, 2, 1, 3, 5, 1, 7, 0, 4, 2, 1, 3, 5, 1,
3, 2, 6, 6, 4, 5, 0, 0, 3, 2, 6, 6, 4, 5, 0, 0,
7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,
@@ -2952,10 +2964,8 @@ static char retbuf[512];
14, 15 14, 15
}; };
*ptr = '\0';
if (!get_int_var(COLOR_VAR)) if (!get_int_var(COLOR_VAR))
return retbuf; return;
if (fore == -2 && back == -2) if (fore == -2 && back == -2)
{ {
@@ -2964,7 +2974,8 @@ static char retbuf[512];
else if (fore == -1 && back == -1) else if (fore == -1 && back == -1)
{ {
last_fore = last_back = -2; last_fore = last_back = -2;
return (current_term->TI_sgrstrs[TERM_SGR_NORMAL-1]); tputs_x(current_term->TI_sgrstrs[TERM_SGR_NORMAL-1]);
return;
} }
if (fore == -1) if (fore == -1)
@@ -2972,9 +2983,10 @@ static char retbuf[512];
if (back == -1) if (back == -1)
back = last_back; back = last_back;
retbuf[0] = '\0';
if (back == 58) if (back == 58)
strcat(retbuf, current_term->TI_sgrstrs[TERM_SGR_BLINK_ON - 1]); strcat(retbuf, current_term->TI_sgrstrs[TERM_SGR_BLINK_ON - 1]);
if (fore > -1) if (fore > -1 && fore < 58)
strcat(retbuf, current_term->TI_forecolors[fore_conv[fore]]); strcat(retbuf, current_term->TI_forecolors[fore_conv[fore]]);
if (back > -1 && back < 58) if (back > -1 && back < 58)
strcat(retbuf, current_term->TI_backcolors[back_conv[back]]); strcat(retbuf, current_term->TI_backcolors[back_conv[back]]);
@@ -2982,5 +2994,5 @@ static char retbuf[512];
last_fore = fore; last_fore = fore;
last_back = back; last_back = back;
return retbuf; tputs_x(retbuf);
} }