#include #include #include #include int main(int argc, char **argv) { FILE *fp = 0; unsigned char bb = 0, *b = 0; int nb = 0, mb = 0; char str[500]; if (argc!=3) { fprintf(stderr, "Usage: %s \n", argv[0]); return 2; } assert(argc>2); fprintf(stderr, "will read %s, write %s\n", argv[1], argv[2]); sprintf(str, "gzip -c -d %s", argv[1]); fp = popen(str, "r"); assert(fp!=0); while (fgets(str, sizeof(str), fp)) { char *p = 0, *q = 0; for (p = str; *p;) { while (*p && !isdigit(*p)) p++; /* skip non-digits */ if (!*p) break; /* no digit found? */ q = p+1; while (*q && isdigit(*q)) q++; /* skip to first non-digit */ *q = 0; /* terminate string w/null */ if (nb>=mb) { /* no room left in array? */ mb = mb>0 ? 2*mb : 1; /* double size of array */ b = (char *) realloc(b, mb); assert(b!=0); } b[nb++] = atoi(p); /* append byte to array */ p = q+1; } } fclose(fp); fprintf(stderr, "read %d bytes from %s\n", nb, argv[1]); fp = fopen(argv[2], "wb"); assert(fp!=0); bb = nb>>24 & 0xff; assert(1==fwrite(&bb, 1, 1, fp)); bb = nb>>16 & 0xff; assert(1==fwrite(&bb, 1, 1, fp)); bb = nb>>8 & 0xff; assert(1==fwrite(&bb, 1, 1, fp)); bb = nb>>0 & 0xff; assert(1==fwrite(&bb, 1, 1, fp)); assert(1==fwrite(b, nb, 1, fp)); fclose(fp); free(b); fprintf(stderr, "wrote 4+%d bytes to %s\n", nb, argv[2]); return 0; }