Implemented outputviewer for debug mode
This commit is contained in:
29
bfckr.c
29
bfckr.c
@@ -42,6 +42,8 @@ int getopt(int argc, char * const argv[], const char *optstring);
|
|||||||
// Globals
|
// Globals
|
||||||
extern char *optarg;
|
extern char *optarg;
|
||||||
extern int optind, opterr, optopt;
|
extern int optind, opterr, optopt;
|
||||||
|
char output_buffer[MEMORY_SIZE];
|
||||||
|
size_t n_output_buffer = 0;
|
||||||
char *colortheme[] = {
|
char *colortheme[] = {
|
||||||
"\e[1;34m<\e[0m", // blue <
|
"\e[1;34m<\e[0m", // blue <
|
||||||
"\e[1;34m>\e[0m", // blue >
|
"\e[1;34m>\e[0m", // blue >
|
||||||
@@ -102,6 +104,11 @@ void init_bf_object(bf_code_t *bf)
|
|||||||
for(size_t i = 0; i < MAX_INPUT_SIZE; i++) {
|
for(size_t i = 0; i < MAX_INPUT_SIZE; i++) {
|
||||||
bf->code[i] = 0;
|
bf->code[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(size_t i = 0; i < MEMORY_SIZE; i++) {
|
||||||
|
output_buffer[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_brainfuck(char c)
|
bool is_brainfuck(char c)
|
||||||
@@ -115,12 +122,24 @@ void die(const char *message)
|
|||||||
if(errno) {
|
if(errno) {
|
||||||
perror(message);
|
perror(message);
|
||||||
} else {
|
} else {
|
||||||
printf("[:(] Error: %s\n", message);
|
printf("[\e[1;31m:(\e[0m] Error: %s\n", message);
|
||||||
}
|
}
|
||||||
|
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* prints the current output buffered in global output_buffer */
|
||||||
|
void print_output()
|
||||||
|
{
|
||||||
|
printf("\nOutput viewer: \n");
|
||||||
|
printf("------------------------------------------------------------\n"); // 61 dashes
|
||||||
|
// print the output buffer
|
||||||
|
for(size_t i = 0; i < n_output_buffer; i++) {
|
||||||
|
printf("\e[1;31m%c\e[0m", output_buffer[i]);
|
||||||
|
}
|
||||||
|
printf("\n------------------------------------------------------------\n");
|
||||||
|
}
|
||||||
|
|
||||||
/* Prints the bf source at the current location */
|
/* Prints the bf source at the current location */
|
||||||
void print_sourceviewer(bf_code_t *bf)
|
void print_sourceviewer(bf_code_t *bf)
|
||||||
{
|
{
|
||||||
@@ -131,7 +150,7 @@ void print_sourceviewer(bf_code_t *bf)
|
|||||||
|
|
||||||
// print 30 valid chars before $ip and 30 after
|
// print 30 valid chars before $ip and 30 after
|
||||||
for(int i=(ip-30); i<(ip+30); i++) {
|
for(int i=(ip-30); i<(ip+30); i++) {
|
||||||
printf("%s",((i<0 || i>MAX_INPUT_SIZE) ? " ": colorize(bf->code[i])));
|
printf("%s",((i<0 || i>=strlen(bf->code)) ? " ": colorize(bf->code[i])));
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("\n \e[1;31m^\e[0m \n");
|
printf("\n \e[1;31m^\e[0m \n");
|
||||||
@@ -181,6 +200,7 @@ void bfuck_debugger(bf_code_t *bf) //char *bf_source_input, int instructionpoint
|
|||||||
|
|
||||||
print_sourceviewer(bf);
|
print_sourceviewer(bf);
|
||||||
print_memoryviewer(bf);
|
print_memoryviewer(bf);
|
||||||
|
print_output();
|
||||||
|
|
||||||
switch(getchar()) {
|
switch(getchar()) {
|
||||||
case 'c':
|
case 'c':
|
||||||
@@ -232,6 +252,7 @@ void bfuck_execute(bf_code_t *bf)
|
|||||||
|
|
||||||
case '.':
|
case '.':
|
||||||
putchar(bf->memory[bf->mp]); // output the byte at memory pointer
|
putchar(bf->memory[bf->mp]); // output the byte at memory pointer
|
||||||
|
(n_output_buffer < MEMORY_SIZE) ? output_buffer[++n_output_buffer] = bf->memory[bf->mp] : 0; // write to output buffer for debugging
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ',':
|
case ',':
|
||||||
@@ -299,7 +320,7 @@ int main(int argc, char* argv[])
|
|||||||
init_bf_object(&bf);
|
init_bf_object(&bf);
|
||||||
|
|
||||||
// check arguments
|
// check arguments
|
||||||
if(argc < 2) {
|
if(argc < 3) {
|
||||||
die("Need more arguments.");
|
die("Need more arguments.");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -335,6 +356,8 @@ int main(int argc, char* argv[])
|
|||||||
case 'd': // set to use debugger
|
case 'd': // set to use debugger
|
||||||
bf.debug = true;
|
bf.debug = true;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
die("Invalid argument, see help.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user