From 683b47f2454cdab5f6989240743e11e42900c215 Mon Sep 17 00:00:00 2001 From: Andrew Kesterson Date: Sun, 12 May 2024 21:28:27 -0400 Subject: [PATCH] WIP : Eff it, I left the magic memcpy in. Printing mostly works but it's still broken. Calls to _cputs and _cputsf may mysteriously fail due to some kind of memory corruption I haven't tracked down yet. This commit leaves in a bunch of commented testing code, the next commit will rip them out. --- media/screenshot.png | Bin 14962 -> 15789 bytes src/basic.c | 85 +++++++++++++++++++------------------------ src/conio.c | 72 +++++++++++++++++++++++++++++++++--- src/conio.h | 4 ++ 4 files changed, 108 insertions(+), 53 deletions(-) diff --git a/media/screenshot.png b/media/screenshot.png index 4ce69ad11d917ab3fa7fb88f9d0797d21d5ae140..41e7b3d682fdac50bf4b6c01032a7ebe84fb4a95 100644 GIT binary patch literal 15789 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 literal 14962 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 b8G!{M;qQ!1U&R3(L0Y% basic_last_stored_lineno ) { /* * basic_last_stored_lineno only every grows upward (even if you go back and edit a line or insert one). @@ -208,14 +195,14 @@ int basic_memory_line_store(char *content, int lineno) /*ptr = basic_memory_line_address(i);*/ /*memset(ptr, 0x00, BASIC_MAX_LINE_LENGTH);*/ } + basic_last_stored_lineno = lineno; } lineno -= 1; - i = (int) memcpy(basic_memory_line_address(lineno), content, strlen(content)); + i = (int) memcpy(basic_memory_lines[lineno], content, strlen(content)); if ( i == 0 ) { basic_errno = BASIC_ERR_INTERNAL_NULLPOINTER; return 1; } - basic_last_stored_lineno = lineno; } int basic_run_line_v2(char *codeline, int repl_mode) @@ -238,7 +225,7 @@ int basic_run_line_v2(char *codeline, int repl_mode) /* is it a line number? If so, store it and do nothing else.*/ if ( isdigit(*token) ) { - memset((char *)&decimal, 0x00, 32); + memset(decimal, 0x00, 32); lineno = atoi(token); basic_memory_line_store(buffptr, lineno); return 0; @@ -258,8 +245,11 @@ int basic_run_line_v2(char *codeline, int repl_mode) /* Report errors */ if ( basic_errno != 0 ) { - /*_cputs(token);*/ - basic_report_error("Parsing error: "); + /*_cputs("Last parsed token: "); + _cputs(token); + _cputs("\n");*/ + _cputsf("Parsing error: %d", basic_errno); + return 1; } /* Move to the next thing in the line and process it */ @@ -307,12 +297,13 @@ void basic_repl(void) blankScreen(); setCursorPosition(0, 0); - basic_repl_mode = 1; - basic_memory_line_store("LIST", 10); - basic_memory_line_store("PRINT HELLO\n", 20); - basic_memory_line_store("PRINT WORLD\n", 30); - basic_memory_line_store("PRINT GOODBYE\n", 40); - + /* + * basic_repl_mode = 1; + * basic_memory_line_store("LIST", 10); + * basic_memory_line_store("PRINT HELLO\\n", 20); + * basic_memory_line_store("PRINT WORLD\\n", 30); + * basic_memory_line_store("PRINT GOODBYE\\n", 40); + */ _cputs("Piquant Basic v0.1\n"); _cputs("READY\n"); @@ -330,9 +321,9 @@ void basic_repl(void) 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_run_line_v2(basic_memory_lines[19], 1); + basic_run_line_v2(basic_memory_lines[29], 1); + basic_run_line_v2(basic_memory_lines[39], 1);*/ basic_repl_mode = 0; } _cputs("\n> "); diff --git a/src/conio.c b/src/conio.c index 0108c83..52a84b3 100644 --- a/src/conio.c +++ b/src/conio.c @@ -6,6 +6,8 @@ #include #endif +char decimal[32]; + void _putch(char c) { #ifndef __GNUC__ @@ -27,17 +29,75 @@ void _putch(char c) #endif } -void _cputs(char *ptr) +void _cputs(char *ptr) { if ( ptr == NULL ) { return; } - while ((char)*ptr != 0x0) { - _putch((char)*ptr); - if (*ptr == '\n') { - _cursor_x = 80; + while (*ptr != 0x0) { + if (*ptr == '\\') { + ptr += 1; + switch ( *ptr ) { + case 'n': + _putch('\n'); + _cursor_x = 80; + advanceCursor(); + break; + } + } else { + _putch(*ptr); + if (*ptr == '\n') { + _cursor_x = 80; + } + advanceCursor(); + } + ptr += 1; + } + return; +} + +void _cputsf(char *ptr, char *data) +{ + if ( ptr == NULL || data == NULL) { + return; + } + + /*_cputs("_cputsf called with ptr : "); + memset(decimal, 0x00, 32); + itoa((int)ptr, decimal); + _cputs(decimal); + _cputs(" ("); + _cputs(ptr); + _cputs(") length "); + memset(decimal, 0x00, 32); + itoa(strlen(ptr), decimal); + _cputs(decimal); + _cputs(" data "); + memset(decimal, 0x00, 32); + itoa((int)data, decimal); + _cputs(decimal); + _cputs("\n");*/ + + while (*ptr != 0) { + if ( *ptr == '%' ) { + ptr += 1; + switch ( *ptr ) { + case 'd': + memset(decimal, 0x00, 32); + itoa((int)data, decimal); + _cputs(decimal); + break; + case 's': + _cputs((char *)data); + break; + } + } else { + _putch(*ptr); + if (*ptr == '\n') { + _cursor_x = 80; + } + advanceCursor(); } - advanceCursor(); ptr += 1; } return; diff --git a/src/conio.h b/src/conio.h index fdb940a..0492881 100644 --- a/src/conio.h +++ b/src/conio.h @@ -4,6 +4,10 @@ void _putch(char _c); char *_cgets(char *d); void _cputs(char *d); +void _cputsf(char *d, char *data); char _getkey(char *dest); + +extern char decimal[32]; + #endif /* _CONIO_H_ */