diff options
Diffstat (limited to 'interpreter')
| -rw-r--r-- | interpreter/code.c | 23 | ||||
| -rw-r--r-- | interpreter/eval.c | 5 | ||||
| -rw-r--r-- | interpreter/graphs.c | 8 | ||||
| -rw-r--r-- | interpreter/lex.c | 5 | ||||
| -rw-r--r-- | interpreter/parse.c | 3 | ||||
| -rw-r--r-- | interpreter/print.c | 2 | ||||
| -rw-r--r-- | interpreter/syntax.c | 9 | ||||
| -rw-r--r-- | interpreter/syntax.h | 2 | 
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 {  | 
