URI: 
       ascii.c - 9base - revived minimalist port of Plan 9 userland to Unix
  HTML git clone git://git.suckless.org/9base
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR 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 }