]> gitweb.hhaalo.de Git - discspan.git/commitdiff
change: splitt with split if else method
authorBastian Dehn <hhaalo@arcor.de>
Sat, 31 Jul 2021 16:50:31 +0000 (18:50 +0200)
committerBastian Dehn <hhaalo@arcor.de>
Sat, 31 Jul 2021 16:50:31 +0000 (18:50 +0200)
splitter.c

index a3817b95c639fa0eefea6643d3fb9062bfd00c88..e487e22d887a37ecc4175d191ed024808416aa13 100644 (file)
@@ -6,36 +6,43 @@
 #include "discspan.h"
 #include "splitter.h"
 
-medium_t splitter(medium_t *srcdata)
+medium_t init_empty_medium(medium_t srcdata)
 {
-       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));
-
-       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));
+       medium_t empty;
+       empty.nr = srcdata.nr;
+       empty.freespace = srcdata.freespace;
+       empty.length = srcdata.length;
+       empty.filearray = (file_size_t *)
+               malloc(empty.length * sizeof(file_size_t));
+       return empty;
+}
+
+int can_add_file_to_medium(medium_t *disc, file_size_t file)
+{
+       int retvalue = 0;
+       // ISO9660 filesystem overhead
+       unsigned long long filesize = ceil(file.fsize / 2048.0) * 2048;
+       if (disc->freespace >= filesize) {
+               disc->freespace -= filesize;
+               retvalue = 1;
+       }
+       return retvalue;
+}
+
+medium_t splitter_to_disc(medium_t *srcdata,
+               int (*check)(medium_t*, file_size_t))
+{
+       medium_t rest = init_empty_medium(*srcdata);
+       medium_t disc = init_empty_medium(*srcdata);
 
-       unsigned long long filesize = 0;
        int restcount = 0;
        int disccount = 0;
 
        for (int i = 0; i < srcdata->length; i++) {
-               // ISO9660 filesystem overhead
-               filesize = ceil(srcdata->filearray[i].fsize / 2048.0) * 2048;
-
-               if (disc.freespace >= filesize) {
-                       disc.freespace -= filesize;
+               if (check(&disc, srcdata->filearray[i]))
                        disc.filearray[disccount++] = srcdata->filearray[i];
-               } else {
+               else
                        rest.filearray[restcount++] = srcdata->filearray[i];
-               }
        }
 
        disc.length = disccount;
@@ -52,3 +59,9 @@ medium_t splitter(medium_t *srcdata)
        free(rest.filearray);
        return disc;
 }
+
+medium_t splitter(medium_t *srcdata)
+{
+       medium_t disc = splitter_to_disc(srcdata, can_add_file_to_medium);
+       return disc;
+}