From f5e4dfb35569783bbc494f247cbe6a5913c0beac Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Sat, 8 Oct 2016 13:46:04 -0400 Subject: Add quote to jrp and refactor jit --- .bin/jrp.c | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/.bin/jrp.c b/.bin/jrp.c index 1847bbe8..a7f71180 100755 --- a/.bin/jrp.c +++ b/.bin/jrp.c @@ -4,6 +4,7 @@ exec cc -Wall -Wextra $@ $0 -ledit -o $(dirname $0)/jrp #include #include +#include #include #include #include @@ -100,14 +101,14 @@ static void jit_fop(op fop) { *code.ptr++ = fop; } -static void jit_print(void) { +static void jit_push(value imm) { + jit_fop(FOP_PUSH); + jit_fop((op)imm); +} + +static void jit_call(void (*fn)(value)) { jit_fop(FOP_CRT); - switch (radix) { - case 2: jit_fop((op)rt_print_bin); break; - case 8: jit_fop((op)rt_print_oct); break; - case 10: jit_fop((op)rt_print_dec); break; - case 16: jit_fop((op)rt_print_hex); break; - } + jit_fop((op)fn); jit_fop(FOP_CALL); } @@ -117,13 +118,20 @@ static void jit(const char *src) { code.ptr = code.base; jit_fop(FOP_PROL); + bool quote = false; while (*src) { + if (quote) { + jit_push(*src++); + quote = false; + continue; + } switch (*src) { case ' ': break; - case 'b': radix = 2; break; - case 'o': radix = 8; break; - case 'd': radix = 10; break; - case 'x': radix = 16; break; + case 39: quote = true; break; + case 'b': radix = 2; break; + case 'o': radix = 8; break; + case 'd': radix = 10; break; + case 'x': radix = 16; break; case ';': jit_hop(HOP_DROP); break; case ':': jit_hop(HOP_DUP); break; case 92: jit_hop(HOP_SWAP); break; @@ -139,15 +147,19 @@ static void jit(const char *src) { case '^': jit_hop(HOP_XOR); break; case '<': jit_fop(FOP_SHL); break; case '>': jit_fop(FOP_SHR); break; - case ',': jit_fop(FOP_CRT); jit_fop((op)rt_print_ascii); jit_fop(FOP_CALL); break; - case '.': jit_print(); break; + case ',': jit_call(rt_print_ascii); break; + case '.': switch (radix) { + case 2: jit_call(rt_print_bin); break; + case 8: jit_call(rt_print_oct); break; + case 10: jit_call(rt_print_dec); break; + case 16: jit_call(rt_print_hex); break; + } break; default: { char *rest; value val = strtoll(src, &rest, radix); if (rest != src) { src = rest; - jit_fop(FOP_PUSH); - jit_fop((op)val); + jit_push(val); continue; } } -- cgit 1.4.1