1
0
mirror of https://github.com/pevans/erc-c.git synced 2024-07-06 23:29:01 +00:00

Add error codes to segment functions

This commit is contained in:
Peter Evans 2017-12-09 15:16:56 -06:00
parent c4a6f77bcd
commit 850fdc55b5
4 changed files with 19 additions and 12 deletions

View File

@ -5,6 +5,12 @@
#define LOG_FILENAME "/tmp/emp.log" #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_write(int, const char *, ...);
extern void log_close(); extern void log_close();
extern void log_open(FILE *); extern void log_open(FILE *);

View File

@ -2,6 +2,7 @@
#define _VM_SEGMENT_H_ #define _VM_SEGMENT_H_
#include "vm_bits.h" #include "vm_bits.h"
#include "log.h"
/* /*
* The bounds check is just some inline code to try and cut down on the * 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_8bit *memory;
} vm_segment; } 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 vm_segment *vm_segment_create(size_t);
extern void vm_segment_free(vm_segment *); extern void vm_segment_free(vm_segment *);
extern vm_8bit vm_segment_get(vm_segment *, size_t); 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 #endif

View File

@ -58,7 +58,7 @@ vm_segment_free(vm_segment *segment)
* bounds-checking here will _crash_ the program if we are * bounds-checking here will _crash_ the program if we are
* out-of-bounds. * out-of-bounds.
*/ */
void int
vm_segment_set(vm_segment *segment, size_t index, vm_8bit value) vm_segment_set(vm_segment *segment, size_t index, vm_8bit value)
{ {
// Some bounds checking. // Some bounds checking.
@ -68,13 +68,11 @@ vm_segment_set(vm_segment *segment, size_t index, vm_8bit value)
index, index,
segment->size); segment->size);
// We prefer to exit in this scenario, rather than try to return ERR_OOB;
// "handle" it with an overflow, because we would rather a crash
// over ill-defined behavior.
exit(1);
} }
segment->memory[index] = value; 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 * Copy a set of bytes from `src` (at `src_index`) to `dest` (at
* `dest_index`), such that the range is `length` bytes long. * `dest_index`), such that the range is `length` bytes long.
*/ */
void int
vm_segment_copy(vm_segment *dest, vm_segment_copy(vm_segment *dest,
vm_segment *src, vm_segment *src,
size_t dest_index, size_t dest_index,
@ -116,7 +114,7 @@ vm_segment_copy(vm_segment *dest,
length, length,
src->size); src->size);
exit(1); return ERR_OOB;
} }
if (dest_index + length >= dest->size) { if (dest_index + length >= dest->size) {
@ -126,10 +124,12 @@ vm_segment_copy(vm_segment *dest,
length, length,
dest->size); dest->size);
exit(1); return ERR_OOB;
} }
memcpy(dest->memory + dest_index, memcpy(dest->memory + dest_index,
src->memory + src_index, src->memory + src_index,
length * sizeof(src->memory[src_index])); length * sizeof(src->memory[src_index]));
return OK;
} }

View File

@ -23,7 +23,7 @@ Test(vm_segment, set) {
segment = vm_segment_create(length); segment = vm_segment_create(length);
cr_assert_neq(segment, NULL); 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); cr_assert_eq(segment->memory[index], value);
vm_segment_free(segment); vm_segment_free(segment);
@ -56,7 +56,7 @@ Test(vm_segment, copy) {
vm_segment_set(src, 2, 0xBE); vm_segment_set(src, 2, 0xBE);
vm_segment_set(src, 3, 0xEF); 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, 8), 0xDE);
cr_assert_eq(vm_segment_get(dest, 9), 0xAD); cr_assert_eq(vm_segment_get(dest, 9), 0xAD);