| #include <string.h> | #include <string.h> | ||||
| #include <stdio.h> | #include <stdio.h> | ||||
| void fput_utf8c(FILE *out, ucd::codepoint_t c) | |||||
| { | |||||
| if (c < 0x80) | |||||
| fputc((uint8_t)c, out); | |||||
| else if (c < 0x800) | |||||
| { | |||||
| fputc(0xC0 | (c >> 6), out); | |||||
| fputc(0x80 + (c & 0x3F), out); | |||||
| } | |||||
| else if (c < 0x10000) | |||||
| { | |||||
| fputc(0xE0 | (c >> 12), out); | |||||
| fputc(0x80 + ((c >> 6) & 0x3F), out); | |||||
| fputc(0x80 + (c & 0x3F), out); | |||||
| } | |||||
| else if (c < 0x200000) | |||||
| { | |||||
| fputc(0xF0 | (c >> 18), out); | |||||
| fputc(0x80 + ((c >> 12) & 0x3F), out); | |||||
| fputc(0x80 + ((c >> 6) & 0x3F), out); | |||||
| fputc(0x80 + (c & 0x3F), out); | |||||
| } | |||||
| } | |||||
| bool fget_utf8c(FILE *in, ucd::codepoint_t &c) | bool fget_utf8c(FILE *in, ucd::codepoint_t &c) | ||||
| { | { | ||||
| int ch = EOF; | int ch = EOF; | ||||
| { | { | ||||
| switch (mode) | switch (mode) | ||||
| { | { | ||||
| case 'c': // character | |||||
| switch (c) | |||||
| { | |||||
| case '\t': fputs("\\t", out); break; | |||||
| case '\r': fputs("\\r", out); break; | |||||
| case '\n': fputs("\\n", out); break; | |||||
| default: fput_utf8c(out, c); break; | |||||
| } | |||||
| break; | |||||
| case 'h': // hexadecimal (lower) | case 'h': // hexadecimal (lower) | ||||
| fprintf(out, "%06x", c); | fprintf(out, "%06x", c); | ||||
| break; | break; | ||||
| { | { | ||||
| ucd::codepoint_t c = 0; | ucd::codepoint_t c = 0; | ||||
| while (fget_utf8c(in, c)) | while (fget_utf8c(in, c)) | ||||
| uprintf(stdout, c, "%pH %s %C %c %UH %LH %TH %W\n"); | |||||
| uprintf(stdout, c, "%pc\t%pH\t%s\t%c\t%Uc\t%Lc\t%Tc\t%W\n"); | |||||
| } | } | ||||
| int main(int argc, char **argv) | int main(int argc, char **argv) |