I noticed a couple things I wanted changed in Easy Color, and I thought you all might want to peruse it. Basically, I added redundancy checking (so that it wouldn't use the same color string repeatedly in a row), and ported a strlen_color() function I got from some ROM snippet site. It works for both forms of Easy Color. Here are the functions involved, they simply replace the old ones included in color.c: /* Updated by Tony Robbins to check that we don't repeat the last color, * which thus shortens the output and decreases the likelihood of a buffer * overflow. [990523] */ void proc_color(char *inbuf, int colour) { register int j = 0, p = 0; int k, max, c = 0, last_color = -1; char out_buf[32768]; if (inbuf[0] == '\0') return; while (inbuf[j] != '\0') { if ((inbuf[j]=='\\') && (inbuf[j+1]=='c') && isnum(inbuf[j + 2]) && isnum(inbuf[j + 3])) { c = (inbuf[j + 2] - '0')*10 + inbuf[j + 3]-'0'; j += 4; } else if ((inbuf[j] == '&') && !(is_colour(inbuf[j + 1]) == -1)) { c = is_colour(inbuf[j + 1]); j += 2; } else { out_buf[p] = inbuf[j]; j++; p++; continue; } if (c > MAX_COLORS) c = 0; max = strlen(COLOURLIST[c]); if (colour || max == 1) for (k = 0; k < max; k++) { if (c != last_color) out_buf[p] = COLOURLIST[c][k]; p++; } } out_buf[p] = '\0'; strcpy(inbuf, out_buf); } /* * This is a modified version of a function written by Wreck. * Original at http://dark.nrg.dtu.dk/~wreck/mud/code/color.txt * [broken link] * * With the modifications, it should be compatible with the newest * version of Lope's colour code. * * Note: I haven't tested this. It may not work perfectly. * Dennis Reed * * Converted to CircleMUD/EasyColor v2.2 by Tony Robbins. I haven't * tested it that much either. [990523] */ int strlen_color(char *argument) { char *str; int length = 0, current = 0; if (!*argument) return (0); str = argument; while ( str[current] != '\0' ) { if ((str[current] == '\\') && (str[current+1] == 'c') && isnum(str[current+2]) && isnum(str[current+3])) { current += 4; continue; } else if ((str[current] == '&') && !(is_colour(str[current+1]) == -1)) { current += 2; continue; } else { current++; length++; continue; } } return (length); } +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST