#define WDDX_BUF_LEN 256
#define PHP_CLASS_NAME_VAR "php_class_name"
-#define EL_STRING "string"
+#define EL_ARRAY "array"
+#define EL_BOOLEAN "boolean"
#define EL_CHAR "char"
#define EL_CHAR_CODE "code"
+#define EL_NULL "null"
#define EL_NUMBER "number"
-#define EL_ARRAY "array"
+#define EL_PACKET "wddxPacket"
+#define EL_STRING "string"
#define EL_STRUCT "struct"
+#define EL_VALUE "value"
#define EL_VAR "var"
#define EL_VAR_NAME "name"
-#define EL_PACKET "wddxPacket"
#define EL_VERSION "version"
-#define _php_wddx_deserialize(a,b) \
- _php_wddx_deserialize_ex((a)->value.str.val, (a)->value.str.len, (b))
+#define php_wddx_deserialize(a,b) \
+ php_wddx_deserialize_ex((a)->value.str.val, (a)->value.str.len, (b))
+#define SET_STACK_VARNAME \
+ if (stack->varname) { \
+ ent.varname = estrdup(stack->varname); \
+ efree(stack->varname); \
+ stack->varname = NULL; \
+ } else \
+ ent.varname = NULL; \
+
static int le_wddx;
struct _wddx_packet {
typedef struct {
zval *data;
enum {
- ST_STRING,
- ST_NUMBER,
ST_ARRAY,
+ ST_BOOLEAN,
+ ST_NULL,
+ ST_NUMBER,
+ ST_STRING,
ST_STRUCT
} type;
char *varname;
/* {{{ function prototypes */
-static void _php_wddx_process_data(void *user_data, const char *s, int len);
+static void php_wddx_process_data(void *user_data, const char *s, int len);
/* }}} */
/* }}} */
-/* {{{ _php_wddx_destructor */
-void _php_wddx_destructor(wddx_packet *packet)
+/* {{{ php_wddx_destructor */
+void php_wddx_destructor(wddx_packet *packet)
{
dlst_kill(packet->packet_head, (void (*)(void *))_php_free_packet_chunk);
efree(packet);
/* {{{ php_minit_wddx */
int php_minit_wddx(INIT_FUNC_ARGS)
{
- le_wddx = register_list_destructors(_php_wddx_destructor, NULL);
+ le_wddx = register_list_destructors(php_wddx_destructor, NULL);
return SUCCESS;
}
/* }}} */
-/* {{{ _php_wddx_add_chunk */
-void _php_wddx_add_chunk(wddx_packet *packet, char *str)
+/* {{{ php_wddx_add_chunk */
+void php_wddx_add_chunk(wddx_packet *packet, char *str)
{
char **chunk_ptr;
/* }}} */
-/* {{{ _php_wddx_gather */
-char* _php_wddx_gather(wddx_packet *packet)
+/* {{{ php_wddx_gather */
+char* php_wddx_gather(wddx_packet *packet)
{
char **chunk;
char *buf;
/* }}} */
-/* {{{ void _php_wddx_packet_start */
-void _php_wddx_packet_start(wddx_packet *packet, char *comment)
+/* {{{ void php_wddx_packet_start */
+void php_wddx_packet_start(wddx_packet *packet, char *comment)
{
char tmp_buf[WDDX_BUF_LEN];
- _php_wddx_add_chunk(packet, WDDX_PACKET_S);
+ php_wddx_add_chunk(packet, WDDX_PACKET_S);
if (comment)
{
sprintf(tmp_buf, WDDX_HEADER_COMMENT, comment);
- _php_wddx_add_chunk(packet, tmp_buf);
+ php_wddx_add_chunk(packet, tmp_buf);
}
else
- _php_wddx_add_chunk(packet, WDDX_HEADER);
- _php_wddx_add_chunk(packet, WDDX_DATA_S);
+ php_wddx_add_chunk(packet, WDDX_HEADER);
+ php_wddx_add_chunk(packet, WDDX_DATA_S);
}
/* }}} */
-/* {{{ int _php_wddx_packet_end */
-void _php_wddx_packet_end(wddx_packet *packet)
+/* {{{ int php_wddx_packet_end */
+void php_wddx_packet_end(wddx_packet *packet)
{
- _php_wddx_add_chunk(packet, WDDX_DATA_E);
- _php_wddx_add_chunk(packet, WDDX_PACKET_E);
+ php_wddx_add_chunk(packet, WDDX_DATA_E);
+ php_wddx_add_chunk(packet, WDDX_PACKET_E);
}
/* }}} */
-/* {{{ void _php_wddx_serialize_var(wddx_packet *packet, zval *var) */
-static void _php_wddx_serialize_string(wddx_packet *packet, zval *var)
+/* {{{ void php_wddx_serialize_var(wddx_packet *packet, zval *var) */
+static void php_wddx_serialize_string(wddx_packet *packet, zval *var)
{
char *buf,
*c,
control_buf[WDDX_BUF_LEN];
int i;
- _php_wddx_add_chunk(packet, WDDX_STRING_S);
+ php_wddx_add_chunk(packet, WDDX_STRING_S);
if (var->value.str.len > 0) {
i = 0;
if (*buf)
{
buf[i] = '\0';
- _php_wddx_add_chunk(packet, buf);
+ php_wddx_add_chunk(packet, buf);
i = 0;
buf[i] = '\0';
}
sprintf(control_buf, WDDX_CHAR, *c);
- _php_wddx_add_chunk(packet, control_buf);
+ php_wddx_add_chunk(packet, control_buf);
}
else
buf[i++] = *c;
}
buf[i] = '\0';
if (*buf)
- _php_wddx_add_chunk(packet, buf);
+ php_wddx_add_chunk(packet, buf);
efree(buf);
}
- _php_wddx_add_chunk(packet, WDDX_STRING_E);
+ php_wddx_add_chunk(packet, WDDX_STRING_E);
}
/* }}} */
-/* {{{ void _php_wddx_serialize_number(wddx_packet *packet, zval *var) */
-static void _php_wddx_serialize_number(wddx_packet *packet, zval *var)
+/* {{{ void php_wddx_serialize_number(wddx_packet *packet, zval *var) */
+static void php_wddx_serialize_number(wddx_packet *packet, zval *var)
{
char tmp_buf[WDDX_BUF_LEN];
+ zval tmp;
- convert_to_string(var);
- sprintf(tmp_buf, WDDX_NUMBER, var->value.str.val);
- _php_wddx_add_chunk(packet, tmp_buf);
+ tmp = *var;
+ zval_copy_ctor(&tmp);
+ convert_to_string(&tmp);
+ sprintf(tmp_buf, WDDX_NUMBER, tmp.value.str.val);
+ zval_dtor(&tmp);
+
+ php_wddx_add_chunk(packet, tmp_buf);
}
/* }}} */
-/* {{{ void _php_wddx_serialize_hash(wddx_packet *packet, zval *var) */
-static void _php_wddx_serialize_hash(wddx_packet *packet, zval *var)
+/* {{{ void php_wddx_serialize_boolean(wddx_packet *packet, zval *var) */
+static void php_wddx_serialize_boolean(wddx_packet *packet, zval *var)
+{
+ char tmp_buf[WDDX_BUF_LEN];
+
+ sprintf(tmp_buf, WDDX_BOOLEAN, var->value.lval ? "true" : "false");
+ php_wddx_add_chunk(packet, tmp_buf);
+}
+/* }}} */
+
+/* {{{ void php_wddx_serialize_unset(wddx_packet *packet, zval *var) */
+static void php_wddx_serialize_unset(wddx_packet *packet)
+{
+ php_wddx_add_chunk(packet, WDDX_NULL);
+}
+/* }}} */
+
+/* {{{ void php_wddx_serialize_hash(wddx_packet *packet, zval *var) */
+static void php_wddx_serialize_hash(wddx_packet *packet, zval *var)
{
zval **ent;
char *key;
hash_type = zend_hash_get_current_key(target_hash, &key, &idx);
if (hash_type == HASH_KEY_IS_STRING) {
- _php_wddx_add_chunk(packet, WDDX_STRUCT_S);
+ php_wddx_add_chunk(packet, WDDX_STRUCT_S);
efree(key);
} else {
sprintf(tmp_buf, WDDX_ARRAY_S, zend_hash_num_elements(target_hash));
- _php_wddx_add_chunk(packet, tmp_buf);
+ php_wddx_add_chunk(packet, tmp_buf);
}
/* If variable is an object, serialize its classname */
if (var->type == IS_OBJECT)
{
sprintf(tmp_buf, WDDX_VAR_S, PHP_CLASS_NAME_VAR);
- _php_wddx_add_chunk(packet, tmp_buf);
- _php_wddx_add_chunk(packet, WDDX_STRING_S);
- _php_wddx_add_chunk(packet, var->value.obj.ce->name);
- _php_wddx_add_chunk(packet, WDDX_STRING_E);
- _php_wddx_add_chunk(packet, WDDX_VAR_E);
+ php_wddx_add_chunk(packet, tmp_buf);
+ php_wddx_add_chunk(packet, WDDX_STRING_S);
+ php_wddx_add_chunk(packet, var->value.obj.ce->name);
+ php_wddx_add_chunk(packet, WDDX_STRING_E);
+ php_wddx_add_chunk(packet, WDDX_VAR_E);
}
while(zend_hash_get_current_data(target_hash, (void**)&ent) == SUCCESS) {
ent_type = zend_hash_get_current_key(target_hash, &key, &idx);
if (ent_type == HASH_KEY_IS_STRING) {
- _php_wddx_serialize_var(packet, *ent, key);
+ php_wddx_serialize_var(packet, *ent, key);
efree(key);
} else {
sprintf(tmp_buf, "%ld", idx);
- _php_wddx_serialize_var(packet, *ent, tmp_buf);
+ php_wddx_serialize_var(packet, *ent, tmp_buf);
}
} else
- _php_wddx_serialize_var(packet, *ent, NULL);
+ php_wddx_serialize_var(packet, *ent, NULL);
zend_hash_move_forward(target_hash);
}
if (hash_type == HASH_KEY_IS_STRING)
- _php_wddx_add_chunk(packet, WDDX_STRUCT_E);
+ php_wddx_add_chunk(packet, WDDX_STRUCT_E);
else
- _php_wddx_add_chunk(packet, WDDX_ARRAY_E);
+ php_wddx_add_chunk(packet, WDDX_ARRAY_E);
}
/* }}} */
-/* {{{ void _php_wddx_serialize_var(wddx_packet *packet, zval *var, char *name) */
-void _php_wddx_serialize_var(wddx_packet *packet, zval *var, char *name)
+/* {{{ void php_wddx_serialize_var(wddx_packet *packet, zval *var, char *name) */
+void php_wddx_serialize_var(wddx_packet *packet, zval *var, char *name)
{
char tmp_buf[WDDX_BUF_LEN];
if (name) {
sprintf(tmp_buf, WDDX_VAR_S, name);
- _php_wddx_add_chunk(packet, tmp_buf);
+ php_wddx_add_chunk(packet, tmp_buf);
}
switch(var->type) {
case IS_STRING:
- _php_wddx_serialize_string(packet, var);
+ php_wddx_serialize_string(packet, var);
break;
case IS_LONG:
case IS_DOUBLE:
- _php_wddx_serialize_number(packet, var);
+ php_wddx_serialize_number(packet, var);
+ break;
+
+ case IS_BOOL:
+ php_wddx_serialize_boolean(packet, var);
+ break;
+
+ case IS_UNSET:
+ php_wddx_serialize_unset(packet);
break;
case IS_ARRAY:
case IS_OBJECT:
- _php_wddx_serialize_hash(packet, var);
+ php_wddx_serialize_hash(packet, var);
break;
}
if (name) {
- _php_wddx_add_chunk(packet, WDDX_VAR_E);
+ php_wddx_add_chunk(packet, WDDX_VAR_E);
}
}
/* }}} */
-/* {{{ void _php_wddx_add_var(wddx_packet *packet, zval *name_var) */
-static void _php_wddx_add_var(wddx_packet *packet, zval *name_var)
+/* {{{ void php_wddx_add_var(wddx_packet *packet, zval *name_var) */
+static void php_wddx_add_var(wddx_packet *packet, zval *name_var)
{
zval **val;
HashTable *target_hash;
{
if (zend_hash_find(EG(active_symbol_table), name_var->value.str.val,
name_var->value.str.len+1, (void**)&val) != FAILURE) {
- _php_wddx_serialize_var(packet, *val, name_var->value.str.val);
+ php_wddx_serialize_var(packet, *val, name_var->value.str.val);
}
}
else if (name_var->type == IS_ARRAY || name_var->type == IS_OBJECT)
zend_hash_internal_pointer_reset(target_hash);
while(zend_hash_get_current_data(target_hash, (void**)&val) == SUCCESS) {
- _php_wddx_add_var(packet, *val);
+ php_wddx_add_var(packet, *val);
zend_hash_move_forward(target_hash);
}
/* }}} */
-/* {{{ void _php_wddx_push_element(void *user_data, const char *name, const char **atts) */
-static void _php_wddx_push_element(void *user_data, const char *name, const char **atts)
+/* {{{ void php_wddx_push_element(void *user_data, const char *name, const char **atts) */
+static void php_wddx_push_element(void *user_data, const char *name, const char **atts)
{
st_entry ent;
wddx_stack *stack = (wddx_stack *)user_data;
}
} else if (!strcmp(name, EL_STRING)) {
ent.type = ST_STRING;
- if (stack->varname) {
- ent.varname = estrdup(stack->varname);
- efree(stack->varname);
- stack->varname = NULL;
- } else
- ent.varname = NULL;
+ SET_STACK_VARNAME;
ALLOC_ZVAL(ent.data);
ent.data->value.str.val = NULL;
for (i=0; atts[i]; i++) {
if (!strcmp(atts[i], EL_CHAR_CODE) && atts[i+1]) {
sprintf(tmp_buf, "%c", (char)strtol(atts[i+1], NULL, 16));
- _php_wddx_process_data(user_data, tmp_buf, strlen(tmp_buf));
+ php_wddx_process_data(user_data, tmp_buf, strlen(tmp_buf));
}
}
} else if (!strcmp(name, EL_NUMBER)) {
ent.type = ST_NUMBER;
- if (stack->varname) {
- ent.varname = estrdup(stack->varname);
- efree(stack->varname);
- stack->varname = NULL;
- } else
- ent.varname = NULL;
+ SET_STACK_VARNAME;
ALLOC_ZVAL(ent.data);
INIT_PZVAL(ent.data);
+ wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));
+ } else if (!strcmp(name, EL_BOOLEAN)) {
+ int i;
+
+ for (i=0; atts[i]; i++) {
+ if (!strcmp(atts[i], EL_VALUE) && atts[i+1]) {
+ ent.type = ST_BOOLEAN;
+ SET_STACK_VARNAME;
+
+ ALLOC_ZVAL(ent.data);
+ INIT_PZVAL(ent.data);
+ wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));
+ php_wddx_process_data(user_data, atts[i+1], strlen(atts[i+1]));
+ }
+ }
+ } else if (!strcmp(name, EL_NULL)) {
+ ent.type = ST_NULL;
+ SET_STACK_VARNAME;
+
+ ALLOC_ZVAL(ent.data);
+ INIT_PZVAL(ent.data);
+ ent.data->type = IS_UNSET;
+
wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));
} else if (!strcmp(name, EL_ARRAY)) {
ent.type = ST_ARRAY;
- if (stack->varname) {
- ent.varname = estrdup(stack->varname);
- efree(stack->varname);
- stack->varname = NULL;
- } else
- ent.varname = NULL;
+ SET_STACK_VARNAME;
ALLOC_ZVAL(ent.data);
array_init(ent.data);
wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));
} else if (!strcmp(name, EL_STRUCT)) {
ent.type = ST_STRUCT;
- if (stack->varname) {
- ent.varname = estrdup(stack->varname);
- efree(stack->varname);
- stack->varname = NULL;
- } else
- ent.varname = NULL;
+ SET_STACK_VARNAME;
ALLOC_ZVAL(ent.data);
array_init(ent.data);
}
}
}
-
}
/* }}} */
-/* {{{ void _php_wddx_pop_element(void *user_data, const char *name) */
-static void _php_wddx_pop_element(void *user_data, const char *name)
+/* {{{ void php_wddx_pop_element(void *user_data, const char *name) */
+static void php_wddx_pop_element(void *user_data, const char *name)
{
st_entry *ent1, *ent2;
wddx_stack *stack = (wddx_stack *)user_data;
ELS_FETCH();
if (!strcmp(name, EL_STRING) || !strcmp(name, EL_NUMBER) ||
- !strcmp(name, EL_ARRAY) || !strcmp(name, EL_STRUCT)) {
+ !strcmp(name, EL_BOOLEAN) || !strcmp(name, EL_NULL) ||
+ !strcmp(name, EL_ARRAY) || !strcmp(name, EL_STRUCT)) {
if (stack->top > 1) {
wddx_stack_top(stack, (void**)&ent1);
stack->top--;
/* }}} */
-/* {{{ void _php_wddx_process_data(void *user_data, const char *s, int len) */
-static void _php_wddx_process_data(void *user_data, const char *s, int len)
+/* {{{ void php_wddx_process_data(void *user_data, const char *s, int len) */
+static void php_wddx_process_data(void *user_data, const char *s, int len)
{
st_entry *ent;
wddx_stack *stack = (wddx_stack *)user_data;
convert_scalar_to_number(ent->data);
break;
+ case ST_BOOLEAN:
+ ent->data->type = IS_BOOL;
+ if (!strcmp(s, "true"))
+ ent->data->value.lval = 1;
+ else if (!strcmp(s, "false"))
+ ent->data->value.lval = 0;
+ else {
+ stack->top--;
+ zval_dtor(ent->data);
+ efree(ent->data);
+ if (ent->varname)
+ efree(ent->varname);
+ efree(ent);
+ }
+ break;
+
default:
break;
}
/* }}} */
-/* {{{ void _php_wddx_deserialize_ex(char *value, int vallen, zval *return_value) */
-void _php_wddx_deserialize_ex(char *value, int vallen, zval *return_value)
+/* {{{ void php_wddx_deserialize_ex(char *value, int vallen, zval *return_value) */
+void php_wddx_deserialize_ex(char *value, int vallen, zval *return_value)
{
wddx_stack stack;
XML_Parser parser;
parser = XML_ParserCreate(NULL);
XML_SetUserData(parser, &stack);
- XML_SetElementHandler(parser, _php_wddx_push_element, _php_wddx_pop_element);
- XML_SetCharacterDataHandler(parser, _php_wddx_process_data);
+ XML_SetElementHandler(parser, php_wddx_push_element, php_wddx_pop_element);
+ XML_SetCharacterDataHandler(parser, php_wddx_process_data);
XML_Parse(parser, value, vallen, 1);
WRONG_PARAM_COUNT;
}
- packet = _php_wddx_constructor();
+ packet = php_wddx_constructor();
if (!packet) {
RETURN_FALSE;
}
if (argc == 2)
{
convert_to_string_ex(comment);
- _php_wddx_packet_start(packet, (*comment)->value.str.val);
+ php_wddx_packet_start(packet, (*comment)->value.str.val);
}
else
- _php_wddx_packet_start(packet, NULL);
+ php_wddx_packet_start(packet, NULL);
- _php_wddx_serialize_var(packet, (*var), NULL);
- _php_wddx_packet_end(packet);
- buf = _php_wddx_gather(packet);
- _php_wddx_destructor(packet);
+ php_wddx_serialize_var(packet, (*var), NULL);
+ php_wddx_packet_end(packet);
+ buf = php_wddx_gather(packet);
+ php_wddx_destructor(packet);
RETURN_STRING(buf, 0);
}
WRONG_PARAM_COUNT;
}
- packet = _php_wddx_constructor();
+ packet = php_wddx_constructor();
if (!packet) {
RETURN_FALSE;
}
- _php_wddx_packet_start(packet, NULL);
- _php_wddx_add_chunk(packet, WDDX_STRUCT_S);
+ php_wddx_packet_start(packet, NULL);
+ php_wddx_add_chunk(packet, WDDX_STRUCT_S);
for (i=0; i<argc; i++) {
if ((*args[i])->type != IS_ARRAY && (*args[i])->type != IS_OBJECT)
convert_to_string_ex(args[i]);
- _php_wddx_add_var(packet, *args[i]);
+ php_wddx_add_var(packet, *args[i]);
}
- _php_wddx_add_chunk(packet, WDDX_STRUCT_E);
- _php_wddx_packet_end(packet);
- buf = _php_wddx_gather(packet);
- _php_wddx_destructor(packet);
+ php_wddx_add_chunk(packet, WDDX_STRUCT_E);
+ php_wddx_packet_end(packet);
+ buf = php_wddx_gather(packet);
+ php_wddx_destructor(packet);
efree(args);
}
/* }}} */
-wddx_packet *_php_wddx_constructor(void)
+wddx_packet *php_wddx_constructor(void)
{
wddx_packet *packet;
WRONG_PARAM_COUNT;
}
- packet = _php_wddx_constructor();
+ packet = php_wddx_constructor();
if (!packet) {
RETURN_FALSE;
}
if (argc == 1) {
convert_to_string_ex(comment);
- _php_wddx_packet_start(packet, (*comment)->value.str.val);
+ php_wddx_packet_start(packet, (*comment)->value.str.val);
}
else
- _php_wddx_packet_start(packet, NULL);
+ php_wddx_packet_start(packet, NULL);
- _php_wddx_add_chunk(packet, WDDX_STRUCT_S);
+ php_wddx_add_chunk(packet, WDDX_STRUCT_S);
ZEND_REGISTER_RESOURCE(return_value, packet, le_wddx);
}
ZEND_FETCH_RESOURCE(packet, wddx_packet *, packet_id, -1, "WDDX packet ID", le_wddx);
- _php_wddx_add_chunk(packet, WDDX_STRUCT_E);
+ php_wddx_add_chunk(packet, WDDX_STRUCT_E);
- _php_wddx_packet_end(packet);
+ php_wddx_packet_end(packet);
- buf = _php_wddx_gather(packet);
+ buf = php_wddx_gather(packet);
zend_list_delete((*packet_id)->value.lval);
for (i=1; i<argc; i++) {
if ((*args[i])->type != IS_ARRAY && (*args[i])->type != IS_OBJECT)
convert_to_string_ex(args[i]);
- _php_wddx_add_var(packet, (*args[i]));
+ php_wddx_add_var(packet, (*args[i]));
}
efree(args);
if ((*packet)->value.str.len == 0)
return;
- _php_wddx_deserialize(*packet, return_value);
+ php_wddx_deserialize(*packet, return_value);
}
/* }}} */