From b743e03fc6042e3e2d55cfa0387c092824de64c5 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sun, 24 Oct 2021 09:52:09 +0200 Subject: Add print/display/newline ops --- src/bytecode/vm.h | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'src/bytecode/vm.h') diff --git a/src/bytecode/vm.h b/src/bytecode/vm.h index b3dd8c3..f1886ec 100755 --- a/src/bytecode/vm.h +++ b/src/bytecode/vm.h @@ -159,8 +159,37 @@ vm_interpret(VM *vm, Chunk *chunk) { case OP_GREATER: { FIXNUM_COMPARE_OP(>); } break; case OP_LESS_EQUAL: { FIXNUM_COMPARE_OP(<=); } break; case OP_GREATER_EQUAL: { FIXNUM_COMPARE_OP(>=); } break; - case OP_RETURN: { + case OP_DISPLAY: { display(array_pop(vm->stack)); + } break; + case OP_PRINT: { + Object obj = array_pop(vm->stack); + if (!IS_STRING(obj)) { + WRONG_ARG_ERR(); + } + StringView scanner = (StringView) { + .start = obj.text, + .n = array_size(obj.text), + }; + while (scanner.n != 0) { + char c = sv_next(&scanner); + if (c == '\\' && sv_peek(&scanner) == 'n') { + putchar('\n'); + sv_next(&scanner); + continue; + } + if (c == '\\' && sv_peek(&scanner) == '"') { + putchar('"'); + sv_next(&scanner); + continue; + } + putchar(c); + } + } break; + case OP_NEWLINE: { + printf("\n"); + } break; + case OP_RETURN: { printf("\n"); return; } break; -- cgit v1.2.1