ascii.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #define MAXBASE 36
  5. void usage(void);
  6. void put(int);
  7. void putn(int, int);
  8. void puttext(char *);
  9. void putnum(char *);
  10. int btoi(char *);
  11. int value(int, int);
  12. int isnum(char *);
  13. char *str[256]={
  14. "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
  15. "bs ", "ht ", "nl ", "vt ", "np ", "cr ", "so ", "si ",
  16. "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
  17. "can", "em ", "sub", "esc", "fs ", "gs ", "rs ", "us ",
  18. "sp ", " ! ", " \" ", " # ", " $ ", " % ", " & ", " ' ",
  19. " ( ", " ) ", " * ", " + ", " , ", " - ", " . ", " / ",
  20. " 0 ", " 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ",
  21. " 8 ", " 9 ", " : ", " ; ", " < ", " = ", " > ", " ? ",
  22. " @ ", " A ", " B ", " C ", " D ", " E ", " F ", " G ",
  23. " H ", " I ", " J ", " K ", " L ", " M ", " N ", " O ",
  24. " P ", " Q ", " R ", " S ", " T ", " U ", " V ", " W ",
  25. " X ", " Y ", " Z ", " [ ", " \\ ", " ] ", " ^ ", " _ ",
  26. " ` ", " a ", " b ", " c ", " d ", " e ", " f ", " g ",
  27. " h ", " i ", " j ", " k ", " l ", " m ", " n ", " o ",
  28. " p ", " q ", " r ", " s ", " t ", " u ", " v ", " w ",
  29. " x ", " y ", " z ", " { ", " | ", " } ", " ~ ", "del",
  30. "x80", "x81", "x82", "x83", "x84", "x85", "x86", "x87",
  31. "x88", "x89", "x8a", "x8b", "x8c", "x8d", "x8e", "x8f",
  32. "x90", "x91", "x92", "x93", "x94", "x95", "x96", "x97",
  33. "x98", "x99", "x9a", "x9b", "x9c", "x9d", "x9e", "x9f",
  34. "xa0", " ¡ ", " ¢ ", " £ ", " ¤ ", " ¥ ", " ¦ ", " § ",
  35. " ¨ ", " © ", " ª ", " « ", " ¬ ", " ­ ", " ® ", " ¯ ",
  36. " ° ", " ± ", " ² ", " ³ ", " ´ ", " µ ", " ¶ ", " · ",
  37. " ¸ ", " ¹ ", " º ", " » ", " ¼ ", " ½ ", " ¾ ", " ¿ ",
  38. " À ", " Á ", " Â ", " Ã ", " Ä ", " Å ", " Æ ", " Ç ",
  39. " È ", " É ", " Ê ", " Ë ", " Ì ", " Í ", " Î ", " Ï ",
  40. " Ð ", " Ñ ", " Ò ", " Ó ", " Ô ", " Õ ", " Ö ", " × ",
  41. " Ø ", " Ù ", " Ú ", " Û ", " Ü ", " Ý ", " Þ ", " ß ",
  42. " à ", " á ", " â ", " ã ", " ä ", " å ", " æ ", " ç ",
  43. " è ", " é ", " ê ", " ë ", " ì ", " í ", " î ", " ï ",
  44. " ð ", " ñ ", " ò ", " ó ", " ô ", " õ ", " ö ", " ÷ ",
  45. " ø ", " ù ", " ú ", " û ", " ü ", " ý ", " þ ", " ÿ "
  46. };
  47. char Ncol[]={
  48. 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,
  49. };
  50. int nchars=128;
  51. int base=16;
  52. int ncol;
  53. int text=1;
  54. int strip=0;
  55. Biobuf bin;
  56. void
  57. main(int argc, char **argv)
  58. {
  59. int i;
  60. Binit(&bin, 1, OWRITE);
  61. ARGBEGIN{
  62. case '8':
  63. nchars=256; break;
  64. case 'x':
  65. base=16; break;
  66. case 'o':
  67. base=8; break;
  68. case 'd':
  69. base=10; break;
  70. case 'b':
  71. base=strtoul(EARGF(usage()), 0, 0);
  72. if(base<2||base>MAXBASE)
  73. usage();
  74. break;
  75. case 'n':
  76. text=0; break;
  77. case 't':
  78. strip=1;
  79. /* fall through */
  80. case 'c':
  81. text=2; break;
  82. default:
  83. usage();
  84. }ARGEND
  85. ncol=Ncol[base];
  86. if(argc==0){
  87. for(i=0;i<nchars;i++){
  88. put(i);
  89. if((i&7)==7)
  90. Bprint(&bin, "|\n");
  91. }
  92. }else{
  93. if(text==1)
  94. text=isnum(argv[0]);
  95. while(argc--)
  96. if(text)
  97. puttext(*argv++);
  98. else
  99. putnum(*argv++);
  100. }
  101. Bputc(&bin, '\n');
  102. exits(0);
  103. }
  104. void
  105. usage(void)
  106. {
  107. fprint(2, "usage: %s [-8] [-xod | -b8] [-ncst] [--] [text]\n", argv0);
  108. exits("usage");
  109. }
  110. void
  111. put(int i)
  112. {
  113. Bputc(&bin, '|');
  114. putn(i, ncol);
  115. Bprint(&bin, " %s", str[i]);
  116. }
  117. char dig[]="0123456789abcdefghijklmnopqrstuvwxyz";
  118. void
  119. putn(int n, int ndig)
  120. {
  121. if(ndig==0)
  122. return;
  123. putn(n/base, ndig-1);
  124. Bputc(&bin, dig[n%base]);
  125. }
  126. void
  127. puttext(char *s)
  128. {
  129. int n;
  130. n=btoi(s)&0377;
  131. if(strip)
  132. Bputc(&bin, n);
  133. else
  134. Bprint(&bin, "%s\n", str[n]);
  135. }
  136. void
  137. putnum(char *s)
  138. {
  139. while(*s){
  140. putn(*s++&0377, ncol);
  141. Bputc(&bin, '\n');
  142. }
  143. }
  144. int
  145. btoi(char *s)
  146. {
  147. int n;
  148. n=0;
  149. while(*s)
  150. n=n*base+value(*s++, 0);
  151. return(n);
  152. }
  153. int
  154. value(int c, int f)
  155. {
  156. char *s;
  157. for(s=dig; s<dig+base; s++)
  158. if(*s==c)
  159. return(s-dig);
  160. if(f)
  161. return(-1);
  162. fprint(2, "%s: bad input char %c\n", argv0, c);
  163. exits("bad");
  164. return 0; /* to keep ken happy */
  165. }
  166. int
  167. isnum(char *s)
  168. {
  169. while(*s)
  170. if(value(*s++, 1)==-1)
  171. return(0);
  172. return(1);
  173. }