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