dsk/test-lzw.c

90 lines
2.2 KiB
C

#include "lzw.h"
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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;
}