Add binary file loading w/ S

This commit is contained in:
Themis Demetriades 2024-05-30 14:17:43 +01:00
parent a50bda3703
commit de40227d08
2 changed files with 56 additions and 0 deletions

47
src/fileio.c Normal file
View File

@ -0,0 +1,47 @@
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include "fileio.h"
/* Loads a binary file located at filePath to memory, taking up a block of exactly memorySize bytes,
and returns the starting address of the data. If memorySize is insufficient to store the entire file,
an appropriate error is reported. Excess memory is set to 0 bit values. */
word *fileio_loadBin(const char *filePath, size_t memorySize) {
FILE *file = fopen(filePath, "rb");
if (file == NULL) {
fprintf(stderr, "Couldn't open %s!\n", filePath);
exit(EXIT_FAILURE);
}
word *fileData = malloc(memorySize);
if (fileData == NULL) {
fprintf(stderr, "Ran out of memory attempting to load %s!\n", filePath);
exit(EXIT_FAILURE);
}
// Loop while reading from the file yields data. Only terminates if EOF is reached or ERROR occurs.
// Explicitly deal with attempting to write too much data to memory block, rather than allow segfault.
const size_t wordCount = memorySize/sizeof(word);
int i = 0;
while (fread(fileData + i, sizeof(word), 1, file)) {
if (i >= wordCount) {
fprintf(stderr, "Attempting to load binary %s to memory of smaller size %zu!\n", filePath, memorySize);
exit(EXIT_FAILURE);
}
i++;
}
if (ferror(file)) {
fprintf(stderr, "Encountered error attempting to read %s!\n", filePath);
exit(EXIT_FAILURE);
}
assert(fclose(file) != EOF);
// If part of memory block was left uninitialized, initialize it to zero.
if (i < wordCount) {
memset(fileData + i, 0, (wordCount - i) * sizeof(word));
}
return fileData;
}

9
src/fileio.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef __FILEIO__
#define __FILEIO__
#include <stdlib.h>
#include "global.h"
#define EXIT_FAILURE 1
extern word *fileio_loadBin(const char *filePath, size_t memorySize);
#endif