unicode.c - 9base - revived minimalist port of Plan 9 userland to Unix | |
git clone git://git.suckless.org/9base | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
unicode.c (1956B) | |
--- | |
1 #include <u.h> | |
2 #include <libc.h> | |
3 #include <bio.h> | |
4 | |
5 char usage[] = "unicode { [-t] hex hex ... | hexmin-hexmax ... | … | |
6 char hex[] = "0123456789abcdefABCDEF"; | |
7 int numout = 0; | |
8 int text = 0; | |
9 char *err; | |
10 Biobuf bout; | |
11 | |
12 char *range(char*[]); | |
13 char *nums(char*[]); | |
14 char *chars(char*[]); | |
15 | |
16 void | |
17 main(int argc, char *argv[]) | |
18 { | |
19 ARGBEGIN{ | |
20 case 'n': | |
21 numout = 1; | |
22 break; | |
23 case 't': | |
24 text = 1; | |
25 break; | |
26 }ARGEND | |
27 Binit(&bout, 1, OWRITE); | |
28 if(argc == 0){ | |
29 fprint(2, "usage: %s\n", usage); | |
30 exits("usage"); | |
31 } | |
32 if(!numout && utfrune(argv[0], '-')) | |
33 exits(range(argv)); | |
34 if(numout || strchr(hex, argv[0][0])==0) | |
35 exits(nums(argv)); | |
36 exits(chars(argv)); | |
37 } | |
38 | |
39 char* | |
40 range(char *argv[]) | |
41 { | |
42 char *q; | |
43 int min, max; | |
44 int i; | |
45 | |
46 while(*argv){ | |
47 q = *argv; | |
48 if(strchr(hex, q[0]) == 0){ | |
49 err: | |
50 fprint(2, "unicode: bad range %s\n", *argv); | |
51 return "bad range"; | |
52 } | |
53 min = strtoul(q, &q, 16); | |
54 if(min<0 || min>Runemax || *q!='-') | |
55 goto err; | |
56 q++; | |
57 if(strchr(hex, *q) == 0) | |
58 goto err; | |
59 max = strtoul(q, &q, 16); | |
60 if(max<0 || max>Runemax || max<min || *q!=0) | |
61 goto err; | |
62 i = 0; | |
63 do{ | |
64 Bprint(&bout, "%.4x %C", min, min); | |
65 i++; | |
66 if(min==max || (i&7)==0) | |
67 Bprint(&bout, "\n"); | |
68 else | |
69 Bprint(&bout, "\t"); | |
70 min++; | |
71 }while(min<=max); | |
72 argv++; | |
73 } | |
74 return 0; | |
75 } | |
76 | |
77 char* | |
78 nums(char *argv[]) | |
79 { | |
80 char *q; | |
81 Rune r; | |
82 int w; | |
83 | |
84 while(*argv){ | |
85 q = *argv; | |
86 while(*q){ | |
87 w = chartorune(&r, q); | |
88 if(r==0x80 && (q[0]&0xFF)!=0x80){ | |
89 fprint(2, "unicode: invalid utf string %… | |
90 return "bad utf"; | |
91 } | |
92 Bprint(&bout, "%.4x\n", r); | |
93 q += w; | |
94 } | |
95 argv++; | |
96 } | |
97 return 0; | |
98 } | |
99 | |
100 char* | |
101 chars(char *argv[]) | |
102 { | |
103 char *q; | |
104 int m; | |
105 | |
106 while(*argv){ | |
107 q = *argv; | |
108 if(strchr(hex, q[0]) == 0){ | |
109 err: | |
110 fprint(2, "unicode: bad unicode value %s\n", *ar… | |
111 return "bad char"; | |
112 } | |
113 m = strtoul(q, &q, 16); | |
114 if(m<0 || m>Runemax || *q!=0) | |
115 goto err; | |
116 Bprint(&bout, "%C", m); | |
117 if(!text) | |
118 Bprint(&bout, "\n"); | |
119 argv++; | |
120 } | |
121 return 0; | |
122 } |