--- /dev/null
+/*
+ * Convert a 3270cg font file to Unicode.
+ *
+ * Reference:
+ * - https://x3270.miraheze.org/wiki/3270cg_encoding
+ * - https://en.wikipedia.org/wiki/Digital_encoding_of_APL_symbols
+ *
+ * MMondor 2023
+ */
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+
+#define LBUFSIZE 255
+
+int main(void);
+
+
+static const uint32_t cg_ucs4[544] = {
+
+ /* 3270gc EBCDIC (0x0000 -> 0-255) */
+ 0x0000, 0x0020, 0x20AC, 3, 4, 5, 0x25CF, 0x00AD, 0x003E, 0x003C, 0x005B, 0x005D, 0x0029, 0x0028, 0x007D, 0x007B,
+ 0x0020, 0x003D, 0x0027, 0x0022, 0x002F, 0x005F, 0x007C, 0x00A6, 0x003F, 0x0021, 0x0024, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x00A4,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x00DF, 0x00A7, 0x0023, 0x0040, 0x0025, 0x005F,
+ 0x0026, 0x002D, 0x002E, 0x002C, 0x003A, 0x002B, 0x00AC, 0x00AF, 0x00B0, 0x00B7, 0x005E, 0x007E, 0x00A8, 0x0060, 0x00B4, 0x25A0,
+ 0x00E0, 0x00E8, 0x00EC, 0x00F2, 0x00F9, 0x00E3, 0x00F5, 0x00FF, 0x00DD, 0x00FD, 0x00E9, 0x00BC, 0x00DB, 0x00BE, 0x00FC, 0x00E7,
+ 0x00E4, 0x00EB, 0x00EF, 0x00F6, 0x00B5, 0x00E2, 0x00EA, 0x00EE, 0x00F4, 0x00FB, 0x00E1, 0x00D7, 0x00ED, 0x00F3, 0x00FA, 0x00F1,
+ 0x00C0, 0x00C8, 0x00CC, 0x00D2, 0x00D9, 0x00C3, 0x00D5, 0x00B9, 0x00B2, 0x00B3, 0x00AA, 0x00BA, 0x00AB, 0x00BB, 0x00A1, 0x00BF,
+ 0x00C4, 0x00CB, 0x00CF, 0x00D6, 0x00DC, 0x00C2, 0x00CA, 0x00CE, 0x00D4, 0x00DB, 0x00C1, 0x00C9, 0x00CD, 0x00D3, 0x00DA, 0x00D1,
+ 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070,
+ 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x00E6, 0x00F8, 0x00E5, 0x00F7, 0xF8FE, 0xFEFF,
+ 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, 0x0050,
+ 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x00C6, 0x00D8, 0x00C5, 0x00C7, 0x003B, 0x002A,
+ 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
+ 0x00A9, 0x00AE, 210, 211, 212, 213, 0x00B1, 0x00D0, 0x2192, 0x00DE, 218, 219, 220, 221, 222, 0x25AE,
+ 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 0x00F0, 0x2190, 0x00Fe, 250, 251, 252, 253, 254, 255,
+
+ /* CP310 and APL (0x0100 -> 256-511) */
+ 256, 0x1D434, 258, 259, 260, 261, 262, 0x2372, 264, 265, 0x2207, 0x2206, 268, 269, 0x007D, 0x007B,
+ 0x0020, 273, 274, 275, 276, 0x2261, 278, 279, 280, 281, 282, 283, 0x03B5, 0x03B9, 0x00D7, 0x2190,
+ 0x2070, 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x2075, 0x2076, 0x2077, 0x2078, 0x2079, 0x1E5E, 299, 300, 301, 302, 303,
+ 304, 305, 306, 307, 308, 309, 310, 0x22A4, 0x2395, 0x2374, 0x237A, 0x00B0, 0x005D, 317, 0x2260, 0x25CB,
+ 0x1E0E, 0x1D440, 0x1D444, 0x233D, 0x234B, 0x1D439, 0x2449, 0x235D, 0x005B, 0x2308, 0x1D43D, 0x2216, 0x00F7, 333, 0x2352, 0x1D43B,
+ 0x1D436, 0x1E3A, 0x1D443, 0x2337, 0x203E, 0x1E06, 0x1E34, 0x1D442, 0x2371, 0x01C3, 0x1D438, 0x2223, 0x1E48, 0x2342, 0x2353, 0x1D43C,
+ 0x1D448, 0x2378, 0x2228, 0x2296, 0x235F, 0x1D44A, 0x2355, 0x2336, 0x233F, 361, 0x2283, 0x2282, 0x2191, 0x2193, 0x2229, 0x222A,
+ 0x1E6E, 0x233B, 0x22A3, 0x2235, 0x2359, 0x1D446, 0x00A8, 0x22A2, 0x233F, 0x236B, 0x1D449, 0x2227, 0x2377, 0x2339, 0x234E, 0x1E94,
+ 0x2551, 0x2550, 0x23B8, 0x23B9, 0x23A5, 389, 390, 391, 392, 0x258C, 0x2590, 0x2580, 0x2584, 0x25A0, 398, 399,
+ 400, 401, 0x2500, 0x2022, 0x2099, 405, 406, 407, 408, 409, 0x2311, 0x22C4, 0x1D43A, 0x2081, 414, 415,
+ 0x207D, 0x207A, 0x220E, 0x2514, 0x250C, 0x251C, 0x2534, 0x00A7, 424, 0x207E, 0x207B, 0x253C, 0x2518, 0x2510, 0x2524, 0x252C,
+ 0x00B6, 433, 0x2082, 0x2083, 0x2364, 0x2365, 0x236A, 0x20AC, 440, 441, 0x00B1, 0x007E, 0x1D44B, 0x1D44C, 446, 447,
+ 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463,
+ 0x2375, 0x2218, 466, 467, 468, 469, 0x2192, 0x22A5, 472, 0x2265, 474, 475, 476, 477, 478, 479,
+ 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495,
+ 496, 497, 498, 499, 500, 501, 502, 0x2264, 504, 0x230A, 506, 507, 508, 508, 510, 511,
+
+ /* Graphics characters (0x0200 -> 512-543) */
+ 0x2590, 0x25cf, 0x2591, 0x2409, 0x240c, 0x240d, 0x240a, 0x00b0, 0x00b1, 0x2424, 0x2409, 0x2518, 0x2510, 0x250c, 0x2514, 0x253c,
+ 0x23ba, 0x23bb, 0x2500, 0x23bc, 0x23bd, 0x251c, 0x2524, 0x2534, 0x252c, 0x2502, 0x2264, 0x2265, 0x03c0, 0x2260, 0x00a3, 0x2022
+};
+
+
+int
+main(void)
+{
+ char buf[LBUFSIZE];
+
+ while (fgets(buf, LBUFSIZE - 1, stdin) != NULL) {
+ int n;
+
+ if ((n = atoi(buf)) != 0 && n < 545)
+ (void)printf("%d\n", (int)cg_ucs4[n]);
+ else
+ (void)fwrite(buf, 1, strlen(buf), stdout);
+ }
+
+ exit(EXIT_SUCCESS);
+}