#include #include #include enum { Minbytes = 64, }; static void putc(Biobuf *b, int c) { if(c>=0) Bputc(b, c); } static void bconv(Biobuf *bin, Biobuf *bout){ int c; char b[Minbytes+1], *p, *e; b[Minbytes] = 0; e = &b[Minbytes]; for(;;){ switch(c = Bgetc(bin)){ case -1: return; default: Bputc(bout, c); break; case '/': Bputc(bout, c); switch(c = Bgetc(bin)){ default: putc(bout, c); break; case '*': do{ putc(bout, c); c = Bgetc(bin); if(c < 0) break; if(c != '*') continue; Bputc(bout, c); c = Bgetc(bin); } while(c != '/'); putc(bout, c); break; case '/': Bputc(bout, c); while((c = Bgetc(bin)) != '\n' && c>0) Bputc(bout, c); putc(bout, c); } break; case '"': Bputc(bout, c); for(;;){ c = Bgetc(bin); switch(c){ case -1: case '"': goto endstr; case '\\': Bputc(bout, c); c = Bgetc(bin); default: Bputc(bout, c); } } endstr: putc(bout, c); break; case '0': c = Bgetc(bin); if(c != 'b' && c != 'B'){ Bputc(bout, '0'); Bputc(bout, c); continue; } for(p = b; p < e && (c = Bgetc(bin)) == '0' || c == '1'; ) *p++ = c; *p = 0; Bprint(bout, "0x%ulx", strtol(b, 0, 2)); putc(bout, c); break; } } } void main(int argc, char **argv) { Biobuf b, bout, *p; int status; ARGBEGIN{ default: fprint(2, "usage: bconv [file] ...\n"); exits("usage"); }ARGEND; status = 0; Binit(&bout, 1, OWRITE); if(*argv == nil){ if(Binit(&b, 0, OREAD) == -1){ fprint(2, "stdin: %r\n"); exits("read"); } bconv(&b, &bout); Bterm(&b); exits(""); } for(; *argv; argv++) if(p = Bopen(*argv, OREAD)){ bconv(p, &bout); Bterm(p); } else{ fprint(2, "%s: %r\n", *argv); status = -1; } Bterm(&bout); if(status == -1) exits("read"); exits(""); }