#include "lzw.h" #include #include #include #include int decompress_file(char* filename) { char* outfilename; FILE *fp, *outfp; int i; unsigned int ifnlen, ofnlen; struct lzw_ctx* ctx; uint8_t bufin[4096], bufout[4096]; uint8_t *pin, *pout; size_t to_decompress, space; int res; ctx = (struct lzw_ctx*)malloc(sizeof(struct lzw_ctx)); if (ctx == NULL) return 0; lzw_init(ctx); fp = fopen(filename, "rb"); if (fp == NULL) { perror("fopen()"); return -1; } /* NOLINTBEGIN(clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling) */ ifnlen = strlen(filename); ofnlen = ifnlen + 5; outfilename = (char*)malloc(ofnlen); strncpy(outfilename, filename, ofnlen); for (i = ifnlen - 1; i > 0 && outfilename[i] != '/'; i--) if (outfilename[i] == '.') { outfilename[i] = '\0'; break; } if (strcmp(filename, outfilename) == 0) strncat(outfilename, ".out", ofnlen); /* NOLINTEND(clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling) */ printf("Writing to %s\n", outfilename); outfp = fopen(outfilename, "wb"); if (outfp == NULL) { perror("fopen()"); free(outfilename); return -1; } to_decompress = 0; space = sizeof(bufout); pout = bufout; while (ctx->eos == 0) { if (to_decompress == 0) { to_decompress = fread(bufin, 1, sizeof(bufin), fp); pin = bufin; } if (space == 0) { fwrite(bufout, 1, sizeof(bufout), outfp); space = sizeof(bufout); pout = bufout; } res = lzw_decompress(ctx, pin, &to_decompress, pout, &space); pin = bufin + sizeof(bufin) - to_decompress; pout = bufout + sizeof(bufout) - space; } if (space < sizeof(bufout)) fwrite(bufout, 1, sizeof(bufout) - space, outfp); free(outfilename); fclose(outfp); fclose(fp); return 0; } int main(int argc, char* argv[]) { int i; for (i = 1; i < argc; i++) { printf("Decompressing %s\n", argv[i]); decompress_file(argv[i]); } return EXIT_SUCCESS; }