9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

ascii.c (3989B)


      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
     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 [-8] [-xod | -b8] [-ncst] [--] [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 }