X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fnumber.c;h=aab8151c4d121406f92bdc94aa8f7dcca9937bbd;hp=bed5a249c79f3da70655d7c7577b648d8295fd63;hb=6509a2053456d0e63b6f383b757289d3016ed1a5;hpb=ef48feab1da9d7a419980294bcbf03ceefd81d1c diff --git a/src/types/number.c b/src/types/number.c index bed5a24..aab8151 100644 --- a/src/types/number.c +++ b/src/types/number.c @@ -30,7 +30,7 @@ #include "data.h" #include "calc.h" #include "call.h" - +#include "parser.h" struct psi_number *psi_number_init(token_t t, void *num) { @@ -69,11 +69,15 @@ struct psi_number *psi_number_init(token_t t, void *num) break; case PSI_T_NUMBER: case PSI_T_NSNAME: + case PSI_T_DEFINE: exp->data.numb = strdup(num); break; case PSI_T_NAME: exp->data.dvar = num; break; + case PSI_T_FUNCTION: + exp->data.call = num; + break; default: assert(0); } @@ -98,11 +102,15 @@ struct psi_number *psi_number_copy(struct psi_number *exp) break; case PSI_T_NUMBER: case PSI_T_NSNAME: + case PSI_T_DEFINE: num->data.numb = strdup(num->data.numb); break; case PSI_T_NAME: num->data.dvar = psi_decl_var_copy(num->data.dvar); break; + case PSI_T_FUNCTION: + num->data.call = psi_cpp_macro_call_copy(num->data.call); + break; default: assert(0); } @@ -124,8 +132,12 @@ void psi_number_free(struct psi_number **exp_ptr) case PSI_T_ENUM: case PSI_T_CONST: break; + case PSI_T_FUNCTION: + psi_cpp_macro_call_free(&exp->data.call); + break; case PSI_T_NSNAME: case PSI_T_NUMBER: + case PSI_T_DEFINE: free(exp->data.numb); break; case PSI_T_NAME: @@ -149,6 +161,7 @@ void psi_number_dump(int fd, struct psi_number *exp) break; case PSI_T_NUMBER: case PSI_T_NSNAME: + case PSI_T_DEFINE: dprintf(fd, "%s", exp->data.numb); break; case PSI_T_CONST: @@ -197,6 +210,8 @@ bool psi_number_validate(struct psi_data *data, struct psi_number *exp, case PSI_T_INT64: case PSI_T_DOUBLE: case PSI_T_ENUM: + case PSI_T_DEFINE: + case PSI_T_FUNCTION: return true; case PSI_T_NAME: @@ -302,7 +317,18 @@ static inline token_t psi_number_eval_decl_var(struct psi_number *exp, return real->type; } -token_t psi_number_eval(struct psi_number *exp, impl_val *res, struct psi_call_frame *frame) +static inline token_t psi_number_eval_define(struct psi_number *exp, + impl_val *res, HashTable *defs) +{ + struct psi_cpp_macro_decl *macro = zend_hash_str_find_ptr(defs, exp->data.numb, strlen(exp->data.numb)); + + //WHATT? + + res->u8 = 0; + return PSI_T_UINT8; +} + +token_t psi_number_eval(struct psi_number *exp, impl_val *res, struct psi_call_frame *frame, HashTable *defs) { switch (exp->type) { case PSI_T_INT64: @@ -322,11 +348,16 @@ token_t psi_number_eval(struct psi_number *exp, impl_val *res, struct psi_call_f case PSI_T_CONST: return psi_number_eval_constant(exp, res, frame); - break; case PSI_T_NAME: return psi_number_eval_decl_var(exp, res, frame); - break; + + case PSI_T_DEFINE: + return psi_number_eval_define(exp, res, defs); + + case PSI_T_FUNCTION: + res->u8 = 0; + return PSI_T_UINT8; default: assert(0);