David van Moolenbroek 00b67f09dd Import NetBSD named(8)
Also known as ISC bind.  This import adds utilities such as host(1),
dig(1), and nslookup(1), as well as many other tools and libraries.

Change-Id: I035ca46e64f1965d57019e773f4ff0ef035e4aa3
2017-03-21 22:00:06 +00:00

346 lines
7.8 KiB
C

/* $NetBSD: tcap.c,v 1.1.1.1 2015/07/08 15:37:48 christos Exp $ */
/*****************************************************************
**
** 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