summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkdx <kikoodx@paranoici.org>2023-06-14 20:21:15 +0200
committerkdx <kikoodx@paranoici.org>2023-06-14 20:21:15 +0200
commit69aa1b02d3064813da5d19b13ffef231501d58ca (patch)
tree97688ff52373b8eade5323718c28513833bcaea6
parent626accfd7fefdf0b8f79a2c95a881620a9b6bd0f (diff)
downloadgolem-69aa1b02d3064813da5d19b13ffef231501d58ca.tar.gz
cracked defines
-rw-r--r--samples/define.golem8
-rw-r--r--samples/malloc.golem6
-rw-r--r--src/main.c63
3 files changed, 67 insertions, 10 deletions
diff --git a/samples/define.golem b/samples/define.golem
new file mode 100644
index 0000000..778a9c7
--- /dev/null
+++ b/samples/define.golem
@@ -0,0 +1,8 @@
+define A = 5;
+define A_SQUARED = A * A;
+define B = A - A_SQUARED + (A_SQUARED / A * 2);
+global array[B];
+
+main() {
+ dbg B;
+}
diff --git a/samples/malloc.golem b/samples/malloc.golem
index 762f78f..27502d4 100644
--- a/samples/malloc.golem
+++ b/samples/malloc.golem
@@ -1,6 +1,7 @@
main() {
local s;
s = strdup("coucou le monde");
+ dbg s;
puts(s);
stoupper(s);
puts(s);
@@ -37,9 +38,9 @@ strcpy(dst, src) {
i = 0;
loop {
[dst + i] = [src + i];
- i = i + 1;
if ([src + i] == 0)
return dst;
+ i = i + 1;
}
}
@@ -51,7 +52,8 @@ stoupper(s) {
}
}
-global heap[4096] = 0x69;
+define HEAP_SIZE = 4096;
+global heap[HEAP_SIZE] = 0x69;
global heap_size = 0;
malloc(n) {
local p;
diff --git a/src/main.c b/src/main.c
index 0d1e22c..9f55de1 100644
--- a/src/main.c
+++ b/src/main.c
@@ -337,7 +337,7 @@ new_num(int val)
static Node *stmt(Token **rest, Token *tok);
static Node *function(Token **rest, Token *tok);
-void define(Token **rest, Token *tok);
+static void define(Token **rest, Token *tok);
static Node *global(Token **rest, Token *tok);
static Node *local(Token **rest, Token *tok);
static Node *expr(Token **rest, Token *tok);
@@ -392,14 +392,14 @@ function(Token **rest, Token *tok)
return node;
}
-void
+static void
define(Token **rest, Token *tok)
{
tok = skip(tok, "define");
Node *store = new_word(tok);
tok = skip(tok->next, "=");
- store->val = get_number(tok);
- *rest = skip(tok->next, ";");
+ store->rhs = expr(&tok, tok);
+ *rest = skip(tok, ";");
store->type = NOD_DEFINE;
store->next = defines;
@@ -417,8 +417,8 @@ global(Token **rest, Token *tok)
if (equal(tok, "[")) {
tok = tok->next;
- node->lhs = new_num(get_number(tok));
- tok = skip(tok->next, "]");
+ node->lhs = expr(&tok, tok);
+ tok = skip(tok, "]");
}
if (equal(tok, "=")) {
@@ -918,6 +918,8 @@ gen_expr(Node *node)
printf("\t%s\n", op);
}
+static int const_expr(Node *node);
+
static void
gen_globaldec(Node *node)
{
@@ -925,7 +927,8 @@ gen_globaldec(Node *node)
if (node->lhs != NULL) {
printf("\t,__gla_%.*s\n", node->len, node->loc);
printf("@__gla_%.*s\n", node->len, node->loc);
- for (int i = 0; i < node->lhs->val; i++)
+ const int len = const_expr(node->lhs);
+ for (int i = 0; i < len; i++)
printf("\t%04x\n", node->val);
} else
printf("\t%04x\n", node->val);
@@ -950,6 +953,49 @@ gen_fncall(Node *node)
}
}
+static int
+get_define(Node *node)
+{
+ const int define_idx = node_find(defines, node);
+ if (define_idx != -1)
+ return const_expr(node_get(defines, define_idx)->rhs);
+ error("define '%.*s doesn't exist\n", node->len, node->loc);
+ return 0;
+}
+
+static int
+const_expr(Node *node)
+{
+ Node *const lhs = node->lhs;
+ Node *const rhs = node->rhs;
+
+ switch (node->type) {
+ case NOD_ADD: return const_expr(lhs) + const_expr(rhs);
+ case NOD_SUB: return const_expr(lhs) - const_expr(rhs);
+ case NOD_MUL: return const_expr(lhs) * const_expr(rhs);
+ case NOD_DIV: return const_expr(lhs) / const_expr(rhs);
+ case NOD_EQU: return const_expr(lhs) == const_expr(rhs);
+ case NOD_NEQ: return const_expr(lhs) != const_expr(rhs);
+ case NOD_LT: return const_expr(lhs) < const_expr(rhs);
+ case NOD_LTE: return const_expr(lhs) <= const_expr(rhs);
+ case NOD_GT: return const_expr(lhs) > const_expr(rhs);
+ case NOD_GTE: return const_expr(lhs) >= const_expr(rhs);
+ case NOD_AND: return const_expr(lhs) & const_expr(rhs);
+ case NOD_OR: return const_expr(lhs) | const_expr(rhs);
+ case NOD_XOR: return const_expr(lhs) ^ const_expr(rhs);
+ default: break;
+ }
+
+ switch (node->type) {
+ case NOD_NUM: return node->val;
+ case NOD_WORD: return get_define(node);
+ default: break;
+ }
+
+ error("const expr doesn't support %d expression", node->type);
+ return 0;
+}
+
static void
gen_variableget(Node *node)
{
@@ -957,7 +1003,8 @@ gen_variableget(Node *node)
const int found = node_find(locals, node);
if (define_idx != -1)
- printf("\tLIT %04x\n", node_get(defines, define_idx)->val);
+ printf("\tLIT %04x\n",
+ (unsigned)const_expr(node_get(defines, define_idx)->rhs) % 0x10000);
else if (found != -1) {
printf("\tLIT ,__stack_ptr LDA\n");
if (locals_size - found - 1)