Blame


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