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>
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;
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*[]);
17 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
19 bc7cb1a1 2003-11-23 devnull ARGBEGIN{
20 bc7cb1a1 2003-11-23 devnull case 'n':
21 bc7cb1a1 2003-11-23 devnull numout = 1;
23 bc7cb1a1 2003-11-23 devnull case 't':
24 bc7cb1a1 2003-11-23 devnull text = 1;
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");
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));
40 bc7cb1a1 2003-11-23 devnull range(char *argv[])
43 bc7cb1a1 2003-11-23 devnull int min, max;
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){
50 bc7cb1a1 2003-11-23 devnull fprint(2, "unicode: bad range %s\n", *argv);
51 bc7cb1a1 2003-11-23 devnull return "bad range";
53 bc7cb1a1 2003-11-23 devnull min = strtoul(q, &q, 16);
54 bc7cb1a1 2003-11-23 devnull if(min<0 || min>0xFFFF || *q!='-')
55 bc7cb1a1 2003-11-23 devnull goto err;
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 bc7cb1a1 2003-11-23 devnull if(max<0 || max>0xFFFF || max<min || *q!=0)
61 bc7cb1a1 2003-11-23 devnull goto err;
64 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%.4x %C", min, min);
66 bc7cb1a1 2003-11-23 devnull if(min==max || (i&7)==0)
67 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "\n");
69 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "\t");
71 bc7cb1a1 2003-11-23 devnull }while(min<=max);
74 bc7cb1a1 2003-11-23 devnull return 0;
78 bc7cb1a1 2003-11-23 devnull nums(char *argv[])
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";
92 bc7cb1a1 2003-11-23 devnull Bprint(&bout, "%.4x\n", r);
97 bc7cb1a1 2003-11-23 devnull return 0;
101 bc7cb1a1 2003-11-23 devnull chars(char *argv[])
103 bc7cb1a1 2003-11-23 devnull char *q;
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){
110 bc7cb1a1 2003-11-23 devnull fprint(2, "unicode: bad unicode value %s\n", *argv);
111 bc7cb1a1 2003-11-23 devnull return "bad char";
113 bc7cb1a1 2003-11-23 devnull m = strtoul(q, &q, 16);
114 bc7cb1a1 2003-11-23 devnull if(m<0 || m>0xFFFF || *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");
121 bc7cb1a1 2003-11-23 devnull return 0;