⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rdcolor.c

📁 项目描述: slsnif is a serial port logging utility. It listens to the specified serial port and logs all
💻 C
字号:
/* rdcolor.c: this program initializes color/printer variables using a *   rdcolor.dat file if it exists.  Otherwise, default values are used. *   The <rdcolor.dat> file uses the following format: *	color ...<CR> *   where the ellipsis is the escape sequence to be used for the "color". *   The following characters have special meaning when preceded by a *   backslash: *	     \e     =>      escape character *	     \f     =>      formfeed character *	     \h     =>      backspace character *	     \n     =>      newline character *	     \t     =>      tab character *	     \A - \Z=>      Associated control characters */#include <stdio.h>#include <ctype.h>#include "xtdio.h"/* * #define DEBUG_TEST * #define DEBUG *//* ------------------------------------------------------------------------- * Definitions: */#define LINESIZE 80#define TERMSIZE 20/* ------------------------------------------------------------------------- * Global Data: */char *BLACK   = NULL;char *RED     = NULL;char *GREEN   = NULL;char *YELLOW  = NULL;char *BLUE    = NULL;char *MAGENTA = NULL;char *CYAN    = NULL;char *WHITE   = NULL;/* since some systems just have to use BLACK, ..., WHITE for themselves... */char *RD_BLACK   = NULL;char *RD_RED     = NULL;char *RD_GREEN   = NULL;char *RD_YELLOW  = NULL;char *RD_BLUE    = NULL;char *RD_MAGENTA = NULL;char *RD_CYAN    = NULL;char *RD_WHITE   = NULL;char *UBLACK     = NULL;char *URED       = NULL;char *UGREEN     = NULL;char *UYELLOW    = NULL;char *UBLUE      = NULL;char *UMAGENTA   = NULL;char *UCYAN      = NULL;char *UWHITE     = NULL;char *RVBLACK    = NULL;char *RVRED      = NULL;char *RVGREEN    = NULL;char *RVYELLOW   = NULL;char *RVBLUE     = NULL;char *RVMAGENTA  = NULL;char *RVCYAN     = NULL;char *RVWHITE    = NULL;char *CLEAR      = NULL;char *BOLD       = NULL;char *NRML       = NULL;char *PYELLOW    = NULL;char *PRED       = NULL;char *PCYAN      = NULL;char *PBLACK     = NULL;/* ------------------------------------------------------------------------- */static struct colorstr{ /* color data structure			*/	char **color;	/* points to a color variable			*/	char *name;		/* gives a name to a color				*/	char *defalt;	/* default color string: nothing		*/	} colors[]={	  {&BLACK,		"BLACK",	"\0"},	  {&RED,		"RED",		"\0"},	  {&GREEN,		"GREEN",	"\0"},	  {&YELLOW,		"YELLOW",	"\0"},	  {&BLUE,		"BLUE",		"\0"},	  {&MAGENTA,	"MAGENTA",	"\0"},	  {&CYAN,		"CYAN",		"\0"},	  {&WHITE,		"WHITE",	"\0"},	  {&UBLACK,		"UBLACK",	"\0"},	  {&URED,		"URED",		"\0"},	  {&UGREEN,		"UGREEN",	"\0"},	  {&UYELLOW,	"UYELLOW",	"\0"},	  {&UBLUE,		"UBLUE",	"\0"},	  {&UMAGENTA,	"UMAGENTA",	"\0"},	  {&UCYAN,		"UCYAN",	"\0"},	  {&UWHITE,		"UWHITE",	"\0"},	  {&RVBLACK,	"RVBLACK",	"\0"},	  {&RVRED,		"RVRED",	"\0"},	  {&RVGREEN,	"RVGREEN",	"\0"},	  {&RVYELLOW,	"RVYELLOW",	"\0"},	  {&RVBLUE,		"RVBLUE",	"\0"},	  {&RVMAGENTA,	"RVMAGENTA","\0"},	  {&RVCYAN,		"RVCYAN",	"\0"},	  {&RVWHITE,	"RVWHITE",	"\0"},	  {&BOLD,		"BOLD",		"\0"},	  {&NRML,		"NRML",		"\0"},	  {&PYELLOW,	"PYELLOW",	"\0"},	  {&PRED,		"PRED",		"\0"},	  {&PCYAN,		"PCYAN",	"\0"},	  {&PBLACK,		"PBLACK",	"\0"},	  {&CLEAR,		"CLEAR",	"\0"}	  };static int ncolor      = sizeof(colors)/sizeof(struct colorstr);char      *colorfile[] = {"rdcolor.dat","color.dat"};static int ncolorfile  = sizeof(colorfile)/sizeof(char *);static int rdcolor_done= 0;	/* has rdcolor been called? *//* ------------------------------------------------------------------------- *//* rdcolor: read the <rdcolor.dat> file */#ifdef __PROTOTYPE__void rdcolor(void)#else	/* __PROTOTYPE__ */void rdcolor()#endif	/* __PROTOTYPE__ */{FILE *fp    = NULL;char *cmd   = NULL;char *new   = NULL;char *lterm = NULL;int   icolor;int   foundterm;static char  color[LINESIZE];static char  line[LINESIZE];static char  newdef[LINESIZE+LINESIZE];static char *term=NULL;/* indicate that rdcolor() has been called */rdcolor_done= 1;/* set up default colors */for(icolor= 0; icolor < ncolor; ++icolor) *(colors[icolor].color)= colors[icolor].defalt;/* attempt to open <rdcolor.dat> file */for(icolor= 0; icolor < ncolorfile; ++icolor) {	fp= fopenv(colorfile[icolor],"r","RDCOLOR");	if(fp) break;	}if(!fp) { /* use default values */	/* set up RD_... colors */	RD_BLACK  = BLACK;	RD_RED    = RED;	RD_GREEN  = GREEN;	RD_YELLOW = YELLOW;	RD_BLUE   = BLUE;	RD_MAGENTA= MAGENTA;	RD_CYAN   = CYAN;	RD_WHITE  = WHITE;	return;	}/* attempt to locate correct terminal definition */#ifdef unixterm= getenv("TERM");#endif#ifdef LATTICEterm= "TI";#endif#ifdef DESMETterm= "TI";#endif#ifdef AZTEC_Cterm= "Amiga"#endif#ifdef vmsterm= "vms";#endif#ifdef MSDOSterm= "ibmpc";#endifif(term) {  /* search for terminal entry in <rdcolor.dat> file */	foundterm= 0;	while(fgets(line,LINESIZE,fp)) if(!isspace(line[0])) {		srmtrblk(line);		for(lterm= strtok(line,"|:"); lterm; lterm=strtok((char *) NULL,"|:")) {			lterm= stpblk(lterm);			srmtrblk(lterm);			if(!strcmp(lterm,term)) {				foundterm= 1;				break;				}			}	/* term|term|term|term: search */		if(foundterm) break;		}	if(!foundterm) { /* couldn't find terminal entry */		fclose(fp);		return;		}	}while(fgets(line,LINESIZE,fp)) { /* read color & use cmd sequence */	/* skip blank lines */	for(cmd= line; *cmd; ++cmd) if(!isspace(*cmd)) break;	if(!*cmd) continue;	if(cmd == line) break; /* finished reading in terminal def'n */	/* if first non-blank character is a "#", skip it (comment) */	if(*cmd == '#') continue;	/* get the color */	sscanf(cmd,"%s",color);	/* skip to first white space character */	for(; *cmd && !isspace(*cmd); ++cmd);	cmd[strlen(cmd) - 1]= '\0';	/* remove newline character */	/* skip over tabs following colorname */	while(*cmd == '\t') ++cmd;	/* identify color (if known) */	for(icolor= 0; icolor < ncolor; ++icolor)	  if(!strcmp(colors[icolor].name,color)) break;	if(icolor >= ncolor) { /* unknown color */		error(XTDIO_WARNING, "(rdcolor) ignoring unknown color <%s> in <%s>\n",		  color,colorfile);		continue;		}	/* copy cmd (new color) over to newdef (new definition), making	 *  appropriate changes due to backslashes	 */	for(new= newdef; *cmd; ++cmd,++new) {		if(*cmd == '\\') {			switch(*++cmd) {			case 'e' : /* escape character		*/				*new= '\033';				break;			case 'f' : /* formfeed character	*/				*new= '\f';				break;			case 'h' : /* backspace character	*/				*new= (char) 8;				break;			case 'n' : /* newline character		*/				*new= '\n';				break;			case 't' : /* tab character		*/				*new= '\t';				break;			default:   /* handles A-Z and other	*/				if('A' <= *cmd && *cmd <= 'Z') *new= *cmd - 64;				else *new= *cmd;				break;				}			}		else *new= *cmd;		}	*new= '\0'; /* terminate new definition with null byte */	/* allocate memory and then set color to colorfile-defined value */	*colors[icolor].color= calloc((unsigned) strlen(newdef)+1,sizeof(char));	if(newdef[0]) strcpy(*colors[icolor].color,newdef);	else *colors[icolor].color= "\0";	}/* close the colorfile */fclose(fp);/* set up RD_... colors */RD_BLACK  = BLACK;RD_RED    = RED;RD_GREEN  = GREEN;RD_YELLOW = YELLOW;RD_BLUE   = BLUE;RD_MAGENTA= MAGENTA;RD_CYAN   = CYAN;RD_WHITE  = WHITE;}/* ------------------------------------------------------------------------- *//* rdcputs: read color's put-string function.  Normally, rdcputs acts exactly *  like fputs, except that "\255X#" strings are translated to appropriate *  colors. */#ifdef __PROTOTYPE__void rdcputs(  char *s,  FILE *fp)#else	/* __PROTOTYPE__ */void rdcputs(s,fp)char *s;FILE *fp;#endif	/* __PROTOTYPE__ */{int icolor;if(*s == '\255' && *(s+1) == 'X') { /* translate */	if(rdcolor_done) {		/* only try interpreting this if rdcolor() has been called */		sscanf(s+2,"%d",&icolor);		fputs(*colors[icolor].color,fp);		}	}else fputs(s,fp);}/* ------------------------------------------------------------------------- */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -