#include #include #include #include int main() { char buf[256]; int data, c, idx, length; unsigned char *imgbuf = NULL; char *p; c = 0; data = 0; idx = 0; length = 0; while (fgets(buf, sizeof(buf), stdin)) { if (strncmp(buf, "Bits:", 5) == 0) { for (p = buf + 5; *p && isspace(*p); p++) ; if (! *p) { fprintf(stderr, "corrupted file in Bits line\n"); return 1; } length = atoi(p); length /= 8; if (length <= 0) { fprintf(stderr, "corrupted file, detected length = %d\n", length); return 1; } imgbuf = malloc(length); if (! imgbuf) { fprintf(stderr, "cannot alloc %d bytes\n", length); return 1; } continue; } if (buf[0] != '0' && buf[1] != '1') continue; if (length <= 0) { fprintf(stderr, "corrupted file, starting without Bits line\n"); return 1; } for (p = buf; *p == '0' || *p == '1'; p++) { data |= (*p - '0') << c; c++; if (c >= 8) { imgbuf[idx] = data; data = 0; c = 0; idx++; if (idx >= length) break; } } } if (c) imgbuf[idx++] = data; if (idx != length) { fprintf(stderr, "length doesn't match: %d != %d\n", idx, length); return 1; } for (idx = 0; idx < length; idx++) putchar(imgbuf[idx]); return 0; }