commit 28b0c89b7e0d2237a8b343275bbdc0eae7a575c2
parent 8c5edcb07f56102922ce11898d55e82080495ad0
Author: William Casarin <jb55@jb55.com>
Date: Sun, 12 Nov 2017 22:39:31 -0800
main working again
Diffstat:
6 files changed, 53 insertions(+), 12 deletions(-)
diff --git a/lexer.l b/lexer.l
@@ -23,6 +23,12 @@
[oO][pP]_ {}
+-?[0-9] {
+ s64 i = strtoll(yytext, NULL, 10);
+ yylval.val = val_from_int(i);
+ return T_VAL;
+}
+
[a-zA-Z0-9]+ {
yylval.opcode = op_tokenize(yytext);
return T_OP;
diff --git a/main.c b/main.c
@@ -10,6 +10,7 @@ extern FILE* yyin;
char * g_reader_buf;
char * g_reader_buf_top;
+struct stack g_reader_stack;
u32 g_reader_buf_cap;
void yyerror(const char* s);
@@ -19,25 +20,39 @@ int main() {
size_t size;
size_t bufsize = MAX_STACK_SIZE * MAX_STACK_SIZE;
+ int i;
int compiled_len;
u8 *buf = (u8*)malloc(bufsize);
struct stack tmp_stack;
alloc_arenas(0, MAX_STACK_SIZE, MAX_STACK_SIZE * MAX_STACK_SIZE);
stack_init(&tmp_stack);
+ stack_init(&g_reader_stack);
do {
yyparse();
} while(!feof(yyin));
size = g_reader_buf_top - g_reader_buf;
- script_serialize(g_reader_buf, buf, bufsize, &compiled_len);
- script_eval(buf, size, &tmp_stack);
- printf("script: ");
- script_print_ops(g_reader_buf, g_reader_buf_top);
- printf("stack: ");
+ printf("script ");
+ script_print_vals(&g_reader_stack);
+ script_serialize(&g_reader_stack, buf, bufsize, &compiled_len);
+ script_eval(buf, compiled_len, &tmp_stack);
+
+ printf("script_hex ");
+ for(i = 0; i < compiled_len; ++i)
+ printf("%02x", buf[i]);
+ printf("\n");
+
+ printf("stack ");
script_print_vals(&tmp_stack);
+ script_serialize(&tmp_stack, buf, bufsize, &compiled_len);
+
+ printf("stack_hex ");
+ for(i = 0; i < compiled_len; ++i)
+ printf("%02x", buf[i]);
+ printf("\n");
- stack_free(&g_reader_buf);
+ stack_free(&g_reader_stack);
stack_free(&tmp_stack);
free_arenas(0);
diff --git a/op.c b/op.c
@@ -360,10 +360,10 @@ val_print(struct val val) {
assert(val.ind != -1);
n = num_pool_get(val.ind);
assert(n);
- printf("sn:%lu", n->val);
+ printf("%lu", n->val);
break;
case VT_OP:
- printf("op:%d", val.ind);
+ printf("OP_%s", op_name(val.ind));
break;
case VT_SMALLINT:
printf("si:%d", val.ind);
diff --git a/parser.y b/parser.y
@@ -3,22 +3,29 @@
#include <stdio.h>
#include "op.h"
#include "stack.h"
+#include "valstack.h"
extern int yylex();
-extern struct stack reader_stack;
+extern struct stack g_reader_stack;
void yyerror(const char* s);
%}
%union {
enum opcode opcode;
+ s64 integer;
+ struct val val;
const char* str;
}
%token T_OP
+%token T_INT
+%token T_VAL
%token T_NEWLINE T_QUIT T_EXAMPLE
%type<opcode> T_OP
+%type<integer> T_INT
+%type<val> T_VAL
%type<str> T_EXAMPLE
%start script
@@ -30,7 +37,9 @@ script:
;
line: T_NEWLINE
- | T_OP { stack_push_op(&reader_stack, &$1); }
+ | T_INT { script_push_int(&g_reader_stack, $1); }
+ | T_VAL { stack_push_val(&g_reader_stack, $1); }
+ | T_OP { stack_push_op(&g_reader_stack, $1); }
| T_EXAMPLE { ; }
diff --git a/script.c b/script.c
@@ -650,7 +650,7 @@ void script_print_vals(struct stack *stack) {
while (p < stack->top) {
struct val val;
memcpy(&val, &*p++, sizeof(struct val));
- printf("s[%d] ", c++);
+ printf(" ");
val_print(val);
}
putchar('\n');
diff --git a/val.c b/val.c
@@ -36,6 +36,17 @@ val_serialize(struct val val, u16 *len, u8 *buf, int bufsize) {
case VT_SCRIPTNUM:
sn = num_pool_get(val.ind);
assert(sn);
+
+ /// TODO: if serialize_minimal
+ if (1) {
+ if (sn->val == -1) { *len = 1; *buf = OP_1NEGATE; return; }
+ if (sn->val == 0 ) { *len = 1; *buf = 0; return; }
+ if (sn->val >= 1 && sn->val <= 16 ) {
+ *len = 1;
+ *buf = OP_1 - 1 + sn->val;
+ return;
+ }
+ }
sn_serialize(sn, buf+1, bufsize - 1, &valsize);
assert(valsize <= 0xFF);
*buf = (u8)valsize;
@@ -54,7 +65,7 @@ val_serialize(struct val val, u16 *len, u8 *buf, int bufsize) {
*len = *len + 1;
}
else {
- assert(!"serialize bigger pushdatas");
+ assert(!"serialize bigger pushdata");
}
return;
}