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 }