1
0
mirror of https://github.com/deuill/go-php.git synced 2024-09-21 00:40:45 +00:00
go-php/value/value.c

138 lines
2.7 KiB
C
Raw Normal View History

// Copyright 2015 Alexander Palaistras. All rights reserved.
// Use of this source code is governed by the MIT license that can be found in
// the LICENSE file.
#include <errno.h>
2015-09-22 21:14:51 +00:00
#include <stdbool.h>
#include <main/php.h>
#include "value.h"
engine_value *value_new(zval *zv) {
engine_value *value = (engine_value *) malloc((sizeof(engine_value)));
if (value == NULL) {
errno = 1;
return NULL;
}
value->value = zv;
value->kind = Z_TYPE_P(zv);
errno = 0;
return value;
}
int value_kind(engine_value *val) {
return val->kind;
}
engine_value *value_create_long(long int value) {
zval *zv;
MAKE_STD_ZVAL(zv);
ZVAL_LONG(zv, value);
return value_new(zv);
}
engine_value *value_create_double(double value) {
zval *zv;
MAKE_STD_ZVAL(zv);
ZVAL_DOUBLE(zv, value);
return value_new(zv);
}
engine_value *value_create_bool(bool value) {
zval *zv;
2015-09-22 21:14:51 +00:00
MAKE_STD_ZVAL(zv);
ZVAL_BOOL(zv, value);
2015-09-22 21:14:51 +00:00
return value_new(zv);
2015-09-22 21:14:51 +00:00
}
engine_value *value_create_string(char *value) {
zval *zv;
MAKE_STD_ZVAL(zv);
ZVAL_STRING(zv, value, 1);
return value_new(zv);
2015-10-01 21:57:17 +00:00
}
engine_value *value_create_array(unsigned int size) {
zval *zv;
2015-10-01 21:57:17 +00:00
MAKE_STD_ZVAL(zv);
array_init_size(zv, size);
2015-10-01 21:57:17 +00:00
return value_new(zv);
2015-10-01 21:57:17 +00:00
}
void value_array_set_index(engine_value *arr, unsigned long idx, engine_value *val) {
add_index_zval(arr->value, idx, val->value);
2015-10-01 21:57:17 +00:00
}
void value_array_set_key(engine_value *arr, const char *key, engine_value *val) {
add_assoc_zval(arr->value, key, val->value);
}
engine_value *value_create_object() {
zval *zv;
2015-10-17 15:00:16 +00:00
MAKE_STD_ZVAL(zv);
object_init(zv);
2015-10-17 15:00:16 +00:00
return value_new(zv);
2015-10-17 15:00:16 +00:00
}
void value_object_add_property(engine_value *obj, const char *key, engine_value *val) {
add_property_zval(obj->value, key, val->value);
}
int value_get_long(engine_value *val) {
// Covert value to long if needed.
if (Z_TYPE_P(val->value) != IS_LONG) {
convert_to_long(val->value);
val->kind = Z_TYPE_P(val->value);
}
return Z_LVAL_P(val->value);
}
double value_get_double(engine_value *val) {
// Covert value to double if needed.
if (Z_TYPE_P(val->value) != IS_DOUBLE) {
convert_to_double(val->value);
val->kind = Z_TYPE_P(val->value);
}
return Z_DVAL_P(val->value);
}
bool value_get_bool(engine_value *val) {
// Covert value to long if needed.
if (Z_TYPE_P(val->value) != IS_BOOL) {
convert_to_boolean(val->value);
val->kind = Z_TYPE_P(val->value);
}
return Z_BVAL_P(val->value);
}
char *value_get_string(engine_value *val) {
// Covert value to string if needed.
if (Z_TYPE_P(val->value) != IS_STRING) {
convert_to_cstring(val->value);
val->kind = Z_TYPE_P(val->value);
}
return Z_STRVAL_P(val->value);
2015-10-17 15:00:16 +00:00
}
void value_destroy(engine_value *val) {
zval_dtor(val->value);
free(val);
}