#include #include #include #include #include size_t get_file_size(FILE* file) { assert(file); const long int starting_pos = ftell(file); if (starting_pos == -1) { return (size_t)-1; } if (fseek(file, 0, SEEK_END) != 0) { return (size_t)-1; } const size_t file_size = ftell(file); if (file_size == (size_t)-1) { return (size_t)-1; } if (fseek(file, starting_pos, SEEK_SET) != 0) { return (size_t)-1; } return file_size; } void* read_file(const char* filepath) { assert(filepath); void* data = 0; FILE* file = fopen(filepath, "rb"); if (!file) { return 0; } const size_t file_size = get_file_size(file); if (file_size == (size_t)-1) { goto cleanup; } data = calloc(1, file_size); if (!data) { goto cleanup; } if (fread(data, 1, file_size, file) != file_size) { goto cleanup; } return data; cleanup: fclose(file); if (data) { free(data); } return 0; }