X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Ftypes%2Fimpl_def_val.c;h=6d983cddc7e948a24dd388b3e4174c5644af0438;hb=ad2c22df5e451fffecc7b7ebdc9c5a4bb36e543e;hp=efbd793feb438086e2cad8188ecd2b4512673e38;hpb=f74ce3f29e2dadd9f839c33ad5292e56e9203efd;p=m6w6%2Fext-psi diff --git a/src/types/impl_def_val.c b/src/types/impl_def_val.c index efbd793..6d983cd 100644 --- a/src/types/impl_def_val.c +++ b/src/types/impl_def_val.c @@ -33,7 +33,7 @@ struct psi_impl_def_val *psi_impl_def_val_init(token_t t, const char *text) struct psi_impl_def_val *def = calloc(1, sizeof(*def)); def->type = t; - def->text = strdup(text); + def->text = text ? strdup(text) : NULL; return def; } @@ -49,15 +49,17 @@ void psi_impl_def_val_free(struct psi_impl_def_val **def_ptr) } switch (def->type) { case PSI_T_STRING: - assert(0); - /* no break */ case PSI_T_QUOTED_STRING: if (def->ival.zend.str) { zend_string_release(def->ival.zend.str); } break; + default: + break; + } + if (def->text) { + free(def->text); } - free(def->text); free(def); } } @@ -78,10 +80,8 @@ bool psi_impl_def_val_validate(struct psi_data *data, def->ival.dval = zend_strtod(def->text, NULL); break; case PSI_T_STRING: - /* used for consts */ - /* no break */ case PSI_T_QUOTED_STRING: - def->ival.zend.str = zend_string_init(&def->text[1], strlen(def->text) - 2, 1); + def->ival.zend.str = zend_string_init(def->text, strlen(def->text), 1); break; default: data->error(data, def->token, PSI_WARNING, @@ -95,13 +95,28 @@ bool psi_impl_def_val_validate(struct psi_data *data, void psi_impl_def_val_dump(int fd, struct psi_impl_def_val *val) { switch (val->type) { + case PSI_T_BOOL: + dprintf(fd, "%s", val->ival.zend.bval ? "true" : "false"); + break; + case PSI_T_INT: + dprintf(fd, "%ld", val->ival.zend.lval); + break; + case PSI_T_FLOAT: + case PSI_T_DOUBLE: + dprintf(fd, "%f", val->ival.dval); + break; case PSI_T_STRING: - assert(0); - /* no break */ + dprintf(fd, "\"%s\"", val->ival.zend.str->val); + break; case PSI_T_QUOTED_STRING: dprintf(fd, "\"%s\"", val->text); break; default: - dprintf(fd, "%s", val->text); + if (val->text) { + dprintf(fd, "%s", val->text); + } else { + assert(0); + } + break; } }