11 calculate a simple checksum
13 static unsigned sccs_checksum(const unsigned char *buf, size_t len)
23 static void *map_file(const char *fname, size_t *size)
25 int fd = open(fname, O_RDONLY);
30 p = mmap(0, st.st_size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0);
38 static int uncompress_one(const char *fname)
50 buf = map_file(fname, &size);
52 p = memmem(buf, size, "\1f e 4\n", 7);
54 p = memmem(buf, size, "\1f e 5\n", 7);
57 printf("%s not compressed (no e 4)\n", fname);
67 p = memmem(buf, size, "\1T\nx", 4);
70 printf("%s not compressed\n", fname);
74 asprintf(&tmpname, "%s.tmpz", fname);
76 f = fopen(tmpname, "w");
79 fwrite(buf, 1, len, f);
81 memset(&zs, 0, sizeof(zs));
83 zs.avail_in = size-len-2;
86 zs.avail_out = sizeof(outbuf);
88 ret = inflateInit2(&zs, -15);
90 fprintf(stderr,"inflateInit2 error %d\n", ret);
95 if (zs.avail_in == 0) break;
97 ret = inflate(&zs, Z_SYNC_FLUSH);
99 if (zs.avail_out < sizeof(outbuf)) {
100 fwrite(outbuf, 1, sizeof(outbuf) - zs.avail_out, f);
101 zs.avail_out = sizeof(outbuf);
102 zs.next_out = outbuf;
105 if (ret == Z_STREAM_END) break;
107 fprintf(stderr,"inflate error %d\n", ret);
115 buf = map_file(tmpname, &size);
117 sum = sccs_checksum(buf+8, size-8);
119 printf("sum=%05u\n", sum);
121 fprintf(f, "\1H%05u", sum);
124 rename(tmpname, fname);
134 int main(int argc, const char *argv[])
137 for (i=1;i<argc;i++) {
138 if (uncompress_one(argv[i]) != 0) return -1;