From 422b6c976e28445d2a6e14586fa416b0f16c093f Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sat, 24 Jun 2023 20:48:32 +0300 Subject: initial commit --- lib/prune.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 lib/prune.c (limited to 'lib/prune.c') diff --git a/lib/prune.c b/lib/prune.c new file mode 100644 index 0000000..5bf5f0b --- /dev/null +++ b/lib/prune.c @@ -0,0 +1,82 @@ +#include +#include +#include + +static void usage(const char *name) +{ + printf("Usage: %s \n", name); +} + +static size_t file_size(FILE *file) +{ + fseek(file, 0, SEEK_END); + size_t size = ftell(file); + rewind(file); + return size; +} + +static char *read_file(FILE *file, size_t bytes) +{ + char *buf = malloc(bytes); + fread(buf, bytes, 1, file); + rewind(file); + return buf; +} + +static int try_filter(FILE *filter, FILE *file) +{ + size_t filtsize = file_size(filter); + char *filtbuf = read_file(filter, filtsize); + + size_t filsize = file_size(file); + char *filbuf = read_file(file, filsize); + + // inform the user? + if (filsize < filtsize) { + free(filtbuf); + free(filbuf); + return 0; + } + + size_t off = filsize - filtsize; + if (strncmp(filbuf + off, filtbuf, filtsize) != 0) { + // filter didn't match + free(filtbuf); + free(filbuf); + return 0; + } + + // write everything except filtered part back to file + freopen(NULL, "w+", file); + fwrite(filbuf, off, 1, file); + free(filtbuf); + free(filbuf); + return 0; +} + +int main(int argc, char *argv[]) +{ + if (argc != 3) { + usage(argv[0]); + return -1; + } + + FILE *filter = fopen(argv[1], "r"); + if (!filter) { + fprintf(stderr, "failed opening filter file %s\n", argv[1]); + return -1; + } + + FILE *file = fopen(argv[2], "r"); + if (!file) { + fprintf(stderr, "failed opening file %s\n", argv[2]); + fclose(filter); + return -1; + } + + int ret = try_filter(filter, file); + + fclose(filter); + fclose(file); + return ret; +} -- cgit v1.3