#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;
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;
+}