1 #include <ctype.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <sys/types.h> 5 6 int main(int argc,char * argv[])7main (int argc, char *argv[]) 8 { 9 int n; 10 char *line = NULL; 11 size_t len = 0; 12 13 if (argc == 1) 14 { 15 static char *new_argv[] = { NULL, (char *) "/dev/stdin", NULL }; 16 argv = new_argv; 17 argc = 2; 18 } 19 20 for (n = 1; n < argc; ++n) 21 { 22 FILE *fp = fopen (argv[n], "r"); 23 if (fp == NULL) 24 continue; 25 26 while (! feof (fp)) 27 { 28 ssize_t cnt = getline (&line, &len, fp); 29 char *runp; 30 if (cnt <= 0) 31 break; 32 33 runp = line; 34 do 35 { 36 if (runp[0] == '<' && runp[1] == 'U' && isxdigit (runp[2]) 37 && isxdigit (runp[3]) && isxdigit (runp[4]) 38 && isxdigit (runp[5]) && runp[6] == '>') 39 { 40 unsigned int val = strtoul (runp + 2, NULL, 16); 41 42 //putchar ('<'); 43 if (val < 128) 44 putchar (val); 45 else if (val < 0x800) 46 { 47 putchar (0xc0 | (val >> 6)); 48 putchar (0x80 | (val & 0x3f)); 49 } 50 else 51 { 52 putchar (0xe0 | (val >> 12)); 53 putchar (0x80 | ((val >> 6) & 0x3f)); 54 putchar (0x80 | (val & 0x3f)); 55 } 56 //putchar ('>'); 57 runp += 7; 58 } 59 else 60 putchar (*runp++); 61 } 62 while (runp < &line[cnt]); 63 } 64 65 fclose (fp); 66 } 67 68 return 0; 69 } 70