From 7eaa926667c6a0d8b0c69c14edad09730125a699 Mon Sep 17 00:00:00 2001 From: obarthel Date: Fri, 11 May 2018 11:06:10 +0200 Subject: [PATCH] These programs generate the cp437 and cp850 tables from Unicode documentation --- source_code/cp437-unicode-tables.c | 339 +++++++++++++++++++++++++++++ source_code/cp850-unicode-tables.c | 339 +++++++++++++++++++++++++++++ 2 files changed, 678 insertions(+) create mode 100644 source_code/cp437-unicode-tables.c create mode 100644 source_code/cp850-unicode-tables.c diff --git a/source_code/cp437-unicode-tables.c b/source_code/cp437-unicode-tables.c new file mode 100644 index 0000000..139e422 --- /dev/null +++ b/source_code/cp437-unicode-tables.c @@ -0,0 +1,339 @@ +#include +#include + +/* Source: ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP437.TXT (2018-05-10) */ + +const unsigned int cp437_to_unicode[256] = +{ + /* + * Name: cp437_DOSLatinUS to Unicode table + * Unicode version: 2.0 + * Table version: 2.00 + * Table format: Format A + * Date: 04/24/96 + * Contact: Shawn.Steele@microsoft.com + * + * General notes: none + * + * Format: Three tab-separated columns + * Column #1 is the cp437_DOSLatinUS code (in hex) + * Column #2 is the Unicode (in hex as 0xXXXX) + * Column #3 is the Unicode name (follows a comment sign, '#') + * + * The entries are in cp437_DOSLatinUS order + */ + + /* 0x00 */ 0x0000, /* NULL */ + /* 0x01 */ 0x0001, /* START OF HEADING */ + /* 0x02 */ 0x0002, /* START OF TEXT */ + /* 0x03 */ 0x0003, /* END OF TEXT */ + /* 0x04 */ 0x0004, /* END OF TRANSMISSION */ + /* 0x05 */ 0x0005, /* ENQUIRY */ + /* 0x06 */ 0x0006, /* ACKNOWLEDGE */ + /* 0x07 */ 0x0007, /* BELL */ + /* 0x08 */ 0x0008, /* BACKSPACE */ + /* 0x09 */ 0x0009, /* HORIZONTAL TABULATION */ + /* 0x0a */ 0x000a, /* LINE FEED */ + /* 0x0b */ 0x000b, /* VERTICAL TABULATION */ + /* 0x0c */ 0x000c, /* FORM FEED */ + /* 0x0d */ 0x000d, /* CARRIAGE RETURN */ + /* 0x0e */ 0x000e, /* SHIFT OUT */ + /* 0x0f */ 0x000f, /* SHIFT IN */ + /* 0x10 */ 0x0010, /* DATA LINK ESCAPE */ + /* 0x11 */ 0x0011, /* DEVICE CONTROL ONE */ + /* 0x12 */ 0x0012, /* DEVICE CONTROL TWO */ + /* 0x13 */ 0x0013, /* DEVICE CONTROL THREE */ + /* 0x14 */ 0x0014, /* DEVICE CONTROL FOUR */ + /* 0x15 */ 0x0015, /* NEGATIVE ACKNOWLEDGE */ + /* 0x16 */ 0x0016, /* SYNCHRONOUS IDLE */ + /* 0x17 */ 0x0017, /* END OF TRANSMISSION BLOCK */ + /* 0x18 */ 0x0018, /* CANCEL */ + /* 0x19 */ 0x0019, /* END OF MEDIUM */ + /* 0x1a */ 0x001a, /* SUBSTITUTE */ + /* 0x1b */ 0x001b, /* ESCAPE */ + /* 0x1c */ 0x001c, /* FILE SEPARATOR */ + /* 0x1d */ 0x001d, /* GROUP SEPARATOR */ + /* 0x1e */ 0x001e, /* RECORD SEPARATOR */ + /* 0x1f */ 0x001f, /* UNIT SEPARATOR */ + /* 0x20 */ 0x0020, /* SPACE */ + /* 0x21 */ 0x0021, /* EXCLAMATION MARK */ + /* 0x22 */ 0x0022, /* QUOTATION MARK */ + /* 0x23 */ 0x0023, /* NUMBER SIGN */ + /* 0x24 */ 0x0024, /* DOLLAR SIGN */ + /* 0x25 */ 0x0025, /* PERCENT SIGN */ + /* 0x26 */ 0x0026, /* AMPERSAND */ + /* 0x27 */ 0x0027, /* APOSTROPHE */ + /* 0x28 */ 0x0028, /* LEFT PARENTHESIS */ + /* 0x29 */ 0x0029, /* RIGHT PARENTHESIS */ + /* 0x2a */ 0x002a, /* ASTERISK */ + /* 0x2b */ 0x002b, /* PLUS SIGN */ + /* 0x2c */ 0x002c, /* COMMA */ + /* 0x2d */ 0x002d, /* HYPHEN-MINUS */ + /* 0x2e */ 0x002e, /* FULL STOP */ + /* 0x2f */ 0x002f, /* SOLIDUS */ + /* 0x30 */ 0x0030, /* DIGIT ZERO */ + /* 0x31 */ 0x0031, /* DIGIT ONE */ + /* 0x32 */ 0x0032, /* DIGIT TWO */ + /* 0x33 */ 0x0033, /* DIGIT THREE */ + /* 0x34 */ 0x0034, /* DIGIT FOUR */ + /* 0x35 */ 0x0035, /* DIGIT FIVE */ + /* 0x36 */ 0x0036, /* DIGIT SIX */ + /* 0x37 */ 0x0037, /* DIGIT SEVEN */ + /* 0x38 */ 0x0038, /* DIGIT EIGHT */ + /* 0x39 */ 0x0039, /* DIGIT NINE */ + /* 0x3a */ 0x003a, /* COLON */ + /* 0x3b */ 0x003b, /* SEMICOLON */ + /* 0x3c */ 0x003c, /* LESS-THAN SIGN */ + /* 0x3d */ 0x003d, /* EQUALS SIGN */ + /* 0x3e */ 0x003e, /* GREATER-THAN SIGN */ + /* 0x3f */ 0x003f, /* QUESTION MARK */ + /* 0x40 */ 0x0040, /* COMMERCIAL AT */ + /* 0x41 */ 0x0041, /* LATIN CAPITAL LETTER A */ + /* 0x42 */ 0x0042, /* LATIN CAPITAL LETTER B */ + /* 0x43 */ 0x0043, /* LATIN CAPITAL LETTER C */ + /* 0x44 */ 0x0044, /* LATIN CAPITAL LETTER D */ + /* 0x45 */ 0x0045, /* LATIN CAPITAL LETTER E */ + /* 0x46 */ 0x0046, /* LATIN CAPITAL LETTER F */ + /* 0x47 */ 0x0047, /* LATIN CAPITAL LETTER G */ + /* 0x48 */ 0x0048, /* LATIN CAPITAL LETTER H */ + /* 0x49 */ 0x0049, /* LATIN CAPITAL LETTER I */ + /* 0x4a */ 0x004a, /* LATIN CAPITAL LETTER J */ + /* 0x4b */ 0x004b, /* LATIN CAPITAL LETTER K */ + /* 0x4c */ 0x004c, /* LATIN CAPITAL LETTER L */ + /* 0x4d */ 0x004d, /* LATIN CAPITAL LETTER M */ + /* 0x4e */ 0x004e, /* LATIN CAPITAL LETTER N */ + /* 0x4f */ 0x004f, /* LATIN CAPITAL LETTER O */ + /* 0x50 */ 0x0050, /* LATIN CAPITAL LETTER P */ + /* 0x51 */ 0x0051, /* LATIN CAPITAL LETTER Q */ + /* 0x52 */ 0x0052, /* LATIN CAPITAL LETTER R */ + /* 0x53 */ 0x0053, /* LATIN CAPITAL LETTER S */ + /* 0x54 */ 0x0054, /* LATIN CAPITAL LETTER T */ + /* 0x55 */ 0x0055, /* LATIN CAPITAL LETTER U */ + /* 0x56 */ 0x0056, /* LATIN CAPITAL LETTER V */ + /* 0x57 */ 0x0057, /* LATIN CAPITAL LETTER W */ + /* 0x58 */ 0x0058, /* LATIN CAPITAL LETTER X */ + /* 0x59 */ 0x0059, /* LATIN CAPITAL LETTER Y */ + /* 0x5a */ 0x005a, /* LATIN CAPITAL LETTER Z */ + /* 0x5b */ 0x005b, /* LEFT SQUARE BRACKET */ + /* 0x5c */ 0x005c, /* REVERSE SOLIDUS */ + /* 0x5d */ 0x005d, /* RIGHT SQUARE BRACKET */ + /* 0x5e */ 0x005e, /* CIRCUMFLEX ACCENT */ + /* 0x5f */ 0x005f, /* LOW LINE */ + /* 0x60 */ 0x0060, /* GRAVE ACCENT */ + /* 0x61 */ 0x0061, /* LATIN SMALL LETTER A */ + /* 0x62 */ 0x0062, /* LATIN SMALL LETTER B */ + /* 0x63 */ 0x0063, /* LATIN SMALL LETTER C */ + /* 0x64 */ 0x0064, /* LATIN SMALL LETTER D */ + /* 0x65 */ 0x0065, /* LATIN SMALL LETTER E */ + /* 0x66 */ 0x0066, /* LATIN SMALL LETTER F */ + /* 0x67 */ 0x0067, /* LATIN SMALL LETTER G */ + /* 0x68 */ 0x0068, /* LATIN SMALL LETTER H */ + /* 0x69 */ 0x0069, /* LATIN SMALL LETTER I */ + /* 0x6a */ 0x006a, /* LATIN SMALL LETTER J */ + /* 0x6b */ 0x006b, /* LATIN SMALL LETTER K */ + /* 0x6c */ 0x006c, /* LATIN SMALL LETTER L */ + /* 0x6d */ 0x006d, /* LATIN SMALL LETTER M */ + /* 0x6e */ 0x006e, /* LATIN SMALL LETTER N */ + /* 0x6f */ 0x006f, /* LATIN SMALL LETTER O */ + /* 0x70 */ 0x0070, /* LATIN SMALL LETTER P */ + /* 0x71 */ 0x0071, /* LATIN SMALL LETTER Q */ + /* 0x72 */ 0x0072, /* LATIN SMALL LETTER R */ + /* 0x73 */ 0x0073, /* LATIN SMALL LETTER S */ + /* 0x74 */ 0x0074, /* LATIN SMALL LETTER T */ + /* 0x75 */ 0x0075, /* LATIN SMALL LETTER U */ + /* 0x76 */ 0x0076, /* LATIN SMALL LETTER V */ + /* 0x77 */ 0x0077, /* LATIN SMALL LETTER W */ + /* 0x78 */ 0x0078, /* LATIN SMALL LETTER X */ + /* 0x79 */ 0x0079, /* LATIN SMALL LETTER Y */ + /* 0x7a */ 0x007a, /* LATIN SMALL LETTER Z */ + /* 0x7b */ 0x007b, /* LEFT CURLY BRACKET */ + /* 0x7c */ 0x007c, /* VERTICAL LINE */ + /* 0x7d */ 0x007d, /* RIGHT CURLY BRACKET */ + /* 0x7e */ 0x007e, /* TILDE */ + /* 0x7f */ 0x007f, /* DELETE */ + /* 0x80 */ 0x00c7, /* LATIN CAPITAL LETTER C WITH CEDILLA */ + /* 0x81 */ 0x00fc, /* LATIN SMALL LETTER U WITH DIAERESIS */ + /* 0x82 */ 0x00e9, /* LATIN SMALL LETTER E WITH ACUTE */ + /* 0x83 */ 0x00e2, /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ + /* 0x84 */ 0x00e4, /* LATIN SMALL LETTER A WITH DIAERESIS */ + /* 0x85 */ 0x00e0, /* LATIN SMALL LETTER A WITH GRAVE */ + /* 0x86 */ 0x00e5, /* LATIN SMALL LETTER A WITH RING ABOVE */ + /* 0x87 */ 0x00e7, /* LATIN SMALL LETTER C WITH CEDILLA */ + /* 0x88 */ 0x00ea, /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ + /* 0x89 */ 0x00eb, /* LATIN SMALL LETTER E WITH DIAERESIS */ + /* 0x8a */ 0x00e8, /* LATIN SMALL LETTER E WITH GRAVE */ + /* 0x8b */ 0x00ef, /* LATIN SMALL LETTER I WITH DIAERESIS */ + /* 0x8c */ 0x00ee, /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ + /* 0x8d */ 0x00ec, /* LATIN SMALL LETTER I WITH GRAVE */ + /* 0x8e */ 0x00c4, /* LATIN CAPITAL LETTER A WITH DIAERESIS */ + /* 0x8f */ 0x00c5, /* LATIN CAPITAL LETTER A WITH RING ABOVE */ + /* 0x90 */ 0x00c9, /* LATIN CAPITAL LETTER E WITH ACUTE */ + /* 0x91 */ 0x00e6, /* LATIN SMALL LIGATURE AE */ + /* 0x92 */ 0x00c6, /* LATIN CAPITAL LIGATURE AE */ + /* 0x93 */ 0x00f4, /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ + /* 0x94 */ 0x00f6, /* LATIN SMALL LETTER O WITH DIAERESIS */ + /* 0x95 */ 0x00f2, /* LATIN SMALL LETTER O WITH GRAVE */ + /* 0x96 */ 0x00fb, /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ + /* 0x97 */ 0x00f9, /* LATIN SMALL LETTER U WITH GRAVE */ + /* 0x98 */ 0x00ff, /* LATIN SMALL LETTER Y WITH DIAERESIS */ + /* 0x99 */ 0x00d6, /* LATIN CAPITAL LETTER O WITH DIAERESIS */ + /* 0x9a */ 0x00dc, /* LATIN CAPITAL LETTER U WITH DIAERESIS */ + /* 0x9b */ 0x00a2, /* CENT SIGN */ + /* 0x9c */ 0x00a3, /* POUND SIGN */ + /* 0x9d */ 0x00a5, /* YEN SIGN */ + /* 0x9e */ 0x20a7, /* PESETA SIGN */ + /* 0x9f */ 0x0192, /* LATIN SMALL LETTER F WITH HOOK */ + /* 0xa0 */ 0x00e1, /* LATIN SMALL LETTER A WITH ACUTE */ + /* 0xa1 */ 0x00ed, /* LATIN SMALL LETTER I WITH ACUTE */ + /* 0xa2 */ 0x00f3, /* LATIN SMALL LETTER O WITH ACUTE */ + /* 0xa3 */ 0x00fa, /* LATIN SMALL LETTER U WITH ACUTE */ + /* 0xa4 */ 0x00f1, /* LATIN SMALL LETTER N WITH TILDE */ + /* 0xa5 */ 0x00d1, /* LATIN CAPITAL LETTER N WITH TILDE */ + /* 0xa6 */ 0x00aa, /* FEMININE ORDINAL INDICATOR */ + /* 0xa7 */ 0x00ba, /* MASCULINE ORDINAL INDICATOR */ + /* 0xa8 */ 0x00bf, /* INVERTED QUESTION MARK */ + /* 0xa9 */ 0x2310, /* REVERSED NOT SIGN */ + /* 0xaa */ 0x00ac, /* NOT SIGN */ + /* 0xab */ 0x00bd, /* VULGAR FRACTION ONE HALF */ + /* 0xac */ 0x00bc, /* VULGAR FRACTION ONE QUARTER */ + /* 0xad */ 0x00a1, /* INVERTED EXCLAMATION MARK */ + /* 0xae */ 0x00ab, /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ + /* 0xaf */ 0x00bb, /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ + /* 0xb0 */ 0x2591, /* LIGHT SHADE */ + /* 0xb1 */ 0x2592, /* MEDIUM SHADE */ + /* 0xb2 */ 0x2593, /* DARK SHADE */ + /* 0xb3 */ 0x2502, /* BOX DRAWINGS LIGHT VERTICAL */ + /* 0xb4 */ 0x2524, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */ + /* 0xb5 */ 0x2561, /* BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE */ + /* 0xb6 */ 0x2562, /* BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE */ + /* 0xb7 */ 0x2556, /* BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE */ + /* 0xb8 */ 0x2555, /* BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE */ + /* 0xb9 */ 0x2563, /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT */ + /* 0xba */ 0x2551, /* BOX DRAWINGS DOUBLE VERTICAL */ + /* 0xbb */ 0x2557, /* BOX DRAWINGS DOUBLE DOWN AND LEFT */ + /* 0xbc */ 0x255d, /* BOX DRAWINGS DOUBLE UP AND LEFT */ + /* 0xbd */ 0x255c, /* BOX DRAWINGS UP DOUBLE AND LEFT SINGLE */ + /* 0xbe */ 0x255b, /* BOX DRAWINGS UP SINGLE AND LEFT DOUBLE */ + /* 0xbf */ 0x2510, /* BOX DRAWINGS LIGHT DOWN AND LEFT */ + /* 0xc0 */ 0x2514, /* BOX DRAWINGS LIGHT UP AND RIGHT */ + /* 0xc1 */ 0x2534, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */ + /* 0xc2 */ 0x252c, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ + /* 0xc3 */ 0x251c, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ + /* 0xc4 */ 0x2500, /* BOX DRAWINGS LIGHT HORIZONTAL */ + /* 0xc5 */ 0x253c, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ + /* 0xc6 */ 0x255e, /* BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE */ + /* 0xc7 */ 0x255f, /* BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE */ + /* 0xc8 */ 0x255a, /* BOX DRAWINGS DOUBLE UP AND RIGHT */ + /* 0xc9 */ 0x2554, /* BOX DRAWINGS DOUBLE DOWN AND RIGHT */ + /* 0xca */ 0x2569, /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL */ + /* 0xcb */ 0x2566, /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL */ + /* 0xcc */ 0x2560, /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT */ + /* 0xcd */ 0x2550, /* BOX DRAWINGS DOUBLE HORIZONTAL */ + /* 0xce */ 0x256c, /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL */ + /* 0xcf */ 0x2567, /* BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE */ + /* 0xd0 */ 0x2568, /* BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE */ + /* 0xd1 */ 0x2564, /* BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE */ + /* 0xd2 */ 0x2565, /* BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE */ + /* 0xd3 */ 0x2559, /* BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE */ + /* 0xd4 */ 0x2558, /* BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE */ + /* 0xd5 */ 0x2552, /* BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE */ + /* 0xd6 */ 0x2553, /* BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE */ + /* 0xd7 */ 0x256b, /* BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE */ + /* 0xd8 */ 0x256a, /* BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE */ + /* 0xd9 */ 0x2518, /* BOX DRAWINGS LIGHT UP AND LEFT */ + /* 0xda */ 0x250c, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */ + /* 0xdb */ 0x2588, /* FULL BLOCK */ + /* 0xdc */ 0x2584, /* LOWER HALF BLOCK */ + /* 0xdd */ 0x258c, /* LEFT HALF BLOCK */ + /* 0xde */ 0x2590, /* RIGHT HALF BLOCK */ + /* 0xdf */ 0x2580, /* UPPER HALF BLOCK */ + /* 0xe0 */ 0x03b1, /* GREEK SMALL LETTER ALPHA */ + /* 0xe1 */ 0x00df, /* LATIN SMALL LETTER SHARP S */ + /* 0xe2 */ 0x0393, /* GREEK CAPITAL LETTER GAMMA */ + /* 0xe3 */ 0x03c0, /* GREEK SMALL LETTER PI */ + /* 0xe4 */ 0x03a3, /* GREEK CAPITAL LETTER SIGMA */ + /* 0xe5 */ 0x03c3, /* GREEK SMALL LETTER SIGMA */ + /* 0xe6 */ 0x00b5, /* MICRO SIGN */ + /* 0xe7 */ 0x03c4, /* GREEK SMALL LETTER TAU */ + /* 0xe8 */ 0x03a6, /* GREEK CAPITAL LETTER PHI */ + /* 0xe9 */ 0x0398, /* GREEK CAPITAL LETTER THETA */ + /* 0xea */ 0x03a9, /* GREEK CAPITAL LETTER OMEGA */ + /* 0xeb */ 0x03b4, /* GREEK SMALL LETTER DELTA */ + /* 0xec */ 0x221e, /* INFINITY */ + /* 0xed */ 0x03c6, /* GREEK SMALL LETTER PHI */ + /* 0xee */ 0x03b5, /* GREEK SMALL LETTER EPSILON */ + /* 0xef */ 0x2229, /* INTERSECTION */ + /* 0xf0 */ 0x2261, /* IDENTICAL TO */ + /* 0xf1 */ 0x00b1, /* PLUS-MINUS SIGN */ + /* 0xf2 */ 0x2265, /* GREATER-THAN OR EQUAL TO */ + /* 0xf3 */ 0x2264, /* LESS-THAN OR EQUAL TO */ + /* 0xf4 */ 0x2320, /* TOP HALF INTEGRAL */ + /* 0xf5 */ 0x2321, /* BOTTOM HALF INTEGRAL */ + /* 0xf6 */ 0x00f7, /* DIVISION SIGN */ + /* 0xf7 */ 0x2248, /* ALMOST EQUAL TO */ + /* 0xf8 */ 0x00b0, /* DEGREE SIGN */ + /* 0xf9 */ 0x2219, /* BULLET OPERATOR */ + /* 0xfa */ 0x00b7, /* MIDDLE DOT */ + /* 0xfb */ 0x221a, /* SQUARE ROOT */ + /* 0xfc */ 0x207f, /* SUPERSCRIPT LATIN SMALL LETTER N */ + /* 0xfd */ 0x00b2, /* SUPERSCRIPT TWO */ + /* 0xfe */ 0x25a0, /* BLACK SQUARE */ + /* 0xff */ 0x00a0 /* NO-BREAK SPACE */ +}; + +int +main(int argc,char ** argv) +{ + unsigned char unicode_to_cp437[256]; + int i; + int c; + + memset(unicode_to_cp437,0,sizeof(unicode_to_cp437)); + + printf("const unsigned char cp437_to_unicode[256] =\n{\n"); + + for(i = 0 ; i < 256 ; i++) + { + c = cp437_to_unicode[i]; + if(c > 255) + c = 0; + + if(c != 0) + unicode_to_cp437[c] = i; + + if((i % 8) == 0) + printf("\t"); + + printf("0x%02x",c); + + if(i < 255) + printf(","); + + if(((i+1) % 8) == 0) + printf("\n"); + } + + printf("};\n\n"); + + printf("const unsigned char unicode_to_cp437[256] =\n{\n"); + + for(i = 0 ; i < 256 ; i++) + { + c = unicode_to_cp437[i]; + + if((i % 8) == 0) + printf("\t"); + + printf("0x%02x",c); + + if(i < 255) + printf(","); + + if(((i+1) % 8) == 0) + printf("\n"); + } + + printf("};\n"); + + return(0); +} diff --git a/source_code/cp850-unicode-tables.c b/source_code/cp850-unicode-tables.c new file mode 100644 index 0000000..064b839 --- /dev/null +++ b/source_code/cp850-unicode-tables.c @@ -0,0 +1,339 @@ +#include +#include + +/* Source: ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP850.TXT (2018-05-10) */ + +const unsigned int cp850_to_unicode[256] = +{ + /* + * Name: cp850_DOSLatin1 to Unicode table + * Unicode version: 2.0 + * Table version: 2.00 + * Table format: Format A + * Date: 04/24/96 + * Contact: Shawn.Steele@microsoft.com + * + * General notes: none + * + * Format: Three tab-separated columns + * Column #1 is the cp850_DOSLatin1 code (in hex) + * Column #2 is the Unicode (in hex as 0xXXXX) + * Column #3 is the Unicode name (follows a comment sign, '#') + * + * The entries are in cp850_DOSLatin1 order + */ + + /* 0x00 */ 0x0000, /* NULL */ + /* 0x01 */ 0x0001, /* START OF HEADING */ + /* 0x02 */ 0x0002, /* START OF TEXT */ + /* 0x03 */ 0x0003, /* END OF TEXT */ + /* 0x04 */ 0x0004, /* END OF TRANSMISSION */ + /* 0x05 */ 0x0005, /* ENQUIRY */ + /* 0x06 */ 0x0006, /* ACKNOWLEDGE */ + /* 0x07 */ 0x0007, /* BELL */ + /* 0x08 */ 0x0008, /* BACKSPACE */ + /* 0x09 */ 0x0009, /* HORIZONTAL TABULATION */ + /* 0x0a */ 0x000a, /* LINE FEED */ + /* 0x0b */ 0x000b, /* VERTICAL TABULATION */ + /* 0x0c */ 0x000c, /* FORM FEED */ + /* 0x0d */ 0x000d, /* CARRIAGE RETURN */ + /* 0x0e */ 0x000e, /* SHIFT OUT */ + /* 0x0f */ 0x000f, /* SHIFT IN */ + /* 0x10 */ 0x0010, /* DATA LINK ESCAPE */ + /* 0x11 */ 0x0011, /* DEVICE CONTROL ONE */ + /* 0x12 */ 0x0012, /* DEVICE CONTROL TWO */ + /* 0x13 */ 0x0013, /* DEVICE CONTROL THREE */ + /* 0x14 */ 0x0014, /* DEVICE CONTROL FOUR */ + /* 0x15 */ 0x0015, /* NEGATIVE ACKNOWLEDGE */ + /* 0x16 */ 0x0016, /* SYNCHRONOUS IDLE */ + /* 0x17 */ 0x0017, /* END OF TRANSMISSION BLOCK */ + /* 0x18 */ 0x0018, /* CANCEL */ + /* 0x19 */ 0x0019, /* END OF MEDIUM */ + /* 0x1a */ 0x001a, /* SUBSTITUTE */ + /* 0x1b */ 0x001b, /* ESCAPE */ + /* 0x1c */ 0x001c, /* FILE SEPARATOR */ + /* 0x1d */ 0x001d, /* GROUP SEPARATOR */ + /* 0x1e */ 0x001e, /* RECORD SEPARATOR */ + /* 0x1f */ 0x001f, /* UNIT SEPARATOR */ + /* 0x20 */ 0x0020, /* SPACE */ + /* 0x21 */ 0x0021, /* EXCLAMATION MARK */ + /* 0x22 */ 0x0022, /* QUOTATION MARK */ + /* 0x23 */ 0x0023, /* NUMBER SIGN */ + /* 0x24 */ 0x0024, /* DOLLAR SIGN */ + /* 0x25 */ 0x0025, /* PERCENT SIGN */ + /* 0x26 */ 0x0026, /* AMPERSAND */ + /* 0x27 */ 0x0027, /* APOSTROPHE */ + /* 0x28 */ 0x0028, /* LEFT PARENTHESIS */ + /* 0x29 */ 0x0029, /* RIGHT PARENTHESIS */ + /* 0x2a */ 0x002a, /* ASTERISK */ + /* 0x2b */ 0x002b, /* PLUS SIGN */ + /* 0x2c */ 0x002c, /* COMMA */ + /* 0x2d */ 0x002d, /* HYPHEN-MINUS */ + /* 0x2e */ 0x002e, /* FULL STOP */ + /* 0x2f */ 0x002f, /* SOLIDUS */ + /* 0x30 */ 0x0030, /* DIGIT ZERO */ + /* 0x31 */ 0x0031, /* DIGIT ONE */ + /* 0x32 */ 0x0032, /* DIGIT TWO */ + /* 0x33 */ 0x0033, /* DIGIT THREE */ + /* 0x34 */ 0x0034, /* DIGIT FOUR */ + /* 0x35 */ 0x0035, /* DIGIT FIVE */ + /* 0x36 */ 0x0036, /* DIGIT SIX */ + /* 0x37 */ 0x0037, /* DIGIT SEVEN */ + /* 0x38 */ 0x0038, /* DIGIT EIGHT */ + /* 0x39 */ 0x0039, /* DIGIT NINE */ + /* 0x3a */ 0x003a, /* COLON */ + /* 0x3b */ 0x003b, /* SEMICOLON */ + /* 0x3c */ 0x003c, /* LESS-THAN SIGN */ + /* 0x3d */ 0x003d, /* EQUALS SIGN */ + /* 0x3e */ 0x003e, /* GREATER-THAN SIGN */ + /* 0x3f */ 0x003f, /* QUESTION MARK */ + /* 0x40 */ 0x0040, /* COMMERCIAL AT */ + /* 0x41 */ 0x0041, /* LATIN CAPITAL LETTER A */ + /* 0x42 */ 0x0042, /* LATIN CAPITAL LETTER B */ + /* 0x43 */ 0x0043, /* LATIN CAPITAL LETTER C */ + /* 0x44 */ 0x0044, /* LATIN CAPITAL LETTER D */ + /* 0x45 */ 0x0045, /* LATIN CAPITAL LETTER E */ + /* 0x46 */ 0x0046, /* LATIN CAPITAL LETTER F */ + /* 0x47 */ 0x0047, /* LATIN CAPITAL LETTER G */ + /* 0x48 */ 0x0048, /* LATIN CAPITAL LETTER H */ + /* 0x49 */ 0x0049, /* LATIN CAPITAL LETTER I */ + /* 0x4a */ 0x004a, /* LATIN CAPITAL LETTER J */ + /* 0x4b */ 0x004b, /* LATIN CAPITAL LETTER K */ + /* 0x4c */ 0x004c, /* LATIN CAPITAL LETTER L */ + /* 0x4d */ 0x004d, /* LATIN CAPITAL LETTER M */ + /* 0x4e */ 0x004e, /* LATIN CAPITAL LETTER N */ + /* 0x4f */ 0x004f, /* LATIN CAPITAL LETTER O */ + /* 0x50 */ 0x0050, /* LATIN CAPITAL LETTER P */ + /* 0x51 */ 0x0051, /* LATIN CAPITAL LETTER Q */ + /* 0x52 */ 0x0052, /* LATIN CAPITAL LETTER R */ + /* 0x53 */ 0x0053, /* LATIN CAPITAL LETTER S */ + /* 0x54 */ 0x0054, /* LATIN CAPITAL LETTER T */ + /* 0x55 */ 0x0055, /* LATIN CAPITAL LETTER U */ + /* 0x56 */ 0x0056, /* LATIN CAPITAL LETTER V */ + /* 0x57 */ 0x0057, /* LATIN CAPITAL LETTER W */ + /* 0x58 */ 0x0058, /* LATIN CAPITAL LETTER X */ + /* 0x59 */ 0x0059, /* LATIN CAPITAL LETTER Y */ + /* 0x5a */ 0x005a, /* LATIN CAPITAL LETTER Z */ + /* 0x5b */ 0x005b, /* LEFT SQUARE BRACKET */ + /* 0x5c */ 0x005c, /* REVERSE SOLIDUS */ + /* 0x5d */ 0x005d, /* RIGHT SQUARE BRACKET */ + /* 0x5e */ 0x005e, /* CIRCUMFLEX ACCENT */ + /* 0x5f */ 0x005f, /* LOW LINE */ + /* 0x60 */ 0x0060, /* GRAVE ACCENT */ + /* 0x61 */ 0x0061, /* LATIN SMALL LETTER A */ + /* 0x62 */ 0x0062, /* LATIN SMALL LETTER B */ + /* 0x63 */ 0x0063, /* LATIN SMALL LETTER C */ + /* 0x64 */ 0x0064, /* LATIN SMALL LETTER D */ + /* 0x65 */ 0x0065, /* LATIN SMALL LETTER E */ + /* 0x66 */ 0x0066, /* LATIN SMALL LETTER F */ + /* 0x67 */ 0x0067, /* LATIN SMALL LETTER G */ + /* 0x68 */ 0x0068, /* LATIN SMALL LETTER H */ + /* 0x69 */ 0x0069, /* LATIN SMALL LETTER I */ + /* 0x6a */ 0x006a, /* LATIN SMALL LETTER J */ + /* 0x6b */ 0x006b, /* LATIN SMALL LETTER K */ + /* 0x6c */ 0x006c, /* LATIN SMALL LETTER L */ + /* 0x6d */ 0x006d, /* LATIN SMALL LETTER M */ + /* 0x6e */ 0x006e, /* LATIN SMALL LETTER N */ + /* 0x6f */ 0x006f, /* LATIN SMALL LETTER O */ + /* 0x70 */ 0x0070, /* LATIN SMALL LETTER P */ + /* 0x71 */ 0x0071, /* LATIN SMALL LETTER Q */ + /* 0x72 */ 0x0072, /* LATIN SMALL LETTER R */ + /* 0x73 */ 0x0073, /* LATIN SMALL LETTER S */ + /* 0x74 */ 0x0074, /* LATIN SMALL LETTER T */ + /* 0x75 */ 0x0075, /* LATIN SMALL LETTER U */ + /* 0x76 */ 0x0076, /* LATIN SMALL LETTER V */ + /* 0x77 */ 0x0077, /* LATIN SMALL LETTER W */ + /* 0x78 */ 0x0078, /* LATIN SMALL LETTER X */ + /* 0x79 */ 0x0079, /* LATIN SMALL LETTER Y */ + /* 0x7a */ 0x007a, /* LATIN SMALL LETTER Z */ + /* 0x7b */ 0x007b, /* LEFT CURLY BRACKET */ + /* 0x7c */ 0x007c, /* VERTICAL LINE */ + /* 0x7d */ 0x007d, /* RIGHT CURLY BRACKET */ + /* 0x7e */ 0x007e, /* TILDE */ + /* 0x7f */ 0x007f, /* DELETE */ + /* 0x80 */ 0x00c7, /* LATIN CAPITAL LETTER C WITH CEDILLA */ + /* 0x81 */ 0x00fc, /* LATIN SMALL LETTER U WITH DIAERESIS */ + /* 0x82 */ 0x00e9, /* LATIN SMALL LETTER E WITH ACUTE */ + /* 0x83 */ 0x00e2, /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ + /* 0x84 */ 0x00e4, /* LATIN SMALL LETTER A WITH DIAERESIS */ + /* 0x85 */ 0x00e0, /* LATIN SMALL LETTER A WITH GRAVE */ + /* 0x86 */ 0x00e5, /* LATIN SMALL LETTER A WITH RING ABOVE */ + /* 0x87 */ 0x00e7, /* LATIN SMALL LETTER C WITH CEDILLA */ + /* 0x88 */ 0x00ea, /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ + /* 0x89 */ 0x00eb, /* LATIN SMALL LETTER E WITH DIAERESIS */ + /* 0x8a */ 0x00e8, /* LATIN SMALL LETTER E WITH GRAVE */ + /* 0x8b */ 0x00ef, /* LATIN SMALL LETTER I WITH DIAERESIS */ + /* 0x8c */ 0x00ee, /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ + /* 0x8d */ 0x00ec, /* LATIN SMALL LETTER I WITH GRAVE */ + /* 0x8e */ 0x00c4, /* LATIN CAPITAL LETTER A WITH DIAERESIS */ + /* 0x8f */ 0x00c5, /* LATIN CAPITAL LETTER A WITH RING ABOVE */ + /* 0x90 */ 0x00c9, /* LATIN CAPITAL LETTER E WITH ACUTE */ + /* 0x91 */ 0x00e6, /* LATIN SMALL LIGATURE AE */ + /* 0x92 */ 0x00c6, /* LATIN CAPITAL LIGATURE AE */ + /* 0x93 */ 0x00f4, /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ + /* 0x94 */ 0x00f6, /* LATIN SMALL LETTER O WITH DIAERESIS */ + /* 0x95 */ 0x00f2, /* LATIN SMALL LETTER O WITH GRAVE */ + /* 0x96 */ 0x00fb, /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ + /* 0x97 */ 0x00f9, /* LATIN SMALL LETTER U WITH GRAVE */ + /* 0x98 */ 0x00ff, /* LATIN SMALL LETTER Y WITH DIAERESIS */ + /* 0x99 */ 0x00d6, /* LATIN CAPITAL LETTER O WITH DIAERESIS */ + /* 0x9a */ 0x00dc, /* LATIN CAPITAL LETTER U WITH DIAERESIS */ + /* 0x9b */ 0x00f8, /* LATIN SMALL LETTER O WITH STROKE */ + /* 0x9c */ 0x00a3, /* POUND SIGN */ + /* 0x9d */ 0x00d8, /* LATIN CAPITAL LETTER O WITH STROKE */ + /* 0x9e */ 0x00d7, /* MULTIPLICATION SIGN */ + /* 0x9f */ 0x0192, /* LATIN SMALL LETTER F WITH HOOK */ + /* 0xa0 */ 0x00e1, /* LATIN SMALL LETTER A WITH ACUTE */ + /* 0xa1 */ 0x00ed, /* LATIN SMALL LETTER I WITH ACUTE */ + /* 0xa2 */ 0x00f3, /* LATIN SMALL LETTER O WITH ACUTE */ + /* 0xa3 */ 0x00fa, /* LATIN SMALL LETTER U WITH ACUTE */ + /* 0xa4 */ 0x00f1, /* LATIN SMALL LETTER N WITH TILDE */ + /* 0xa5 */ 0x00d1, /* LATIN CAPITAL LETTER N WITH TILDE */ + /* 0xa6 */ 0x00aa, /* FEMININE ORDINAL INDICATOR */ + /* 0xa7 */ 0x00ba, /* MASCULINE ORDINAL INDICATOR */ + /* 0xa8 */ 0x00bf, /* INVERTED QUESTION MARK */ + /* 0xa9 */ 0x00ae, /* REGISTERED SIGN */ + /* 0xaa */ 0x00ac, /* NOT SIGN */ + /* 0xab */ 0x00bd, /* VULGAR FRACTION ONE HALF */ + /* 0xac */ 0x00bc, /* VULGAR FRACTION ONE QUARTER */ + /* 0xad */ 0x00a1, /* INVERTED EXCLAMATION MARK */ + /* 0xae */ 0x00ab, /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ + /* 0xaf */ 0x00bb, /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ + /* 0xb0 */ 0x2591, /* LIGHT SHADE */ + /* 0xb1 */ 0x2592, /* MEDIUM SHADE */ + /* 0xb2 */ 0x2593, /* DARK SHADE */ + /* 0xb3 */ 0x2502, /* BOX DRAWINGS LIGHT VERTICAL */ + /* 0xb4 */ 0x2524, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */ + /* 0xb5 */ 0x00c1, /* LATIN CAPITAL LETTER A WITH ACUTE */ + /* 0xb6 */ 0x00c2, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ + /* 0xb7 */ 0x00c0, /* LATIN CAPITAL LETTER A WITH GRAVE */ + /* 0xb8 */ 0x00a9, /* COPYRIGHT SIGN */ + /* 0xb9 */ 0x2563, /* BOX DRAWINGS DOUBLE VERTICAL AND LEFT */ + /* 0xba */ 0x2551, /* BOX DRAWINGS DOUBLE VERTICAL */ + /* 0xbb */ 0x2557, /* BOX DRAWINGS DOUBLE DOWN AND LEFT */ + /* 0xbc */ 0x255d, /* BOX DRAWINGS DOUBLE UP AND LEFT */ + /* 0xbd */ 0x00a2, /* CENT SIGN */ + /* 0xbe */ 0x00a5, /* YEN SIGN */ + /* 0xbf */ 0x2510, /* BOX DRAWINGS LIGHT DOWN AND LEFT */ + /* 0xc0 */ 0x2514, /* BOX DRAWINGS LIGHT UP AND RIGHT */ + /* 0xc1 */ 0x2534, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */ + /* 0xc2 */ 0x252c, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */ + /* 0xc3 */ 0x251c, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */ + /* 0xc4 */ 0x2500, /* BOX DRAWINGS LIGHT HORIZONTAL */ + /* 0xc5 */ 0x253c, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */ + /* 0xc6 */ 0x00e3, /* LATIN SMALL LETTER A WITH TILDE */ + /* 0xc7 */ 0x00c3, /* LATIN CAPITAL LETTER A WITH TILDE */ + /* 0xc8 */ 0x255a, /* BOX DRAWINGS DOUBLE UP AND RIGHT */ + /* 0xc9 */ 0x2554, /* BOX DRAWINGS DOUBLE DOWN AND RIGHT */ + /* 0xca */ 0x2569, /* BOX DRAWINGS DOUBLE UP AND HORIZONTAL */ + /* 0xcb */ 0x2566, /* BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL */ + /* 0xcc */ 0x2560, /* BOX DRAWINGS DOUBLE VERTICAL AND RIGHT */ + /* 0xcd */ 0x2550, /* BOX DRAWINGS DOUBLE HORIZONTAL */ + /* 0xce */ 0x256c, /* BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL */ + /* 0xcf */ 0x00a4, /* CURRENCY SIGN */ + /* 0xd0 */ 0x00f0, /* LATIN SMALL LETTER ETH */ + /* 0xd1 */ 0x00d0, /* LATIN CAPITAL LETTER ETH */ + /* 0xd2 */ 0x00ca, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ + /* 0xd3 */ 0x00cb, /* LATIN CAPITAL LETTER E WITH DIAERESIS */ + /* 0xd4 */ 0x00c8, /* LATIN CAPITAL LETTER E WITH GRAVE */ + /* 0xd5 */ 0x0131, /* LATIN SMALL LETTER DOTLESS I */ + /* 0xd6 */ 0x00cd, /* LATIN CAPITAL LETTER I WITH ACUTE */ + /* 0xd7 */ 0x00ce, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ + /* 0xd8 */ 0x00cf, /* LATIN CAPITAL LETTER I WITH DIAERESIS */ + /* 0xd9 */ 0x2518, /* BOX DRAWINGS LIGHT UP AND LEFT */ + /* 0xda */ 0x250c, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */ + /* 0xdb */ 0x2588, /* FULL BLOCK */ + /* 0xdc */ 0x2584, /* LOWER HALF BLOCK */ + /* 0xdd */ 0x00a6, /* BROKEN BAR */ + /* 0xde */ 0x00cc, /* LATIN CAPITAL LETTER I WITH GRAVE */ + /* 0xdf */ 0x2580, /* UPPER HALF BLOCK */ + /* 0xe0 */ 0x00d3, /* LATIN CAPITAL LETTER O WITH ACUTE */ + /* 0xe1 */ 0x00df, /* LATIN SMALL LETTER SHARP S */ + /* 0xe2 */ 0x00d4, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ + /* 0xe3 */ 0x00d2, /* LATIN CAPITAL LETTER O WITH GRAVE */ + /* 0xe4 */ 0x00f5, /* LATIN SMALL LETTER O WITH TILDE */ + /* 0xe5 */ 0x00d5, /* LATIN CAPITAL LETTER O WITH TILDE */ + /* 0xe6 */ 0x00b5, /* MICRO SIGN */ + /* 0xe7 */ 0x00fe, /* LATIN SMALL LETTER THORN */ + /* 0xe8 */ 0x00de, /* LATIN CAPITAL LETTER THORN */ + /* 0xe9 */ 0x00da, /* LATIN CAPITAL LETTER U WITH ACUTE */ + /* 0xea */ 0x00db, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ + /* 0xeb */ 0x00d9, /* LATIN CAPITAL LETTER U WITH GRAVE */ + /* 0xec */ 0x00fd, /* LATIN SMALL LETTER Y WITH ACUTE */ + /* 0xed */ 0x00dd, /* LATIN CAPITAL LETTER Y WITH ACUTE */ + /* 0xee */ 0x00af, /* MACRON */ + /* 0xef */ 0x00b4, /* ACUTE ACCENT */ + /* 0xf0 */ 0x00ad, /* SOFT HYPHEN */ + /* 0xf1 */ 0x00b1, /* PLUS-MINUS SIGN */ + /* 0xf2 */ 0x2017, /* DOUBLE LOW LINE */ + /* 0xf3 */ 0x00be, /* VULGAR FRACTION THREE QUARTERS */ + /* 0xf4 */ 0x00b6, /* PILCROW SIGN */ + /* 0xf5 */ 0x00a7, /* SECTION SIGN */ + /* 0xf6 */ 0x00f7, /* DIVISION SIGN */ + /* 0xf7 */ 0x00b8, /* CEDILLA */ + /* 0xf8 */ 0x00b0, /* DEGREE SIGN */ + /* 0xf9 */ 0x00a8, /* DIAERESIS */ + /* 0xfa */ 0x00b7, /* MIDDLE DOT */ + /* 0xfb */ 0x00b9, /* SUPERSCRIPT ONE */ + /* 0xfc */ 0x00b3, /* SUPERSCRIPT THREE */ + /* 0xfd */ 0x00b2, /* SUPERSCRIPT TWO */ + /* 0xfe */ 0x25a0, /* BLACK SQUARE */ + /* 0xff */ 0x00a0 /* NO-BREAK SPACE */ +}; + +int +main(int argc,char ** argv) +{ + unsigned char unicode_to_cp850[256]; + int i; + int c; + + memset(unicode_to_cp850,0,sizeof(unicode_to_cp850)); + + printf("const unsigned char cp850_to_unicode[256] =\n{\n"); + + for(i = 0 ; i < 256 ; i++) + { + c = cp850_to_unicode[i]; + if(c > 255) + c = 0; + + if(c != 0) + unicode_to_cp850[c] = i; + + if((i % 8) == 0) + printf("\t"); + + printf("0x%02x",c); + + if(i < 255) + printf(","); + + if(((i+1) % 8) == 0) + printf("\n"); + } + + printf("};\n\n"); + + printf("const unsigned char unicode_to_cp850[256] =\n{\n"); + + for(i = 0 ; i < 256 ; i++) + { + c = unicode_to_cp850[i]; + + if((i % 8) == 0) + printf("\t"); + + printf("0x%02x",c); + + if(i < 255) + printf(","); + + if(((i+1) % 8) == 0) + printf("\n"); + } + + printf("};\n"); + + return(0); +}