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