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);
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;
}
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;
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);
}
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++;
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[])