]> gitweb.hhaalo.de Git - discspan.git/commitdiff
change medium to heap
authorBastian Dehn <hhaalo@arcor.de>
Sun, 31 Aug 2025 07:49:34 +0000 (09:49 +0200)
committerBastian Dehn <hhaalo@arcor.de>
Sun, 31 Aug 2025 07:49:34 +0000 (09:49 +0200)
libs/spandisc/src/filehandler.c
libs/spandisc/src/filehandler.h
libs/spandisc/src/logic.c
libs/spandisc/src/logic.h
libs/spandisc/src/spandisc.c
libs/spandisc/src/spandisc.h
libs/spandisc/src/splitter.c
libs/spandisc/src/splitter.h
src/discspan.c

index 3eb838fcae05d48c011496a5fcdf2078dc6f7575..a98cc95c0317486e66ab2e730e986a7513bff178 100644 (file)
@@ -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);
index 17688f0fd87f6026069d3a1726913aa55dbf99ab..b720d1c7eea054700e21cae8a5946e31d6f762fc 100644 (file)
@@ -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
 }
index 5e0014eb4df5a352425fc7debc2cf0b774b3cac7..2dabd8000084686df431d9f24ab61b5ce5b67233 100644 (file)
@@ -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;
 }
index 7a910181508cb851e6dbb86bc441ee3902d51ef1..aab4f82b4f08ba5767ea4c6bc7848bf5083fe20e 100644 (file)
@@ -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;
 
 /**
index 7f983ebfdca926883d83a61fdd56b7b467c76b6a..cc8b056ed126b0a64d8a936d87a4c9e3fa4c142d 100644 (file)
@@ -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);
index c19911db419f6a9db0f766ae9da713cd7d8cfe2a..d31459170ce2abc9a827feeb83deb92ae4d83fde 100644 (file)
@@ -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);
 
index 52db0eaba96045a7a6ac873c2f4855398b3bf139..603a603b1a66b64df4cb9bc9f9f4392748cfa52a 100644 (file)
@@ -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);
 }
index 0b49a144ca79fb61437de176427d3272da238223..9742c4d476d9ab23a7ab805b3fd1072cdd85defd 100644 (file)
@@ -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
index 4d5d8bdcd0b09a7bf0be62f0ff8a92cffb2b6d21..d092b3f704c5963ca16aa62563f0028ebd314c94 100644 (file)
@@ -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[])