X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fimpl_def_val.c;h=61c4e8ba6ef275ca61eac4b4690cde8f21eae0d8;hp=0d176f309eea9845d6ff2222243ef761c6d4f98a;hb=9bcb1df0786a8193d65949c857baaba2f4296e84;hpb=5e240548ba570610ce0dbc248a2b7654a0e080fa diff --git a/src/types/impl_def_val.c b/src/types/impl_def_val.c index 0d176f3..61c4e8b 100644 --- a/src/types/impl_def_val.c +++ b/src/types/impl_def_val.c @@ -23,34 +23,85 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *******************************************************************************/ -#ifdef HAVE_CONFIG_H -# include "config.h" -#else -# include "php_config.h" -#endif +#include "php_psi_stdinc.h" +#include "data.h" -#include -#include +#include -#include "impl_def_val.h" +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)); -void free_impl_def_val(impl_def_val *def) { - free(def->text); - free(def); -} - -impl_def_val *init_impl_def_val(token_t t, const char *text) { - impl_def_val *def = calloc(1, sizeof(*def)); def->type = t; def->text = strdup(text); + return def; } -void dump_impl_def_val(int fd, impl_def_val *val) { - if (val->type == PSI_T_QUOTED_STRING) { +void psi_impl_def_val_free(struct psi_impl_def_val **def_ptr) +{ + if (*def_ptr) { + struct psi_impl_def_val *def = *def_ptr; + + *def_ptr = NULL; + if (def->token) { + free(def->token); + } + 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; + } + free(def->text); + free(def); + } +} + +bool psi_impl_def_val_validate(struct psi_data *data, + struct psi_impl_def_val *def, struct psi_impl_type *type) +{ + if (def->type != PSI_T_NULL) { + switch (type->type) { + case PSI_T_BOOL: + def->ival.zend.bval = def->type == PSI_T_TRUE ? 1 : 0; + break; + case PSI_T_INT: + def->ival.zend.lval = zend_atol(def->text, strlen(def->text)); + break; + case PSI_T_FLOAT: + case PSI_T_DOUBLE: + def->ival.dval = zend_strtod(def->text, NULL); + break; + case PSI_T_STRING: + assert(0); + /* no break */ + case PSI_T_QUOTED_STRING: + def->ival.zend.str = zend_string_init(&def->text[1], strlen(def->text) - 2, 1); + break; + default: + data->error(data, def->token, PSI_WARNING, + "Invalid default value type '%s', expected one of bool, int, double, string.", + type->name); + return false; + } + } + return true; +} + +void psi_impl_def_val_dump(int fd, struct psi_impl_def_val *val) { + switch (val->type) { + case PSI_T_STRING: + assert(0); + /* no break */ + case PSI_T_QUOTED_STRING: dprintf(fd, "\"%s\"", val->text); - } else { + break; + default: dprintf(fd, "%s", val->text); } - }