]>
Commit | Line | Data |
---|---|---|
7475d016 UD |
1 | #include <ctype.h> |
2 | #include <stdio.h> | |
3 | #include <stdlib.h> | |
4 | #include <sys/types.h> | |
5 | ||
6 | int | |
7 | main (int argc, char *argv[]) | |
8 | { | |
9 | int n; | |
10 | char *line = NULL; | |
11 | size_t len = 0; | |
12 | ||
c9eb73d9 UD |
13 | if (argc == 1) |
14 | { | |
15 | static char *new_argv[] = { NULL, (char *) "/dev/stdin", NULL }; | |
16 | argv = new_argv; | |
17 | argc = 2; | |
18 | } | |
19 | ||
7475d016 UD |
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 | ||
8da2915d | 42 | //putchar ('<'); |
7475d016 UD |
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 | } | |
8da2915d | 56 | //putchar ('>'); |
7475d016 UD |
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 | } |