/* * colour: change the screen colors to something new and interesting */ #include #include #define FG_INDEX 30 #define BG_INDEX 40 #define COUNT(x) (sizeof x/sizeof x[0]) struct aa { char name[11]; unsigned short value; } attribs[] = { { "normal", 0 }, { "bold", 1 }, { "bright", 1 }, { "underline", 4 }, { "blinking", 5 }, { "reverse", 7 }, { "invisible", 8 } }; struct aa colours[] = { { "black", 0 }, { "red", 1 }, { "green", 2 }, { "yellow", 3 }, { "blue", 4 }, { "magenta", 5 }, { "cyan", 6 }, { "white", 7 } }; /* getopt and friends */ extern int optind, opterr, optopt; extern int getopt(); extern char *optarg; char clear_screen=0; /* * badboy() spits out an error message, then dies */ badboy(msg) char *msg; { va_list ptr; if (msg) { fprintf(stderr, "colour:"); va_start(ptr, msg); vfprintf(stderr, msg, ptr); va_end(ptr); putc('\n', stderr); } fprintf(stderr, "usage: colour [-c?] [attrib] fg-colour [on bg-colour]\n"); exit(1); } /* badboy */ /* * pickout matches a name to a values in an aa array */ pickout(str, ary, size) char *str; struct aa *ary; { while (size-- > 0) if (stricmp(ary->name, str) == 0) return ary->value; else ++ary; return -1; } /* pickout */ /* * usage() emits an overly verbose message describing how colour * works. */ usage() { register j, max; printf("usage:"); max = COUNT(attribs); if (max < COUNT(colours)) max = COUNT(colours); for (j=0; j= COUNT(colours)) printf("\t %-10s\n", attribs[j].name); else printf("\t %-10s %-10s %s\n", (j", optopt); } } argv += optind; argc -= optind; while (argc > 1 && (tattrib=pickout(*argv, attribs, COUNT(attribs))) >= 0) { if (tattrib == 0) attrcount = 0; else if (attrcount < COUNT(attrib)) attrib[attrcount++] = tattrib; ++argv, --argc; } if (argc == 3) { /* [attrib] colour on colour */ if (stricmp(argv[1], "on") != 0) badboy((char*)0); if ((bg_col = pickout(argv[2], colours, COUNT(colours))) < 0) badboy("invalid background colour"); } else if (argc < 1) badboy((char*)0); else if (argc > 1) badboy("bad attribute"); if ((fg_col=pickout(argv[0], colours, COUNT(colours))) < 0) badboy("invalid foreground colour"); bfr[0] = 0; for (i=0; i= 0) sprintf(bfr+strlen(bfr), ";%d", fg_col+FG_INDEX); if (bg_col >= 0) sprintf(bfr+strlen(bfr), ";%d", bg_col+BG_INDEX); if (clear_screen) printf("\033[0%sm\033[2J", bfr); else printf("\033[0%sm", bfr); fflush(stdout); exit(0); } /* main */