diff --git a/src/basic.c b/src/basic.c index 9e194a5..5b3cbda 100644 --- a/src/basic.c +++ b/src/basic.c @@ -10,6 +10,7 @@ struct basic_expr math_expressions[32]; int basic_errno; int basic_last_stored_lineno; +int basic_run_ip = 0; int basic_repl_mode = 0; /* 0 = REPL mode, 1 = RUN mode */ char _tokenizer_value[BASIC_TOKENIZER_MAX_LENGTH]; @@ -38,6 +39,18 @@ void basic_cmd_rem(void *expr) return; } +void basic_cmd_goto(void *data) +{ + int lineno; + if ( data == NULL ) { + basic_errno = BASIC_ERR_INVALID_ARGUMENTS; + return; + } + memset(decimal, 0x00, 32); + lineno = atoi(lstripseek(data)); + basic_run_ip = lineno-1; +} + void basic_cmd_list(void *data) { int i = 0; @@ -73,16 +86,15 @@ void basic_cmd_print(void *data) void basic_cmd_run(void *data) { - int i = 0; int rc = 0; char *lineptr; - for ( i = 0; i <= basic_last_stored_lineno ; i++ ) { + for ( basic_run_ip = 0; basic_run_ip <= basic_last_stored_lineno ; basic_run_ip++ ) { basic_errno = 0; - if ( basic_memory_lines[i][0] != 0x00 ) { - rc = basic_run_line_v2((char *)basic_memory_lines[i], 1); + if ( basic_memory_lines[basic_run_ip][0] != 0x00 ) { + rc = basic_run_line_v2((char *)basic_memory_lines[basic_run_ip], 1); if ( rc != 0 || basic_errno != 0 ) { _cputs("Error at Line "); - itoa(i+1, (char *)&decimal); + itoa(basic_run_ip+1, (char *)&decimal); _cputs(": "); _cputs((char *)&decimal); _cputs("\n"); @@ -220,6 +232,9 @@ int basic_run_line_v2(char *codeline, int repl_mode) } else if ( strcmp(token, "LIST") == 0 ) { basic_cmd_list(NULL); return basic_errno; + } else if ( strcmp(token, "GOTO") == 0 ) { + basic_cmd_goto(buffptr); + return basic_errno; } else if ( strcmp(token, "RUN") == 0 ) { basic_repl_mode = 1; return basic_errno; diff --git a/src/basic.h b/src/basic.h index 1381fb3..3541755 100644 --- a/src/basic.h +++ b/src/basic.h @@ -101,6 +101,7 @@ void basic_cmd_rem(void *data); void basic_cmd_print(void *data); void basic_cmd_list(void *data); void basic_cmd_run(void *data); +void basic_cmd_goto(void *data); void basic_print_var(basic_variable *var); void basic_report_error(char *prefix);