/* Autoconf patching by David Hedbor, neotron@lysator.liu.se */ /*********************************************************************/ /* file: highlight.c - functions related to the highlight command */ /* TINTIN ++ */ /* (T)he K(I)cki(N) (T)ickin D(I)kumud Clie(N)t */ /* coded by Bill Reiss 1993 */ /*********************************************************************/ #ifdef HAVE_STRING_H #include <string.h> #else #ifdef HAVE_STRINGS_H #include <strings.h> #endif #endif /* CHANGED to include <ctype.h>, since we use isdigit() etc. * Thanks to Brian Ebersole [Harm@GrimneMUD] for the bug report! */ #include <ctype.h> #include "tintin.h" #ifdef HAVE_STDLIB_H #include <stdlib.h> #endif #ifdef HAVE_UNISTD_H #include <unistd.h> #endif extern char *get_arg_in_braces(); extern struct listnode *searchnode_list(); extern struct listnode *search_node_with_wild(); extern struct listnode *deletenode_list(); void add_codes(); int is_high_arg(); extern struct listnode *common_highs; extern char vars[10][BUFFER_SIZE]; /* the %0, %1, %2,....%9 variables */ extern int hinum; extern int mesvar[7]; extern char high_starts[13][80]; extern char high_ends[13][80]; /***************************/ /* the #highlight command */ /***************************/ void parse_high(arg, ses) char *arg; struct session *ses; { char left[BUFFER_SIZE], right[BUFFER_SIZE], result[BUFFER_SIZE]; struct listnode *myhighs, *ln; int colflag = TRUE; char *pright, *tmp1, *tmp2, tmp3[BUFFER_SIZE]; pright = right; *pright = '\0'; myhighs = (ses) ? ses->highs : common_highs; arg = get_arg_in_braces(arg, left, 0); arg = get_arg_in_braces(arg, right, 1); if (!*left) { tintin_puts("#THESE HIGHLIGHTS HAVE BEEN DEFINED:", ses); show_list(myhighs); prompt(ses); } else { tmp1 = left; tmp2 = tmp1; while (*tmp2 != '\0') { tmp2++; while (*tmp2 != ',' && *tmp2 != '\0') tmp2++; while (isspace(*tmp1)) tmp1++; strncpy(tmp3, tmp1, tmp2 - tmp1); tmp3[tmp2 - tmp1] = '\0'; colflag = is_high_arg(tmp3); tmp1 = tmp2 + 1; } if (colflag == TRUE) { if ((ln = searchnode_list(myhighs, right)) != NULL) deletenode_list(myhighs, ln); insertnode_list(myhighs, right, left, "0", ALPHA); hinum++; if (mesvar[4]) { sprintf(result, "#Ok. {%s} is now highlighted %s.", right, left); tintin_puts2(result, ses); } } else { tintin_puts2("Invalid Highlighting color or effect, valid types are red, blue, cyan, green,", ses); tintin_puts2("yellow, magenta, white, grey, black, brown, charcoal, light red, light blue,", ses); tintin_puts2("light cyan, light magenta, light green, b red, b blue, b cyan, b green,", ses); tintin_puts2("b yellow, b magenta, b white, b grey, b black, b brown, b charcoal, b light", ses); tintin_puts2("red, b light blue, b light cyan, b light magenta, b light green, bold,", ses); tintin_puts2("faint, blink, italic, reverse, or 1-32"); } } } int is_high_arg(s) char *s; { int code; sscanf(s, "%d", &code); if (is_abrev(s, "red") || is_abrev(s, "blue") || is_abrev(s, "cyan") || is_abrev(s, "green") || is_abrev(s, "yellow") || is_abrev(s, "magenta") || is_abrev(s, "white") || is_abrev(s, "grey") || is_abrev(s, "black") || is_abrev(s, "brown") || is_abrev(s, "charcoal") || is_abrev(s, "light red") || is_abrev(s, "light blue") || is_abrev(s, "light cyan") || is_abrev(s, "light magenta") || is_abrev(s, "light green") || is_abrev(s, "b red") || is_abrev(s, "b blue") || is_abrev(s, "b cyan") || is_abrev(s, "b green") || is_abrev(s, "b yellow") || is_abrev(s, "b magenta") || is_abrev(s, "b white") || is_abrev(s, "b grey") || is_abrev(s, "b black") || is_abrev(s, "b brown") || is_abrev(s, "b charcoal") || is_abrev(s, "b light red") || is_abrev(s, "b light blue") || is_abrev(s, "b light cyan") || is_abrev(s, "b light magenta") || is_abrev(s, "b light green") || is_abrev(s, "bold") || is_abrev(s, "faint") || is_abrev(s, "blink") || is_abrev(s, "italic") || is_abrev(s, "reverse") || (isdigit(*s) && code < 33 && code > 0)) return TRUE; else return FALSE; } /*****************************/ /* the #unhighlight command */ /*****************************/ void unhighlight_command(arg, ses) char *arg; struct session *ses; { char left[BUFFER_SIZE], result[BUFFER_SIZE]; struct listnode *myhighs, *ln, *temp; int flag; flag = FALSE; myhighs = (ses) ? ses->highs : common_highs; temp = myhighs; arg = get_arg_in_braces(arg, left, 1); while ((ln = search_node_with_wild(temp, left)) != NULL) { if (mesvar[4]) { sprintf(result, "Ok. {%s} is no longer %s.", ln->left, ln->right); tintin_puts2(result, ses); } /* @@@changed -- perry (ln is deleted and free'd by deletenode!!!) deletenode_list(myhighs, ln); temp=ln; */ temp = deletenode_list(myhighs, ln); flag = TRUE; } if (!flag && mesvar[4]) tintin_puts2("#THAT HIGHLIGHT IS NOT DEFINED.", ses); } void do_one_high(line, ses) char *line; struct session *ses; { /* struct listnode *ln, *myhighs; */ struct listnode *ln; char temp[BUFFER_SIZE], temp2[BUFFER_SIZE], result[BUFFER_SIZE]; char *lptr, *tptr, *line2, *firstch_ptr; char *place; int hflag, length; hflag = TRUE; ln = ses->highs; while ((ln = ln->next)) { if (check_one_action(line, ln->left, ses)) { firstch_ptr = ln->left; if (*(firstch_ptr) == '^') firstch_ptr++; prepare_actionalias(firstch_ptr, temp, ses); *(line + strlen(line) + 2) = '\0'; hflag = TRUE; line2 = line; while (hflag) { lptr = temp; place = line2; while (*lptr != *line2) { place = ++line2; } length = 0; while (*lptr == *line2 && *lptr != '\0') { length++; lptr++; line2++; } if (length >= strlen(temp)) hflag = FALSE; } add_codes(temp, temp2, ln->right, 0); *(place) = '\0'; tptr = line2; sprintf(result, "%s%s%s", line, temp2, tptr); strcpy(line, result); } } } void add_codes(line, result, htype, flag) char *line, *result, *htype; int flag; { char *tmp1, *tmp2, tmp3[BUFFER_SIZE]; int code; sprintf(result, "%s", DEFAULT_BEGIN_COLOR); tmp1 = htype; tmp2 = tmp1; while (*tmp2 != '\0') { tmp2++; while (*tmp2 != ',' && *tmp2 != '\0') tmp2++; while (isspace(*tmp1)) tmp1++; strncpy(tmp3, tmp1, tmp2 - tmp1); tmp3[tmp2 - tmp1] = '\0'; code = -1; if (isdigit(*tmp3)) { sscanf(tmp3, "%d", &code); code--; } if (is_abrev(tmp3, "black") || code == 0) strcat(result, ";30"); else if (is_abrev(tmp3, "red") || code == 1) strcat(result, ";31"); else if (is_abrev(tmp3, "green") || code == 2) strcat(result, ";32"); else if (is_abrev(tmp3, "brown") || code == 3) strcat(result, ";33"); else if (is_abrev(tmp3, "blue") || code == 4) strcat(result, ";34"); else if (is_abrev(tmp3, "magenta") || code == 5) strcat(result, ";35"); else if (is_abrev(tmp3, "cyan") || code == 6) strcat(result, ";36"); else if (is_abrev(tmp3, "grey") || code == 7) strcat(result, ";37"); else if (is_abrev(tmp3, "charcoal") || code == 8) strcat(result, ";30;1"); else if (is_abrev(tmp3, "light red") || code == 9) strcat(result, ";31;1"); else if (is_abrev(tmp3, "light green") || code == 10) strcat(result, ";32;1"); else if (is_abrev(tmp3, "yellow") || code == 11) strcat(result, ";33;1"); else if (is_abrev(tmp3, "light blue") || code == 12) strcat(result, ";34;1"); else if (is_abrev(tmp3, "light magenta") || code == 13) strcat(result, ";35;1"); else if (is_abrev(tmp3, "light cyan") || code == 14) strcat(result, ";36;1"); else if (is_abrev(tmp3, "white") || code == 15) strcat(result, ";37;1"); else if (is_abrev(tmp3, "b black") || code == 16) strcat(result, ";40"); else if (is_abrev(tmp3, "b red") || code == 17) strcat(result, ";41"); else if (is_abrev(tmp3, "b green") || code == 18) strcat(result, ";42"); else if (is_abrev(tmp3, "b brown") || code == 19) strcat(result, ";43"); else if (is_abrev(tmp3, "b blue") || code == 20) strcat(result, ";44"); else if (is_abrev(tmp3, "b magenta") || code == 21) strcat(result, ";45"); else if (is_abrev(tmp3, "b cyan") || code == 22) strcat(result, ";46"); else if (is_abrev(tmp3, "b grey") || code == 23) strcat(result, ";47"); else if (is_abrev(tmp3, "b charcoal") || code == 24) strcat(result, ";40;1"); else if (is_abrev(tmp3, "b light red") || code == 25) strcat(result, ";41;1"); else if (is_abrev(tmp3, "b light green") || code == 26) strcat(result, ";42;1"); else if (is_abrev(tmp3, "b yellow") || code == 27) strcat(result, ";43;1"); else if (is_abrev(tmp3, "b light blue") || code == 28) strcat(result, ";44;1"); else if (is_abrev(tmp3, "b light magenta") || code == 29) strcat(result, ";45;1"); else if (is_abrev(tmp3, "b light cyan") || code == 30) strcat(result, ";46;1"); else if (is_abrev(tmp3, "b white") || code == 31) strcat(result, ";47;1"); else if (is_abrev(tmp3, "bold")) strcat(result, ";1"); else if (is_abrev(tmp3, "faint")) strcat(result, ";2"); else if (is_abrev(tmp3, "blink")) strcat(result, ";5"); else if (is_abrev(tmp3, "italic")) strcat(result, ";3"); else if (is_abrev(tmp3, "reverse")) strcat(result, ";7"); tmp1 = tmp2 + 1; } strcat(result, "m"); strcat(result, line); strcat(result, DEFAULT_END_COLOR); }