1
0
mirror of https://github.com/pevans/erc-c.git synced 2024-11-17 00:04:43 +00:00

Allow us to call objstore_init more than once.

This also separates some code into objstore_ready().
This commit is contained in:
Peter Evans 2018-01-03 21:49:26 -06:00
parent 7182608473
commit 06d37d24d7
2 changed files with 23 additions and 8 deletions

View File

@ -1,6 +1,8 @@
#ifndef _OBJSTORE_H_ #ifndef _OBJSTORE_H_
#define _OBJSTORE_H_ #define _OBJSTORE_H_
#include <stdbool.h>
#include "apple2.mem.h" #include "apple2.mem.h"
#include "vm_bits.h" #include "vm_bits.h"
@ -12,6 +14,7 @@ typedef struct {
} objstore; } objstore;
extern int objstore_init(); extern int objstore_init();
extern bool objstore_ready();
#define OBJSTORE_DECL(x) \ #define OBJSTORE_DECL(x) \
const vm_8bit *objstore_##x() const vm_8bit *objstore_##x()

View File

@ -27,7 +27,11 @@ static objstore store;
int int
objstore_init() objstore_init()
{ {
int cmp; // Oh, you're calling this again? Cool, but let's bail before we do
// anything else.
if (objstore_ready()) {
return OK;
}
// We want to input some bad header data and compare with what // We want to input some bad header data and compare with what
// eventually should get put into there by memcmp. // eventually should get put into there by memcmp.
@ -38,6 +42,20 @@ objstore_init()
memcpy(&store, store_data, sizeof(store)); memcpy(&store, store_data, sizeof(store));
// If the copy didn't work out somehow...
if (!objstore_ready()) {
log_critical("Object store initialization failed with bad data");
return ERR_BADFILE;
}
return OK;
}
bool
objstore_ready()
{
int cmp;
// Test if the header field data is exactly equivalent to that // Test if the header field data is exactly equivalent to that
// defined in HEADER_DATA. Note we use memcmp(), because the header // defined in HEADER_DATA. Note we use memcmp(), because the header
// field is an array of just 4 bytes; strcmp() and strncmp() have an // field is an array of just 4 bytes; strcmp() and strncmp() have an
@ -47,13 +65,7 @@ objstore_init()
cmp = memcmp(store.header, HEADER_DATA, cmp = memcmp(store.header, HEADER_DATA,
sizeof(store.header) / sizeof(char)); sizeof(store.header) / sizeof(char));
// If the two areas of memory were not a complete match... return cmp == 0;
if (cmp != 0) {
log_critical("Object store initialization failed with bad data");
return ERR_BADFILE;
}
return OK;
} }
/* /*