diff --git a/include/log.h b/include/log.h index a01e41c..df0c7e5 100644 --- a/include/log.h +++ b/include/log.h @@ -5,6 +5,12 @@ #define LOG_FILENAME "/tmp/emp.log" +enum log_errcode { + OK = 1, + ERR_OOM, // out of memory + ERR_OOB, // out of bounds +}; + extern void log_write(int, const char *, ...); extern void log_close(); extern void log_open(FILE *); diff --git a/include/vm_segment.h b/include/vm_segment.h index e813b8c..029759d 100644 --- a/include/vm_segment.h +++ b/include/vm_segment.h @@ -2,6 +2,7 @@ #define _VM_SEGMENT_H_ #include "vm_bits.h" +#include "log.h" /* * The bounds check is just some inline code to try and cut down on the @@ -22,10 +23,10 @@ typedef struct { vm_8bit *memory; } vm_segment; -extern void vm_segment_copy(vm_segment *, vm_segment *, size_t, size_t, size_t); +extern int vm_segment_copy(vm_segment *, vm_segment *, size_t, size_t, size_t); extern vm_segment *vm_segment_create(size_t); extern void vm_segment_free(vm_segment *); extern vm_8bit vm_segment_get(vm_segment *, size_t); -extern void vm_segment_set(vm_segment *, size_t, vm_8bit); +extern int vm_segment_set(vm_segment *, size_t, vm_8bit); #endif diff --git a/src/vm_segment.c b/src/vm_segment.c index 3977206..da72f3f 100644 --- a/src/vm_segment.c +++ b/src/vm_segment.c @@ -58,7 +58,7 @@ vm_segment_free(vm_segment *segment) * bounds-checking here will _crash_ the program if we are * out-of-bounds. */ -void +int vm_segment_set(vm_segment *segment, size_t index, vm_8bit value) { // Some bounds checking. @@ -68,13 +68,11 @@ vm_segment_set(vm_segment *segment, size_t index, vm_8bit value) index, segment->size); - // We prefer to exit in this scenario, rather than try to - // "handle" it with an overflow, because we would rather a crash - // over ill-defined behavior. - exit(1); + return ERR_OOB; } segment->memory[index] = value; + return OK; } /* @@ -102,7 +100,7 @@ vm_segment_get(vm_segment *segment, size_t index) * Copy a set of bytes from `src` (at `src_index`) to `dest` (at * `dest_index`), such that the range is `length` bytes long. */ -void +int vm_segment_copy(vm_segment *dest, vm_segment *src, size_t dest_index, @@ -116,7 +114,7 @@ vm_segment_copy(vm_segment *dest, length, src->size); - exit(1); + return ERR_OOB; } if (dest_index + length >= dest->size) { @@ -126,10 +124,12 @@ vm_segment_copy(vm_segment *dest, length, dest->size); - exit(1); + return ERR_OOB; } memcpy(dest->memory + dest_index, src->memory + src_index, length * sizeof(src->memory[src_index])); + + return OK; } diff --git a/tests/vm_segment.c b/tests/vm_segment.c index 26d8ad4..084277d 100644 --- a/tests/vm_segment.c +++ b/tests/vm_segment.c @@ -23,7 +23,7 @@ Test(vm_segment, set) { segment = vm_segment_create(length); cr_assert_neq(segment, NULL); - vm_segment_set(segment, index, value); + cr_assert_eq(vm_segment_set(segment, index, value), OK); cr_assert_eq(segment->memory[index], value); vm_segment_free(segment); @@ -56,7 +56,7 @@ Test(vm_segment, copy) { vm_segment_set(src, 2, 0xBE); vm_segment_set(src, 3, 0xEF); - vm_segment_copy(dest, src, 8, 0, 4); + cr_assert_eq(vm_segment_copy(dest, src, 8, 0, 4), OK); cr_assert_eq(vm_segment_get(dest, 8), 0xDE); cr_assert_eq(vm_segment_get(dest, 9), 0xAD);