2005-09-20 23:26:39 +10:00
# include "config.h"
2006-02-28 23:17:16 +10:00
2005-09-20 23:26:39 +10:00
# include <stdlib.h>
# include <stdio.h>
# include <string.h>
# include <termios.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <unistd.h>
2006-01-24 03:37:20 +10:00
# include <locale.h>
2005-09-20 23:26:39 +10:00
# if HAVE_NCURSES_H
# include <ncurses.h>
# else
# include <curses.h>
# endif
# if HAVE_TERMIO_H
# include <termio.h>
# endif
2006-01-19 22:22:07 +10:00
# if HAVE_TERM_H
2005-09-20 23:26:39 +10:00
# include <term.h>
2006-01-19 22:22:07 +10:00
# elif HAVE_NCURSES_TERM_H
# include <ncurses/term.h>
# endif
2005-09-20 23:26:39 +10:00
# include <errno.h>
# ifdef HAVE_GETOPT_H
# include <getopt.h>
# endif
2006-01-24 03:37:20 +10:00
# if HAVE_LIBINTL_H
# include <libintl.h>
# endif
2006-06-15 23:49:15 +10:00
# include "fallback.h"
2005-09-20 23:26:39 +10:00
/*
Small utility for setting the color .
Usage : set_color COLOR
where COLOR is either an integer from 0 to seven or one of the strings in the col array .
*/
# define COLORS (sizeof(col) / sizeof(char *))
2006-01-24 03:37:20 +10:00
/**
Program name
*/
# define SET_COLOR "set_color"
2006-05-27 00:55:51 +10:00
/**
Getopt short switches for set_color
*/
2006-06-15 23:49:15 +10:00
# define GETOPT_STRING "b:hvocu"
2006-05-27 00:55:51 +10:00
2006-01-24 03:37:20 +10:00
# if HAVE_GETTEXT
# define _(string) gettext(string)
# else
# define _(string) (string)
# endif
2005-09-20 23:26:39 +10:00
char * col [ ] =
{
" black " ,
" red " ,
" green " ,
" brown " ,
" yellow " ,
" blue " ,
" magenta " ,
" purple " ,
" cyan " ,
" white " ,
" normal "
}
;
int col_idx [ ] =
{
0 ,
1 ,
2 ,
3 ,
3 ,
4 ,
5 ,
5 ,
6 ,
7 ,
8
}
;
void print_help ( ) ;
int translate_color ( char * str )
{
char * endptr ;
int color ;
if ( ! str )
return - 1 ;
color = strtol ( str , & endptr , 10 ) ;
if ( endptr < = str )
{
int i ;
color = - 1 ;
for ( i = 0 ; i < COLORS ; i + + )
{
if ( strcasecmp ( col [ i ] , str ) = = 0 )
{
color = col_idx [ i ] ;
break ;
}
}
}
return color ;
}
2005-10-25 03:51:08 +10:00
void print_colors ( )
{
int i ;
for ( i = 0 ; i < COLORS ; i + + )
{
printf ( " %s \n " , col [ i ] ) ;
}
}
2006-02-04 21:42:56 +10:00
static void check_locale_init ( )
2006-01-24 03:37:20 +10:00
{
2006-02-04 21:42:56 +10:00
static int is_init = 0 ;
if ( is_init )
return ;
is_init = 1 ;
2006-01-24 03:37:20 +10:00
setlocale ( LC_ALL , " " ) ;
# if HAVE_GETTEXT
bindtextdomain ( PACKAGE_NAME , LOCALEDIR ) ;
textdomain ( PACKAGE_NAME ) ;
# endif
}
2005-09-20 23:26:39 +10:00
int main ( int argc , char * * argv )
{
char * bgcolor = 0 ;
char * fgcolor = 0 ;
int fg , bg ;
2005-09-24 11:28:34 +10:00
int bold = 0 ;
2006-06-15 23:49:15 +10:00
int underline = 0 ;
char * bg_seq , * fg_seq ;
2005-09-20 23:26:39 +10:00
while ( 1 )
{
2005-11-28 01:06:03 +10:00
# ifdef HAVE_GETOPT_LONG
2005-09-20 23:26:39 +10:00
static struct option
long_options [ ] =
{
{
" background " , required_argument , 0 , ' b '
}
,
{
" help " , no_argument , 0 , ' h '
}
,
2005-09-24 11:28:34 +10:00
{
" bold " , no_argument , 0 , ' o '
}
,
2006-06-15 23:49:15 +10:00
{
" underline " , no_argument , 0 , ' u '
}
,
2005-09-20 23:26:39 +10:00
{
" version " , no_argument , 0 , ' v '
}
,
2005-10-25 03:51:08 +10:00
{
" print-colors " , no_argument , 0 , ' c '
}
,
2005-09-20 23:26:39 +10:00
{
0 , 0 , 0 , 0
}
}
;
int opt_index = 0 ;
int opt = getopt_long ( argc ,
argv ,
2006-05-27 00:55:51 +10:00
GETOPT_STRING ,
2005-09-20 23:26:39 +10:00
long_options ,
& opt_index ) ;
# else
int opt = getopt ( argc ,
argv ,
2006-05-27 00:55:51 +10:00
GETOPT_STRING ) ;
2005-09-20 23:26:39 +10:00
# endif
if ( opt = = - 1 )
break ;
switch ( opt )
{
case 0 :
break ;
case ' b ' :
bgcolor = optarg ;
break ;
case ' h ' :
print_help ( ) ;
exit ( 0 ) ;
2005-09-24 11:28:34 +10:00
case ' o ' :
bold = 1 ;
break ;
2006-06-15 23:49:15 +10:00
case ' u ' :
underline = 1 ;
break ;
2005-09-20 23:26:39 +10:00
case ' v ' :
2006-02-04 21:42:56 +10:00
check_locale_init ( ) ;
2006-01-24 03:37:20 +10:00
fprintf ( stderr , _ ( " %s, version %s \n " ) , SET_COLOR , PACKAGE_VERSION ) ;
2005-09-20 23:26:39 +10:00
exit ( 0 ) ;
2005-10-25 03:51:08 +10:00
case ' c ' :
print_colors ( ) ;
exit ( 0 ) ;
2005-09-20 23:26:39 +10:00
case ' ? ' :
return 1 ;
}
}
switch ( argc - optind )
{
case 0 :
// printf( "no fg\n" );
break ;
case 1 :
fgcolor = argv [ optind ] ;
// printf( "fg %s\n", fgcolor );
break ;
default :
2006-02-04 21:42:56 +10:00
check_locale_init ( ) ;
2006-01-24 03:37:20 +10:00
printf ( _ ( " %s: Too many arguments \n " ) , SET_COLOR ) ;
2005-09-20 23:26:39 +10:00
return 1 ;
}
2006-06-15 23:49:15 +10:00
if ( ! fgcolor & & ! bgcolor & & ! bold & & ! underline )
2005-09-20 23:26:39 +10:00
{
2006-02-04 21:42:56 +10:00
check_locale_init ( ) ;
2006-01-24 03:37:20 +10:00
fprintf ( stderr , _ ( " %s: Expected an argument \n " ) , SET_COLOR ) ;
2005-09-20 23:26:39 +10:00
print_help ( ) ;
return 1 ;
}
fg = translate_color ( fgcolor ) ;
if ( fgcolor & & ( fg = = - 1 ) )
{
2006-02-04 21:42:56 +10:00
check_locale_init ( ) ;
2006-01-24 03:37:20 +10:00
fprintf ( stderr , _ ( " %s: Unknown color '%s' \n " ) , SET_COLOR , fgcolor ) ;
2005-09-20 23:26:39 +10:00
return 1 ;
}
bg = translate_color ( bgcolor ) ;
if ( bgcolor & & ( bg = = - 1 ) )
{
2006-02-04 21:42:56 +10:00
check_locale_init ( ) ;
2006-01-24 03:37:20 +10:00
fprintf ( stderr , _ ( " %s: Unknown color '%s' \n " ) , SET_COLOR , bgcolor ) ;
2005-09-20 23:26:39 +10:00
return 1 ;
}
setupterm ( 0 , STDOUT_FILENO , 0 ) ;
2005-09-24 11:28:34 +10:00
2006-06-15 23:49:15 +10:00
fg_seq = set_a_foreground ? set_a_foreground : set_foreground ;
bg_seq = set_a_background ? set_a_background : set_background ;
2005-09-24 11:28:34 +10:00
if ( bold )
{
2006-06-15 23:49:15 +10:00
if ( enter_bold_mode )
putp ( enter_bold_mode ) ;
}
if ( underline )
{
if ( enter_underline_mode )
putp ( enter_underline_mode ) ;
2005-09-24 11:28:34 +10:00
}
2005-09-20 23:26:39 +10:00
if ( bgcolor )
{
if ( bg = = 8 )
{
2006-06-15 23:49:15 +10:00
if ( bg_seq )
putp ( tparm ( bg_seq , 0 ) ) ;
2005-09-20 23:26:39 +10:00
putp ( tparm ( exit_attribute_mode ) ) ;
}
}
if ( fgcolor )
{
if ( fg = = 8 )
{
2006-06-15 23:49:15 +10:00
if ( fg_seq )
putp ( tparm ( fg_seq , 0 ) ) ;
2005-09-20 23:26:39 +10:00
putp ( tparm ( exit_attribute_mode ) ) ;
}
else
{
2006-06-15 23:49:15 +10:00
if ( fg_seq )
putp ( tparm ( fg_seq , fg ) ) ;
2005-09-20 23:26:39 +10:00
}
}
if ( bgcolor )
{
if ( bg ! = 8 )
{
2006-06-15 23:49:15 +10:00
if ( bg_seq )
putp ( tparm ( bg_seq , bg ) ) ;
2005-09-20 23:26:39 +10:00
}
}
2006-06-15 23:49:15 +10:00
2006-08-14 09:05:02 +10:00
if ( del_curterm ( cur_term ) = = ERR )
{
debug ( 0 , _ ( L " Error while closing terminfo " ) ) ;
}
2006-06-15 23:49:15 +10:00
2005-09-20 23:26:39 +10:00
}