xref: /plan9/sys/src/cmd/ascii.c (revision 4aeffbf5869a066cad266dfda04e87c99bacbc21)
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 ",	"np ",	"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
main(int argc,char ** argv)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
usage(void)113 usage(void)
114 {
115 	fprint(2, "usage: %s [-8cnt] [-dox | -b n] [text]\n", argv0);
116 	exits("usage");
117 }
118 void
put(int i)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
putn(int n,int ndig)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
puttext(char * s)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
putnum(char * s)145 putnum(char *s)
146 {
147 	while(*s){
148 		putn(*s++&0377, ncol);
149 		Bputc(&bin, '\n');
150 	}
151 }
152 int
btoi(char * s)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
value(int c,int f)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
isnum(char * s)175 isnum(char *s)
176 {
177 	while(*s)
178 		if(value(*s++, 1)==-1)
179 			return(0);
180 	return(1);
181 }
182