| #include <ctype.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <sys/types.h> |
| |
| 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; |
| } |