#include #include #include int nibble(int c){ if(c >= '0' && c <= '9') return c - '0'; if(c >= 'a' && c <= 'f') return c + 10 - 'a'; if(c >= 'A' && c <= 'F') return c + 10 - 'A'; return -1; } void main(int argc, char **argv){ Biobuf *in, *out; int c, line; char *file; switch(argc){ default: sysfatal("usage: %s [file]", argv[0]); case 1: file = ""; in = Bfdopen(0, OREAD); break; case 2: file = argv[1]; in = Bopen(file, OREAD); break; } out = Bfdopen(1, OWRITE); if(in == nil || out == nil) sysfatal("Bopen: %r"); line = 1; while(9){ c = Bgetc(in); if(c == ' ' || c == '\t') continue; if(c == '#') do c = Bgetc(in); while(c >= 0 && c != '\n'); if(c == '\n'){ line++; continue; } if(c < 0){ Bterm(in); Bterm(out); exits(nil); } c = nibble(c) << 4 | nibble(Bgetc(in)); if(c < 0) sysfatal("bad input: %s:%d", file, line); Bputc(out, c); } }