aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2018-04-03 21:14:37 +0200
committerCamil Staps2018-04-03 21:14:37 +0200
commitb3f9bcbc307e3e8d455ccf560a61dc5129174728 (patch)
treec1a036d82a25452d8ade3ae29310a699aa809ddd
parentResolve #11: print end result as soon as it is in HNF (diff)
Store integers without pointers
-rw-r--r--interpreter/code.c23
-rw-r--r--interpreter/eval.c5
-rw-r--r--interpreter/graphs.c8
-rw-r--r--interpreter/lex.c5
-rw-r--r--interpreter/parse.c3
-rw-r--r--interpreter/print.c2
-rw-r--r--interpreter/syntax.c9
-rw-r--r--interpreter/syntax.h2
8 files changed, 29 insertions, 28 deletions
diff --git a/interpreter/code.c b/interpreter/code.c
index 88f58b7..f047add 100644
--- a/interpreter/code.c
+++ b/interpreter/code.c
@@ -7,12 +7,11 @@
#include "mem.h"
#include "print.h"
-void fill_node_int(struct node **node, int i) {
+void fill_node_int(struct node **node, INT i) {
unsigned int used_count = (*node)->used_count;
free_node(*node, used_count, 0);
(*node)->kind = NODE_INT;
- (*node)->var1 = my_calloc(1, sizeof(int));
- *((int*) (*node)->var1) = i;
+ (*node)->var1 = (void*) i;
use_node(*node, used_count);
}
@@ -45,63 +44,63 @@ void code_add(struct node **result, struct node *a, struct node *b) {
if (a->kind != NODE_INT || b->kind != NODE_INT)
fill_node_name(result, "add on non-ints");
else
- fill_node_int(result, *((int*) b->var1) + *((int*) a->var1));
+ fill_node_int(result, (INT) b->var1 + (INT) a->var1);
}
void code_mul(struct node **result, struct node *a, struct node *b) {
if (a->kind != NODE_INT || b->kind != NODE_INT)
fill_node_name(result, "mul on non-ints");
else
- fill_node_int(result, *((int*) a->var1) * *((int*) b->var1));
+ fill_node_int(result, (INT) a->var1 * (INT) b->var1);
}
void code_sub(struct node **result, struct node *a, struct node *b) {
if (a->kind != NODE_INT || b->kind != NODE_INT)
fill_node_name(result, "sub on non-ints");
else
- fill_node_int(result, *((int*) b->var1) - *((int*) a->var1));
+ fill_node_int(result, (INT) b->var1 - (INT) a->var1);
}
void code_eq(struct node **result, struct node *a, struct node *b) {
if (a->kind != NODE_INT || b->kind != NODE_INT)
fill_node_name(result, "eq on non-ints");
else
- fill_node_bool(result, *((int*) a->var1) == *((int*) b->var1));
+ fill_node_bool(result, (INT) a->var1 == (INT) b->var1);
}
void code_gt(struct node **result, struct node *a, struct node *b) {
if (a->kind != NODE_INT || b->kind != NODE_INT)
fill_node_name(result, "gt on non-ints");
else
- fill_node_bool(result, *((int*) a->var1) > *((int*) b->var1));
+ fill_node_bool(result, (INT) a->var1 > (INT) b->var1);
}
void code_ge(struct node **result, struct node *a, struct node *b) {
if (a->kind != NODE_INT || b->kind != NODE_INT)
fill_node_name(result, "ge on non-ints");
else
- fill_node_bool(result, *((int*) a->var1) >= *((int*) b->var1));
+ fill_node_bool(result, (INT) a->var1 >= (INT) b->var1);
}
void code_lt(struct node **result, struct node *a, struct node *b) {
if (a->kind != NODE_INT || b->kind != NODE_INT)
fill_node_name(result, "lt on non-ints");
else
- fill_node_bool(result, *((int*) a->var1) < *((int*) b->var1));
+ fill_node_bool(result, (INT) a->var1 < (INT) b->var1);
}
void code_le(struct node **result, struct node *a, struct node *b) {
if (a->kind != NODE_INT || b->kind != NODE_INT)
fill_node_name(result, "le on non-ints");
else
- fill_node_bool(result, *((int*) a->var1) <= *((int*) b->var1));
+ fill_node_bool(result, (INT) a->var1 <= (INT) b->var1);
}
void code_ne(struct node **result, struct node *a, struct node *b) {
if (a->kind != NODE_INT || b->kind != NODE_INT)
fill_node_name(result, "ne on non-ints");
else
- fill_node_bool(result, *((int*) a->var1) != *((int*) b->var1));
+ fill_node_bool(result, (INT) a->var1 != (INT) b->var1);
}
struct code_mapping {
diff --git a/interpreter/eval.c b/interpreter/eval.c
index b86c32f..cfcdb0c 100644
--- a/interpreter/eval.c
+++ b/interpreter/eval.c
@@ -103,7 +103,7 @@ bool match_expr(struct fuspel *rules, struct expression *expr, struct node **nod
switch (expr->kind) {
case EXPR_INT:
- return *((int*) (*node)->var1) == *((int*) expr->var1);
+ return (*node)->var1 == expr->var1;
case EXPR_NAME:
push_repl(_repls, (char*) expr->var1, *node);
@@ -349,7 +349,7 @@ void print_eval(FILE *out, struct fuspel *rules, struct node **node) {
switch ((*node)->kind) {
case NODE_INT:
- fprintf(out, "%d", *(int*)(*node)->var1);
+ fprintf(out, "%ld", (INT)(*node)->var1);
break;
case NODE_NAME:
fprintf(out, "%s", (char*)(*node)->var1);
@@ -373,6 +373,7 @@ void print_eval(FILE *out, struct fuspel *rules, struct node **node) {
eval(rules, &tl, true);
print_eval(out, rules, (struct node**) &tl->var1);
tl = (struct node*) tl->var2;
+ eval(rules, &tl, true);
}
}
fprintf(out, "]");
diff --git a/interpreter/graphs.c b/interpreter/graphs.c
index 91f9a19..dca2c53 100644
--- a/interpreter/graphs.c
+++ b/interpreter/graphs.c
@@ -50,7 +50,7 @@ void free_node(struct node *node, unsigned int count, bool free_first) {
}
if (node->used_count == 0) {
- if (node->kind == NODE_INT || node->kind == NODE_NAME)
+ if (node->kind == NODE_NAME)
my_free(node->var1);
if (node->kind == NODE_CODE)
@@ -111,8 +111,7 @@ void cpy_expression_to_node(struct node *dst, struct expression *src) {
dst->kind = src->kind;
switch (src->kind) {
case EXPR_INT:
- dst->var1 = my_calloc(1, sizeof(int));
- *((int*) dst->var1) = *((int*) src->var1);
+ dst->var1 = src->var1;
break;
case EXPR_NAME:
@@ -152,8 +151,7 @@ void cpy_node_to_expression(struct expression *dst, struct node *src) {
dst->kind = src->kind;
switch (src->kind) {
case NODE_INT:
- dst->var1 = my_calloc(1, sizeof(int));
- *((int*) dst->var1) = *((int*) src->var1);
+ dst->var1 = src->var1;
break;
case NODE_NAME:
diff --git a/interpreter/lex.c b/interpreter/lex.c
index c33d816..cc0241d 100644
--- a/interpreter/lex.c
+++ b/interpreter/lex.c
@@ -91,10 +91,9 @@ struct token_list *lex(struct token_list *list, char *input) {
char *s;
unsigned char len = lex_int_length(input);
s = my_calloc(1, len + 1);
- list->elems[list->index].kind = TOKEN_INT;
- list->elems[list->index].var = my_calloc(1, sizeof(int));
strncpy(s, input, len);
- *((int*) list->elems[list->index].var) = atoi(s);
+ list->elems[list->index].kind = TOKEN_INT;
+ list->elems[list->index].var = (void*)((INT)atoi(s));
my_free(s);
input += len - 1;
} else if (is_name_char(*input)) {
diff --git a/interpreter/parse.c b/interpreter/parse.c
index 2548262..cb2d311 100644
--- a/interpreter/parse.c
+++ b/interpreter/parse.c
@@ -32,8 +32,7 @@ bool parse_simple_expression(struct expression *expr, struct parsing_list *list)
switch (list->tokens->elems[list->i].kind) {
case TOKEN_INT:
expr->kind = EXPR_INT;
- expr->var1 = my_calloc(1, sizeof(int));
- *((int*) expr->var1) = *((int*) list->tokens->elems[list->i].var);
+ expr->var1 = list->tokens->elems[list->i].var;
list->i++;
return true;
diff --git a/interpreter/print.c b/interpreter/print.c
index d5134c9..67b99e8 100644
--- a/interpreter/print.c
+++ b/interpreter/print.c
@@ -64,7 +64,7 @@ void print_expression(struct expression *expr) {
switch (expr->kind) {
case EXPR_INT:
- printf("%d", *((int*) expr->var1));
+ printf("%ld", (INT) expr->var1);
break;
case EXPR_NAME:
printf("%s", (char*) expr->var1);
diff --git a/interpreter/syntax.c b/interpreter/syntax.c
index 015f820..a147d46 100644
--- a/interpreter/syntax.c
+++ b/interpreter/syntax.c
@@ -5,6 +5,8 @@
#include "mem.h"
void free_token(struct token *tk) {
+ if (tk->kind == TOKEN_INT)
+ return;
if (tk->var)
my_free(tk->var);
}
@@ -34,8 +36,7 @@ void cpy_expression(struct expression *dst, struct expression *src) {
dst->kind = src->kind;
switch (dst->kind) {
case EXPR_INT:
- dst->var1 = my_calloc(1, sizeof(int));
- *((int*) dst->var1) = *((int*) src->var1);
+ dst->var1 = src->var1;
break;
case EXPR_NAME:
dst->var1 = my_calloc(1, strlen((char*) src->var1) + 1);
@@ -64,7 +65,7 @@ bool eq_expression(struct expression *a, struct expression *b) {
return 0;
switch (a->kind) {
- case EXPR_INT: return *((int*) a->var1) == *((int*) b->var1);
+ case EXPR_INT: return a->var1 == b->var1;
case EXPR_NAME: return !strcmp(a->var1, b->var1);
case EXPR_CODE: return a->var1 == b->var1;
case EXPR_TUPLE:
@@ -118,6 +119,8 @@ void free_expression(struct expression *expr) {
switch (expr->kind) {
case EXPR_INT:
+ break;
+
case EXPR_NAME:
my_free(expr->var1);
break;
diff --git a/interpreter/syntax.h b/interpreter/syntax.h
index 8c3c336..e60c03e 100644
--- a/interpreter/syntax.h
+++ b/interpreter/syntax.h
@@ -3,6 +3,8 @@
#include <stdbool.h>
+typedef long int INT;
+
/* TOKENS */
enum token_kind {