#define _OCOLOR_C_ #include "ocolor.h" #include "utils.h" #include #ifndef OCOLOR_STACK_MAX #define OCOLOR_STACK_MAX 4096 #endif int colorize = 0; int current_color = OC_SANE; int color_dir_n = 0; int color_dir_max = 0; ocd_t *color_directory = NULL; char *term_name = NULL; int context_n = 0; int *contexts = NULL; char **term_list = { NULL }; static int stack[OCOLOR_STACK_MAX]; static int tos = 0; /* top of stack */ static int state = 0; static int terms_max = 0; static int terms_n = 0; static oct_t *r = NULL; static oct_t *ter = NULL; static char a_color[1024]; #define OC_VT100 ((int)(0x0001)) /* This is kind of gross .. */ char *ocolor_code_to_string ( int ccode ) { int i, k; ocm_t *p if ( state == 0 ) return NULL; if ( ter == NULL ) return NULL; if ( ter->flags & OC_VT100 ) { a_color[0] = 0; if ( ccode & OC_SANE ) strcat ( a_color, "normal " ); if ( ccode & OC_BOLD ) strcat ( a_color, "bold " ); if ( ccode & OC_ULINE ) strcat ( a_color, "uline " ); if ( ccode & OC_BLINK ) strcat ( a_color, "blink " ); if ( ccode & OC_INVERT ) strcat ( a_color, "inverse " ); switch ( ccode & 0x00F00 ) { case OC_BLACK : strcat ( a_color, "fg-black " ); break; case OC_RED : strcat ( a_color, "fg-red " ); break; case OC_GREEN : strcat ( a_color, "fg-green " ); break; case OC_YELLOW : strcat ( a_color, "fg-yellow " ); break; case OC_BLUE : strcat ( a_color, "fg-blue " ); break; case OC_MAGENTA : strcat ( a_color, "fg-magenta "); break; case OC_CYAN : strcat ( a_color, "fg-cyan " ); break; case OC_WHITE : strcat ( a_color, "fg-white " ); break; } switch ( ccode & 0x00F000 ) { case OC_BG_BLACK : strcat ( a_color, "bg-black " ); break; case OC_BG_RED : strcat ( a_color, "bg-red " ); break; case OC_BG_GREEN : strcat ( a_color, "bg-green " ); break; case OC_BG_YELLOW : strcat ( a_color, "bg-yellow " ); break; case OC_BG_BLUE : strcat ( a_color, "bg-blue " ); break; case OC_BG_MAGENTA : strcat ( a_color, "bg-magenta "); break; case OC_BG_CYAN : strcat ( a_color, "bg-cyan " ); break; case OC_BG_WHITE : strcat ( a_color, "bg-white " ); break; } switch ( ccode & 0x00F0000 ) { case OC_BG_DK_BLACK : strcat ( a_color, "bg-dk-black" ); break; case OC_BG_DK_RED : strcat ( a_color, "bg-dk-red" ); break; case OC_BG_DK_GREEN : strcat ( a_color, "bg-dk-green" ); break; case OC_BG_DK_YELLOW : strcat ( a_color, "bg-dk-yellow" ); break; case OC_BG_DK_BLUE : strcat ( a_color, "bg-dk-blue" ); break; case OC_BG_DK_MAGENTA : strcat ( a_color, "bg-dk-magenta"); break; case OC_BG_DK_CYAN : strcat ( a_color, "bg-dk-cyan" ); break; case OC_BG_DK_WHITE : strcat ( a_color, "bg-dk-white" ); break; } return a_color; } else { /* FIXME -- add support for extended codes */ return NULL; } return NULL; } /* end of ocolor_code_to_string() */ int ocolor_string_to_code ( char *str ) { int ccode = 0; if ( state == 0 ) return NULL; if ( ter == NULL ) return NULL; if ( ter->flags & OC_VT100 ) { if ( str == NULL ) return OC_SANE; if ( strstr ( str, "sane" ) != NULL ) ccode = OC_SANE; if ( strstr ( str, "normal" ) != NULL ) ccode = OC_NORMAL; if ( strstr ( str, "bold" ) != NULL ) ccode |= OC_BOLD; if ( strstr ( str, "uline" ) != NULL ) ccode |= OC_ULINE; if ( strstr ( str, "blink" ) != NULL ) ccode |= OC_BLINK; if ( strstr ( str, "invert" ) != NULL ) ccode |= OC_INVERT; if ( strstr ( str, "inverse" ) != NULL ) ccode |= OC_INVERT; if ( strstr ( str, "fg-black" ) != NULL ) ccode |= OC_BLACK; if ( strstr ( str, "fg-red" ) != NULL ) ccode |= OC_RED; if ( strstr ( str, "fg-green" ) != NULL ) ccode |= OC_GREEN; if ( strstr ( str, "fg-yellow" ) != NULL ) ccode |= OC_YELLOW; if ( strstr ( str, "fg-blue" ) != NULL ) ccode |= OC_BLUE; if ( strstr ( str, "fg-cyan" ) != NULL ) ccode |= OC_CYAN; if ( strstr ( str, "fg-white" ) != NULL ) ccode |= OC_WHITE; if ( strstr ( str, "fg-magenta" ) != NULL ) ccode |= OC_MAGENTA; if ( strstr ( str, "bg-black" ) != NULL ) ccode |= OC_BG_BLACK; if ( strstr ( str, "bg-red" ) != NULL ) ccode |= OC_BG_RED; if ( strstr ( str, "bg-green" ) != NULL ) ccode |= OC_BG_GREEN; if ( strstr ( str, "bg-yellow" ) != NULL ) ccode |= OC_BG_YELLOW; if ( strstr ( str, "bg-blue" ) != NULL ) ccode |= OC_BG_BLUE; if ( strstr ( str, "bg-cyan" ) != NULL ) ccode |= OC_BG_CYAN; if ( strstr ( str, "bg-white" ) != NULL ) ccode |= OC_BG_WHITE; if ( strstr ( str, "bg-magenta" ) != NULL ) ccode |= OC_BG_MAGENTA; if ( strstr ( str, "bg-dk-black" ) != NULL ) ccode |= OC_BG_DK_BLACK; if ( strstr ( str, "bg-dk-red" ) != NULL ) ccode |= OC_BG_DK_RED; if ( strstr ( str, "bg-dk-green" ) != NULL ) ccode |= OC_BG_DK_GREEN; if ( strstr ( str, "bg-dk-yellow" ) != NULL ) ccode |= OC_BG_DK_YELLOW; if ( strstr ( str, "bg-dk-blue" ) != NULL ) ccode |= OC_BG_DK_BLUE; if ( strstr ( str, "bg-dk-cyan" ) != NULL ) ccode |= OC_BG_DK_CYAN; if ( strstr ( str, "bg-dk-white" ) != NULL ) ccode |= OC_BG_DK_WHITE; if ( strstr ( str, "bg-dk-magenta" ) != NULL ) ccode |= OC_BG_DK_MAGENTA; return 0; } else { /* FIXME -- add support for extended codes */ return -1; } return 0; } /* END of function ocolor_string_to_code() */ static void stradd ( char *str, int *nc, char *xtra ) { if ( *nc == 0 ) { strcat ( str, xtra ); *nc = 1; } else { strcat ( str, ";" ); strcat ( str, xtra ); } } int ocolor_write ( int ccode ) { char str[1024]; int ndcol; if ( ( colorize | state ) == 0 ) return -1; if ( ter == NULL ) return NULL; if ( ter->flags & OC_VT100 ) { sprintf ( str, "%c[", 0x1b ); ndcol = 0; if ( ccode & OC_SANE ) stradd ( str, &ndcol, "0" ); if ( ccode & OC_BOLD ) stradd ( str, &ndcol, "1" ); if ( ccode & OC_ULINE ) stradd ( str, &ndcol, "4" ); if ( ccode & OC_BLINK ) stradd ( str, &ndcol, "5" ); if ( ccode & OC_INVERT ) stradd ( str, &ndcol, "7" ); switch ( ccode & 0x00F00 ) { case OC_BLACK : stradd ( str, &ndcol, "30" ); break; case OC_RED : stradd ( str, &ndcol, "31" ); break; case OC_GREEN : stradd ( str, &ndcol, "32" ); break; case OC_YELLOW : stradd ( str, &ndcol, "33" ); break; case OC_BLUE : stradd ( str, &ndcol, "34" ); break; case OC_MAGENTA : stradd ( str, &ndcol, "35" ); break; case OC_CYAN : stradd ( str, &ndcol, "36" ); break; case OC_WHITE : stradd ( str, &ndcol, "37" ); break; } switch ( ccode & 0x00F000 ) { case OC_BG_BLACK : stradd ( str, &ndcol, "100" ); break; case OC_BG_RED : stradd ( str, &ndcol, "101" ); break; case OC_BG_GREEN : stradd ( str, &ndcol, "102" ); break; case OC_BG_YELLOW : stradd ( str, &ndcol, "103" ); break; case OC_BG_BLUE : stradd ( str, &ndcol, "104" ); break; case OC_BG_MAGENTA : stradd ( str, &ndcol, "105" ); break; case OC_BG_CYAN : stradd ( str, &ndcol, "106" ); break; case OC_BG_WHITE : stradd ( str, &ndcol, "107" ); break; } switch ( ccode & 0x00F0000 ) { case OC_BG_DK_BLACK : stradd ( str, &ndcol, "40" ); break; case OC_BG_DK_RED : stradd ( str, &ndcol, "41" ); break; case OC_BG_DK_GREEN : stradd ( str, &ndcol, "42" ); break; case OC_BG_DK_YELLOW : stradd ( str, &ndcol, "43" ); break; case OC_BG_DK_BLUE : stradd ( str, &ndcol, "44" ); break; case OC_BG_DK_MAGENTA : stradd ( str, &ndcol, "45" ); break; case OC_BG_DK_CYAN : stradd ( str, &ndcol, "46" ); break; case OC_BG_DK_WHITE : stradd ( str, &ndcol, "47" ); break; } if ( !ndcol ) strcat ( str, "0" ); strcat ( str, "m" ); write ( 1, str, strlen(str) ); return 0; } else { /* FIXME -- add support for extended codes */ return -1; } return 0; } int ocolor_set ( int ccode ) { if ( ( colorize | state ) == 0 ) return -1; if ( silent_running != 0 ) return 0; current_color = ccode; return ocolor_write ( ccode ); } int ocolor_push ( int ccode ) { if ( ( colorize | state ) == 0 ) return -1; if ( silent_running != 0 ) return 0; if ( tos >= OCOLOR_STACK_MAX ) { stack[0] = current_color; tos = 1; } stack[tos++] = ccode; if ( ccode != current_color ) return ocolor_set; return 0; } int ocolor_pop () { if ( ( colorize | state ) == 0 ) return -1; if ( silent_running != 0 ) return 0; if ( tos <= 0 ) { ocolor_set ( OC_SANE ); /* FIXME -- add support for extended codes */ tos = 0; return 0; } tos--; } int ocolor_get () { if ( ( colorize | state ) == 0 ) return -1; if ( tos <= 0 ) return OC_SANE; return stack[tos-1]; } int ocolor_reset ( int ccode ) { /* can't fuckin' remember what I wanted to do with this goddamn function */ return 0; } int ocolor_ctxtid ( char *context_name ) { int i; int retval; FOR ( i, context_n ) if ( strcmp ( context_dir[i].name, context_name ) == 0 ) return ( context_dir[i].id ); return -1; } int ocolor_bind ( int ccode, int context_id, char *context_name ) { int id = context_id; if ( context_name != NULL ) id = ocolor_ctxtid ( context_name ); if ( id < 0 ) return -1; if ( id >= context_n ) return -2; contexts[id] = ccode; return 0; } int ocolor_color ( int ccode, int term_id, char *term_name, char *ctlstr, char *name ) { /* FIXME -- add support for extended codes */ return 0; } int ocolor_sterm ( int term_id, char *term_name ) { /* FIXME -- add support for extended codes */ return 0; } int ocolor_termid ( char *term_name ) { /* FIXME -- add support for extended codes */ return 0; } static oct_t vt100_term = { OC_VT100, "vt100", 1, 0, NULL, NULL }; int ocolor_init() { int i; /* FIXME -- implement non-vt100 terminal support */ state = 1; ter = &vt100_term; current_color = OC_SANE; color_dir_n = 1; color_dir_max = 1; color_directory = &vt100_term; term_name = "vt100"; context_n = OC_NCONTEXTS; contexts = (int*) malloc ( sizeof ( int ) * context_n ); if ( contexts != NULL ) FOR ( i, context_n ) contexts[i] = OC_SANE; }