project(discspan)
if (SHAREDLIB)
- set(SOURCES discspan.c help.c)
- set(SOURCE_LIB logic.c filehandler.c splitter.c)
- set(PUBLIC_HEADERS discspan.h logic.h filehandler.h splitter.h)
+ file(GLOB SOURCES discspan/*.c)
+ file(GLOB SOURCE_LIB libspandisc/*.c)
+ include_directories(include)
add_library(spandisc SHARED ${SOURCE_LIB})
- set_target_properties(spandisc PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}")
else()
- set(SOURCES discspan.c help.c logic.c filehandler.c splitter.c)
+ file(GLOB SOURCES discspan/*.c libspandisc/*.c)
+ include_directories(include)
endif()
add_executable(discspan ${SOURCES})
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include "discspan.h"
-#include "logic.h"
-#include "help.h"
-
-extern void useage();
-extern void (*status_print)(const char *output, medium_t disc);
-extern void run(const char *input,
- const char *output,
- unsigned long long split);
-
-typedef struct {
- char *input;
- char *output;
- unsigned long long split;
-} param_t;
-
-param_t readArgument(int argc, char *argv[])
-{
- param_t parameter = { NULL, NULL, 0 };
-
- // Medien groessen
- const unsigned long long bluray = 24159191040;
- const unsigned long long dvd9 = 8500000000;
- const unsigned long long dvd5 = 4700000000;
- const unsigned long long cd = 734003200;
-
- int c = 0;
- while ((c = getopt(argc, argv, ":59bcf:hi:o:")) != -1) {
- switch (c) {
- case 'i':
- parameter.input = optarg;
- break;
- case 'o':
- parameter.output = optarg;
- break;
- case '5':
- parameter.split = dvd5;
- break;
- case '9':
- parameter.split = dvd9;
- break;
- case 'b':
- parameter.split = bluray;
- break;
- case 'c':
- parameter.split = cd;
- break;
- case 'f':
- parameter.split = atoll(optarg);
- break;
- case 'h':
- useage();
- exit(0);
- break;
- default:
- printf("WARNUNG: Parameter -%c unbekannt!\n", optopt);
- break;
- }
- }
-
- return parameter;
-}
-
-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;
- while (humanread >= 1024) {
- humanread /= 1024;
- i++;
- }
-
- if (i > sizeof(einheit)/sizeof(einheit[0]))
- i = 0;
-
- printf("Restlicher Platz in Bytes(%s): %lld (%lld %c)\n", output,
- medium.freespace, humanread, einheit[i]);
-}
-
-int main(int argc, char *argv[])
-{
- param_t parameter = readArgument(argc, argv);
-
- if (parameter.input == NULL
- || parameter.output == NULL
- || parameter.split < 2048) {
- useage();
- exit(1);
- }
-
- if (access(parameter.input, F_OK) < 0) {
- printf("ERROR: %s existiert nicht!\n", parameter.input);
- exit(1);
- }
-
- status_print = print_human_read_size;
- run(parameter.input, parameter.output, parameter.split);
-
- return 0;
-}
+++ /dev/null
-#ifndef _DISCSPAN_H
-#define _DISCSPAN_H
-
-typedef struct {
- char name[255];
- unsigned long long fsize;
- unsigned int type;
-} file_size_t;
-
-typedef struct {
- int nr;
- unsigned long long freespace;
- int length;
- file_size_t *filearray;
-} medium_t;
-
-typedef struct {
- int length;
- medium_t *disc;
-} collection_t;
-
-#endif
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "discspan.h"
+#include "logic.h"
+#include "help.h"
+
+extern void useage();
+extern void (*status_print)(const char *output, medium_t disc);
+extern void run(const char *input,
+ const char *output,
+ unsigned long long split);
+
+typedef struct {
+ char *input;
+ char *output;
+ unsigned long long split;
+} param_t;
+
+param_t readArgument(int argc, char *argv[])
+{
+ param_t parameter = { NULL, NULL, 0 };
+
+ // Medien groessen
+ const unsigned long long bluray = 24159191040;
+ const unsigned long long dvd9 = 8500000000;
+ const unsigned long long dvd5 = 4700000000;
+ const unsigned long long cd = 734003200;
+
+ int c = 0;
+ while ((c = getopt(argc, argv, ":59bcf:hi:o:")) != -1) {
+ switch (c) {
+ case 'i':
+ parameter.input = optarg;
+ break;
+ case 'o':
+ parameter.output = optarg;
+ break;
+ case '5':
+ parameter.split = dvd5;
+ break;
+ case '9':
+ parameter.split = dvd9;
+ break;
+ case 'b':
+ parameter.split = bluray;
+ break;
+ case 'c':
+ parameter.split = cd;
+ break;
+ case 'f':
+ parameter.split = atoll(optarg);
+ break;
+ case 'h':
+ useage();
+ exit(0);
+ break;
+ default:
+ printf("WARNUNG: Parameter -%c unbekannt!\n", optopt);
+ break;
+ }
+ }
+
+ return parameter;
+}
+
+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;
+ while (humanread >= 1024) {
+ humanread /= 1024;
+ i++;
+ }
+
+ if (i > sizeof(einheit)/sizeof(einheit[0]))
+ i = 0;
+
+ printf("Restlicher Platz in Bytes(%s): %lld (%lld %c)\n", output,
+ medium.freespace, humanread, einheit[i]);
+}
+
+int main(int argc, char *argv[])
+{
+ param_t parameter = readArgument(argc, argv);
+
+ if (parameter.input == NULL
+ || parameter.output == NULL
+ || parameter.split < 2048) {
+ useage();
+ exit(1);
+ }
+
+ if (access(parameter.input, F_OK) < 0) {
+ printf("ERROR: %s existiert nicht!\n", parameter.input);
+ exit(1);
+ }
+
+ status_print = print_human_read_size;
+ run(parameter.input, parameter.output, parameter.split);
+
+ return 0;
+}
--- /dev/null
+#include <stdio.h>
+#include "help.h"
+
+void useage()
+{
+ printf("\nUsage: discspan <option> -i <source> -o <prefix>\n\n");
+ printf(" -i <source>\tpath to source file\n");
+ printf(" -o <prefix>\tprefix for output files\n\n");
+ printf("Option:\n\n");
+ printf(" -b\t\tsize of Bluray: 25.000.000.000 bytes\n");
+ printf(" -9\t\tsize of double layer DVD 8.500.000.000 bytes\n");
+ printf(" -5\t\tsize of sigle layer DVD: 4.700.000.000 bytes\n");
+ printf(" -c\t\tsize of CD: 734.003.200 bytes\n");
+ printf(" -f <size>\tsize in bytes\n");
+ printf(" -h\t\tshow this help\n\n");
+}
+++ /dev/null
-#include <sys/stat.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "discspan.h"
-#include "filehandler.h"
-
-void malloc_array_length(FILE *in, medium_t *srcdata)
-{
- int lines = 0;
- char pfad[255];
-
- while (fscanf(in, "%[^\n]\n", pfad) == 1) {
- lines++;
- }
- rewind(in);
-
- 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)
-{
- char pfad[255];
- struct stat st;
- int lines = 0;
-
- while (fscanf(in, "%[^\n]\n", pfad) == 1) {
- // Lese Dateieigenschaften in st struct
- stat(pfad, &st);
- strcpy(srcdata->filearray[lines].name, pfad);
- srcdata->filearray[lines].type = st.st_mode;
- srcdata->filearray[lines++].fsize = st.st_size;
- }
-}
-
-void read_input_file(const char *input, medium_t *srcdata)
-{
- FILE *in = fopen(input, "r");
-
- malloc_array_length(in, srcdata);
- fill_array_from_file(in, srcdata);
-
- fclose(in);
-}
-
-void write_output_file(const char *output, medium_t disc)
-{
- FILE *out = fopen(output, "w");
-
- for (int i = 0; i < disc.length; i++) {
- fprintf(out, "%s\n", disc.filearray[i].name);
- }
-
- fclose(out);
-}
+++ /dev/null
-#ifndef _FILEHANDLER_H
-#define _FILEHANDLER_H
-
-void read_input_file(const char *input, medium_t *srcdata);
-
-void write_output_file(const char *output, medium_t disc);
-
-#endif
+++ /dev/null
-#include <stdio.h>
-#include "help.h"
-
-void useage()
-{
- printf("\nUsage: discspan <option> -i <source> -o <prefix>\n\n");
- printf(" -i <source>\tpath to source file\n");
- printf(" -o <prefix>\tprefix for output files\n\n");
- printf("Option:\n\n");
- printf(" -b\t\tsize of Bluray: 25.000.000.000 bytes\n");
- printf(" -9\t\tsize of double layer DVD 8.500.000.000 bytes\n");
- printf(" -5\t\tsize of sigle layer DVD: 4.700.000.000 bytes\n");
- printf(" -c\t\tsize of CD: 734.003.200 bytes\n");
- printf(" -f <size>\tsize in bytes\n");
- printf(" -h\t\tshow this help\n\n");
-}
+++ /dev/null
-#ifndef _HELP_H
-#define _HELP_H
-
-void usage();
-
-#endif
--- /dev/null
+#ifndef _DISCSPAN_H
+#define _DISCSPAN_H
+
+typedef struct {
+ char name[255];
+ unsigned long long fsize;
+ unsigned int type;
+} file_size_t;
+
+typedef struct {
+ int nr;
+ unsigned long long freespace;
+ int length;
+ file_size_t *filearray;
+} medium_t;
+
+typedef struct {
+ int length;
+ medium_t *disc;
+} collection_t;
+
+#endif
--- /dev/null
+#ifndef _FILEHANDLER_H
+#define _FILEHANDLER_H
+
+void read_input_file(const char *input, medium_t *srcdata);
+
+void write_output_file(const char *output, medium_t disc);
+
+#endif
--- /dev/null
+#ifndef _HELP_H
+#define _HELP_H
+
+void usage();
+
+#endif
--- /dev/null
+#ifndef _LOGIC_H
+#define _LOGIC_H
+
+void (*status_print)(const char *output, medium_t disc);
+
+void run(const char *input, const char *output, unsigned long long split);
+
+#endif
--- /dev/null
+#ifndef _SPLITTER_H
+#define _SPLITTER_H
+
+medium_t splitter(medium_t *srcdata);
+medium_t ignore(medium_t *srcdata);
+collection_t split_all(medium_t *srcdata);
+
+#endif
--- /dev/null
+#include <sys/stat.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "discspan.h"
+#include "filehandler.h"
+
+void malloc_array_length(FILE *in, medium_t *srcdata)
+{
+ int lines = 0;
+ char pfad[255];
+
+ while (fscanf(in, "%[^\n]\n", pfad) == 1) {
+ lines++;
+ }
+ rewind(in);
+
+ 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)
+{
+ char pfad[255];
+ struct stat st;
+ int lines = 0;
+
+ while (fscanf(in, "%[^\n]\n", pfad) == 1) {
+ // Lese Dateieigenschaften in st struct
+ stat(pfad, &st);
+ strcpy(srcdata->filearray[lines].name, pfad);
+ srcdata->filearray[lines].type = st.st_mode;
+ srcdata->filearray[lines++].fsize = st.st_size;
+ }
+}
+
+void read_input_file(const char *input, medium_t *srcdata)
+{
+ FILE *in = fopen(input, "r");
+
+ malloc_array_length(in, srcdata);
+ fill_array_from_file(in, srcdata);
+
+ fclose(in);
+}
+
+void write_output_file(const char *output, medium_t disc)
+{
+ FILE *out = fopen(output, "w");
+
+ for (int i = 0; i < disc.length; i++) {
+ fprintf(out, "%s\n", disc.filearray[i].name);
+ }
+
+ fclose(out);
+}
--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "discspan.h"
+#include "logic.h"
+#include "splitter.h"
+#include "filehandler.h"
+
+extern void read_input_file(const char *input, medium_t *srcdata);
+extern void write_output_file(const char *output, medium_t disc);
+extern collection_t splitall(medium_t *srcdata);
+
+void on_status_print(const char *output, medium_t disc)
+{
+ if (status_print != NULL)
+ status_print(output, disc);
+}
+
+int cmpfunc(const void *filea, const void *fileb)
+{
+ unsigned long long a = ((const file_size_t*)filea)->fsize;
+ unsigned long long b = ((const file_size_t*)fileb)->fsize;
+
+ if (a < b)
+ return 1;
+ else if (a > b)
+ return -1;
+ else if (a == b)
+ return 0;
+ else
+ return -2;
+}
+
+void run(const char *input, const char *output, unsigned long long split)
+{
+ medium_t srcdata = { 0, split, 0, NULL };
+ read_input_file(input, &srcdata);
+
+ qsort(srcdata.filearray, srcdata.length, sizeof(file_size_t), cmpfunc);
+
+ collection_t col = split_all(&srcdata);
+
+ char outname[strlen(output) + 4];
+ for (int i = 0; i < col.length; i++) {
+ sprintf(outname, "%s%04d", output, col.disc[i].nr);
+ on_status_print(outname, col.disc[i]);
+ write_output_file(outname, col.disc[i]);
+ free(col.disc[i].filearray);
+ }
+
+ free(col.disc);
+}
--- /dev/null
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include "discspan.h"
+#include "splitter.h"
+
+#define S_IFREG 0100000 // bitmask for regular file; man inode
+
+medium_t init_empty_medium(medium_t srcdata)
+{
+ medium_t empty;
+ empty.nr = srcdata.nr;
+ empty.freespace = srcdata.freespace;
+ empty.length = 0;
+ empty.filearray = (file_size_t *)
+ malloc(1 * 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;
+}
+
+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 ((file.type & S_IFREG) != S_IFREG)
+ retvalue = 1;
+
+ if (disc->freespace < filesize)
+ retvalue = 1;
+
+ return retvalue;
+}
+
+void add_item_medium(medium_t *medium, file_size_t item)
+{
+ medium->filearray = (file_size_t *)realloc(medium->filearray,
+ (medium->length + 1) *
+ sizeof(file_size_t));
+ medium->filearray[medium->length] = item;
+ medium->length++;
+}
+
+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);
+
+ for (int i = 0; i < srcdata->length; i++) {
+ if (check(&disc, srcdata->filearray[i]))
+ add_item_medium(&disc, srcdata->filearray[i]);
+ else
+ add_item_medium(&rest, srcdata->filearray[i]);
+ }
+
+ memcpy(srcdata->filearray, rest.filearray,
+ rest.length * sizeof(file_size_t));
+
+ srcdata->length = rest.length;
+ srcdata->filearray = (file_size_t *) realloc(srcdata->filearray,
+ srcdata->length * sizeof(file_size_t));
+
+ 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;
+}
+
+medium_t ignore(medium_t *srcdata)
+{
+ medium_t ignore = splitter_to_disc(srcdata, bigger_file_ignore_medium);
+ return ignore;
+}
+
+collection_t split_all(medium_t *srcdata)
+{
+ collection_t col;
+ col.length = 0;
+ col.disc = NULL;
+
+ medium_t ignoredisc;
+ ignoredisc = ignore(srcdata);
+ ignoredisc.freespace = 0;
+ if (ignoredisc.length > 0) {
+ col.disc = (medium_t *)malloc(sizeof(medium_t));
+ col.disc[col.length] = ignoredisc;
+ col.length++;
+ }
+
+ while (srcdata->length > 0) {
+ srcdata->nr++;
+ medium_t disc = splitter(srcdata);
+ col.disc = (medium_t *)
+ realloc(col.disc, (col.length + 1) * sizeof(medium_t));
+ col.disc[col.length] = disc;
+ col.length++;
+ }
+
+ free(srcdata->filearray);
+ return col;
+}
+++ /dev/null
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "discspan.h"
-#include "logic.h"
-#include "splitter.h"
-#include "filehandler.h"
-
-extern void read_input_file(const char *input, medium_t *srcdata);
-extern void write_output_file(const char *output, medium_t disc);
-extern collection_t splitall(medium_t *srcdata);
-
-void on_status_print(const char *output, medium_t disc)
-{
- if (status_print != NULL)
- status_print(output, disc);
-}
-
-int cmpfunc(const void *filea, const void *fileb)
-{
- unsigned long long a = ((const file_size_t*)filea)->fsize;
- unsigned long long b = ((const file_size_t*)fileb)->fsize;
-
- if (a < b)
- return 1;
- else if (a > b)
- return -1;
- else if (a == b)
- return 0;
- else
- return -2;
-}
-
-void run(const char *input, const char *output, unsigned long long split)
-{
- medium_t srcdata = { 0, split, 0, NULL };
- read_input_file(input, &srcdata);
-
- qsort(srcdata.filearray, srcdata.length, sizeof(file_size_t), cmpfunc);
-
- collection_t col = split_all(&srcdata);
-
- char outname[strlen(output) + 4];
- for (int i = 0; i < col.length; i++) {
- sprintf(outname, "%s%04d", output, col.disc[i].nr);
- on_status_print(outname, col.disc[i]);
- write_output_file(outname, col.disc[i]);
- free(col.disc[i].filearray);
- }
-
- free(col.disc);
-}
+++ /dev/null
-#ifndef _LOGIC_H
-#define _LOGIC_H
-
-void (*status_print)(const char *output, medium_t disc);
-
-void run(const char *input, const char *output, unsigned long long split);
-
-#endif
+++ /dev/null
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-#include "discspan.h"
-#include "splitter.h"
-
-#define S_IFREG 0100000 // bitmask for regular file; man inode
-
-medium_t init_empty_medium(medium_t srcdata)
-{
- medium_t empty;
- empty.nr = srcdata.nr;
- empty.freespace = srcdata.freespace;
- empty.length = 0;
- empty.filearray = (file_size_t *)
- malloc(1 * 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;
-}
-
-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 ((file.type & S_IFREG) != S_IFREG)
- retvalue = 1;
-
- if (disc->freespace < filesize)
- retvalue = 1;
-
- return retvalue;
-}
-
-void add_item_medium(medium_t *medium, file_size_t item)
-{
- medium->filearray = (file_size_t *)realloc(medium->filearray,
- (medium->length + 1) *
- sizeof(file_size_t));
- medium->filearray[medium->length] = item;
- medium->length++;
-}
-
-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);
-
- for (int i = 0; i < srcdata->length; i++) {
- if (check(&disc, srcdata->filearray[i]))
- add_item_medium(&disc, srcdata->filearray[i]);
- else
- add_item_medium(&rest, srcdata->filearray[i]);
- }
-
- memcpy(srcdata->filearray, rest.filearray,
- rest.length * sizeof(file_size_t));
-
- srcdata->length = rest.length;
- srcdata->filearray = (file_size_t *) realloc(srcdata->filearray,
- srcdata->length * sizeof(file_size_t));
-
- 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;
-}
-
-medium_t ignore(medium_t *srcdata)
-{
- medium_t ignore = splitter_to_disc(srcdata, bigger_file_ignore_medium);
- return ignore;
-}
-
-collection_t split_all(medium_t *srcdata)
-{
- collection_t col;
- col.length = 0;
- col.disc = NULL;
-
- medium_t ignoredisc;
- ignoredisc = ignore(srcdata);
- ignoredisc.freespace = 0;
- if (ignoredisc.length > 0) {
- col.disc = (medium_t *)malloc(sizeof(medium_t));
- col.disc[col.length] = ignoredisc;
- col.length++;
- }
-
- while (srcdata->length > 0) {
- srcdata->nr++;
- medium_t disc = splitter(srcdata);
- col.disc = (medium_t *)
- realloc(col.disc, (col.length + 1) * sizeof(medium_t));
- col.disc[col.length] = disc;
- col.length++;
- }
-
- free(srcdata->filearray);
- return col;
-}
+++ /dev/null
-#ifndef _SPLITTER_H
-#define _SPLITTER_H
-
-medium_t splitter(medium_t *srcdata);
-medium_t ignore(medium_t *srcdata);
-collection_t split_all(medium_t *srcdata);
-
-#endif