diff --git a/src/operations/node.c b/src/operations/node.c index 42e1f94..321f1a1 100644 --- a/src/operations/node.c +++ b/src/operations/node.c @@ -14,7 +14,7 @@ struct Node* make_node(int type, struct Value* value, std::string id) { int i; /* allocate space */ - struct Node* node = (struct Node*) malloc(sizeof(struct Node)); + struct Node* node = new Node(); /* set properties */ node->type = type; diff --git a/src/operations/operators.c b/src/operations/operators.c index 99d70db..ba6b496 100644 --- a/src/operations/operators.c +++ b/src/operations/operators.c @@ -21,7 +21,7 @@ struct Value* add(struct Value* x, struct Value* y) { } else if (x->type == DOUBLE && y->type == LONG) { ans = make_double(get_double(x) + get_long(y)); } else if (x->type == STRING && y->type == STRING) { - ans = make_string(strcat(get_string(x), get_string(y))); + ans = make_string(get_string(x) + get_string(y)); } else { // Both are DOUBLE ans = make_double(get_double(x) + get_double(y)); } @@ -109,7 +109,7 @@ struct Value* less(struct Value* x, struct Value* y) { } else if (x->type == DOUBLE && y->type == LONG) { ans = make_boolean(get_double(x) < get_long(y)); } else if (x->type == STRING && y->type == STRING) { - ans = make_boolean(strcmp(get_string(x), get_string(y)) < 0); + ans = make_boolean(get_string(x).compare(get_string(y)) < 0); } else { // Both are DOUBLE ans = make_boolean(get_double(x) < get_double(y)); } @@ -134,7 +134,7 @@ struct Value* greater(struct Value* x, struct Value* y) { } else if (x->type == DOUBLE && y->type == LONG) { ans = make_boolean(get_double(x) > get_long(y)); } else if (x->type == STRING && y->type == STRING) { - ans = make_boolean(strcmp(get_string(x), get_string(y)) > 0); + ans = make_boolean(get_string(x).compare(get_string(y)) > 0); } else { // Both are DOUBLE ans = make_boolean(get_double(x) > get_double(y)); } @@ -159,7 +159,7 @@ struct Value* less_equal(struct Value* x, struct Value* y) { } else if (x->type == DOUBLE && y->type == LONG) { ans = make_boolean(get_double(x) <= get_long(y)); } else if (x->type == STRING && y->type == STRING) { - ans = make_boolean(strcmp(get_string(x), get_string(y)) <= 0); + ans = make_boolean(get_string(x).compare(get_string(y)) <= 0); } else { // Both are DOUBLE ans = make_boolean(get_double(x) <= get_double(y)); } @@ -184,7 +184,7 @@ struct Value* greater_equal(struct Value* x, struct Value* y) { } else if (x->type == DOUBLE && y->type == LONG) { ans = make_boolean(get_double(x) >= get_long(y)); } else if (x->type == STRING && y->type == STRING) { - ans = make_boolean(strcmp(get_string(x), get_string(y)) >= 0); + ans = make_boolean(get_string(x).compare(get_string(y)) >= 0); } else { // Both are DOUBLE ans = make_boolean(get_double(x) >= get_double(y)); } @@ -212,7 +212,7 @@ struct Value* equals(struct Value* x, struct Value* y) { } else if (x->type == BOOLEAN && y->type == BOOLEAN) { ans = make_boolean(get_long(x) == get_long(y)); } else if (x->type == STRING && y->type == STRING) { - ans = make_boolean(strcmp(get_string(x), get_string(y)) == 0); + ans = make_boolean(get_string(x).compare(get_string(y)) == 0); } else { // Type is a mix between boolean and another type fprintf(stderr, "Error, cannot compare a boolean with another type.\n"); } @@ -240,7 +240,7 @@ struct Value* not_equals(struct Value* x, struct Value* y) { } else if (x->type == BOOLEAN && y->type == BOOLEAN) { ans = make_boolean(get_long(x) != get_long(y)); } else if (x->type == STRING && y->type == STRING) { - ans = make_boolean(strcmp(get_string(x), get_string(y)) != 0); + ans = make_boolean(get_string(x).compare(get_string(y)) != 0); } else { // Type is a mix between boolean and another type fprintf(stderr, "Error, cannot compare a boolean with another type.\n"); } diff --git a/src/variables/environment.c b/src/variables/environment.c index f89c0b3..74f99c6 100644 --- a/src/variables/environment.c +++ b/src/variables/environment.c @@ -5,7 +5,7 @@ #include "variable.h" struct Environment* create_environment(void) { - struct Environment* env = (struct Environment*) malloc(sizeof(struct Environment)); + struct Environment* env = new Environment(); env->num_vars = 0; for(int i = 0; i < MAX_VARIABLES; i++) { env->vars[i] = NULL; diff --git a/src/variables/value.c b/src/variables/value.c index ee4892b..b3f2b81 100644 --- a/src/variables/value.c +++ b/src/variables/value.c @@ -1,12 +1,13 @@ -#include #include #include "value.h" +#include +#include #include "../parser/parser.tab.h" -struct Value* make_value(TypeTag type, long num, double dec, struct Node* expr, char* str) { +struct Value* make_value(TypeTag type, long num, double dec, struct Node* expr, std::string str) { /* allocate space */ - struct Value* val = (struct Value*) malloc(sizeof(struct Value)); + struct Value* val = new Value(); /* set properties */ val->type = type; @@ -25,24 +26,24 @@ struct Value* make_value(TypeTag type, long num, double dec, struct Node* expr, } struct Value* make_long(long num) { - return make_value(LONG, num, 0, NULL, NULL); + return make_value(LONG, num, 0, NULL, ""); } struct Value* make_double(double dec) { - return make_value(DOUBLE, 0, dec, NULL, NULL); + return make_value(DOUBLE, 0, dec, NULL, ""); } struct Value* make_true() { - return make_value(BOOLEAN, 1, 0, NULL, NULL); + return make_value(BOOLEAN, 1, 0, NULL, ""); } struct Value* make_false() { - return make_value(BOOLEAN, 0, 0, NULL, NULL); + return make_value(BOOLEAN, 0, 0, NULL, ""); } struct Value* make_boolean(int x) { return (x)? make_true() : make_false(); } struct Value* make_expression(struct Node* expr) { - return make_value(LAMBDA, 0, 0, expr, NULL); + return make_value(LAMBDA, 0, 0, expr, ""); } -struct Value* make_string(char* str) { +struct Value* make_string(std::string str) { return make_value(STRING, 0, 0, NULL, str); } @@ -59,7 +60,7 @@ double get_double(struct Value* val) { struct Node* get_expression(struct Value* val) { return val->value.expr; } -char* get_string(struct Value* val) { +std::string get_string(struct Value* val) { return val->value.str; } @@ -75,7 +76,7 @@ void set_expression(struct Value* val, struct Node* expr) { val->type = LAMBDA; val->value.expr = expr; } -void set_sring(struct Value* val, char* str) { +void set_sring(struct Value* val, std::string str) { val->type = STRING; val->value.str = str; } @@ -83,17 +84,17 @@ void set_sring(struct Value* val, char* str) { void print_value(struct Value* val) { if (val->type == BOOLEAN) { if (get_long(val)) { - printf("true"); + std::cout << "true"; } else { - printf("false"); + std::cout << "false"; } } else if (val->type == LONG) { - printf("%li", get_long(val)); + std::cout << get_long(val); } else if (val->type == STRING) { - printf("%s", get_string(val)); + std::cout << get_string(val); } else if (val->type == DOUBLE) { - printf("%lf", get_double(val)); + std::cout << get_double(val); } else { // Assume lambda expression - printf(""); + std::cout << ""; } } diff --git a/src/variables/value.h b/src/variables/value.h index 4167813..00d281d 100644 --- a/src/variables/value.h +++ b/src/variables/value.h @@ -1,14 +1,20 @@ #ifndef VALUE_H #define VALUE_H +#include + enum TypeTag { DOUBLE, LONG, BOOLEAN, STRING, LAMBDA }; -typedef union typeval { - long num; - double dec; - struct Node* expr; - char* str; -} TypeVal; +union TypeVal { + long num; + double dec; + struct Node* expr; + std::string str; + TypeVal() {} + // TypeVal(const std::string& s) : str(s) {} // Construct Point object using initializer list. + // TypeVal& operator=(const std::string& s) { new(&str) std::string(s); return *this; } // Assign Point object using placement 'new'. + ~TypeVal() {} +}; struct Value { enum TypeTag type; @@ -16,14 +22,14 @@ struct Value { }; // Constructors -struct Value* make_value(int type, long num, double dec, struct Node* expr, char* str); +struct Value* make_value(int type, long num, double dec, struct Node* expr, std::string str); struct Value* make_long(long num); struct Value* make_double(double dec); struct Value* make_true(); struct Value* make_false(); struct Value* make_boolean(int x); struct Value* make_expression(struct Node* expr); -struct Value* make_string(char* str); +struct Value* make_string(std::string str); // Destructor void delete_value(struct Value* val); @@ -32,13 +38,13 @@ void delete_value(struct Value* val); long get_long(struct Value* val); double get_double(struct Value* val); struct Node* get_expression(struct Value* val); -char* get_string(struct Value* val); +std::string get_string(struct Value* val); // Setters void set_long(struct Value* val, long num); void set_double(struct Value* val, double dec); void set_expression(struct Value* val, struct Node* node); -void set_string(struct Value* val, char* str); +void set_string(struct Value* val, std::string str); void print_value(struct Value* val); diff --git a/src/variables/variable.c b/src/variables/variable.c index 60a3951..9b6c942 100644 --- a/src/variables/variable.c +++ b/src/variables/variable.c @@ -6,7 +6,7 @@ /* creates a new variable and returns it */ struct Variable* make_variable(char* id, struct Value* value) { /* allocate space */ - struct Variable* var = (struct Variable*) malloc(sizeof(struct Variable)); + struct Variable* var = new Variable(); /* set properties */ strcpy(var->id, id);