xref: /plan9/sys/src/cmd/ascii.c (revision 4aeffbf5869a066cad266dfda04e87c99bacbc21)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier #include <bio.h>
43e12c5d1SDavid du Colombier 
53e12c5d1SDavid du Colombier #define	MAXBASE	36
63e12c5d1SDavid du Colombier 
73e12c5d1SDavid du Colombier void	usage(void);
83e12c5d1SDavid du Colombier void	put(int);
93e12c5d1SDavid du Colombier void	putn(int, int);
103e12c5d1SDavid du Colombier void	puttext(char *);
113e12c5d1SDavid du Colombier void	putnum(char *);
123e12c5d1SDavid du Colombier int	btoi(char *);
133e12c5d1SDavid du Colombier int	value(int, int);
143e12c5d1SDavid du Colombier int	isnum(char *);
153e12c5d1SDavid du Colombier 
163e12c5d1SDavid du Colombier char *str[256]={
173e12c5d1SDavid du Colombier 	"nul",	"soh",	"stx",	"etx",	"eot",	"enq",	"ack",	"bel",
183e12c5d1SDavid du Colombier 	"bs ",	"ht ",	"nl ",	"vt ",	"np ",	"cr ",	"so ",	"si ",
193e12c5d1SDavid du Colombier 	"dle",	"dc1",	"dc2",	"dc3",	"dc4",	"nak",	"syn",	"etb",
203e12c5d1SDavid du Colombier 	"can",	"em ",	"sub",	"esc",	"fs ",	"gs ",	"rs ",	"us ",
213e12c5d1SDavid du Colombier 	"sp ",	" ! ",	" \" ",	" # ",	" $ ",	" % ",	" & ",	" ' ",
223e12c5d1SDavid du Colombier 	" ( ",	" ) ",	" * ",	" + ",	" , ",	" - ",	" . ",	" / ",
233e12c5d1SDavid du Colombier 	" 0 ",	" 1 ",	" 2 ",	" 3 ",	" 4 ",	" 5 ",	" 6 ",	" 7 ",
243e12c5d1SDavid du Colombier 	" 8 ",	" 9 ",	" : ",	" ; ",	" < ",	" = ",	" > ",	" ? ",
253e12c5d1SDavid du Colombier 	" @ ",	" A ",	" B ",	" C ",	" D ",	" E ",	" F ",	" G ",
263e12c5d1SDavid du Colombier 	" H ",	" I ",	" J ",	" K ",	" L ",	" M ",	" N ",	" O ",
273e12c5d1SDavid du Colombier 	" P ",	" Q ",	" R ",	" S ",	" T ",	" U ",	" V ",	" W ",
283e12c5d1SDavid du Colombier 	" X ",	" Y ",	" Z ",	" [ ",	" \\ ",	" ] ",	" ^ ",	" _ ",
293e12c5d1SDavid du Colombier 	" ` ",	" a ",	" b ",	" c ",	" d ",	" e ",	" f ",	" g ",
303e12c5d1SDavid du Colombier 	" h ",	" i ",	" j ",	" k ",	" l ",	" m ",	" n ",	" o ",
313e12c5d1SDavid du Colombier 	" p ",	" q ",	" r ",	" s ",	" t ",	" u ",	" v ",	" w ",
323e12c5d1SDavid du Colombier 	" x ",	" y ",	" z ",	" { ",	" | ",	" } ",	" ~ ",	"del",
333e12c5d1SDavid du Colombier 	"x80",	"x81",	"x82",	"x83",	"x84",	"x85",	"x86",	"x87",
343e12c5d1SDavid du Colombier 	"x88",	"x89",	"x8a",	"x8b",	"x8c",	"x8d",	"x8e",	"x8f",
353e12c5d1SDavid du Colombier 	"x90",	"x91",	"x92",	"x93",	"x94",	"x95",	"x96",	"x97",
363e12c5d1SDavid du Colombier 	"x98",	"x99",	"x9a",	"x9b",	"x9c",	"x9d",	"x9e",	"x9f",
373e12c5d1SDavid du Colombier 	"xa0",	" ¡ ",	" ¢ ",	" £ ",	" ¤ ",	" ¥ ",	" ¦ ",	" § ",
383e12c5d1SDavid du Colombier 	" ¨ ",	" © ",	" ª ",	" « ",	" ¬ ",	" ­ ",	" ® ",	" ¯ ",
393e12c5d1SDavid du Colombier 	" ° ",	" ± ",	" ² ",	" ³ ",	" ´ ",	" µ ",	" ¶ ",	" · ",
403e12c5d1SDavid du Colombier 	" ¸ ",	" ¹ ",	" º ",	" » ",	" ¼ ",	" ½ ",	" ¾ ",	" ¿ ",
413e12c5d1SDavid du Colombier 	" À ",	" Á ",	" Â ",	" Ã ",	" Ä ",	" Å ",	" Æ ",	" Ç ",
423e12c5d1SDavid du Colombier 	" È ",	" É ",	" Ê ",	" Ë ",	" Ì ",	" Í ",	" Î ",	" Ï ",
433e12c5d1SDavid du Colombier 	" Ð ",	" Ñ ",	" Ò ",	" Ó ",	" Ô ",	" Õ ",	" Ö ",	" × ",
443e12c5d1SDavid du Colombier 	" Ø ",	" Ù ",	" Ú ",	" Û ",	" Ü ",	" Ý ",	" Þ ",	" ß ",
453e12c5d1SDavid du Colombier 	" à ",	" á ",	" â ",	" ã ",	" ä ",	" å ",	" æ ",	" ç ",
463e12c5d1SDavid du Colombier 	" è ",	" é ",	" ê ",	" ë ",	" ì ",	" í ",	" î ",	" ï ",
473e12c5d1SDavid du Colombier 	" ð ",	" ñ ",	" ò ",	" ó ",	" ô ",	" õ ",	" ö ",	" ÷ ",
483e12c5d1SDavid du Colombier 	" ø ",	" ù ",	" ú ",	" û ",	" ü ",	" ý ",	" þ ",	" ÿ "
493e12c5d1SDavid du Colombier };
503e12c5d1SDavid du Colombier 
513e12c5d1SDavid du Colombier char Ncol[]={
523e12c5d1SDavid du Colombier     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,
533e12c5d1SDavid du Colombier };
543e12c5d1SDavid du Colombier 
553e12c5d1SDavid du Colombier int 	nchars=128;
563e12c5d1SDavid du Colombier int 	base=16;
573e12c5d1SDavid du Colombier int 	ncol;
583e12c5d1SDavid du Colombier int 	text=1;
593e12c5d1SDavid du Colombier int	strip=0;
603e12c5d1SDavid du Colombier Biobuf	bin;
613e12c5d1SDavid du Colombier 
623e12c5d1SDavid du Colombier void
main(int argc,char ** argv)633e12c5d1SDavid du Colombier main(int argc, char **argv)
643e12c5d1SDavid du Colombier {
653e12c5d1SDavid du Colombier 	int i;
663e12c5d1SDavid du Colombier 
673e12c5d1SDavid du Colombier 	Binit(&bin, 1, OWRITE);
683e12c5d1SDavid du Colombier 	ARGBEGIN{
693e12c5d1SDavid du Colombier 	case '8':
703e12c5d1SDavid du Colombier 		nchars=256; break;
713e12c5d1SDavid du Colombier 	case 'x':
723e12c5d1SDavid du Colombier 		base=16; break;
733e12c5d1SDavid du Colombier 	case 'o':
743e12c5d1SDavid du Colombier 		base=8; break;
753e12c5d1SDavid du Colombier 	case 'd':
763e12c5d1SDavid du Colombier 		base=10; break;
773e12c5d1SDavid du Colombier 	case 'b':
7859cc4ca5SDavid du Colombier 		base=strtoul(EARGF(usage()), 0, 0);
793e12c5d1SDavid du Colombier 		if(base<2||base>MAXBASE)
803e12c5d1SDavid du Colombier 			usage();
813e12c5d1SDavid du Colombier 		break;
823e12c5d1SDavid du Colombier 	case 'n':
833e12c5d1SDavid du Colombier 		text=0; break;
843e12c5d1SDavid du Colombier 	case 't':
853e12c5d1SDavid du Colombier 		strip=1;
863e12c5d1SDavid du Colombier 		/* fall through */
873e12c5d1SDavid du Colombier 	case 'c':
883e12c5d1SDavid du Colombier 		text=2; break;
893e12c5d1SDavid du Colombier 	default:
903e12c5d1SDavid du Colombier 		usage();
913e12c5d1SDavid du Colombier 	}ARGEND
923e12c5d1SDavid du Colombier 
933e12c5d1SDavid du Colombier 	ncol=Ncol[base];
943e12c5d1SDavid du Colombier 	if(argc==0){
953e12c5d1SDavid du Colombier 		for(i=0;i<nchars;i++){
963e12c5d1SDavid du Colombier 			put(i);
973e12c5d1SDavid du Colombier 			if((i&7)==7)
983e12c5d1SDavid du Colombier 				Bprint(&bin, "|\n");
993e12c5d1SDavid du Colombier 		}
1003e12c5d1SDavid du Colombier 	}else{
1013e12c5d1SDavid du Colombier 		if(text==1)
1023e12c5d1SDavid du Colombier 			text=isnum(argv[0]);
1033e12c5d1SDavid du Colombier 		while(argc--)
1043e12c5d1SDavid du Colombier 			if(text)
1053e12c5d1SDavid du Colombier 				puttext(*argv++);
1063e12c5d1SDavid du Colombier 			else
1073e12c5d1SDavid du Colombier 				putnum(*argv++);
1083e12c5d1SDavid du Colombier 	}
1093e12c5d1SDavid du Colombier 	Bputc(&bin, '\n');
1103e12c5d1SDavid du Colombier 	exits(0);
1113e12c5d1SDavid du Colombier }
1123e12c5d1SDavid du Colombier void
usage(void)1133e12c5d1SDavid du Colombier usage(void)
1143e12c5d1SDavid du Colombier {
115*4aeffbf5SDavid du Colombier 	fprint(2, "usage: %s [-8cnt] [-dox | -b n] [text]\n", argv0);
1163e12c5d1SDavid du Colombier 	exits("usage");
1173e12c5d1SDavid du Colombier }
1183e12c5d1SDavid du Colombier void
put(int i)1193e12c5d1SDavid du Colombier put(int i)
1203e12c5d1SDavid du Colombier {
1213e12c5d1SDavid du Colombier 	Bputc(&bin, '|');
1223e12c5d1SDavid du Colombier 	putn(i, ncol);
1233e12c5d1SDavid du Colombier 	Bprint(&bin, " %s", str[i]);
1243e12c5d1SDavid du Colombier }
1253e12c5d1SDavid du Colombier char dig[]="0123456789abcdefghijklmnopqrstuvwxyz";
1263e12c5d1SDavid du Colombier void
putn(int n,int ndig)1273e12c5d1SDavid du Colombier putn(int n, int ndig)
1283e12c5d1SDavid du Colombier {
1293e12c5d1SDavid du Colombier 	if(ndig==0)
1303e12c5d1SDavid du Colombier 		return;
1313e12c5d1SDavid du Colombier 	putn(n/base, ndig-1);
1323e12c5d1SDavid du Colombier 	Bputc(&bin, dig[n%base]);
1333e12c5d1SDavid du Colombier }
1343e12c5d1SDavid du Colombier void
puttext(char * s)1353e12c5d1SDavid du Colombier puttext(char *s)
1363e12c5d1SDavid du Colombier {
1373e12c5d1SDavid du Colombier 	int n;
1383e12c5d1SDavid du Colombier 	n=btoi(s)&0377;
1393e12c5d1SDavid du Colombier 	if(strip)
1403e12c5d1SDavid du Colombier 		Bputc(&bin, n);
1413e12c5d1SDavid du Colombier 	else
1423e12c5d1SDavid du Colombier 		Bprint(&bin, "%s\n", str[n]);
1433e12c5d1SDavid du Colombier }
1443e12c5d1SDavid du Colombier void
putnum(char * s)1453e12c5d1SDavid du Colombier putnum(char *s)
1463e12c5d1SDavid du Colombier {
1473e12c5d1SDavid du Colombier 	while(*s){
1483e12c5d1SDavid du Colombier 		putn(*s++&0377, ncol);
1493e12c5d1SDavid du Colombier 		Bputc(&bin, '\n');
1503e12c5d1SDavid du Colombier 	}
1513e12c5d1SDavid du Colombier }
1523e12c5d1SDavid du Colombier int
btoi(char * s)1533e12c5d1SDavid du Colombier btoi(char *s)
1543e12c5d1SDavid du Colombier {
1553e12c5d1SDavid du Colombier 	int n;
1563e12c5d1SDavid du Colombier 	n=0;
1573e12c5d1SDavid du Colombier 	while(*s)
1583e12c5d1SDavid du Colombier 		n=n*base+value(*s++, 0);
1593e12c5d1SDavid du Colombier 	return(n);
1603e12c5d1SDavid du Colombier }
1613e12c5d1SDavid du Colombier int
value(int c,int f)1623e12c5d1SDavid du Colombier value(int c, int f)
1633e12c5d1SDavid du Colombier {
1643e12c5d1SDavid du Colombier 	char *s;
1653e12c5d1SDavid du Colombier 	for(s=dig; s<dig+base; s++)
1663e12c5d1SDavid du Colombier 		if(*s==c)
1673e12c5d1SDavid du Colombier 			return(s-dig);
1683e12c5d1SDavid du Colombier 	if(f)
1693e12c5d1SDavid du Colombier 		return(-1);
1703e12c5d1SDavid du Colombier 	fprint(2, "%s: bad input char %c\n", argv0, c);
1713e12c5d1SDavid du Colombier 	exits("bad");
1723e12c5d1SDavid du Colombier 	return 0;	/* to keep ken happy */
1733e12c5d1SDavid du Colombier }
1743e12c5d1SDavid du Colombier int
isnum(char * s)1753e12c5d1SDavid du Colombier isnum(char *s)
1763e12c5d1SDavid du Colombier {
1773e12c5d1SDavid du Colombier 	while(*s)
1783e12c5d1SDavid du Colombier 		if(value(*s++, 1)==-1)
1793e12c5d1SDavid du Colombier 			return(0);
1803e12c5d1SDavid du Colombier 	return(1);
1813e12c5d1SDavid du Colombier }
182