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:
parent
c4a6f77bcd
commit
850fdc55b5
@ -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 *);
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user