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);
+extern medium_t ignore(medium_t *srdata);
int cmpfunc(const void *filea, const void *fileb)
{
qsort(srcdata.filearray, srcdata.length, sizeof(file_size_t), cmpfunc);
- char outname[strlen(output) + 3];
medium_t disc;
+ disc = ignore(&srcdata);
+ write_output_file("ignore", disc);
+ free(disc.filearray);
+
+ char outname[strlen(output) + 3];
while (srcdata.length > 0) {
srcdata.nr++;
sprintf(outname, "%s%03d", output, srcdata.nr);
#include "discspan.h"
#include "filehandler.h"
-void malloc_array_length(FILE *in, medium_t *handler)
+void malloc_array_length(FILE *in, medium_t *srcdata)
{
int lines = 0;
char pfad[255];
}
rewind(in);
- handler->length = lines;
- handler->filearray = (file_size_t *)
- malloc(handler->length * sizeof(file_size_t));
+ srcdata->length = lines;
+ srcdata->filearray = (file_size_t *)
+ malloc(srcdata->length * sizeof(file_size_t));
}
void fill_array_from_file(FILE *in, medium_t *srcdata)
{
- FILE *ignore = NULL;
char pfad[255];
struct stat st;
int lines = 0;
while (fscanf(in, "%[^\n]\n", pfad) == 1) {
// Lese Dateieigenschaften in st struct
stat(pfad, &st);
-
- 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)
- ignore = fopen("ignore", "w");
-
- fprintf(ignore, "%s\n", pfad);
- }
+ strcpy(srcdata->filearray[lines].name, pfad);
+ srcdata->filearray[lines++].fsize = st.st_size;
}
-
- if (ignore != NULL)
- fclose(ignore);
-
- srcdata->length = lines;
- srcdata->filearray = (file_size_t *)
- realloc(srcdata->filearray,
- srcdata->length * sizeof(file_size_t));
}
void read_input_file(const char *input, medium_t *srcdata)
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;
+}
+
+int bigger_file_ignore_medium(medium_t *disc, file_size_t file)
+{
+ int retvalue = 0;
+ unsigned long long filesize = ceil(file.fsize /2048.0) * 2048;
+
+ if (disc->freespace < filesize)
+ retvalue = 1;
+
return retvalue;
}
medium_t disc = splitter_to_disc(srcdata, can_add_file_to_medium);
return disc;
}
+
+medium_t ignore(medium_t *srcdata)
+{
+ medium_t ignore = splitter_to_disc(srcdata, bigger_file_ignore_medium);
+ return ignore;
+}
medium_t splitter(medium_t *srcdata);
+medium_t ignore(medium_t *srcdata);
+
#endif