From b4d012eefb2b1dddfb7731271cc7c6ab4469bbc3 Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Sun, 31 Aug 2025 09:49:34 +0200 Subject: [PATCH] change medium to heap --- libs/spandisc/src/filehandler.c | 6 +-- libs/spandisc/src/filehandler.h | 2 +- libs/spandisc/src/logic.c | 14 +++--- libs/spandisc/src/logic.h | 2 +- libs/spandisc/src/spandisc.c | 17 ++++++- libs/spandisc/src/spandisc.h | 3 +- libs/spandisc/src/splitter.c | 83 +++++++++++++++++---------------- libs/spandisc/src/splitter.h | 4 +- src/discspan.c | 6 +-- 9 files changed, 79 insertions(+), 58 deletions(-) diff --git a/libs/spandisc/src/filehandler.c b/libs/spandisc/src/filehandler.c index 3eb838f..a98cc95 100644 --- a/libs/spandisc/src/filehandler.c +++ b/libs/spandisc/src/filehandler.c @@ -33,12 +33,12 @@ void read_input_file(const char *input, medium_t *srcdata) fclose(in); } -void write_output_file(const char *output, medium_t disc) +void write_output_file(const char *output, medium_t* disc) { FILE *out = fopen(output, "w"); - for (int i = 0; i < disc.length; i++) { - fprintf(out, "%s\n", disc.filearray[i].name); + for (int i = 0; i < disc->length; i++) { + fprintf(out, "%s\n", disc->filearray[i].name); } fclose(out); diff --git a/libs/spandisc/src/filehandler.h b/libs/spandisc/src/filehandler.h index 17688f0..b720d1c 100644 --- a/libs/spandisc/src/filehandler.h +++ b/libs/spandisc/src/filehandler.h @@ -19,7 +19,7 @@ void read_input_file(const char *input, medium_t *srcdata); * @param output is the file name * @param disc is the struct with file pathes */ -void write_output_file(const char *output, medium_t disc); +void write_output_file(const char *output, medium_t* disc); #ifdef __cplusplus } diff --git a/libs/spandisc/src/logic.c b/libs/spandisc/src/logic.c index 5e0014e..2dabd80 100644 --- a/libs/spandisc/src/logic.c +++ b/libs/spandisc/src/logic.c @@ -17,7 +17,7 @@ const char * get_version() return SPANDISC_VERSION; } -void on_status_print(const char *output, medium_t disc) +void on_status_print(const char *output, medium_t* disc) { if (status_print != NULL) status_print(output, disc); @@ -25,22 +25,24 @@ void on_status_print(const char *output, medium_t disc) void span(const char *input, const char *output, unsigned long long split) { - medium_t srcdata = { 0, split, 0, NULL }; - read_input_file(input, &srcdata); + medium_t* srcdata = init_medium(); + srcdata->freespace = split; + read_input_file(input, srcdata); collection_t* col = init_collection(); - split_all(&srcdata, col); + split_all(srcdata, col); char* outname = malloc(sizeof(char) * (strlen(output) + NUM_LEN)); for (int i = 0; i < col->length; i++) { - sprintf(outname, "%s%04d", output, col->disc[i].nr); + sprintf(outname, "%s%04d", output, col->disc[i]->nr); on_status_print(outname, col->disc[i]); write_output_file(outname, col->disc[i]); } free_collection(col); col = NULL; - + free(srcdata); + srcdata = NULL; free(outname); outname = NULL; } diff --git a/libs/spandisc/src/logic.h b/libs/spandisc/src/logic.h index 7a91018..aab4f82 100644 --- a/libs/spandisc/src/logic.h +++ b/libs/spandisc/src/logic.h @@ -14,7 +14,7 @@ const char *get_version(); * @param output is the file name * @param disc is the disc struct */ -typedef void (*status_print_t)(const char *output, medium_t disc); +typedef void (*status_print_t)(const char *output, medium_t* disc); extern status_print_t status_print; /** diff --git a/libs/spandisc/src/spandisc.c b/libs/spandisc/src/spandisc.c index 7f983eb..cc8b056 100644 --- a/libs/spandisc/src/spandisc.c +++ b/libs/spandisc/src/spandisc.c @@ -11,16 +11,31 @@ collection_t* init_collection() return col; } +medium_t* init_medium() +{ + medium_t* medium = malloc(sizeof(medium_t)); + + medium->nr = 0; + medium->freespace = 0; + medium->length = 0; + medium->filearray = NULL; + + return medium; +} + void free_medium(medium_t *medium) { free(medium->filearray); medium->filearray = NULL; + free(medium); + medium = NULL; } void free_collection(collection_t *col) { for (int i = 0; i < col->length; i++) { - free_medium(&col->disc[i]); + free_medium(col->disc[i]); + col->disc[i] = NULL; } free(col->disc); diff --git a/libs/spandisc/src/spandisc.h b/libs/spandisc/src/spandisc.h index c19911d..d314591 100644 --- a/libs/spandisc/src/spandisc.h +++ b/libs/spandisc/src/spandisc.h @@ -20,10 +20,11 @@ typedef struct { typedef struct { int length; - medium_t *disc; + medium_t **disc; } collection_t; collection_t* init_collection(); +medium_t* init_medium(); void free_medium(medium_t *medium); void free_collection(collection_t *col); diff --git a/libs/spandisc/src/splitter.c b/libs/spandisc/src/splitter.c index 52db0ea..603a603 100644 --- a/libs/spandisc/src/splitter.c +++ b/libs/spandisc/src/splitter.c @@ -30,16 +30,6 @@ int strcmpfunc(const void *filea, const void *fileb) return strcasecmp(filename1, filename2); } -medium_t init_medium(medium_t srcdata) -{ - medium_t empty; - empty.nr = srcdata.nr; - empty.freespace = srcdata.freespace; - empty.length = 0; - empty.filearray = NULL; - return empty; -} - int can_add_file_to_medium(medium_t *disc, file_size_t file) { int retvalue = 0; @@ -77,66 +67,79 @@ void add_item_medium(medium_t *medium, file_size_t item) medium->length++; } -medium_t splitter_to_disc(medium_t *srcdata, +void move_rest_to_srcdata(medium_t* rest, medium_t* srcdata) +{ + free(srcdata->filearray); + srcdata->filearray = NULL; + srcdata->length = 0; + + if (rest->length > 0) { + srcdata->filearray = malloc(sizeof(file_size_t) * rest->length); + srcdata->length = rest->length; + } + + memcpy(srcdata->filearray, rest->filearray, + rest->length * sizeof(file_size_t)); +} + +medium_t* splitter_to_disc(medium_t *srcdata, int (*check)(medium_t*, file_size_t)) { qsort(srcdata->filearray, srcdata->length, sizeof(file_size_t), cmpfunc); - medium_t rest = init_medium(*srcdata); - medium_t disc = init_medium(*srcdata); + medium_t* rest = init_medium(); + rest->nr = srcdata->nr; + rest->freespace = srcdata->freespace; + medium_t* disc = init_medium(); + disc->nr = srcdata->nr; + disc->freespace = srcdata->freespace; for (int i = 0; i < srcdata->length; i++) { - if (check(&disc, srcdata->filearray[i])) - add_item_medium(&disc, srcdata->filearray[i]); + if (check(disc, srcdata->filearray[i])) + add_item_medium(disc, srcdata->filearray[i]); else - add_item_medium(&rest, srcdata->filearray[i]); + add_item_medium(rest, srcdata->filearray[i]); } - memcpy(srcdata->filearray, rest.filearray, - rest.length * sizeof(file_size_t)); + move_rest_to_srcdata(rest, srcdata); - srcdata->length = rest.length; - if (srcdata->length > 0) - srcdata->filearray = realloc(srcdata->filearray, - srcdata->length * sizeof(file_size_t)); + qsort(disc->filearray, disc->length, sizeof(file_size_t), strcmpfunc); - qsort(disc.filearray, disc.length, sizeof(file_size_t), strcmpfunc); + free_medium(rest); + rest = NULL; - free_medium(&rest); return disc; } -medium_t splitter(medium_t *srcdata) +medium_t* splitter(medium_t *srcdata) { - medium_t disc = splitter_to_disc(srcdata, can_add_file_to_medium); - return disc; + return splitter_to_disc(srcdata, can_add_file_to_medium); } -medium_t ignore(medium_t *srcdata) +medium_t* ignore(medium_t *srcdata) { - medium_t ignore = splitter_to_disc(srcdata, bigger_file_ignore_medium); - return ignore; + return splitter_to_disc(srcdata, bigger_file_ignore_medium); } void split_all(medium_t *srcdata, collection_t* col) { - medium_t ignoredisc = { 0, 0, 0, NULL }; - ignoredisc = ignore(srcdata); - ignoredisc.freespace = 0; - if (ignoredisc.length > 0) { - col->disc = (medium_t *) malloc(sizeof(medium_t)); + medium_t* ignoredisc = ignore(srcdata); + ignoredisc->freespace = 0; + if (ignoredisc->length > 0) { + col->disc = malloc(sizeof(medium_t*)); col->disc[col->length] = ignoredisc; col->length++; + } else { + free_medium(ignoredisc); + ignoredisc = NULL; } + medium_t* disc = NULL; while (srcdata->length > 0) { srcdata->nr++; - medium_t disc = splitter(srcdata); - col->disc = (medium_t *) - realloc(col->disc, (col->length + 1) * sizeof(medium_t)); + disc = splitter(srcdata); + col->disc = realloc(col->disc, (col->length + 1) * sizeof(medium_t*)); col->disc[col->length] = disc; col->length++; } - - free_medium(srcdata); } diff --git a/libs/spandisc/src/splitter.h b/libs/spandisc/src/splitter.h index 0b49a14..9742c4d 100644 --- a/libs/spandisc/src/splitter.h +++ b/libs/spandisc/src/splitter.h @@ -8,8 +8,8 @@ extern "C" { void free_medium(medium_t *medium); void free_collection(collection_t *col); -medium_t splitter(medium_t *srcdata); -medium_t ignore(medium_t *srcdata); +medium_t* splitter(medium_t *srcdata); +medium_t* ignore(medium_t *srcdata); void split_all(medium_t *srcdata, collection_t* col); #ifdef __cplusplus diff --git a/src/discspan.c b/src/discspan.c index 4d5d8bd..d092b3f 100644 --- a/src/discspan.c +++ b/src/discspan.c @@ -71,13 +71,13 @@ param_t read_argument(int argc, char *argv[]) return parameter; } -void print_human_read_size(const char *output, medium_t medium) +void print_human_read_size(const char *output, medium_t* medium) { unsigned long long humanread; char einheit[6] = {'B', 'K', 'M', 'G', 'T', 'P'}; int i = 0; - humanread = medium.freespace; + humanread = medium->freespace; while (humanread >= 1024) { humanread /= 1024; i++; @@ -87,7 +87,7 @@ void print_human_read_size(const char *output, medium_t medium) i = 0; fprintf(stdout, "free space on %s: %lld bytes (%lld %c)\n", output, - medium.freespace, humanread, einheit[i]); + medium->freespace, humanread, einheit[i]); } int main(int argc, char *argv[]) -- 2.47.3