/* $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++;
}
}