/*****************************************************************
**
** 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 <stdio.h>
#include <string.h>
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
# include "config_zkt.h"
#if defined(COLOR_MODE) && COLOR_MODE && HAVE_LIBNCURSES
# ifdef HAVE_TERM_H
# include <term.h>
# endif
# ifdef HAVE_CURSES_H
# include <curses.h>
# 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 = "<B>";
bold_off = "</B>";
italic_on = "<I>";
italic_off = "</I>";
af = "";
maxcolor = 8;
snprintf (colortab[TC_BLACK], sizeof colortab[0], "<font color=black>");
snprintf (colortab[TC_BLUE], sizeof colortab[0], "<font color=blue>");
snprintf (colortab[TC_GREEN], sizeof colortab[0], "<font color=green>");
snprintf (colortab[TC_CYAN], sizeof colortab[0], "<font color=cyan>");
snprintf (colortab[TC_RED], sizeof colortab[0], "<font color=red>");
snprintf (colortab[TC_MAGENTA], sizeof colortab[0], "<font color=magenta>");
snprintf (colortab[TC_YELLOW], sizeof colortab[0], "<font color=yellow>");
snprintf (colortab[TC_WHITE], sizeof colortab[0], "<font color=white>");
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, "</font>");
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