diff options
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/common.c | 54 | ||||
| -rw-r--r-- | src/common/common.h | 7 | 
2 files changed, 61 insertions, 0 deletions
diff --git a/src/common/common.c b/src/common/common.c new file mode 100644 index 0000000..508140d --- /dev/null +++ b/src/common/common.c @@ -0,0 +1,54 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "../include.h" +#include "common.h" + +int (*file_ext(char *file))(struct blob *, struct userdata *) { +	size_t len = strlen(file); +	#define ext(extension) memcmp(file + len - sizeof (extension) + 1, extension, sizeof (extension)) +	if ((ext(".mptm") && ext(".mod") && ext(".xm") && ext(".s3m") && ext(".it")) == 0) { +		return module_openmpt; +	} else if ((ext(".mid") && ext(".midi")) == 0) { +		return module_fluidsynth; +	} +	#undef ext +	return NULL; +} + +struct blob load_file(char const *const name) { +	const size_t START_SIZE = 1; +	FILE *file = fopen(name, "rb"); +	if (file == NULL) { +		return (struct blob) {.data = NULL}; +	} +	void *data = malloc(START_SIZE); +	size_t allocated = START_SIZE; +	size_t used = 0; +	while (1) { +		size_t read = fread(data + used, 1, allocated - used, file); +		if (read != allocated - used) { +			used += read; +			break; +		} +		used += read; +		allocated *= 2; +		void *const newdata = realloc(data, allocated); +		if (newdata == NULL) { +			goto realloc_error; +		} +		data = newdata; +	} +	void *const newdata = realloc(data, used); +	if (newdata == NULL && used != 0) { +		goto realloc_error; +	} +	fclose(file); +	return (struct blob) {.data = newdata, .size = used}; +	 +	realloc_error: +	free(data); +	fclose(file); +	return (struct blob) {.data = NULL}; +} diff --git a/src/common/common.h b/src/common/common.h new file mode 100644 index 0000000..806212a --- /dev/null +++ b/src/common/common.h @@ -0,0 +1,7 @@ +#include "../include.h" + +int (*file_ext(char *file))(struct blob *, struct userdata *); +struct blob load_file(char const *const name); + +int module_openmpt(struct blob *file, struct userdata *userdata); +int module_fluidsynth(struct blob *file, struct userdata *userdata);  | 
