diff options
Diffstat (limited to 'wtable.c')
-rw-r--r-- | wtable.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/wtable.c b/wtable.c new file mode 100644 index 0000000..3c008b3 --- /dev/null +++ b/wtable.c @@ -0,0 +1,140 @@ +/* ref: +https://stackoverflow.com/questions/21737906/how-to-read-write-utf8-text-files-in-c +*/ + +#include <stdio.h> +#include <wchar.h> +#include "wtable.h" + +/* +#define WSEARCH_DEBUG +*/ + +wint_t wchar2ata[][2] = { + /* Unicode, ATASCII */ + { 0x2190, 0x1e }, + { 0x2191, 0x1c }, + { 0x2192, 0x1f }, + { 0x2193, 0x1d }, + { 0x21b0, 0x7d }, + { 0x241b, 0x1b }, + { 0x2501, 0x12 }, + { 0x2503, 0x02 }, + { 0x250f, 0x11 }, + { 0x2513, 0x05 }, + { 0x2517, 0x1a }, + { 0x251b, 0x03 }, + { 0x2523, 0x01 }, + { 0x252b, 0x04 }, + { 0x2533, 0x17 }, + { 0x253b, 0x18 }, + { 0x254b, 0x13 }, + { 0x2571, 0x06 }, + { 0x2572, 0x07 }, + { 0x2581, 0x0e }, + { 0x2584, 0x15 }, + { 0x258c, 0x19 }, + { 0x258e, 0x16 }, + { 0x2594, 0x0d }, + { 0x2596, 0x0f }, + { 0x2597, 0x09 }, + { 0x2598, 0x0c }, + { 0x259d, 0x0b }, + { 0x25b6, 0x7f }, + { 0x25c0, 0x7e }, + { 0x25c6, 0x60 }, + { 0x25cf, 0x14 }, + { 0x25e2, 0x08 }, + { 0x25e3, 0x0a }, + { 0x2660, 0x7b }, + { 0x2663, 0x10 }, + { 0x2665, 0x00 }, +}; + +wint_t wchar2ics[][2] = { + /* Unicode, ATASCII */ + { 0x00a1, 0x60 }, + { 0x00a3, 0x08 }, + { 0x00c4, 0x7b }, + { 0x00c9, 0x03 }, + { 0x00d1, 0x02 }, + { 0x00d6, 0x0c }, + { 0x00dc, 0x10 }, + { 0x00e0, 0x19 }, + { 0x00e1, 0x00 }, + { 0x00e2, 0x11 }, + { 0x00e4, 0x0b }, + { 0x00e7, 0x04 }, + { 0x00e8, 0x15 }, + { 0x00e9, 0x14 }, + { 0x00ea, 0x17 }, + { 0x00ec, 0x07 }, + { 0x00ee, 0x13 }, + { 0x00ef, 0x09 }, + { 0x00f1, 0x16 }, + { 0x00f2, 0x06 }, + { 0x00f3, 0x0e }, + { 0x00f4, 0x05 }, + { 0x00f6, 0x0f }, + { 0x00f9, 0x01 }, + { 0x00fa, 0x0d }, + { 0x00fb, 0x12 }, + { 0x00fc, 0x0a }, + { 0x0226, 0x1a }, + { 0x0227, 0x18 }, + { 0x2190, 0x1e }, + { 0x2191, 0x1c }, + { 0x2192, 0x1f }, + { 0x2193, 0x1d }, + { 0x21b0, 0x7d }, + { 0x241b, 0x1b }, + { 0x25b6, 0x7f }, + { 0x25c0, 0x7e }, +}; + +static int tblsize = sizeof(wchar2ata) / sizeof(wchar2ata[0]); + +static wint_t wsearch(wint_t table[][2], wint_t target, int start, int end) { + wint_t *elem; + int center; + +#ifdef WSEARCH_DEBUG + fprintf(stderr, "wsearch(0x%04x, %d, %d)\n", target, start, end); +#endif + + if(start == end) { + if(table[start][0] == target) + return table[start][1]; + else + return -1; + } else { + center = (start + end) / 2; + elem = table[center]; + +#ifdef WSEARCH_DEBUG + fprintf(stderr, "elem = 0x%04x, 0x%02x\n", elem[0], elem[1]); +#endif + + if(elem[0] == target) + return elem[1]; + else if(elem[0] > target) + return wsearch(table, target, start, center); + else + return wsearch(table, target, center + 1, end); + } +} + +int wchar2atascii(wint_t wc, int ics) { + return wsearch((ics ? wchar2ics : wchar2ata), wc, 0, tblsize - 1); +} + +#ifdef WSEARCH_DEBUG +int main(int argc, char **argv) { + printf("%02x\n", wchar2atascii(0x2190, 0)); + printf("%02x\n", wchar2atascii(0x2571, 0)); + printf("%02x\n", wchar2atascii(0x25c6, 0)); + printf("%02x\n", wchar2atascii(0x2665, 0)); + printf("%02x\n", wchar2atascii(0x2510, 0)); + return 0; +} +#endif |