/* bits - pipe the bits of each byte from stdin to stdout * * usage: bits [] */ #include #include #include #define BUFFER_SIZE 4096 #define IGNORE(param) do { (void)(param); } while(0) static inline int sfread(void* out, size_t *restrict size, FILE* f) { return !!(*size = (size_t)fread(out, 1, *size, f)); } static int fwrite_all(const void* buf, size_t esz, size_t num, FILE* out) { register size_t w, done=0; register size_t fsz = esz * num; const char* tbuf = (const char*)buf; while( (w = fwrite(tbuf+done, 1, fsz-done, out)) > 0 && done < fsz) done+=w; if (done!=fsz) return 0; else return 1; } static void pbits(char out[restrict 8], unsigned char byte, const char bit[static 2]) { for(register int i=8; i --> 0; byte >>= 1) *out++=((int)bit[byte & 1]); } static inline int check(int val, const char* msg) { if(val) return val; fprintf(stderr, "error: %s\n", msg); exit(1); } int main(int argc, char **argv) { IGNORE(argc); const char* mask = argv[1] && check(strlen(argv[1]) > 1, "expected 2 character mask") ? argv[1] : "01"; unsigned char buf[BUFFER_SIZE]; char tbuf[BUFFER_SIZE * 8]; size_t bsz = BUFFER_SIZE; while(sfread(buf, &bsz, stdin)) { register size_t size = bsz; while(size --> 0) pbits(tbuf+(8*size), buf[size], mask); if(!fwrite_all(tbuf, 8, bsz, stdout)) { perror("Failed to write"); return 1; } } return 0; }