From 234c2e683dd7261ac50ea7d964e0d14898d9b060 Mon Sep 17 00:00:00 2001 From: Bastian Dehn Date: Sat, 31 Jul 2021 16:46:47 +0200 Subject: [PATCH] change: medium struct with more infos --- discspan.c | 40 +++++++++++++++++----------------------- discspan.h | 8 +++++--- filehandler.c | 29 +++++++++++++---------------- filehandler.h | 6 ++---- splitter.c | 43 +++++++++++++++++++------------------------ splitter.h | 5 +---- 6 files changed, 57 insertions(+), 74 deletions(-) diff --git a/discspan.c b/discspan.c index b4fe792..e900636 100644 --- a/discspan.c +++ b/discspan.c @@ -8,13 +8,10 @@ #include "filehandler.h" #include "help.h" -extern void (*printEvent)(const char *output, unsigned long long splitgroesse); extern void useage(); -extern void read_input_file(const char *input, const unsigned long long split, - file_size_handler_t *handler); -extern void write_output_file(const char *output, file_size_handler_t disc); -extern file_size_handler_t splitter(file_size_handler_t *handler, - const char *output, unsigned long long splitgroesse); +extern void read_input_file(const char *input, medium_t *srcdata); +extern void write_output_file(const char *output, medium_t disc); +extern medium_t splitter(medium_t *srcdata); int cmpfunc(const void *filea, const void *fileb) { @@ -68,13 +65,13 @@ const unsigned long long readArgument(int argc, char *argv[]) return split; } -void printHumanReadSize(const char *output, unsigned long long splitgroesse) +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 = splitgroesse; + humanread = medium.freespace; while (humanread >= 1024) { humanread /= 1024; i++; @@ -84,7 +81,7 @@ void printHumanReadSize(const char *output, unsigned long long splitgroesse) i = 0; printf("Restlicher Platz in Bytes(%s): %lld (%lld %c)\n", output, - splitgroesse, humanread, einheit[i]); + medium.freespace, humanread, einheit[i]); } int main(int argc, char *argv[]) @@ -94,29 +91,26 @@ int main(int argc, char *argv[]) return 1; } - printEvent = printHumanReadSize; - const char *input = argv[1]; const char *output = argv[2]; - - file_size_handler_t arrayhandler = { NULL, 0 }; - const unsigned long long split = readArgument(argc, argv); - read_input_file(input, split, &arrayhandler); - qsort(arrayhandler.filearray, arrayhandler.length, sizeof(file_size_t), - cmpfunc); + medium_t srcdata = { 0, split, 0, NULL }; + read_input_file(input, &srcdata); + + qsort(srcdata.filearray, srcdata.length, sizeof(file_size_t), cmpfunc); char outname[strlen(output) + 3]; - int num = 1; - file_size_handler_t disc; - while (arrayhandler.length > 0) { - sprintf(outname, "%s%03d", output, num++); - disc = splitter(&arrayhandler, outname, split); + medium_t disc; + while (srcdata.length > 0) { + srcdata.nr++; + sprintf(outname, "%s%03d", output, srcdata.nr); + disc = splitter(&srcdata); + print_human_read_size(outname, disc); write_output_file(outname, disc); free(disc.filearray); } - free(arrayhandler.filearray); + free(srcdata.filearray); return 0; } diff --git a/discspan.h b/discspan.h index 6b05345..4e3a537 100644 --- a/discspan.h +++ b/discspan.h @@ -3,12 +3,14 @@ typedef struct { char name[255]; - long long unsigned fsize; + unsigned long long fsize; } file_size_t; typedef struct { - file_size_t *filearray; + int nr; + unsigned long long freespace; int length; -} file_size_handler_t; + file_size_t *filearray; +} medium_t; #endif diff --git a/filehandler.c b/filehandler.c index fa7b0b6..c2647e7 100644 --- a/filehandler.c +++ b/filehandler.c @@ -6,7 +6,7 @@ #include "discspan.h" #include "filehandler.h" -void malloc_array_length(FILE *in, file_size_handler_t *handler) +void malloc_array_length(FILE *in, medium_t *handler) { int lines = 0; char pfad[255]; @@ -21,8 +21,7 @@ void malloc_array_length(FILE *in, file_size_handler_t *handler) malloc(handler->length * sizeof(file_size_t)); } -void fill_array_from_file(FILE *in, const unsigned long long split, - file_size_handler_t *handler) +void fill_array_from_file(FILE *in, medium_t *srcdata) { FILE *ignore = NULL; char pfad[255]; @@ -33,9 +32,9 @@ void fill_array_from_file(FILE *in, const unsigned long long split, // Lese Dateieigenschaften in st struct stat(pfad, &st); - if (st.st_size <= split) { - strcpy(handler->filearray[lines].name, pfad); - handler->filearray[lines++].fsize = st.st_size; + if (st.st_size <= srcdata->freespace) { + strcpy(srcdata->filearray[lines].name, pfad); + srcdata->filearray[lines++].fsize = st.st_size; } else { // irgnore List erstellen if (ignore == NULL) @@ -48,25 +47,23 @@ void fill_array_from_file(FILE *in, const unsigned long long split, if (ignore != NULL) fclose(ignore); - handler->length = lines; - handler->filearray = (file_size_t *) - realloc(handler->filearray, - handler->length * sizeof(file_size_t)); + srcdata->length = lines; + srcdata->filearray = (file_size_t *) + realloc(srcdata->filearray, + srcdata->length * sizeof(file_size_t)); } -void read_input_file(const char *input, - const unsigned long long split, - file_size_handler_t *handler) +void read_input_file(const char *input, medium_t *srcdata) { FILE *in = fopen(input, "r"); - malloc_array_length(in, handler); - fill_array_from_file(in, split, handler); + malloc_array_length(in, srcdata); + fill_array_from_file(in, srcdata); fclose(in); } -void write_output_file(const char *output, file_size_handler_t disc) +void write_output_file(const char *output, medium_t disc) { FILE *out = fopen(output, "w"); diff --git a/filehandler.h b/filehandler.h index a2c254f..04bd2ee 100644 --- a/filehandler.h +++ b/filehandler.h @@ -1,10 +1,8 @@ #ifndef _FILEHANDLER_H #define _FILEHANDLER_H -void read_input_file(const char *input, - const unsigned long long split, - file_size_handler_t *handler); +void read_input_file(const char *input, medium_t *srcdata); -void write_output_file(const char *output, file_size_handler_t disc); +void write_output_file(const char *output, medium_t disc); #endif diff --git a/splitter.c b/splitter.c index 10200a5..a3817b9 100644 --- a/splitter.c +++ b/splitter.c @@ -6,22 +6,19 @@ #include "discspan.h" #include "splitter.h" -void onPrintEvent(const char *output, unsigned long long splitgroesse) +medium_t splitter(medium_t *srcdata) { - if (printEvent != NULL) - printEvent(output, splitgroesse); -} - -file_size_handler_t splitter(file_size_handler_t *handler, const char *output, - unsigned long long splitgroesse) -{ - file_size_handler_t rest; - rest.length = handler->length; + medium_t rest; + rest.nr = srcdata->nr; + rest.freespace = srcdata->freespace; + rest.length = srcdata->length; rest.filearray = (file_size_t *) malloc(rest.length * sizeof(file_size_t)); - file_size_handler_t disc; - disc.length = handler->length; + medium_t disc; + disc.nr = srcdata->nr; + disc.freespace = srcdata->freespace; + disc.length = srcdata->length; disc.filearray = (file_size_t *) malloc(disc.length * sizeof(file_size_t)); @@ -29,15 +26,15 @@ file_size_handler_t splitter(file_size_handler_t *handler, const char *output, int restcount = 0; int disccount = 0; - for (int i = 0; i < handler->length; i++) { + for (int i = 0; i < srcdata->length; i++) { // ISO9660 filesystem overhead - filesize = ceil(handler->filearray[i].fsize / 2048.0) * 2048; + filesize = ceil(srcdata->filearray[i].fsize / 2048.0) * 2048; - if (splitgroesse >= filesize) { - splitgroesse -= filesize; - disc.filearray[disccount++] = handler->filearray[i]; + if (disc.freespace >= filesize) { + disc.freespace -= filesize; + disc.filearray[disccount++] = srcdata->filearray[i]; } else { - rest.filearray[restcount++] = handler->filearray[i]; + rest.filearray[restcount++] = srcdata->filearray[i]; } } @@ -45,14 +42,12 @@ file_size_handler_t splitter(file_size_handler_t *handler, const char *output, disc.filearray = (file_size_t *) realloc(disc.filearray, disc.length * sizeof(file_size_t)); - onPrintEvent(output, splitgroesse); - - memcpy(handler->filearray, rest.filearray, + memcpy(srcdata->filearray, rest.filearray, restcount * sizeof(file_size_t)); - handler->length = restcount; - handler->filearray = (file_size_t *) realloc(handler->filearray, - handler->length * sizeof(file_size_t)); + srcdata->length = restcount; + srcdata->filearray = (file_size_t *) realloc(srcdata->filearray, + srcdata->length * sizeof(file_size_t)); free(rest.filearray); return disc; diff --git a/splitter.h b/splitter.h index da73a44..a1d9dd8 100644 --- a/splitter.h +++ b/splitter.h @@ -1,9 +1,6 @@ #ifndef _SPLITTER_H #define _SPLITTER_H -void (*printEvent)(const char *output, unsigned long long splitgroesse); - -file_size_handler_t splitter(file_size_handler_t *handler, const char *output, - unsigned long long splitgroesse); +medium_t splitter(medium_t *srcdata); #endif -- 2.39.5