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)
|
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 99)
|
||||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,7 @@ static const char *opcode_name(OpCode op) {
|
||||||
case OP_CALL: return "CALL";
|
case OP_CALL: return "CALL";
|
||||||
case OP_RETURN: return "RETURN";
|
case OP_RETURN: return "RETURN";
|
||||||
case OP_PRINT: return "PRINT";
|
case OP_PRINT: return "PRINT";
|
||||||
|
case OP_ECHO: return "ECHO";
|
||||||
case OP_HALT: return "HALT";
|
case OP_HALT: return "HALT";
|
||||||
case OP_MOD: return "MOD";
|
case OP_MOD: return "MOD";
|
||||||
case OP_AND: return "AND";
|
case OP_AND: return "AND";
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ typedef enum {
|
||||||
OP_RETURN, // pop optional return value and return to caller
|
OP_RETURN, // pop optional return value and return to caller
|
||||||
|
|
||||||
OP_PRINT,
|
OP_PRINT,
|
||||||
|
OP_ECHO, // like print but does not append a newline; prints immediately
|
||||||
OP_HALT,
|
OP_HALT,
|
||||||
|
|
||||||
OP_LINE, // operand = source line number (debug marker)
|
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;
|
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 */
|
/* assignment or simple call */
|
||||||
int lidx = local_find(name);
|
int lidx = local_find(name);
|
||||||
int gi = (lidx < 0) ? sym_index(name) : -1;
|
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;
|
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 */
|
/* unknown token: report error */
|
||||||
parser_fail(*pos, "Unknown token at start of statement");
|
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/len.c"
|
||||||
#include "vm/line.c"
|
#include "vm/line.c"
|
||||||
#include "vm/print.c"
|
#include "vm/print.c"
|
||||||
|
#include "vm/echo.c"
|
||||||
#include "vm/to_number.c"
|
#include "vm/to_number.c"
|
||||||
#include "vm/to_string.c"
|
#include "vm/to_string.c"
|
||||||
#include "vm/cast.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",
|
"NOP","LOAD_CONST","LOAD_LOCAL","STORE_LOCAL",
|
||||||
"LOAD_GLOBAL","STORE_GLOBAL","ADD","SUB","MUL","DIV",
|
"LOAD_GLOBAL","STORE_GLOBAL","ADD","SUB","MUL","DIV",
|
||||||
"LT","LTE","GT","GTE","EQ","NEQ","POP","JUMP",
|
"LT","LTE","GT","GTE","EQ","NEQ","POP","JUMP",
|
||||||
"JUMP_IF_FALSE","CALL","RETURN","PRINT","HALT",
|
"JUMP_IF_FALSE","CALL","RETURN","PRINT","ECHO","HALT",
|
||||||
"LINE",
|
"LINE",
|
||||||
"MOD","AND","OR","NOT","DUP","SWAP",
|
"MOD","AND","OR","NOT","DUP","SWAP",
|
||||||
"MAKE_ARRAY","INDEX_GET","INDEX_SET",
|
"MAKE_ARRAY","INDEX_GET","INDEX_SET",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue