Add binary file loading w/ S
This commit is contained in:
parent
a50bda3703
commit
de40227d08
47
src/fileio.c
Normal file
47
src/fileio.c
Normal 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
9
src/fileio.h
Normal 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
|
||||||
Loading…
Reference in New Issue
Block a user