#include #include #include #include int main (int argc, char *argv[]) { int n; char *line = NULL; size_t len = 0; if (argc == 1) { static char *new_argv[] = { NULL, (char *) "/dev/stdin", NULL }; argv = new_argv; argc = 2; } for (n = 1; n < argc; ++n) { FILE *fp = fopen (argv[n], "r"); if (fp == NULL) continue; while (! feof (fp)) { ssize_t cnt = getline (&line, &len, fp); char *runp; if (cnt <= 0) break; runp = line; do { if (runp[0] == '<' && runp[1] == 'U' && isxdigit (runp[2]) && isxdigit (runp[3]) && isxdigit (runp[4]) && isxdigit (runp[5]) && runp[6] == '>') { unsigned int val = strtoul (runp + 2, NULL, 16); //putchar ('<'); if (val < 128) putchar (val); else if (val < 0x800) { putchar (0xc0 | (val >> 6)); putchar (0x80 | (val & 0x3f)); } else { putchar (0xe0 | (val >> 12)); putchar (0x80 | ((val >> 6) & 0x3f)); putchar (0x80 | (val & 0x3f)); } //putchar ('>'); runp += 7; } else putchar (*runp++); } while (runp < &line[cnt]); } fclose (fp); } return 0; }