/*- * Copyright (c) 1998 fjoe <fjoe@iclub.nsu.ru> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * $Id: comm_colors.c,v 1.3 1999/02/23 22:06:49 fjoe Exp $ */ #include <string.h> #include "typedef.h" #include "comm_colors.h" #include "str.h" static const char* color(char type, int format); enum { COLOR_BLACK, /* normal colors */ COLOR_RED, COLOR_GREEN, COLOR_YELLOW, COLOR_BLUE, COLOR_MAGENTA, COLOR_CYAN, COLOR_WHITE, COLOR_DARK_GREY, /* light colors */ COLOR_BRIGHT_RED, COLOR_BRIGHT_GREEN, COLOR_BRIGHT_YELLOW, COLOR_BRIGHT_BLUE, COLOR_BRIGHT_MAGENTA, COLOR_BRIGHT_CYAN, COLOR_BRIGHT_WHITE, COLOR_CLEAR, /* special colors */ COLOR_BEEP, COLOR_CR, COLOR_LF, COLOR_MAX }; typedef struct format_data FORMAT_DATA; struct format_data { const char * name; const char * colors[COLOR_MAX]; }; static int reset_color = COLOR_CLEAR; static int curr_color = COLOR_CLEAR; FORMAT_DATA format_table[] = { { "dumb", { str_empty, /* normal colors */ str_empty, str_empty, str_empty, str_empty, str_empty, str_empty, str_empty, str_empty, /* light colors */ str_empty, str_empty, str_empty, str_empty, str_empty, str_empty, str_empty, str_empty, /* special colors */ str_empty, str_empty, "\n\r" } }, { "ansi", { "\033[0;30m", "\033[0;31m", "\033[0;32m", "\033[0;33m", "\033[0;34m", "\033[0;35m", "\033[0;36m", "\033[0;37m", "\033[1;30m", "\033[1;31m", "\033[1;32m", "\033[1;33m", "\033[1;34m", "\033[1;35m", "\033[1;36m", "\033[1;37m", "\033[0m", "\007", str_empty, "\n\r", } }, { "html", { "<FONT COLOR=#000000>", "<FONT COLOR=#800000>", "<FONT COLOR=#008000>", "<FONT COLOR=#808000>", "<FONT COLOR=#000080>", "<FONT COLOR=#800080>", "<FONT COLOR=#008080>", "<FONT COLOR=#C0C0C0>", "<FONT COLOR=#606060>", "<FONT COLOR=#FF0000>", "<FONT COLOR=#00FF00>", "<FONT COLOR=#FFFF00>", "<FONT COLOR=#0000FF>", "<FONT COLOR=#FF00FF>", "<FONT COLOR=#00FFFF>", "<FONT COLOR=#FFFFFF>", "<FONT COLOR=#C0C0C0>", str_empty, str_empty, "\n" } }, { NULL } }; /* * Parse color symbols. len MUST BE > 1 */ void parse_colors(const char *i, char *o, size_t len, int format) { char *p; reset_color = curr_color = COLOR_CLEAR; for (p = o; *i && p - o < len - 1; i++) { if (*i == '\r' || *i == '\n' || (*i == '{' && *(i+1))) { strnzcpy(p, len - 1 - (p - o), color(*i == '{' ? *++i : *i, format)); p = strchr(p, '\0'); continue; } *p++ = *i; } *p = '\0'; } static const char* color(char type, int format) { int color; switch (type) { /* normal colors */ case 'd': case '0': color = COLOR_BLACK; break; case 'r': case '1': color = COLOR_RED; break; case 'g': case '2': color = COLOR_GREEN; break; case 'y': case '3': color = COLOR_YELLOW; break; case 'b': case '4': color = COLOR_BLUE; break; case 'm': case '5': color = COLOR_MAGENTA; break; case 'c': case '6': color = COLOR_CYAN; break; case 'w': case '7': color = COLOR_WHITE; break; /* light colors */ case 'D': case '8': case ')': color = COLOR_DARK_GREY; break; case 'R': case '!': color = COLOR_BRIGHT_RED; break; case 'G': case '@': color = COLOR_BRIGHT_GREEN; break; case 'Y': case '#': color = COLOR_BRIGHT_YELLOW; break; case 'B': case '$': color = COLOR_BRIGHT_BLUE; break; case 'M': case '%': color = COLOR_BRIGHT_MAGENTA; break; case 'C': case '^': color = COLOR_BRIGHT_CYAN; break; case 'W': case '&': color = COLOR_BRIGHT_WHITE; break; /* special colors */ case 'x': color = COLOR_CLEAR; break; case '*': color = COLOR_BEEP; break; case '\r': return format_table[format].colors[COLOR_CR]; case '\n': return format_table[format].colors[COLOR_LF]; /* special cases */ case 'z': return format_table[format].colors[curr_color = reset_color]; break; case '{': return "{"; default: return str_empty; } reset_color = curr_color; return format_table[format].colors[curr_color = color]; } int format_lookup(const char *name) { int i; for (i = 0; format_table[i].name; i++) if (!str_cmp(name, format_table[i].name)) return i; return FORMAT_DUMB; }