mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
* Implemented <boolean> and <null> types. We now support WDDX version 1.0
as best as we can. * Cleaned up the API function names, _ was really not needed. * Cleaned up the repetitive stack var name stuff with a macro. * WDDX now no longer converts numbers to strings in arrays when during serialization. @Implemented support for <boolean> and <null> types according @to WDDX version 1.0 (Andrei)
This commit is contained in:
parent
8e99c415ab
commit
4595bf1e20
1
TODO
1
TODO
@ -31,7 +31,6 @@ documentation
|
||||
|
||||
ext/wddx
|
||||
--------
|
||||
* should support IS_BOOL and IS_UNSET (NULL) natively
|
||||
* implement wddx_packet_as_javascript(). (Andrei)
|
||||
|
||||
ext/apache
|
||||
|
@ -268,20 +268,20 @@ PS_SERIALIZER_ENCODE_FUNC(wddx)
|
||||
wddx_packet *packet;
|
||||
ENCODE_VARS;
|
||||
|
||||
packet = _php_wddx_constructor();
|
||||
packet = php_wddx_constructor();
|
||||
if(!packet) return FAILURE;
|
||||
|
||||
_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);
|
||||
|
||||
ENCODE_LOOP(
|
||||
_php_wddx_serialize_var(packet, *struc, key);
|
||||
php_wddx_serialize_var(packet, *struc, key);
|
||||
);
|
||||
|
||||
_php_wddx_add_chunk(packet, WDDX_STRUCT_E);
|
||||
_php_wddx_packet_end(packet);
|
||||
*newstr = _php_wddx_gather(packet);
|
||||
_php_wddx_destructor(packet);
|
||||
php_wddx_add_chunk(packet, WDDX_STRUCT_E);
|
||||
php_wddx_packet_end(packet);
|
||||
*newstr = php_wddx_gather(packet);
|
||||
php_wddx_destructor(packet);
|
||||
|
||||
if(newlen) *newlen = strlen(*newstr);
|
||||
|
||||
@ -302,7 +302,7 @@ PS_SERIALIZER_DECODE_FUNC(wddx)
|
||||
|
||||
MAKE_STD_ZVAL(retval);
|
||||
|
||||
_php_wddx_deserialize_ex((char *)val, vallen, retval);
|
||||
php_wddx_deserialize_ex((char *)val, vallen, retval);
|
||||
|
||||
for(zend_hash_internal_pointer_reset(retval->value.ht);
|
||||
zend_hash_get_current_data(retval->value.ht, (void **) &ent) == SUCCESS;
|
||||
|
@ -21,34 +21,36 @@
|
||||
#ifndef PHP_WDDX_API_H
|
||||
#define PHP_WDDX_API_H
|
||||
|
||||
#define WDDX_PACKET_S "<wddxPacket version='0.9'>"
|
||||
#define WDDX_PACKET_E "</wddxPacket>"
|
||||
#define WDDX_HEADER "<header/>"
|
||||
#define WDDX_HEADER_COMMENT "<header comment='%s'/>"
|
||||
#define WDDX_DATA_S "<data>"
|
||||
#define WDDX_DATA_E "</data>"
|
||||
#define WDDX_STRING_S "<string>"
|
||||
#define WDDX_STRING_E "</string>"
|
||||
#define WDDX_CHAR "<char code='%02X'/>"
|
||||
#define WDDX_NUMBER "<number>%s</number>"
|
||||
#define WDDX_ARRAY_S "<array length='%d'>"
|
||||
#define WDDX_ARRAY_E "</array>"
|
||||
#define WDDX_VAR_S "<var name='%s'>"
|
||||
#define WDDX_VAR_E "</var>"
|
||||
#define WDDX_BOOLEAN "<boolean value='%s'/>"
|
||||
#define WDDX_CHAR "<char code='%02X'/>"
|
||||
#define WDDX_DATA_S "<data>"
|
||||
#define WDDX_DATA_E "</data>"
|
||||
#define WDDX_HEADER "<header/>"
|
||||
#define WDDX_HEADER_COMMENT "<header comment='%s'/>"
|
||||
#define WDDX_NULL "<null/>"
|
||||
#define WDDX_NUMBER "<number>%s</number>"
|
||||
#define WDDX_PACKET_S "<wddxPacket version='1.0'>"
|
||||
#define WDDX_PACKET_E "</wddxPacket>"
|
||||
#define WDDX_STRING_S "<string>"
|
||||
#define WDDX_STRING_E "</string>"
|
||||
#define WDDX_STRUCT_S "<struct>"
|
||||
#define WDDX_STRUCT_E "</struct>"
|
||||
#define WDDX_VAR_S "<var name='%s'>"
|
||||
#define WDDX_VAR_E "</var>"
|
||||
|
||||
typedef struct _wddx_packet wddx_packet;
|
||||
|
||||
wddx_packet *_php_wddx_constructor(void);
|
||||
void _php_wddx_destructor(wddx_packet *packet);
|
||||
wddx_packet *php_wddx_constructor(void);
|
||||
void php_wddx_destructor(wddx_packet *packet);
|
||||
|
||||
void _php_wddx_packet_start(wddx_packet *packet, char *comment);
|
||||
void _php_wddx_packet_end(wddx_packet *packet);
|
||||
void php_wddx_packet_start(wddx_packet *packet, char *comment);
|
||||
void php_wddx_packet_end(wddx_packet *packet);
|
||||
|
||||
void _php_wddx_serialize_var(wddx_packet *packet, zval *var, char *name);
|
||||
void _php_wddx_add_chunk(wddx_packet *packet, char *str);
|
||||
void _php_wddx_deserialize_ex(char *, int, zval *return_value);
|
||||
char *_php_wddx_gather(wddx_packet *packet);
|
||||
void php_wddx_serialize_var(wddx_packet *packet, zval *var, char *name);
|
||||
void php_wddx_add_chunk(wddx_packet *packet, char *str);
|
||||
void php_wddx_deserialize_ex(char *, int, zval *return_value);
|
||||
char *php_wddx_gather(wddx_packet *packet);
|
||||
|
||||
#endif /* PHP_WDDX_API_H */
|
||||
|
310
ext/wddx/wddx.c
310
ext/wddx/wddx.c
@ -40,20 +40,31 @@
|
||||
#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 {
|
||||
@ -64,9 +75,11 @@ 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;
|
||||
@ -80,7 +93,7 @@ typedef struct {
|
||||
|
||||
|
||||
/* {{{ 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);
|
||||
/* }}} */
|
||||
|
||||
|
||||
@ -192,8 +205,8 @@ static void _php_free_packet_chunk(char **chunk_ptr)
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ _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);
|
||||
@ -204,15 +217,15 @@ void _php_wddx_destructor(wddx_packet *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;
|
||||
|
||||
@ -224,8 +237,8 @@ void _php_wddx_add_chunk(wddx_packet *packet, char *str)
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ _php_wddx_gather */
|
||||
char* _php_wddx_gather(wddx_packet *packet)
|
||||
/* {{{ php_wddx_gather */
|
||||
char* php_wddx_gather(wddx_packet *packet)
|
||||
{
|
||||
char **chunk;
|
||||
char *buf;
|
||||
@ -243,42 +256,42 @@ char* _php_wddx_gather(wddx_packet *packet)
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ 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;
|
||||
@ -290,41 +303,63 @@ static void _php_wddx_serialize_string(wddx_packet *packet, zval *var)
|
||||
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;
|
||||
@ -340,22 +375,22 @@ static void _php_wddx_serialize_hash(wddx_packet *packet, zval *var)
|
||||
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) {
|
||||
@ -363,61 +398,69 @@ static void _php_wddx_serialize_hash(wddx_packet *packet, zval *var)
|
||||
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;
|
||||
@ -427,7 +470,7 @@ static void _php_wddx_add_var(wddx_packet *packet, zval *name_var)
|
||||
{
|
||||
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)
|
||||
@ -437,7 +480,7 @@ static void _php_wddx_add_var(wddx_packet *packet, zval *name_var)
|
||||
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);
|
||||
}
|
||||
@ -446,8 +489,8 @@ static void _php_wddx_add_var(wddx_packet *packet, zval *name_var)
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ 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;
|
||||
@ -461,12 +504,7 @@ static void _php_wddx_push_element(void *user_data, const char *name, const char
|
||||
}
|
||||
} 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;
|
||||
@ -480,29 +518,42 @@ static void _php_wddx_push_element(void *user_data, const char *name, const char
|
||||
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);
|
||||
@ -510,12 +561,7 @@ static void _php_wddx_push_element(void *user_data, const char *name, const char
|
||||
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);
|
||||
@ -530,13 +576,12 @@ static void _php_wddx_push_element(void *user_data, const char *name, const char
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ 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;
|
||||
@ -547,7 +592,8 @@ static void _php_wddx_pop_element(void *user_data, const char *name)
|
||||
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--;
|
||||
@ -609,8 +655,8 @@ static void _php_wddx_pop_element(void *user_data, const char *name)
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ 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;
|
||||
@ -639,6 +685,22 @@ static void _php_wddx_process_data(void *user_data, const char *s, int len)
|
||||
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;
|
||||
}
|
||||
@ -647,8 +709,8 @@ static void _php_wddx_process_data(void *user_data, const char *s, int len)
|
||||
/* }}} */
|
||||
|
||||
|
||||
/* {{{ 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;
|
||||
@ -658,8 +720,8 @@ void _php_wddx_deserialize_ex(char *value, int vallen, zval *return_value)
|
||||
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);
|
||||
|
||||
@ -691,7 +753,7 @@ PHP_FUNCTION(wddx_serialize_value)
|
||||
WRONG_PARAM_COUNT;
|
||||
}
|
||||
|
||||
packet = _php_wddx_constructor();
|
||||
packet = php_wddx_constructor();
|
||||
if (!packet) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
@ -699,15 +761,15 @@ PHP_FUNCTION(wddx_serialize_value)
|
||||
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);
|
||||
}
|
||||
@ -731,24 +793,24 @@ PHP_FUNCTION(wddx_serialize_vars)
|
||||
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);
|
||||
|
||||
@ -756,7 +818,7 @@ PHP_FUNCTION(wddx_serialize_vars)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
wddx_packet *_php_wddx_constructor(void)
|
||||
wddx_packet *php_wddx_constructor(void)
|
||||
{
|
||||
wddx_packet *packet;
|
||||
|
||||
@ -784,19 +846,19 @@ PHP_FUNCTION(wddx_packet_start)
|
||||
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);
|
||||
}
|
||||
@ -817,11 +879,11 @@ PHP_FUNCTION(wddx_packet_end)
|
||||
|
||||
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);
|
||||
|
||||
@ -863,7 +925,7 @@ PHP_FUNCTION(wddx_add_vars)
|
||||
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);
|
||||
@ -886,7 +948,7 @@ PHP_FUNCTION(wddx_deserialize)
|
||||
if ((*packet)->value.str.len == 0)
|
||||
return;
|
||||
|
||||
_php_wddx_deserialize(*packet, return_value);
|
||||
php_wddx_deserialize(*packet, return_value);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user