diff --git a/src/xpdev/cp437defs.h b/src/xpdev/cp437defs.h new file mode 100644 index 0000000000000000000000000000000000000000..b36c8718866bc5b3a8258ccfab9acca4abaf1d46 --- /dev/null +++ b/src/xpdev/cp437defs.h @@ -0,0 +1,163 @@ +/* Synchronet IBM Code Page 437 (CP437) definitions */ + +/* $Id$ */ + +/**************************************************************************** + * @format.tab-size 4 (Plain Text/Source Code File Header) * + * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * + * * + * Copyright Rob Swindell - http://www.synchro.net/copyright.html * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * See the GNU Lesser General Public License for more details: lgpl.txt or * + * http://www.fsf.org/copyleft/lesser.html * + * * + * Anonymous FTP access to the most recent released source is available at * + * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * + * * + * Anonymous CVS access to the development source and modification history * + * is available at cvs.synchro.net:/cvsroot/sbbs, example: * + * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * + * (just hit return, no password is necessary) * + * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * + * * + * For Synchronet coding style and modification guidelines, see * + * http://www.synchro.net/source.html * + * * + * You are encouraged to submit any modifications (preferably in Unix diff * + * format) via e-mail to mods@synchro.net * + * * + * Note: If this box doesn't appear square, then you need to fix your tabs. * + ****************************************************************************/ + +#ifndef CP437DEFS_H_ +#define CP437DEFS_H_ + +enum cp437_char { + CP437_CHAR_WHITE_SMILING_FACE = '\x01', + CP437_CHAR_BLACK_SMILING_FACE = '\x02', + CP437_CHAR_BLACK_HEART_SUIT = '\x03', + CP437_CHAR_BLACK_DIAMOND_SUIT = '\x04', + CP437_CHAR_BLACK_CLUB_SUIT = '\x05', + CP437_CHAR_BLACK_SPADE_SUIT = '\x06', + CP437_CHAR_BULLET = '\x07', + CP437_CHAR_INVERSE_BULLET = '\x08', + CP437_CHAR_WHITE_CIRCLE = '\x09', + CP437_CHAR_INVERSE_WHITE_CIRCLE = '\x0A', + CP437_CHAR_MALE_SIGN = '\x0B', + CP437_CHAR_FEMALE_SIGN = '\x0C', + CP437_CHAR_EIGHTH_NOTE = '\x0D', + CP437_CHAR_BEAMED_EIGHTH_NOTES = '\x0E', + CP437_CHAR_WHITE_SUN_WITH_RAYS = '\x0F', + CP437_CHAR_BLACK_RIGHT_POINTING_POINTER = '\x10', + CP437_CHAR_BLACK_LEFT_POINTING_POINTER = '\x11', + CP437_CHAR_UP_DOWN_ARROW = '\x12', + CP437_CHAR_DOUBLE_EXCLAMATION_MARK = '\x13', + CP437_CHAR_PILCROW_SIGN = '\x14', // Paragraph mark + CP437_CHAR_SECTION_SIGN = '\x15', + CP437_CHAR_BLACK_RECTANGLE = '\x16', + CP437_CHAR_UP_DOWN_ARROW_WITH_BASE = '\x17', + CP437_CHAR_UPWARDS_ARROW = '\x18', + CP437_CHAR_DOWNWARDS_ARROW = '\x19', + CP437_CHAR_RIGHTWARDS_ARROW = '\x1A', + CP437_CHAR_LEFTWARDS_ARROW = '\x1B', + CP437_CHAR_RIGHT_ANGLE = '\x1C', + CP437_CHAR_LEFT_RIGHT_ARROW = '\x1D', + CP437_CHAR_BLACK_UP_POINTING_TRIANGLE = '\x1E', + CP437_CHAR_BLACK_DOWN_POINTING_TRIANGLE = '\x1F', + + // 0x20 - 0x7E are ASCII characters + + CP437_CHAR_HOUSE = '\x7F', + CP437_CHAR_LATIN_CAPTIAL_LETTER_C_WITH_CEDILLA = '\x80', + CP437_CHAR_LATIN_SMALL_LETTER_U_WITH_DIAERESIS = '\x81', + CP437_CHAR_LATIN_SMALL_LETTER_E_WITH_ACUTE = '\x82', + CP437_CHAR_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX = '\x83', + CP437_CHAR_LATIN_SMALL_LETTER_A_WITH_DIAERESIS = '\x84', + CP437_CHAR_LATIN_SMALL_LETTER_A_WITH_GRAVE = '\x85', + CP437_CHAR_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE = '\x86', + CP437_CHAR_LATIN_SMALL_LETTER_C_WITH_CEDILLA = '\x87', + CP437_CHAR_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX = '\x88', + CP437_CHAR_LATIN_SMALL_LETTER_E_WITH_DIAERESIS = '\x89', + CP437_CHAR_LATIN_SMALL_LETTER_E_WITH_GRAVE = '\x8a', + CP437_CHAR_LATIN_SMALL_LETTER_I_WITH_DIAERESIS = '\x8b', + CP437_CHAR_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX = '\x8c', + CP437_CHAR_LATIN_SMALL_LETTER_I_WITH_GRAVE = '\x8d', + CP437_CHAR_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS = '\x8e', + CP437_CHAR_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE = '\x8f', + CP437_CHAR_LATIN_CAPITAL_LETTER_E_WITH_ACUTE = '\x90', + CP437_CHAR_LATIN_SMALL_LETTER_AE = '\x91', + CP437_CHAR_LATIN_CAPITAL_LETTER_AE = '\x92', + CP437_CHAR_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX = '\x93', + CP437_CHAR_LATIN_LATIN_SMALL_LETTER_O_WITH_DIAERESIS = '\x94', + CP437_CHAR_LATIN_SMALL_LETTER_O_WITH_GRAVE = '\x95', + CP437_CHAR_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX = '\x96', + CP437_CHAR_LATIN_SMALL_LETTER_U_WITH_GRAVE = '\x97', + CP437_CHAR_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS = '\x98', + CP437_CHAR_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS = '\x99', + CP437_CHAR_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS = '\x9a', + CP437_CHAR_CENT_SIGN = '\x9b', + CP437_CHAR_POUND_SIGN = '\x9c', + CP437_CHAR_YEN_SIGN = '\x9d', + CP437_CHAR_PESETA_SIGN = '\x9e', + CP437_CHAR_LATIN_SMALL_LETTER_F_WITH_HOOK = '\x9f', + CP437_CHAR_LATIN_SMALL_LETTER_A_WITH_ACUTE = '\xA0', + CP437_CHAR_LATIN_SMALL_LETTER_I_WITH_ACUTE = '\xA1', + CP437_CHAR_LATIN_SMALL_LETTER_O_WITH_ACUTE = '\xA2', + CP437_CHAR_LATIN_SMALL_LETTER_U_WITH_ACUTE = '\xA3', + CP437_CHAR_LATIN_SMALL_LETTER_N_WITH_TILDE = '\xA4', + CP437_CHAR_LATIN_CAPITAL_LETTER_N_WITH_TILDE = '\xA5', + CP437_CHAR_FEMININE_ORDINAL_INDICATOR = '\xA6', + CP437_CHAR_MASCULINE_ORDINAL_INDICATOR = '\xA7', + CP437_CHAR_INVERTED_QUESTION_MARK = '\xA8', + CP437_CHAR_REVERSED_NOT_SIGN = '\xA9', + CP437_CHAR_NOT_SIGN = '\xAA', + CP437_CHAR_VULGAR_FRACTION_ONE_HALF = '\xAB', + CP437_CHAR_VULGAR_FRACTION_ONE_QUARTER = '\xAC', + CP437_CHAR_INVERTED_EXCLAMATION_MARK = '\xAD', + CP437_CHAR_LEFT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK = '\xAE', + CP437_CHAR_RIGHT_POINTING_DOUBLE_ANGLE_QUOTATION_MARK = '\xAF', + // TODO... + CP437_CHAR_GREEK_SMALL_LETTER_ALPHA = '\xE0', + CP437_CHAR_GREEK_SMALL_LETTER_BETA = '\xE1', + CP437_CHAR_LATIN_SMALL_LETTER_SHARP_S = '\xE1', // Duplicate + CP437_CHAR_GREEK_CAPITAL_LETTER_GAMMA = '\xE2', + CP437_CHAR_GREEK_SMALL_LETTER_PI = '\xE3', + CP437_CHAR_GREEK_CAPITAL_LETTER_SIGMA = '\xE4', + CP437_CHAR_GREEK_SMALL_LETTER_SIGMA = '\xE5', + CP437_CHAR_GREEK_SMALL_LETTER_MU = '\xE6', + CP437_CHAR_MICRO_SIGN = '\xE6', // Duplicate + CP437_CHAR_GREEK_SMALL_LETTER_TAU = '\xE7', + CP437_CHAR_GREEK_CAPITAL_LETTER_PHI = '\xE8', + CP437_CHAR_GREEK_SMALL_LETTER_THETA = '\xE9', + CP437_CHAR_GREEK_CAPITAL_LETTER_OMEGA = '\xEA', + CP437_CHAR_GREEK_SMALL_LETTER_DELTA = '\xEB', + CP437_CHAR_INFINITY = '\xEC', + CP437_CHAR_GREEK_SMALL_LETTER_PHI = '\xED', + CP437_CHAR_GREEK_SMALL_LETTER_EPSILION = '\xEE', + CP437_CHAR_INTERSECTION = '\xEF', + CP437_CHAR_IDENTICAL_TO = '\xF0', + CP437_CHAR_TRIPLE_BAR = '\xF0', // Duplicate + CP437_CHAR_PLUS_MINUS_SIGN = '\xF1', + CP437_CHAR_GREATER_THAN_OR_EQUAL_TO = '\xF2', + CP437_CHAR_LESS_THAN_OR_EQUAL_TO = '\xF3', + CP437_CHAR_TOP_HALF_INTEGRAL = '\xF4', + CP437_CHAR_BOTTOM_HALF_INTEGRAL = '\xF5', + CP437_CHAR_DIVISION_SIGN = '\xF6', + CP437_CHAR_ALMOST_EQUAL_TO = '\xF7', + CP437_CHAR_DEGREE_SIGN = '\xF8', + CP437_CHAR_BULLET_OPERATOR = '\xF9', + CP437_CHAR_MIDDLE_DOT = '\xFA', + CP437_CHAR_SQUARE_ROOT = '\xFB', + CP437_CHAR_CHECK_MARK = '\xFB', // Duplicate + CP437_CHAR_SUPERSCRIPT_LATIN_SMALL_LETTER_N = '\xFC', + CP437_CHAR_SUPERSCRIPT_TWO = '\xFD', + CP437_CHAR_BLACK_SQUARE = '\xFE', + CP437_CHAR_HALFWIDTH_BLACK_SQUARE = '\xFE', // Duplicate + CP437_CHAR_NO_BREAK_SPACE = '\xFF' +}; + +#endif // Don't add anything after this line \ No newline at end of file diff --git a/src/xpdev/unicode.c b/src/xpdev/unicode.c index bf0e15cf4bb8abab251d92dcd5f022c9a8f9b664..355132b18fe04bf17df035db4353969188e07952 100644 --- a/src/xpdev/unicode.c +++ b/src/xpdev/unicode.c @@ -34,6 +34,8 @@ ****************************************************************************/ #include "unicode.h" +#include "cp437defs.h" +#include "unicode_defs.h" // Want UNICDE encodings of terminal control characters? #if defined USE_UNICODE_FOR_TERM_CTRL_CHARS @@ -309,26 +311,26 @@ uint32_t cp437_unicode_tbl[] = bool unicode_is_zerowidth(uint32_t u) { switch(u) { - case 0x200B: // ZERO WIDTH SPACE - case 0x200C: // ZERO WIDTH NON-JOINER - case 0x200D: // ZERO WIDTH JOINER - case 0xFE00: // VARIATION SELECTOR-1 - case 0xFE01: // VARIATION SELECTOR-2 - case 0xFE02: // VARIATION SELECTOR-3 - case 0xFE03: // VARIATION SELECTOR-4 - case 0xFE04: // VARIATION SELECTOR-5 - case 0xFE05: // VARIATION SELECTOR-6 - case 0xFE06: // VARIATION SELECTOR-7 - case 0xFE07: // VARIATION SELECTOR-8 - case 0xFE08: // VARIATION SELECTOR-9 - case 0xFE09: // VARIATION SELECTOR-10 - case 0xFE0A: // VARIATION SELECTOR-11 - case 0xFE0B: // VARIATION SELECTOR-12 - case 0xFE0C: // VARIATION SELECTOR-13 - case 0xFE0D: // VARIATION SELECTOR-14 - case 0xFE0E: // VARIATION SELECTOR-15 - case 0xFE0F: // VARIATION SELECTOR-16 - case 0xFEFF: // ZERO WIDTH NO-BREAK SPACE + case UNICODE_ZERO_WIDTH_SPACE: + case UNICODE_ZERO_WIDTH_NON_JOINER: + case UNICODE_ZERO_WIDTH_JOINER: + case UNICODE_VARIATION_SELECTOR_1: + case UNICODE_VARIATION_SELECTOR_2: + case UNICODE_VARIATION_SELECTOR_3: + case UNICODE_VARIATION_SELECTOR_4: + case UNICODE_VARIATION_SELECTOR_5: + case UNICODE_VARIATION_SELECTOR_6: + case UNICODE_VARIATION_SELECTOR_7: + case UNICODE_VARIATION_SELECTOR_8: + case UNICODE_VARIATION_SELECTOR_9: + case UNICODE_VARIATION_SELECTOR_10: + case UNICODE_VARIATION_SELECTOR_11: + case UNICODE_VARIATION_SELECTOR_12: + case UNICODE_VARIATION_SELECTOR_13: + case UNICODE_VARIATION_SELECTOR_14: + case UNICODE_VARIATION_SELECTOR_15: + case UNICODE_VARIATION_SELECTOR_16: + case UNICODE_ZERO_WIDTH_NO_BREAK_SPACE: return true; } return false; @@ -337,18 +339,112 @@ bool unicode_is_zerowidth(uint32_t u) char unicode_to_cp437(uint32_t codepoint) { switch(codepoint) { - case 0x00B4: // ACUTE ACCENT - return '\''; - case 0x00CD: // LATIN CAPITAL LETTER I WITH ACUTE - return '\xA1'; // Lower-case Letter i with Acute - - case 0x2014: // EM DASH + case 0: return '\0'; + + case UNICODE_ACUTE_ACCENT: return '\''; + + case UNICODE_BROKEN_BAR: return '|'; + + // Perform Upper -> Lower case mapping where an upper case equivalent doesn't exist in CP437: + case UNICODE_LATIN_CAPITAL_LETTER_A_WITH_GRAVE: return CP437_CHAR_LATIN_SMALL_LETTER_A_WITH_GRAVE; + case UNICODE_LATIN_CAPITAL_LETTER_A_WITH_ACUTE: return CP437_CHAR_LATIN_SMALL_LETTER_A_WITH_ACUTE; + case UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX: return CP437_CHAR_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX; + + case UNICODE_LATIN_CAPITAL_LETTER_E_WITH_GRAVE: return CP437_CHAR_LATIN_SMALL_LETTER_E_WITH_GRAVE; + case UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX: return CP437_CHAR_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX; + case UNICODE_LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS: return CP437_CHAR_LATIN_SMALL_LETTER_E_WITH_DIAERESIS; + + case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_GRAVE: return CP437_CHAR_LATIN_SMALL_LETTER_I_WITH_GRAVE; + case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_ACUTE: return CP437_CHAR_LATIN_SMALL_LETTER_I_WITH_ACUTE; + case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX: return CP437_CHAR_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX; + case UNICODE_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS: return CP437_CHAR_LATIN_SMALL_LETTER_I_WITH_DIAERESIS; + + case UNICODE_LATIN_CAPITAL_LETTER_O_WITH_GRAVE: return CP437_CHAR_LATIN_SMALL_LETTER_O_WITH_GRAVE; + case UNICODE_LATIN_CAPITAL_LETTER_O_WITH_ACUTE: return CP437_CHAR_LATIN_SMALL_LETTER_O_WITH_ACUTE; + case UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX: return CP437_CHAR_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX; + + case UNICODE_LATIN_CAPITAL_LETTER_U_WITH_GRAVE: return CP437_CHAR_LATIN_SMALL_LETTER_U_WITH_GRAVE; + case UNICODE_LATIN_CAPITAL_LETTER_U_WITH_ACUTE: return CP437_CHAR_LATIN_SMALL_LETTER_U_WITH_ACUTE; + case UNICODE_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX: return CP437_CHAR_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX; + + case UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS: return CP437_CHAR_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS; + + // Greek letters + case UNICODE_GREEK_CAPITAL_LETTER_ALPHA: + case UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS: return 'A'; + case UNICODE_GREEK_CAPITAL_LETTER_BETA: return 'B'; + case UNICODE_GREEK_CAPITAL_LETTER_GAMMA: + case UNICODE_GREEK_SMALL_LETTER_GAMMA: return CP437_CHAR_GREEK_CAPITAL_LETTER_GAMMA; + case UNICODE_GREEK_CAPITAL_LETTER_DELTA: + case UNICODE_GREEK_SMALL_LETTER_DELTA: return CP437_CHAR_GREEK_SMALL_LETTER_DELTA; + case UNICODE_GREEK_CAPITAL_LETTER_EPSILON: + case UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS: + case UNICODE_GREEK_SMALL_LETTER_EPSILON: + case UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_TONOS: return CP437_CHAR_GREEK_SMALL_LETTER_EPSILION; + case UNICODE_GREEK_CAPITAL_LETTER_ZETA: return 'Z'; + case UNICODE_GREEK_CAPITAL_LETTER_ETA: return 'H'; + case UNICODE_GREEK_CAPITAL_LETTER_THETA: + case UNICODE_GREEK_SMALL_LETTER_THETA: + case UNICODE_GREEK_THETA_SYMBOL: return CP437_CHAR_GREEK_SMALL_LETTER_THETA; + case UNICODE_GREEK_CAPITAL_LETTER_IOTA: + case UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA: return 'I'; + case UNICODE_GREEK_CAPITAL_LETTER_KAPPA: return 'K'; + case UNICODE_GREEK_CAPITAL_LETTER_MU: return 'M'; + case UNICODE_GREEK_CAPITAL_LETTER_NU: return 'N'; + case UNICODE_GREEK_CAPITAL_LETTER_OMICRON: return 'O'; + case UNICODE_GREEK_CAPITAL_LETTER_PI: + case UNICODE_GREEK_SMALL_LETTER_PI: + case UNICODE_GREEK_PI_SYMBOL: return CP437_CHAR_GREEK_SMALL_LETTER_PI; + case UNICODE_GREEK_CAPITAL_LETTER_RHO: return 'P'; + case UNICODE_GREEK_CAPITAL_LETTER_SIGMA: return CP437_CHAR_GREEK_CAPITAL_LETTER_SIGMA; + case UNICODE_GREEK_CAPITAL_LETTER_TAU: + case UNICODE_GREEK_SMALL_LETTER_TAU: + return 'T'; + case UNICODE_GREEK_CAPITAL_LETTER_UPSILON: return 'Y'; + case UNICODE_GREEK_CAPITAL_LETTER_PHI: return CP437_CHAR_GREEK_CAPITAL_LETTER_PHI; + case UNICODE_GREEK_CAPITAL_LETTER_CHI: return 'X'; + case UNICODE_GREEK_CAPITAL_LETTER_OMEGA: + case UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS: + case UNICODE_GREEK_SMALL_LETTER_OMEGA: + case UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_TONOS: return CP437_CHAR_GREEK_CAPITAL_LETTER_OMEGA; + case UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA: + return CP437_CHAR_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS; + case UNICODE_GREEK_SMALL_LETTER_ALPHA: + case UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_TONOS: return CP437_CHAR_GREEK_SMALL_LETTER_ALPHA; + case UNICODE_GREEK_SMALL_LETTER_BETA: return CP437_CHAR_GREEK_SMALL_LETTER_BETA; + case UNICODE_GREEK_SMALL_LETTER_MU: return CP437_CHAR_GREEK_SMALL_LETTER_MU; + case UNICODE_GREEK_SMALL_LETTER_NU: return 'v'; + case UNICODE_GREEK_SMALL_LETTER_OMICRON: return 'o'; + case UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_TONOS: return CP437_CHAR_LATIN_SMALL_LETTER_O_WITH_ACUTE; + case UNICODE_GREEK_SMALL_LETTER_UPSILON: return 'u'; + case UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_TONOS: return CP437_CHAR_LATIN_SMALL_LETTER_U_WITH_ACUTE; + case UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA: + case UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS: + return CP437_CHAR_LATIN_SMALL_LETTER_U_WITH_DIAERESIS; + case UNICODE_GREEK_SMALL_LETTER_IOTA: + case UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_TONOS: return 'i'; + case UNICODE_GREEK_SMALL_LETTER_KAPPA: return 'k'; + case UNICODE_GREEK_SMALL_LETTER_CHI: return 'x'; + case UNICODE_GREEK_SMALL_LETTER_SIGMA: + case UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA: return CP437_CHAR_GREEK_SMALL_LETTER_SIGMA; + case UNICODE_GREEK_SMALL_LETTER_RHO: return 'p'; + case UNICODE_GREEK_SMALL_LETTER_ZETA: return 'z'; + case UNICODE_GREEK_SMALL_LETTER_ETA: return 'n'; + + case UNICODE_EM_DASH: return '\xC4'; - case 0x2022: // BULLET + case UNICODE_BULLET: // BULLET return '\xF9'; - case 0x203E: // OVERLINE + case UNICODE_NO_BREAK_SPACE: + case UNICODE_EN_QUAD: + case UNICODE_EM_QUAD: + case UNICODE_EN_SPACE: + case UNICODE_EM_SPACE: + return ' '; + + case UNICODE_OVERLINE: case 0x2500: // Box Drawings Light Horizontal case 0x2501: // Box Drawings Heavy Horizontal case 0x2504: // Box Drawings Light Triple Dash Horizontal @@ -520,5 +616,11 @@ char unicode_to_cp437(uint32_t codepoint) return '\xDF'; } + // Look for a 1:1 match in the CP437 -> Unicode table + for(int i = 1; i < 0x100; i++) { + if(cp437_unicode_tbl[i] == codepoint) + return i; + } + return '\0'; // Not-mapped } diff --git a/src/xpdev/unicode_defs.h b/src/xpdev/unicode_defs.h new file mode 100644 index 0000000000000000000000000000000000000000..97bf03aca672f3222fa2714fb994864b7fe8ae6b --- /dev/null +++ b/src/xpdev/unicode_defs.h @@ -0,0 +1,268 @@ +/* Synchronet Unicode definitions */ + +/* $Id$ */ + +/**************************************************************************** + * @format.tab-size 4 (Plain Text/Source Code File Header) * + * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * + * * + * Copyright Rob Swindell - http://www.synchro.net/copyright.html * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Lesser General Public License * + * as published by the Free Software Foundation; either version 2 * + * of the License, or (at your option) any later version. * + * See the GNU Lesser General Public License for more details: lgpl.txt or * + * http://www.fsf.org/copyleft/lesser.html * + * * + * Anonymous FTP access to the most recent released source is available at * + * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * + * * + * Anonymous CVS access to the development source and modification history * + * is available at cvs.synchro.net:/cvsroot/sbbs, example: * + * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * + * (just hit return, no password is necessary) * + * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * + * * + * For Synchronet coding style and modification guidelines, see * + * http://www.synchro.net/source.html * + * * + * You are encouraged to submit any modifications (preferably in Unix diff * + * format) via e-mail to mods@synchro.net * + * * + * Note: If this box doesn't appear square, then you need to fix your tabs. * + ****************************************************************************/ + +#ifndef UNICODE_DEFS_H_ +#define UNICODE_DEFS_H_ + +enum unicode_codepoint { + UNICODE_NO_BREAK_SPACE = 0x00A0, + + UNICODE_INVERTED_EXCLAMATION_MARK = 0x00A1, + UNICODE_CENT_SIGN = 0x00A2, + UNICODE_POUND_SIGN = 0x00A3, + UNICODE_CURRENCY_SIGN = 0x00A4, + UNICODE_YEN_SIGN = 0x00A5, + UNICODE_BROKEN_BAR = 0x00A6, + UNICODE_SECTION_SIGN = 0x00A7, + + UNICODE_DEGREE_SIGN = 0x00B0, + UNICODE_PLUS_MINUS_SIGN = 0x00B1, + UNICODE_SUPERSCRIPT_TWO = 0x00B2, + UNICODE_ACUTE_ACCENT = 0x00B4, + UNICODE_PILCROW_SIGN = 0x00B6, // Paragraph mark + + UNICODE_INVERTED_QUESTION_MARK = 0x00BF, + + UNICODE_LATIN_CAPITAL_LETTER_A_WITH_GRAVE = 0x00C0, + UNICODE_LATIN_CAPITAL_LETTER_A_WITH_ACUTE = 0x00C1, + UNICODE_LATIN_CAPITAL_LETTER_A_WITH_CIRCUMFLEX = 0x00C2, + UNICODE_LATIN_CAPITAL_LETTER_A_WITH_TILDE = 0x00C3, + UNICODE_LATIN_CAPITAL_LETTER_A_WITH_DIAERESIS = 0x00C4, + UNICODE_LATIN_CAPITAL_LETTER_A_WITH_RING_ABOVE = 0x00C5, + UNICODE_LATIN_CAPITAL_LETTER_AE = 0x00C6, + UNICODE_LATIN_CAPITAL_LETTER_C_WITH_CEDILLA = 0x00C7, + UNICODE_LATIN_CAPITAL_LETTER_E_WITH_GRAVE = 0x00C8, + UNICODE_LATIN_CAPITAL_LETTER_E_WITH_ACUTE = 0x00C9, + UNICODE_LATIN_CAPITAL_LETTER_E_WITH_CIRCUMFLEX = 0x00CA, + UNICODE_LATIN_CAPITAL_LETTER_E_WITH_DIAERESIS = 0x00CB, + UNICODE_LATIN_CAPITAL_LETTER_I_WITH_GRAVE = 0x00CC, + UNICODE_LATIN_CAPITAL_LETTER_I_WITH_ACUTE = 0x00CD, + UNICODE_LATIN_CAPITAL_LETTER_I_WITH_CIRCUMFLEX = 0x00CE, + UNICODE_LATIN_CAPITAL_LETTER_I_WITH_DIAERESIS = 0x00CF, + UNICODE_LATIN_CAPITAL_LETTER_ETH = 0x00D0, + UNICODE_LATIN_CAPITAL_LETTER_N_WITH_TILDE = 0x00D1, + UNICODE_LATIN_CAPITAL_LETTER_O_WITH_GRAVE = 0x00D2, + UNICODE_LATIN_CAPITAL_LETTER_O_WITH_ACUTE = 0x00D3, + UNICODE_LATIN_CAPITAL_LETTER_O_WITH_CIRCUMFLEX = 0x00D4, + UNICODE_LATIN_CAPITAL_LETTER_O_WITH_TILDE = 0x00D5, + UNICODE_LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS = 0x00D6, + UNICODE_MULTIPLICATION_SIGN = 0x00D7, + UNICODE_LATIN_CAPITAL_LETTER_O_WITH_STROKE = 0x00D8, + UNICODE_LATIN_CAPITAL_LETTER_U_WITH_GRAVE = 0x00D9, + UNICODE_LATIN_CAPITAL_LETTER_U_WITH_ACUTE = 0x00DA, + UNICODE_LATIN_CAPITAL_LETTER_U_WITH_CIRCUMFLEX = 0x00DB, + UNICODE_LATIN_CAPITAL_LETTER_U_WITH_DIAERESIS = 0x00DC, + UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_ACUTE = 0x00DD, + UNICODE_LATIN_CAPITAL_LETTER_THORN = 0x00DE, + UNICODE_LATIN_SMALL_LETTER_SHARP_S = 0x00DF, + UNICODE_LATIN_SMALL_LETTER_A_WITH_GRAVE = 0x00E0, + UNICODE_LATIN_SMALL_LETTER_A_WITH_ACUTE = 0x00E1, + UNICODE_LATIN_SMALL_LETTER_A_WITH_CIRCUMFLEX = 0x00E2, + UNICODE_LATIN_SMALL_LETTER_A_WITH_TILDE = 0x00E3, + UNICODE_LATIN_SMALL_LETTER_A_WITH_DIAERESIS = 0x00E4, + UNICODE_LATIN_SMALL_LETTER_A_WITH_RING_ABOVE = 0x00E5, + UNICODE_LATIN_SMALL_LETTER_AE = 0x00E6, + UNICODE_LATIN_SMALL_LETTER_C_WITH_CEDILLA = 0x00E7, + UNICODE_LATIN_SMALL_LETTER_E_WITH_GRAVE = 0x00E8, + UNICODE_LATIN_SMALL_LETTER_E_WITH_ACUTE = 0x00E9, + UNICODE_LATIN_SMALL_LETTER_E_WITH_CIRCUMFLEX = 0x00EA, + UNICODE_LATIN_SMALL_LETTER_E_WITH_DIAERESIS = 0x00EB, + UNICODE_LATIN_SMALL_LETTER_I_WITH_GRAVE = 0x00EC, + UNICODE_LATIN_SMALL_LETTER_I_WITH_ACUTE = 0x00ED, + UNICODE_LATIN_SMALL_LETTER_I_WITH_CIRCUMFLEX = 0x00EE, + UNICODE_LATIN_SMALL_LETTER_I_WITH_DIAERESIS = 0x00EF, + UNICODE_LATIN_SMALL_LETTER_ETH = 0x00F0, + UNICODE_LATIN_SMALL_LETTER_N_WITH_TILDE = 0x00F1, + UNICODE_LATIN_SMALL_LETTER_O_WITH_GRAVE = 0x00F2, + UNICODE_LATIN_SMALL_LETTER_O_WITH_ACUTE = 0x00F3, + UNICODE_LATIN_SMALL_LETTER_O_WITH_CIRCUMFLEX = 0x00F4, + UNICODE_LATIN_SMALL_LETTER_O_WITH_TILDE = 0x00F5, + UNICODE_LATIN_SMALL_LETTER_O_WITH_DIAERESIS = 0x00F6, + UNICODE_DIVISION_SIGN = 0x00F7, + UNICODE_LATIN_SMALL_LETTER_O_WITH_STROKE = 0x00F8, + UNICODE_LATIN_SMALL_LETTER_U_WITH_GRAVE = 0x00F9, + UNICODE_LATIN_SMALL_LETTER_U_WITH_ACUTE = 0x00FA, + UNICODE_LATIN_SMALL_LETTER_U_WITH_CIRCUMFLEX = 0x00FB, + UNICODE_LATIN_SMALL_LETTER_U_WITH_DIAERESIS = 0x00FC, + UNICODE_LATIN_SMALL_LETTER_Y_WITH_ACUTE = 0x00FD, + UNICODE_LATIN_SMALL_LETTER_THORN = 0x00FE, + UNICODE_LATIN_SMALL_LETTER_Y_WITH_DIAERESIS = 0x00FF, + UNICODE_LATIN_CAPITAL_LETTER_Y_WITH_DIAERESIS = 0x0178, + + UNICODE_EN_QUAD = 0x2000, + UNICODE_EM_QUAD = 0x2001, + UNICODE_EN_SPACE = 0x2002, + UNICODE_EM_SPACE = 0x2003, + UNICODE_ZERO_WIDTH_SPACE = 0x200B, + UNICODE_ZERO_WIDTH_NON_JOINER = 0x200C, + UNICODE_ZERO_WIDTH_JOINER = 0x200D, + UNICODE_EM_DASH = 0x2014, + UNICODE_BULLET = 0x2022, + UNICODE_DOUBLE_EXCLAMATION_MARK = 0x203c, + UNICODE_OVERLINE = 0x203E, + + UNICODE_GREEK_CAPITAL_LETTER_HETA = 0x0370, + UNICODE_GREEK_SMALL_LETTER_HETA = 0x0371, + UNICODE_GREEK_CAPITAL_LETTER_ARCHAIC_SAMPI = 0x0372, + UNICODE_GREEK_SMALL_LETTER_ARCHAIC_SAMPI = 0x0373, + UNICODE_GREEK_NUMERAL_SIGN = 0x0374, + UNICODE_GREEK_LOWER_NUMERAL_SIGN = 0x0375, + UNICODE_GREEK_CAPITAL_LETTER_PAMPHYLIAN_DIGAMMA = 0x0376, + UNICODE_GREEK_SMALL_LETTER_PAMPHYLIAN_DIGAMMA = 0x0377, + UNICODE_GREEK_YPOGEGRAMMENI = 0x037A, + UNICODE_GREEK_SMALL_REVERSED_LUNATE_SIGMA_SYMBOL = 0x037B, + UNICODE_GREEK_SMALL_DOTTED_LUNATE_SIGMA_SYMBOL = 0x037C, + UNICODE_GREEK_SMALL_REVERSED_DOTTED_LUNATE_SIGMA_SYMBOL = 0x037D, + UNICODE_GREEK_QUESTION_MARK = 0x037E, + UNICODE_GREEK_CAPITAL_LETTER_YOT = 0x037F, + UNICODE_GREEK_TONOS = 0x0384, + UNICODE_GREEK_DIALYTIKA_TONOS = 0x0385, + UNICODE_GREEK_CAPITAL_LETTER_ALPHA_WITH_TONOS = 0x0386, + UNICODE_GREEK_ANO_TELEIA = 0x0387, + UNICODE_GREEK_CAPITAL_LETTER_EPSILON_WITH_TONOS = 0x0388, + UNICODE_GREEK_CAPITAL_LETTER_ETA_WITH_TONOS = 0x0389, + UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_TONOS = 0x038A, + UNICODE_GREEK_CAPITAL_LETTER_OMICRON_WITH_TONOS = 0x038C, + UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_TONOS = 0x038E, + UNICODE_GREEK_CAPITAL_LETTER_OMEGA_WITH_TONOS = 0x038F, + UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA_AND_TONOS = 0x0390, + UNICODE_GREEK_CAPITAL_LETTER_ALPHA = 0x0391, + UNICODE_GREEK_CAPITAL_LETTER_BETA = 0x0392, + UNICODE_GREEK_CAPITAL_LETTER_GAMMA = 0x0393, + UNICODE_GREEK_CAPITAL_LETTER_DELTA = 0x0394, + UNICODE_GREEK_CAPITAL_LETTER_EPSILON = 0x0395, + UNICODE_GREEK_CAPITAL_LETTER_ZETA = 0x0396, + UNICODE_GREEK_CAPITAL_LETTER_ETA = 0x397, + UNICODE_GREEK_CAPITAL_LETTER_THETA = 0x0398, + UNICODE_GREEK_CAPITAL_LETTER_IOTA = 0x0399, + UNICODE_GREEK_CAPITAL_LETTER_KAPPA = 0x039A, + UNICODE_GREEK_CAPITAL_LETTER_LAMDA = 0x039B, + UNICODE_GREEK_CAPITAL_LETTER_MU = 0x039C, + UNICODE_GREEK_CAPITAL_LETTER_NU = 0x039D, + UNICODE_GREEK_CAPITAL_LETTER_XI = 0x039E, + UNICODE_GREEK_CAPITAL_LETTER_OMICRON = 0x039F, + UNICODE_GREEK_CAPITAL_LETTER_PI = 0x03A0, + UNICODE_GREEK_CAPITAL_LETTER_RHO = 0x03A1, + UNICODE_GREEK_CAPITAL_LETTER_SIGMA = 0x03A3, + UNICODE_GREEK_CAPITAL_LETTER_TAU = 0x03A4, + UNICODE_GREEK_CAPITAL_LETTER_UPSILON = 0x03A5, + UNICODE_GREEK_CAPITAL_LETTER_PHI = 0x03A6, + UNICODE_GREEK_CAPITAL_LETTER_CHI = 0x03A7, + UNICODE_GREEK_CAPITAL_LETTER_PSI = 0x03A8, + UNICODE_GREEK_CAPITAL_LETTER_OMEGA = 0x03A9, + UNICODE_GREEK_CAPITAL_LETTER_IOTA_WITH_DIALYTIKA = 0x03AA, + UNICODE_GREEK_CAPITAL_LETTER_UPSILON_WITH_DIALYTIKA = 0x03AB, + UNICODE_GREEK_SMALL_LETTER_ALPHA_WITH_TONOS = 0x03AC, + UNICODE_GREEK_SMALL_LETTER_EPSILON_WITH_TONOS = 0x03AD, + UNICODE_GREEK_SMALL_LETTER_ETA_WITH_TONOS = 0x03AE, + UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_TONOS = 0x03AF, + UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA_AND_TONOS = 0x03B0, + UNICODE_GREEK_SMALL_LETTER_ALPHA = 0x03B1, + UNICODE_GREEK_SMALL_LETTER_BETA = 0x03B2, + UNICODE_GREEK_SMALL_LETTER_GAMMA = 0x03B3, + UNICODE_GREEK_SMALL_LETTER_DELTA = 0x03B4, + UNICODE_GREEK_SMALL_LETTER_EPSILON = 0x03B5, + UNICODE_GREEK_SMALL_LETTER_ZETA = 0x03B6, + UNICODE_GREEK_SMALL_LETTER_ETA = 0x03B7, + UNICODE_GREEK_SMALL_LETTER_THETA = 0x03B8, + UNICODE_GREEK_SMALL_LETTER_IOTA = 0x03B9, + UNICODE_GREEK_SMALL_LETTER_KAPPA = 0x03BA, + UNICODE_GREEK_SMALL_LETTER_LAMDA = 0x03BB, + UNICODE_GREEK_SMALL_LETTER_MU = 0x03BC, + UNICODE_GREEK_SMALL_LETTER_NU = 0x03BD, + UNICODE_GREEK_SMALL_LETTER_XI = 0x03BE, + UNICODE_GREEK_SMALL_LETTER_OMICRON = 0x03BF, + UNICODE_GREEK_SMALL_LETTER_PI = 0x03C0, + UNICODE_GREEK_SMALL_LETTER_RHO = 0x03C1, + UNICODE_GREEK_SMALL_LETTER_FINAL_SIGMA = 0x03C2, + UNICODE_GREEK_SMALL_LETTER_SIGMA = 0x03C3, + UNICODE_GREEK_SMALL_LETTER_TAU = 0x03C4, + UNICODE_GREEK_SMALL_LETTER_UPSILON = 0x03C5, + UNICODE_GREEK_SMALL_LETTER_PHI = 0x03C6, + UNICODE_GREEK_SMALL_LETTER_CHI = 0x03C7, + UNICODE_GREEK_SMALL_LETTER_PSI = 0x03C8, + UNICODE_GREEK_SMALL_LETTER_OMEGA = 0x03C9, + UNICODE_GREEK_SMALL_LETTER_IOTA_WITH_DIALYTIKA = 0x03CA, + UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_DIALYTIKA = 0x03CB, + UNICODE_GREEK_SMALL_LETTER_OMICRON_WITH_TONOS = 0x03CC, + UNICODE_GREEK_SMALL_LETTER_UPSILON_WITH_TONOS = 0x03CD, + UNICODE_GREEK_SMALL_LETTER_OMEGA_WITH_TONOS = 0x03CE, + UNICODE_GREEK_CAPITLA_KAI_SYMBOL = 0x03CF, + UNICODE_GREEK_BETA_SYMBOL = 0x03D0, + UNICODE_GREEK_THETA_SYMBOL = 0x03D1, + UNICODE_GREEK_UPSILON_WITH_HOOK_SYMBOL = 0x03D2, + UNICODE_GREEK_UPSILON_WITH_ACUTE_AND_HOOK_SYMBOL = 0x03D3, + UNICODE_GREEK_UPSILON_WITH_DIAERESIS_AND_HOOK_SYMBOL = 0x03D4, + UNICODE_GREEK_PHI_SYMBOL = 0x03D5, + UNICODE_GREEK_PI_SYMBOL = 0x03D6, + UNICODE_GREEK_KAI_SYMBOL = 0x03D7, + UNICODE_GREEK_LETTER_ARCHAIC_KOPPA = 0x03D8, + UNICODE_GREEK_SMALL_LETTER_ARCHAIC_KOPPA = 0x03D9, + UNICODE_GREEK_LETTER_STIGMA = 0x03DA, + UNICODE_GREEK_SMALL_LETTER_STIGMA = 0x03DB, + UNICODE_GREEK_LETTER_DIGAMMA = 0x03DC, + UNICODE_GREEK_SMALL_LETTER_DIGAMMA = 0x03DD, + UNICODE_GREEK_LETTER_KOPPA = 0x03DE, + UNICODE_GREEK_SMALL_LETTER_KOPPA = 0x03DF, + UNICODE_GREEK_LETTER_SAMPI = 0x03E0, + UNICODE_GREEK_SMALL_LETTER_SAMPI = 0x03E1, + + UNICODE_BLACK_SQUARE = 0x25A0, + + UNICODE_VARIATION_SELECTOR_1 = 0xFE00, + UNICODE_VARIATION_SELECTOR_2 = 0xFE01, + UNICODE_VARIATION_SELECTOR_3 = 0xFE02, + UNICODE_VARIATION_SELECTOR_4 = 0xFE03, + UNICODE_VARIATION_SELECTOR_5 = 0xFE04, + UNICODE_VARIATION_SELECTOR_6 = 0xFE05, + UNICODE_VARIATION_SELECTOR_7 = 0xFE06, + UNICODE_VARIATION_SELECTOR_8 = 0xFE07, + UNICODE_VARIATION_SELECTOR_9 = 0xFE08, + UNICODE_VARIATION_SELECTOR_10 = 0xFE09, + UNICODE_VARIATION_SELECTOR_11 = 0xFE0A, + UNICODE_VARIATION_SELECTOR_12 = 0xFE0B, + UNICODE_VARIATION_SELECTOR_13 = 0xFE0C, + UNICODE_VARIATION_SELECTOR_14 = 0xFE0D, + UNICODE_VARIATION_SELECTOR_15 = 0xFE0E, + UNICODE_VARIATION_SELECTOR_16 = 0xFE0F, + UNICODE_ZERO_WIDTH_NO_BREAK_SPACE = 0xFEFF, + + UNICODE_HALFWIDTH_BLACK_SQUARE = 0xFFED, + UNICODE_HALFWIDTH_WHITE_CIRCLE = 0xFFEE, + + UNICODE_REPLACEMENT_CHARACTER = 0xFFFD +}; + +#endif // Don't add anything after this line \ No newline at end of file