/* $Id: comm_colors.c,v 1.666 2004/09/20 10:50:15 shrike Exp $ */ /************************************************************************************ * Copyright 2004 Astrum Metaphora consortium * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * * You may obtain a copy of the License at * * * * http://www.apache.org/licenses/LICENSE-2.0 * * * * Unless required by applicable law or agreed to in writing, software * * distributed under the License is distributed on an "AS IS" BASIS, * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * * limitations under the License. * * * ************************************************************************************/ /************************************************************************************ * ANATOLIA 2.1 is copyright 1996-1997 Serdar BULUT, Ibrahim CANPUNAR * * ANATOLIA has been brought to you by ANATOLIA consortium * * Serdar BULUT {Chronos} bulut@rorqual.cc.metu.edu.tr * * Ibrahim Canpunar {Asena} canpunar@rorqual.cc.metu.edu.tr * * Murat BICER {KIO} mbicer@rorqual.cc.metu.edu.tr * * D.Baris ACAR {Powerman} dbacar@rorqual.cc.metu.edu.tr * * By using this code, you have agreed to follow the terms of the * * ANATOLIA license, in the file Anatolia/anatolia.licence * ***********************************************************************************/ /************************************************************************************ * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ************************************************************************************/ /************************************************************************************ * ROM 2.4 is copyright 1993-1995 Russ Taylor * * ROM has been brought to you by the ROM consortium * * Russ Taylor (rtaylor@pacinfo.com) * * Gabrielle Taylor (gtaylor@pacinfo.com) * * Brian Moore (rom@rom.efn.org) * * By using this code, you have agreed to follow the terms of the * * ROM license, in the file Rom24/doc/rom.license * *************************************************************************************/ /************************************************************************************ * 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. * ************************************************************************************/ #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; } void strip_color(char *bufin, bool GLOBAL) { const char *pointer; for(pointer = bufin; *pointer; pointer++) { if(*pointer == '{') { pointer++; bufin++; if(*pointer == 'z') /*blinking text reserved*/ { *bufin = ' '; } if(*pointer == '`') /*line space reserved*/ { *bufin = ' '; } if(*pointer == '0' && GLOBAL) /*used for clear screen reserved*/ { *bufin = ' '; } } bufin++; } }