]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ascii.c
merge
[plan9front.git] / sys / src / cmd / ascii.c
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4
5 #define MAXBASE 36
6
7 void    usage(void);
8 void    put(int);
9 void    putn(int, int);
10 void    puttext(char *);
11 void    putnum(char *);
12 int     btoi(char *);
13 int     value(int, int);
14 int     isnum(char *);
15
16 char *str[256]={
17         "nul",  "soh",  "stx",  "etx",  "eot",  "enq",  "ack",  "bel",
18         "bs ",  "ht ",  "nl ",  "vt ",  "ff ",  "cr ",  "so ",  "si ",
19         "dle",  "dc1",  "dc2",  "dc3",  "dc4",  "nak",  "syn",  "etb",
20         "can",  "em ",  "sub",  "esc",  "fs ",  "gs ",  "rs ",  "us ",
21         "sp ",  " ! ",  " \" ", " # ",  " $ ",  " % ",  " & ",  " ' ",
22         " ( ",  " ) ",  " * ",  " + ",  " , ",  " - ",  " . ",  " / ",
23         " 0 ",  " 1 ",  " 2 ",  " 3 ",  " 4 ",  " 5 ",  " 6 ",  " 7 ",
24         " 8 ",  " 9 ",  " : ",  " ; ",  " < ",  " = ",  " > ",  " ? ",
25         " @ ",  " A ",  " B ",  " C ",  " D ",  " E ",  " F ",  " G ",
26         " H ",  " I ",  " J ",  " K ",  " L ",  " M ",  " N ",  " O ",
27         " P ",  " Q ",  " R ",  " S ",  " T ",  " U ",  " V ",  " W ",
28         " X ",  " Y ",  " Z ",  " [ ",  " \\ ", " ] ",  " ^ ",  " _ ",
29         " ` ",  " a ",  " b ",  " c ",  " d ",  " e ",  " f ",  " g ",
30         " h ",  " i ",  " j ",  " k ",  " l ",  " m ",  " n ",  " o ",
31         " p ",  " q ",  " r ",  " s ",  " t ",  " u ",  " v ",  " w ",
32         " x ",  " y ",  " z ",  " { ",  " | ",  " } ",  " ~ ",  "del",
33         "x80",  "x81",  "x82",  "x83",  "x84",  "x85",  "x86",  "x87",
34         "x88",  "x89",  "x8a",  "x8b",  "x8c",  "x8d",  "x8e",  "x8f",
35         "x90",  "x91",  "x92",  "x93",  "x94",  "x95",  "x96",  "x97",
36         "x98",  "x99",  "x9a",  "x9b",  "x9c",  "x9d",  "x9e",  "x9f",
37         "xa0",  " ¡ ", " ¢ ", " £ ", " ¤ ", " ¥ ", " ¦ ", " § ",
38         " ¨ ", " © ", " ª ", " « ", " ¬ ", " ­ ", " ® ", " ¯ ",
39         " ° ", " ± ", " ² ", " ³ ", " ´ ", " µ ", " ¶ ", " · ",
40         " ¸ ", " ¹ ", " º ", " » ", " ¼ ", " ½ ", " ¾ ", " ¿ ",
41         " À ", " Á ", " Â ", " Ã ", " Ä ", " Å ", " Æ ", " Ç ",
42         " È ", " É ", " Ê ", " Ë ", " Ì ", " Í ", " Î ", " Ï ",
43         " Ð ", " Ñ ", " Ò ", " Ó ", " Ô ", " Õ ", " Ö ", " × ",
44         " Ø ", " Ù ", " Ú ", " Û ", " Ü ", " Ý ", " Þ ", " ß ",
45         " à ", " á ", " â ", " ã ", " ä ", " å ", " æ ", " ç ",
46         " è ", " é ", " ê ", " ë ", " ì ", " í ", " î ", " ï ",
47         " ð ", " ñ ", " ò ", " ó ", " ô ", " õ ", " ö ", " ÷ ",
48         " ø ", " ù ", " ú ", " û ", " ü ", " ý ", " þ ", " ÿ "
49 };
50
51 char Ncol[]={
52     0,0,7,5,4,4,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
53 };
54
55 int     nchars=128;
56 int     base=16;
57 int     ncol;
58 int     text=1;
59 int     strip=0;
60 Biobuf  bin;
61
62 void
63 main(int argc, char **argv)
64 {
65         int i;
66
67         Binit(&bin, 1, OWRITE);
68         ARGBEGIN{
69         case '8':
70                 nchars=256; break;
71         case 'x':
72                 base=16; break;
73         case 'o':
74                 base=8; break;
75         case 'd':
76                 base=10; break;
77         case 'b':
78                 base=strtoul(EARGF(usage()), 0, 0);
79                 if(base<2||base>MAXBASE)
80                         usage();
81                 break;
82         case 'n':
83                 text=0; break;
84         case 't':
85                 strip=1;
86                 /* fall through */
87         case 'c':
88                 text=2; break;
89         default:
90                 usage();
91         }ARGEND
92
93         ncol=Ncol[base];
94         if(argc==0){
95                 for(i=0;i<nchars;i++){
96                         put(i);
97                         if((i&7)==7)
98                                 Bprint(&bin, "|\n");
99                 }
100         }else{
101                 if(text==1)
102                         text=isnum(argv[0]);
103                 while(argc--)
104                         if(text)
105                                 puttext(*argv++);
106                         else
107                                 putnum(*argv++);
108         }
109         Bputc(&bin, '\n');
110         exits(0);
111 }
112 void
113 usage(void)
114 {
115         fprint(2, "usage: %s [-8cnt] [-dox | -b n] [text]\n", argv0);
116         exits("usage");
117 }
118 void
119 put(int i)
120 {
121         Bputc(&bin, '|');
122         putn(i, ncol);
123         Bprint(&bin, " %s", str[i]);
124 }
125 char dig[]="0123456789abcdefghijklmnopqrstuvwxyz";
126 void
127 putn(int n, int ndig)
128 {
129         if(ndig==0)
130                 return;
131         putn(n/base, ndig-1);
132         Bputc(&bin, dig[n%base]);
133 }
134 void
135 puttext(char *s)
136 {
137         int n;
138         n=btoi(s)&0377;
139         if(strip)
140                 Bputc(&bin, n);
141         else
142                 Bprint(&bin, "%s\n", str[n]);
143 }
144 void
145 putnum(char *s)
146 {
147         while(*s){
148                 putn(*s++&0377, ncol);
149                 Bputc(&bin, '\n');
150         }
151 }
152 int
153 btoi(char *s)
154 {
155         int n;
156         n=0;
157         while(*s)
158                 n=n*base+value(*s++, 0);
159         return(n);
160 }
161 int
162 value(int c, int f)
163 {
164         char *s;
165         for(s=dig; s<dig+base; s++)
166                 if(*s==c)
167                         return(s-dig);
168         if(f)
169                 return(-1);
170         fprint(2, "%s: bad input char %c\n", argv0, c);
171         exits("bad");
172         return 0;       /* to keep ken happy */
173 }
174 int
175 isnum(char *s)
176 {
177         while(*s)
178                 if(value(*s++, 1)==-1)
179                         return(0);
180         return(1);
181 }