/***************************************************************** ** ** tcap.c -- termcap color capabilities ** ** (c) Jan 1991 - Feb 2010 by hoz ** ** Feb 2002 max line size increased to 512 byte ** default terminal "html" added ** Feb 2010 color capabilities added ** *****************************************************************/ #include #include #ifdef HAVE_CONFIG_H # include #endif # include "config_zkt.h" #if defined(COLOR_MODE) && COLOR_MODE && HAVE_LIBNCURSES # ifdef HAVE_TERM_H # include # endif # ifdef HAVE_CURSES_H # include # endif #endif #define extern # include "tcap.h" #undef extern /***************************************************************** ** global vars *****************************************************************/ /* termcap strings */ static const char *is1 = ""; static const char *is2 = ""; static const char *r1 = ""; static const char *r2 = ""; static const char *bold_on = ""; static const char *bold_off = ""; static const char *italic_on = ""; static const char *italic_off = ""; static char colortab[8][31+1]; /* termcap numbers */ static int maxcolor; /* function declaration */ static int tc_printattr (FILE *fp, const char *attstr); static int tc_color (FILE *fp, int color); static int html = 0; /***************************************************************** ** global functions *****************************************************************/ #if defined(COLOR_MODE) && COLOR_MODE && HAVE_LIBNCURSES int tc_init (FILE *fp, const char *term) { static char area[1024]; char buf[1024]; char *ap = area; char *af = ""; /* AF */ /* ansi foreground */ int i; /* clear all color strings */ for ( i = 0; i < 8; i++ ) colortab[i][0] = '\0'; if ( term == NULL || *term == '\0' || strcmp (term, "none") == 0 || strcmp (term, "dumb") == 0 ) return 0; if ( strcmp (term, "html") == 0 || strcmp (term, "HTML") == 0 ) { bold_on = ""; bold_off = ""; italic_on = ""; italic_off = ""; af = ""; maxcolor = 8; snprintf (colortab[TC_BLACK], sizeof colortab[0], ""); snprintf (colortab[TC_BLUE], sizeof colortab[0], ""); snprintf (colortab[TC_GREEN], sizeof colortab[0], ""); snprintf (colortab[TC_CYAN], sizeof colortab[0], ""); snprintf (colortab[TC_RED], sizeof colortab[0], ""); snprintf (colortab[TC_MAGENTA], sizeof colortab[0], ""); snprintf (colortab[TC_YELLOW], sizeof colortab[0], ""); snprintf (colortab[TC_WHITE], sizeof colortab[0], ""); html = 1; return 0; } #if 0 if ( !istty (fp) ) return 0; #endif switch ( tgetent (buf, term) ) { case -1: perror ("termcap file"); return -1; case 0: fprintf (stderr, "unknown terminal %s\n", term); return -1; } if ( !(is1 = tgetstr ("is1", &ap)) ) is1 = ""; if ( !(is2 = tgetstr ("is2", &ap)) ) is2 = ""; if ( !(r1 = tgetstr ("r1", &ap)) ) r1 = ""; if ( !(r2 = tgetstr ("r2", &ap)) ) r2 = ""; /* if bold is not present */ if ( !(bold_on = tgetstr ("md", &ap)) ) /* use standout mode */ if ( !(bold_on = tgetstr ("so", &ap)) ) bold_on = bold_off = ""; else bold_off = tgetstr ("se", &ap); else bold_off = tgetstr ("me", &ap); /* if italic not present */ if ( !(italic_on = tgetstr ("ZH", &ap)) ) /* use underline mode */ if ( !(italic_on = tgetstr ("us", &ap)) ) italic_on = italic_off = ""; else italic_off = tgetstr ("ue", &ap); else italic_off = tgetstr ("ZR", &ap); maxcolor = tgetnum ("Co"); if ( maxcolor < 0 ) /* no colors ? */ return 0; if ( maxcolor > 8 ) maxcolor = 8; if ( (af = tgetstr ("AF", &ap)) ) /* set ansi color foreground */ { for ( i = 0; i < maxcolor; i++ ) snprintf (colortab[i], sizeof colortab[0], "%s", tparm (af, i)); } else if ( (af = tgetstr ("Sf", &ap)) ) /* or set color foreground */ { snprintf (colortab[TC_BLACK], sizeof colortab[0], "%s", tparm (af, 0)); snprintf (colortab[TC_BLUE], sizeof colortab[0], "%s", tparm (af, 1)); snprintf (colortab[TC_GREEN], sizeof colortab[0], "%s", tparm (af, 2)); snprintf (colortab[TC_CYAN], sizeof colortab[0], "%s", tparm (af, 3)); snprintf (colortab[TC_RED], sizeof colortab[0], "%s", tparm (af, 4)); snprintf (colortab[TC_MAGENTA], sizeof colortab[0], "%s", tparm (af, 5)); snprintf (colortab[TC_YELLOW], sizeof colortab[0], "%s", tparm (af, 6)); snprintf (colortab[TC_WHITE], sizeof colortab[0], "%s", tparm (af, 7)); } #if 0 if ( is1 && *is1 ) tc_printattr (fp, is1); if ( is2 && *is2 ) tc_printattr (fp, is2); #endif return 0; } #else int tc_init (FILE *fp, const char *term) { int i; is1 = ""; is2 = ""; r1 = ""; r2 = ""; bold_on = ""; bold_off = ""; italic_on = ""; italic_off = ""; for ( i = 0; i < 8; i++ ) colortab[i][0] = '\0'; maxcolor = 0; html = 0; return 0; } #endif #if defined(COLOR_MODE) && COLOR_MODE && HAVE_LIBNCURSES int tc_end (FILE *fp, const char *term) { #if 0 if ( term ) { // if ( r1 && *r1 ) tc_printattr (fp, r1); if ( r2 && *r2 ) tc_printattr (fp, r2); } #endif return 0; } #else int tc_end (FILE *fp, const char *term) { return 0; } #endif #if defined(COLOR_MODE) && COLOR_MODE && HAVE_LIBNCURSES int tc_attr (FILE *fp, tc_att_t attr, int on) { int len; len = 0; if ( on ) /* turn attributes on ? */ { if ( (attr & TC_BOLD) == TC_BOLD ) len += tc_printattr (fp, bold_on); if ( (attr & TC_ITALIC) == TC_ITALIC ) len += tc_printattr (fp, italic_on); if ( attr & 0xFF ) len += tc_color (fp, attr & 0xFF); } else /* turn attributes off */ { if ( html ) len += fprintf (fp, ""); else len += tc_color (fp, TC_BLACK); if ( (attr & TC_ITALIC) == TC_ITALIC ) len += tc_printattr (fp, italic_off); if ( !html || (attr & TC_BOLD) == TC_BOLD ) len += tc_printattr (fp, bold_off); } return len; } #else int tc_attr (FILE *fp, tc_att_t attr, int on) { return 0; } #endif /***************************************************************** ** internal functions *****************************************************************/ static FILE *tc_outfp; static int put (int c) { return putc (c, tc_outfp); } #if defined(COLOR_MODE) && COLOR_MODE && HAVE_LIBNCURSES static int tc_printattr (FILE *fp, const char *attstr) { tc_outfp = fp; return tputs (attstr, 0, put); } #else static int tc_printattr (FILE *fp, const char *attstr) { return 0; } #endif #if defined(COLOR_MODE) && COLOR_MODE && HAVE_LIBNCURSES static int tc_color (FILE *fp, int color) { tc_outfp = fp; if ( color < 0 || color >= maxcolor ) return 0; return tputs (colortab[color], 0, put); } #else static int tc_color (FILE *fp, int color) { return 0; } #endif #ifdef TEST static const char *progname; /***************************************************************** ** test main() *****************************************************************/ main (int argc, const char *argv[]) { extern char *getenv (); char *term = getenv ("TERM"); int i; const char *text; progname = *argv; tc_init (stdout, term); // printattr (is); /* Initialisierungsstring ausgeben */ text = "Test"; if ( argc > 1 ) text = *++argv; tc_attr (stdout, TC_BOLD, 1); printf ("Bold Headline\n"); tc_attr (stdout, TC_BOLD, 0); for ( i = 0; i < 8; i++ ) { tc_attr (stdout, i, 1); printf ("%s", text); tc_attr (stdout, i, 0); #if 0 tc_attr (stdout, (i | TC_BOLD), 1); printf ("\t%s", text); tc_attr (stdout, (i | TC_BOLD), 0); tc_attr (stdout, (i | TC_ITALIC), 1); printf ("\t%s", text); tc_attr (stdout, (i | TC_ITALIC), 0); tc_attr (stdout, (i | TC_BOLD | TC_ITALIC), 1); printf ("\t%s", text); tc_attr (stdout, (i | TC_BOLD | TC_ITALIC), 0); #endif printf ("\n"); } printf ("now back to black\n"); // printattr (r2); /* Zuruecksetzen */ return (0); } #endif