WIP. Somewhere in between the init of basic_cmd_run and basic_cmd_list calls to _cputs stop working with constant character string pointers and only work with pointers off the heap.

This commit is contained in:
2024-05-12 08:54:11 -04:00
parent 0826d1946b
commit f2cab38cf2

View File

@@ -42,27 +42,37 @@ void basic_cmd_rem(void *expr)
void basic_cmd_list(void *data) void basic_cmd_list(void *data)
{ {
int i = 0; int i = 0;
int x = 0;
int limit = basic_last_stored_lineno; int limit = basic_last_stored_lineno;
char *lineptr = NULL; char *lineptr = NULL;
i = 0; i = 0;
/* I don't know why, but somehow, this makes the interspersed _cputs() calls below work. /* I don't know why, but somehow, this makes the interspersed _cputs() calls below work.
* Take this out, and those lines stop working. * Take this out, and those lines stop working.
*
* WHAT. THE. FUCK. * WHAT. THE. FUCK.
*
*
* memcpy((char *)&const_string_test, (char *)" \0", strlen(" \0"));
* _cputs((char *)&const_string_test);
*/ */
memcpy((char *)&const_string_test, (char *)"OMG WTF BBQ\n\0", strlen("OMG WTF BBQ\n\0")); /* 12 characters of nothing? This does the same thing as the cputs above.
_cputs((char *)&const_string_test); * But cputs is still broken after this. It's the memcpy that is fixing whatever is wrong.
*/
/*for ( i = 0; i < 12; i++ ) {
_putch(' ');
advanceCursor();
}*/
for ( i = 0; i <= limit ; i++ ) { for ( i = 0; i <= limit ; i++ ) {
lineptr = basic_memory_line_address(i); if ( basic_memory_lines[i][0] != 0 ) {
if ( lineptr == NULL ) {
continue;
}
if ( (char)*lineptr != 0x00 ) {
itoa(i+1, (char *)&decimal); itoa(i+1, (char *)&decimal);
_cputs((char *)&decimal); _cputs((char *)&decimal);
_cputs(" WTF"); _putch(' ');
_cputs(lineptr); advanceCursor();
_cputs("BBQ\n"); _cputs(basic_memory_line_address(i));
_putch('\n');
_cursor_x = 80;
advanceCursor();
} }
} }
} }
@@ -86,9 +96,9 @@ void basic_cmd_run(void *data)
char *lineptr; char *lineptr;
for ( i = 0; i <= basic_last_stored_lineno ; i++ ) { for ( i = 0; i <= basic_last_stored_lineno ; i++ ) {
basic_errno = 0; basic_errno = 0;
lineptr = basic_memory_line_address(i); /*lineptr = basic_memory_line_address(i);*/
if ( (char)*lineptr != 0x00 ) { if ( basic_memory_lines[i][0] != 0x00 ) {
rc = basic_run_line_v2(lineptr, 0); rc = basic_run_line_v2((char *)basic_memory_lines[i], 1);
if ( rc != 0 || basic_errno != 0 ) { if ( rc != 0 || basic_errno != 0 ) {
_cputs("Error at Line "); _cputs("Error at Line ");
itoa(i+1, (char *)&decimal); itoa(i+1, (char *)&decimal);
@@ -134,20 +144,21 @@ char *_tokenize(char *ptr, char *token)
memset(&_tokenizer_value, 0x00, BASIC_TOKENIZER_MAX_LENGTH); memset(&_tokenizer_value, 0x00, BASIC_TOKENIZER_MAX_LENGTH);
while ( *ptr != 0x0 ) { while ( *ptr != 0x0 ) {
tokenptr = token; /*for ( tokenptr = token ; *tokenptr != 0x00; tokenptr += 1) {
for ( i = 0 ; i < numtokens; i++) { if ( *ptr == *tokenptr) {
if ( *ptr == *(tokenptr + i)) { goto _tokenize_copy;*/
if ( len == 0 ) { if ( *ptr == ' ' ) {
len = 1; break;
ptr += 1;
}
goto _tokenize_copy;
} }
} /*}*/
ptr += 1; ptr += 1;
len += 1; len += 1;
} }
_tokenize_copy: _tokenize_copy:
if ( len == 0 ) {
len = 1;
ptr += 1;
}
if ( len > BASIC_TOKENIZER_MAX_LENGTH ) { if ( len > BASIC_TOKENIZER_MAX_LENGTH ) {
basic_errno = BASIC_ERR_SYNTAX_TOKEN_LENGTH; basic_errno = BASIC_ERR_SYNTAX_TOKEN_LENGTH;
return NULL; return NULL;
@@ -192,9 +203,10 @@ int basic_memory_line_store(char *content, int lineno)
* through to LIST those lines later we may find garbage. Let's clean it up. * through to LIST those lines later we may find garbage. Let's clean it up.
*/ */
for ( i = basic_last_stored_lineno+1; i <= lineno ; i++ ) { for ( i = basic_last_stored_lineno+1; i <= lineno ; i++ ) {
ptr = basic_memory_line_address(i);
/* We don't need to zero the entire string, just the first character, don't waste time */ /* We don't need to zero the entire string, just the first character, don't waste time */
memset(ptr, 0x00, BASIC_MAX_LINE_LENGTH); basic_memory_lines[i][0] = 0x00;
/*ptr = basic_memory_line_address(i);*/
/*memset(ptr, 0x00, BASIC_MAX_LINE_LENGTH);*/
} }
} }
lineno -= 1; lineno -= 1;
@@ -246,6 +258,7 @@ int basic_run_line_v2(char *codeline, int repl_mode)
/* Report errors */ /* Report errors */
if ( basic_errno != 0 ) { if ( basic_errno != 0 ) {
/*_cputs(token);*/
basic_report_error("Parsing error: "); basic_report_error("Parsing error: ");
} }
@@ -289,11 +302,10 @@ void basic_repl(void)
char keybuff[512]; char keybuff[512];
int i; int i;
char *ptr; char *ptr;
char *token;
blankScreen(); blankScreen();
setCursorPosition(0, 0); setCursorPosition(0, 0);
_cputs("Piquant Basic v0.1\n");
_cputs("READY\n");
basic_repl_mode = 1; basic_repl_mode = 1;
basic_memory_line_store("LIST", 10); basic_memory_line_store("LIST", 10);
@@ -301,13 +313,29 @@ void basic_repl(void)
basic_memory_line_store("PRINT WORLD\n", 30); basic_memory_line_store("PRINT WORLD\n", 30);
basic_memory_line_store("PRINT GOODBYE\n", 40); basic_memory_line_store("PRINT GOODBYE\n", 40);
_cputs("Piquant Basic v0.1\n");
_cputs("READY\n");
while ( 1 ) { while ( 1 ) {
basic_errno = 0; basic_errno = 0;
if ( basic_repl_mode == 1 ) { if ( basic_repl_mode == 1 ) {
basic_cmd_run(NULL); basic_cmd_run(NULL);
/*basic_cmd_list(NULL);
ptr = _tokenize((char *)&basic_memory_lines[19], " ");
token = tokenizer_token();
basic_cmd_print(ptr);
ptr = _tokenize((char *)&basic_memory_lines[29], " ");
token = tokenizer_token();
basic_cmd_print(ptr);
ptr = _tokenize((char *)&basic_memory_lines[39], " ");
token = tokenizer_token();
basic_cmd_print(ptr);
basic_run_line_v2((char *)&basic_memory_lines[19], 1);
basic_run_line_v2((char *)&basic_memory_lines[29], 1);
basic_run_line_v2((char *)&basic_memory_lines[39], 1);*/
basic_repl_mode = 0; basic_repl_mode = 0;
} }
_cputs("> "); _cputs("\n> ");
/* Read */ /* Read */
memset((void *)&keybuff, 0x00, 512); memset((void *)&keybuff, 0x00, 512);