271 lines
12 KiB
C
271 lines
12 KiB
C
/*
|
|
* This file is part of uIRC. (https://git.redxen.eu/caskd/uIRC)
|
|
* Copyright (c) 2019-2021 Alex-David Denes
|
|
*
|
|
* uIRC is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* any later version.
|
|
*
|
|
* uIRC is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with uIRC. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "ctcp.h"
|
|
|
|
#include <stdint.h>
|
|
|
|
// Tables
|
|
static int_least8_t ctcp_formats[] = {
|
|
[IRC_CTCP_BOLD] = 0x02, [IRC_CTCP_COLOR] = 0x03, [IRC_CTCP_COLOR_HEX] = 0x04,
|
|
[IRC_CTCP_RESET] = 0x0F, [IRC_CTCP_MONOSPACE] = 0x11, [IRC_CTCP_REVERSE] = 0x16,
|
|
[IRC_CTCP_ITALICS] = 0x1D, [IRC_CTCP_STRIKETHROUGH] = 0x1E, [IRC_CTCP_UNDERLINE] = 0x1F,
|
|
};
|
|
static int_least8_t ctcp_named_colors[] = {
|
|
[IRC_CTCP_COLORS_WHITE] = 0, [IRC_CTCP_COLORS_BLACK] = 1, [IRC_CTCP_COLORS_BLUE] = 2, [IRC_CTCP_COLORS_GREEN] = 3,
|
|
[IRC_CTCP_COLORS_RED] = 4, [IRC_CTCP_COLORS_BROWN] = 5, [IRC_CTCP_COLORS_MAGENTA] = 6, [IRC_CTCP_COLORS_ORANGE] = 7,
|
|
[IRC_CTCP_COLORS_YELLOW] = 8, [IRC_CTCP_COLORS_LIGHT_GREEN] = 9, [IRC_CTCP_COLORS_CYAN] = 10, [IRC_CTCP_COLORS_LIGHT_CYAN] = 11,
|
|
[IRC_CTCP_COLORS_LIGHT_BLUE] = 12, [IRC_CTCP_COLORS_PINK] = 13, [IRC_CTCP_COLORS_GREY] = 14, [IRC_CTCP_COLORS_LIGHT_GREY] = 15,
|
|
[IRC_CTCP_COLORS_DEFAULT] = 99,
|
|
};
|
|
|
|
// CTCP to ANSI format mappings
|
|
static short ansi_formats[] = {
|
|
[IRC_CTCP_BOLD] = 1, [IRC_CTCP_RESET] = 0, [IRC_CTCP_REVERSE] = 7,
|
|
[IRC_CTCP_ITALICS] = 3, [IRC_CTCP_STRIKETHROUGH] = 9, [IRC_CTCP_UNDERLINE] = 4,
|
|
};
|
|
|
|
// CTCP to ANSI color mappings
|
|
static short ansi_colors[] = {
|
|
[IRC_CTCP_COLORS_WHITE] = 97,
|
|
[IRC_CTCP_COLORS_BLACK] = 30,
|
|
[IRC_CTCP_COLORS_BLUE] = 34,
|
|
[IRC_CTCP_COLORS_GREEN] = 32,
|
|
[IRC_CTCP_COLORS_RED] = 31,
|
|
[IRC_CTCP_COLORS_BROWN] = 94,
|
|
[IRC_CTCP_COLORS_MAGENTA] = 35,
|
|
[IRC_CTCP_COLORS_ORANGE] = 166,
|
|
[IRC_CTCP_COLORS_YELLOW] = 33,
|
|
[IRC_CTCP_COLORS_LIGHT_GREEN] = 92,
|
|
[IRC_CTCP_COLORS_CYAN] = 36,
|
|
[IRC_CTCP_COLORS_LIGHT_CYAN] = 96,
|
|
[IRC_CTCP_COLORS_LIGHT_BLUE] = 94,
|
|
[IRC_CTCP_COLORS_PINK] = 127,
|
|
[IRC_CTCP_COLORS_GREY] = 90,
|
|
[IRC_CTCP_COLORS_LIGHT_GREY] = 37,
|
|
[IRC_CTCP_COLORS_DEFAULT] = 39,
|
|
[16] = 52, /* See https://modern.ircdocs.horse/formatting.html */
|
|
[17] = 94,
|
|
[18] = 100,
|
|
[19] = 58,
|
|
[20] = 22,
|
|
[21] = 29,
|
|
[22] = 23,
|
|
[23] = 24,
|
|
[24] = 17,
|
|
[25] = 54,
|
|
[26] = 53,
|
|
[27] = 89,
|
|
[28] = 88,
|
|
[29] = 130,
|
|
[30] = 142,
|
|
[31] = 64,
|
|
[32] = 28,
|
|
[33] = 35,
|
|
[34] = 30,
|
|
[35] = 25,
|
|
[36] = 18,
|
|
[37] = 91,
|
|
[38] = 90,
|
|
[39] = 125,
|
|
[40] = 124,
|
|
[41] = 166,
|
|
[42] = 184,
|
|
[43] = 106,
|
|
[44] = 34,
|
|
[45] = 49,
|
|
[46] = 37,
|
|
[47] = 33,
|
|
[48] = 19,
|
|
[49] = 129,
|
|
[50] = 127,
|
|
[51] = 161,
|
|
[52] = 196,
|
|
[53] = 208,
|
|
[54] = 226,
|
|
[55] = 154,
|
|
[56] = 46,
|
|
[57] = 86,
|
|
[58] = 51,
|
|
[59] = 75,
|
|
[60] = 21,
|
|
[61] = 171,
|
|
[62] = 201,
|
|
[63] = 198,
|
|
[64] = 203,
|
|
[65] = 215,
|
|
[66] = 227,
|
|
[67] = 191,
|
|
[68] = 83,
|
|
[69] = 122,
|
|
[70] = 87,
|
|
[71] = 111,
|
|
[72] = 63,
|
|
[73] = 177,
|
|
[74] = 207,
|
|
[75] = 205,
|
|
[76] = 217,
|
|
[77] = 223,
|
|
[78] = 229,
|
|
[79] = 193,
|
|
[80] = 157,
|
|
[81] = 158,
|
|
[82] = 159,
|
|
[83] = 153,
|
|
[84] = 147,
|
|
[85] = 183,
|
|
[86] = 219,
|
|
[87] = 212,
|
|
[88] = 16,
|
|
[89] = 233,
|
|
[90] = 235,
|
|
[91] = 237,
|
|
[92] = 239,
|
|
[93] = 241,
|
|
[94] = 244,
|
|
[95] = 247,
|
|
[96] = 250,
|
|
[97] = 254,
|
|
[98] = 231,
|
|
};
|
|
|
|
// CTCP to RGB color mappings
|
|
static rgbcolor rgb_maps[] = {
|
|
[IRC_CTCP_COLORS_WHITE] = { 0xFF, 0xFF, 0xFF },
|
|
[IRC_CTCP_COLORS_BLACK] = { 0x00, 0x00, 0x00 },
|
|
[IRC_CTCP_COLORS_BLUE] = { 0x00, 0x00, 0x7F },
|
|
[IRC_CTCP_COLORS_GREEN] = { 0x00, 0x93, 0x00 },
|
|
[IRC_CTCP_COLORS_RED] = { 0xFF, 0x00, 0x00 },
|
|
[IRC_CTCP_COLORS_BROWN] = { 0x7F, 0x00, 0x00 },
|
|
[IRC_CTCP_COLORS_MAGENTA] = { 0x9C, 0x00, 0x9C },
|
|
[IRC_CTCP_COLORS_ORANGE] = { 0xFC, 0x7F, 0x00 },
|
|
[IRC_CTCP_COLORS_YELLOW] = { 0xFF, 0xFF, 0x00 },
|
|
[IRC_CTCP_COLORS_LIGHT_GREEN] = { 0x00, 0xFC, 0x00 },
|
|
[IRC_CTCP_COLORS_CYAN] = { 0x00, 0x93, 0x93 },
|
|
[IRC_CTCP_COLORS_LIGHT_CYAN] = { 0x00, 0xFF, 0xFF },
|
|
[IRC_CTCP_COLORS_LIGHT_BLUE] = { 0x00, 0x00, 0xFC },
|
|
[IRC_CTCP_COLORS_PINK] = { 0xFF, 0x00, 0xFF },
|
|
[IRC_CTCP_COLORS_GREY] = { 0x7F, 0x7F, 0x7F },
|
|
[IRC_CTCP_COLORS_LIGHT_GREY] = { 0xD2, 0xD2, 0xD2 },
|
|
[IRC_CTCP_COLORS_DEFAULT] = { 0xFF, 0xFF, 0xFF },
|
|
[16] = { 0x47, 0x00, 0x00 }, /* See https://modern.ircdocs.horse/formatting.html */
|
|
[17] = { 0x47, 0x21, 0x00 },
|
|
[18] = { 0x47, 0x47, 0x00 },
|
|
[19] = { 0x32, 0x47, 0x00 },
|
|
[20] = { 0x00, 0x47, 0x00 },
|
|
[21] = { 0x00, 0x47, 0x2c },
|
|
[22] = { 0x00, 0x47, 0x47 },
|
|
[23] = { 0x00, 0x27, 0x47 },
|
|
[24] = { 0x00, 0x00, 0x47 },
|
|
[25] = { 0x2e, 0x00, 0x47 },
|
|
[26] = { 0x47, 0x00, 0x47 },
|
|
[27] = { 0x47, 0x00, 0x2a },
|
|
[28] = { 0x74, 0x00, 0x00 },
|
|
[29] = { 0x74, 0x3a, 0x00 },
|
|
[30] = { 0x74, 0x74, 0x00 },
|
|
[31] = { 0x51, 0x74, 0x00 },
|
|
[32] = { 0x00, 0x74, 0x00 },
|
|
[33] = { 0x00, 0x74, 0x49 },
|
|
[34] = { 0x00, 0x74, 0x74 },
|
|
[35] = { 0x00, 0x40, 0x74 },
|
|
[36] = { 0x00, 0x00, 0x74 },
|
|
[37] = { 0x4b, 0x00, 0x74 },
|
|
[38] = { 0x74, 0x00, 0x74 },
|
|
[39] = { 0x74, 0x00, 0x45 },
|
|
[40] = { 0xb5, 0x00, 0x00 },
|
|
[41] = { 0xb5, 0x63, 0x00 },
|
|
[42] = { 0xb5, 0xb5, 0x00 },
|
|
[43] = { 0x7d, 0xb5, 0x00 },
|
|
[44] = { 0x00, 0xb5, 0x00 },
|
|
[45] = { 0x00, 0xb5, 0x71 },
|
|
[46] = { 0x00, 0xb5, 0xb5 },
|
|
[47] = { 0x00, 0x63, 0xb5 },
|
|
[48] = { 0x00, 0x00, 0xb5 },
|
|
[49] = { 0x75, 0x00, 0xb5 },
|
|
[50] = { 0xb5, 0x00, 0xb5 },
|
|
[51] = { 0xb5, 0x00, 0x6b },
|
|
[52] = { 0xff, 0x00, 0x00 },
|
|
[53] = { 0xff, 0x8c, 0x00 },
|
|
[54] = { 0xff, 0xff, 0x00 },
|
|
[55] = { 0xb2, 0xff, 0x00 },
|
|
[56] = { 0x00, 0xff, 0x00 },
|
|
[57] = { 0x00, 0xff, 0xa0 },
|
|
[58] = { 0x00, 0xff, 0xff },
|
|
[59] = { 0x00, 0x8c, 0xff },
|
|
[60] = { 0x00, 0x00, 0xff },
|
|
[61] = { 0xa5, 0x00, 0xff },
|
|
[62] = { 0xff, 0x00, 0xff },
|
|
[63] = { 0xff, 0x00, 0x98 },
|
|
[64] = { 0xff, 0x59, 0x59 },
|
|
[65] = { 0xff, 0xb4, 0x59 },
|
|
[66] = { 0xff, 0xff, 0x71 },
|
|
[67] = { 0xcf, 0xff, 0x60 },
|
|
[68] = { 0x6f, 0xff, 0x6f },
|
|
[69] = { 0x65, 0xff, 0xc9 },
|
|
[70] = { 0x6d, 0xff, 0xff },
|
|
[71] = { 0x59, 0xb4, 0xff },
|
|
[72] = { 0x59, 0x59, 0xff },
|
|
[73] = { 0xc4, 0x59, 0xff },
|
|
[74] = { 0xff, 0x66, 0xff },
|
|
[75] = { 0xff, 0x59, 0xbc },
|
|
[76] = { 0xff, 0x9c, 0x9c },
|
|
[77] = { 0xff, 0xd3, 0x9c },
|
|
[78] = { 0xff, 0xff, 0x9c },
|
|
[79] = { 0xe2, 0xff, 0x9c },
|
|
[80] = { 0x9c, 0xff, 0x9c },
|
|
[81] = { 0x9c, 0xff, 0xdb },
|
|
[82] = { 0x9c, 0xff, 0xff },
|
|
[83] = { 0x9c, 0xd3, 0xff },
|
|
[84] = { 0x9c, 0x9c, 0xff },
|
|
[85] = { 0xdc, 0x9c, 0xff },
|
|
[86] = { 0xff, 0x9c, 0xff },
|
|
[87] = { 0xff, 0x94, 0xd3 },
|
|
[88] = { 0x00, 0x00, 0x00 },
|
|
[89] = { 0x13, 0x13, 0x13 },
|
|
[90] = { 0x28, 0x28, 0x28 },
|
|
[91] = { 0x36, 0x36, 0x36 },
|
|
[92] = { 0x4d, 0x4d, 0x4d },
|
|
[93] = { 0x65, 0x65, 0x65 },
|
|
[94] = { 0x81, 0x81, 0x81 },
|
|
[95] = { 0x9f, 0x9f, 0x9f },
|
|
[96] = { 0xbc, 0xbc, 0xbc },
|
|
[97] = { 0xe2, 0xe2, 0xe2 },
|
|
[98] = { 0xff, 0xff, 0xff },
|
|
};
|
|
|
|
rgbcolor*
|
|
uirc_ctcp_to_rgb(uint_least8_t color)
|
|
{
|
|
if (color < sizeof(rgb_maps) / sizeof(rgbcolor)) return &rgb_maps[color];
|
|
return &rgb_maps[IRC_CTCP_RESET];
|
|
}
|
|
|
|
int_least8_t
|
|
IRC_CTCP_FORMAT(enum uirc_table_ctcp_formats fmt)
|
|
{
|
|
return ctcp_formats[fmt];
|
|
}
|
|
|
|
int_least8_t
|
|
IRC_CTCP_COLORS(enum uirc_table_ctcp_named_colors col)
|
|
{
|
|
return ctcp_named_colors[col];
|
|
}
|
|
|
|
// TODO: Write converters for ANSI
|