/*********************************************************************/ /* 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 */ /*********************************************************************/ #include <string.h> #include "tintin.h" #if IRIX #include <stdlib.h> #include <unistd.h> #endif extern char *get_arg_in_braces(); extern struct listnode *searchnode_list(); extern struct listnode *search_node_with_wild(); 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; 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); } deletenode_list(myhighs, ln); flag=TRUE; temp=ln; } 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); }