#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)
{
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++;
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[])
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;
}
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
#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];
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];
// 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)
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");
#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
#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));
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];
}
}
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;
#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