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 <stdlib.h>
-#include <stdio.h>
+#include <assert.h>
-#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);
+ def->text = text ? strdup(text) : NULL;
+
return def;
}
-void dump_impl_def_val(int fd, impl_def_val *val) {
- if (val->type == PSI_T_QUOTED_STRING) {
- dprintf(fd, "\"%s\"", val->text);
- } else {
- dprintf(fd, "%s", val->text);
+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:
+ case PSI_T_QUOTED_STRING:
+ if (def->ival.zend.str) {
+ zend_string_release(def->ival.zend.str);
+ }
+ break;
+ }
+ if (def->text) {
+ free(def->text);
+ }
+ free(def);
}
+}
+bool psi_impl_def_val_validate(struct psi_data *data,
+ struct psi_impl_def_val *def, token_t type_t, const char *type_name)
+{
+ if (def->type != PSI_T_NULL && def->text) {
+ switch (type_t) {
+ 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:
+ case PSI_T_QUOTED_STRING:
+ def->ival.zend.str = zend_string_init(def->text, strlen(def->text), 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_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:
+ dprintf(fd, "\"%s\"", val->ival.zend.str->val);
+ break;
+ case PSI_T_QUOTED_STRING:
+ dprintf(fd, "\"%s\"", val->text);
+ break;
+ default:
+ if (val->text) {
+ dprintf(fd, "%s", val->text);
+ } else {
+ assert(0);
+ }
+ break;
+ }
}