Added echo to output data wthout a newline. (0.36.2)
This commit is contained in:
parent
9dc8afc387
commit
b1e1160bff
6 changed files with 35 additions and 2 deletions
|
|
@ -1,5 +1,5 @@
|
|||
cmake_minimum_required(VERSION 3.10)
|
||||
project(fun VERSION 0.36.1 LANGUAGES C)
|
||||
project(fun VERSION 0.36.2 LANGUAGES C)
|
||||
|
||||
set(CMAKE_C_STANDARD 99)
|
||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||
|
|
|
|||
|
|
@ -77,6 +77,7 @@ static const char *opcode_name(OpCode op) {
|
|||
case OP_CALL: return "CALL";
|
||||
case OP_RETURN: return "RETURN";
|
||||
case OP_PRINT: return "PRINT";
|
||||
case OP_ECHO: return "ECHO";
|
||||
case OP_HALT: return "HALT";
|
||||
case OP_MOD: return "MOD";
|
||||
case OP_AND: return "AND";
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ typedef enum {
|
|||
OP_RETURN, // pop optional return value and return to caller
|
||||
|
||||
OP_PRINT,
|
||||
OP_ECHO, // like print but does not append a newline; prints immediately
|
||||
OP_HALT,
|
||||
|
||||
OP_LINE, // operand = source line number (debug marker)
|
||||
|
|
|
|||
30
src/parser.c
30
src/parser.c
|
|
@ -2806,6 +2806,21 @@ static void parse_simple_statement(Bytecode *bc, const char *src, size_t len, si
|
|||
return;
|
||||
}
|
||||
|
||||
if (strcmp(name, "echo") == 0) {
|
||||
free(name);
|
||||
skip_spaces(src, len, &local_pos);
|
||||
(void)consume_char(src, len, &local_pos, '(');
|
||||
if (emit_expression(bc, src, len, &local_pos)) {
|
||||
(void)consume_char(src, len, &local_pos, ')');
|
||||
bytecode_add_instruction(bc, OP_ECHO, 0);
|
||||
} else {
|
||||
(void)consume_char(src, len, &local_pos, ')');
|
||||
}
|
||||
*pos = local_pos;
|
||||
skip_to_eol(src, len, pos);
|
||||
return;
|
||||
}
|
||||
|
||||
/* assignment or simple call */
|
||||
int lidx = local_find(name);
|
||||
int gi = (lidx < 0) ? sym_index(name) : -1;
|
||||
|
|
@ -3120,6 +3135,21 @@ static void parse_simple_statement(Bytecode *bc, const char *src, size_t len, si
|
|||
return;
|
||||
}
|
||||
|
||||
/* echo(expr): like print but does not add a newline (immediate output) */
|
||||
if (starts_with(src, len, *pos, "echo")) {
|
||||
*pos += 4;
|
||||
skip_spaces(src, len, pos);
|
||||
(void)consume_char(src, len, pos, '(');
|
||||
if (emit_expression(bc, src, len, pos)) {
|
||||
(void)consume_char(src, len, pos, ')');
|
||||
bytecode_add_instruction(bc, OP_ECHO, 0);
|
||||
} else {
|
||||
(void)consume_char(src, len, pos, ')');
|
||||
}
|
||||
skip_to_eol(src, len, pos);
|
||||
return;
|
||||
}
|
||||
|
||||
/* unknown token: report error */
|
||||
parser_fail(*pos, "Unknown token at start of statement");
|
||||
}
|
||||
|
|
|
|||
1
src/vm.c
1
src/vm.c
|
|
@ -794,6 +794,7 @@ void vm_run(VM *vm, Bytecode *entry) {
|
|||
#include "vm/len.c"
|
||||
#include "vm/line.c"
|
||||
#include "vm/print.c"
|
||||
#include "vm/echo.c"
|
||||
#include "vm/to_number.c"
|
||||
#include "vm/to_string.c"
|
||||
#include "vm/cast.c"
|
||||
|
|
|
|||
2
src/vm.h
2
src/vm.h
|
|
@ -22,7 +22,7 @@ static const char *opcode_names[] = {
|
|||
"NOP","LOAD_CONST","LOAD_LOCAL","STORE_LOCAL",
|
||||
"LOAD_GLOBAL","STORE_GLOBAL","ADD","SUB","MUL","DIV",
|
||||
"LT","LTE","GT","GTE","EQ","NEQ","POP","JUMP",
|
||||
"JUMP_IF_FALSE","CALL","RETURN","PRINT","HALT",
|
||||
"JUMP_IF_FALSE","CALL","RETURN","PRINT","ECHO","HALT",
|
||||
"LINE",
|
||||
"MOD","AND","OR","NOT","DUP","SWAP",
|
||||
"MAKE_ARRAY","INDEX_GET","INDEX_SET",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue