Prevented memory under and overun
This commit is contained in:
19
bfckr.c
19
bfckr.c
@@ -15,11 +15,12 @@
|
|||||||
|
|
||||||
// Amount of memory on the band tape
|
// Amount of memory on the band tape
|
||||||
#define MEMORY_SIZE 10000
|
#define MEMORY_SIZE 10000
|
||||||
#define MAX_INPUT_SIZE 1000
|
#define MAX_INPUT_SIZE 10000
|
||||||
|
|
||||||
// Memory initialized with zeros and its pointer
|
// Memory initialized with zeros and its pointer
|
||||||
char memory[MEMORY_SIZE] = {0};
|
char memory[MEMORY_SIZE] = {0};
|
||||||
char *p = memory;
|
char *p = memory;
|
||||||
|
int memcnt = 0;
|
||||||
|
|
||||||
// Prototypes
|
// Prototypes
|
||||||
void bfuck_parser(char *input);
|
void bfuck_parser(char *input);
|
||||||
@@ -44,11 +45,23 @@ void bfuck_parser(char *input)
|
|||||||
for(size_t i = 0; input[i] != 0; i++) { // where i is the instruction pointer
|
for(size_t i = 0; input[i] != 0; i++) { // where i is the instruction pointer
|
||||||
switch(input[i]) {
|
switch(input[i]) {
|
||||||
case '>':
|
case '>':
|
||||||
++p; // increment data pointer
|
if(memcnt >= MEMORY_SIZE) { // prevent overrun
|
||||||
|
p = &memory[0];
|
||||||
|
memcnt = 0;
|
||||||
|
} else {
|
||||||
|
++p; // increment data pointer
|
||||||
|
++memcnt;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '<':
|
case '<':
|
||||||
--p; // decrement data pointer
|
if(memcnt < 0) { // prevent underun
|
||||||
|
p = &memory[MEMORY_SIZE - 1];
|
||||||
|
memcnt = MEMORY_SIZE - 1;
|
||||||
|
} else {
|
||||||
|
--p; // decrement data pointer
|
||||||
|
--memcnt;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case '+':
|
case '+':
|
||||||
|
|||||||
Reference in New Issue
Block a user