⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wddx.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
static void php_wddx_serialize_unset(wddx_packet *packet){	php_wddx_add_chunk_static(packet, WDDX_NULL);}/* }}} *//* {{{ php_wddx_serialize_object */static void php_wddx_serialize_object(wddx_packet *packet, zval *obj){/* OBJECTS_FIXME */	zval **ent, *fname, **varname;	zval *retval = NULL;	char *key;	ulong idx;	char tmp_buf[WDDX_BUF_LEN];	TSRMLS_FETCH();	MAKE_STD_ZVAL(fname);	ZVAL_STRING(fname, "__sleep", 1);	/*	 * We try to call __sleep() method on object. It's supposed to return an	 * array of property names to be serialized.	 */	if (call_user_function_ex(CG(function_table), &obj, fname, &retval, 0, 0, 1, NULL TSRMLS_CC) == SUCCESS) {		if (retval && HASH_OF(retval)) {			PHP_CLASS_ATTRIBUTES;						PHP_SET_CLASS_ATTRIBUTES(obj);			php_wddx_add_chunk_static(packet, WDDX_STRUCT_S);			sprintf(tmp_buf, WDDX_VAR_S, PHP_CLASS_NAME_VAR);			php_wddx_add_chunk(packet, tmp_buf);			php_wddx_add_chunk_static(packet, WDDX_STRING_S);			php_wddx_add_chunk_ex(packet, class_name, name_len);			php_wddx_add_chunk_static(packet, WDDX_STRING_E);			php_wddx_add_chunk_static(packet, WDDX_VAR_E);			PHP_CLEANUP_CLASS_ATTRIBUTES();						for (zend_hash_internal_pointer_reset(HASH_OF(retval));				 zend_hash_get_current_data(HASH_OF(retval), (void **)&varname) == SUCCESS;				 zend_hash_move_forward(HASH_OF(retval))) {				if (Z_TYPE_PP(varname) != IS_STRING) {					php_error(E_NOTICE, "__sleep should return an array only containing the names of instance-variables to serialize.");					continue;				}				if (zend_hash_find(HASH_OF(obj), Z_STRVAL_PP(varname), Z_STRLEN_PP(varname)+1, (void **)&ent) == SUCCESS) {					php_wddx_serialize_var(packet, *ent, Z_STRVAL_PP(varname), Z_STRLEN_PP(varname) TSRMLS_CC);				}			}						php_wddx_add_chunk_static(packet, WDDX_STRUCT_E);		}	} else {		uint key_len;		PHP_CLASS_ATTRIBUTES;		PHP_SET_CLASS_ATTRIBUTES(obj);		php_wddx_add_chunk_static(packet, WDDX_STRUCT_S);		sprintf(tmp_buf, WDDX_VAR_S, PHP_CLASS_NAME_VAR);		php_wddx_add_chunk(packet, tmp_buf);		php_wddx_add_chunk_static(packet, WDDX_STRING_S);		php_wddx_add_chunk_ex(packet, class_name, name_len);		php_wddx_add_chunk_static(packet, WDDX_STRING_E);		php_wddx_add_chunk_static(packet, WDDX_VAR_E);		PHP_CLEANUP_CLASS_ATTRIBUTES();				for (zend_hash_internal_pointer_reset(HASH_OF(obj));			 zend_hash_get_current_data(HASH_OF(obj), (void**)&ent) == SUCCESS;			 zend_hash_move_forward(HASH_OF(obj))) {			if (*ent == obj)				continue;			if (zend_hash_get_current_key_ex(HASH_OF(obj), &key, &key_len, &idx, 0, NULL) == HASH_KEY_IS_STRING) {				php_wddx_serialize_var(packet, *ent, key, key_len TSRMLS_CC);			} else {				key_len = sprintf(tmp_buf, "%ld", idx);				php_wddx_serialize_var(packet, *ent, tmp_buf, key_len TSRMLS_CC);			}		}		php_wddx_add_chunk_static(packet, WDDX_STRUCT_E);	}	zval_dtor(fname);	FREE_ZVAL(fname);	if (retval) {		zval_ptr_dtor(&retval);	}}/* }}} *//* {{{ php_wddx_serialize_array */static void php_wddx_serialize_array(wddx_packet *packet, zval *arr){	zval **ent;	char *key;	uint key_len;	int is_struct = 0, ent_type;	ulong idx;	HashTable *target_hash;	char tmp_buf[WDDX_BUF_LEN];	ulong ind = 0;	int type;	TSRMLS_FETCH();	target_hash = HASH_OF(arr);	for (zend_hash_internal_pointer_reset(target_hash);		 zend_hash_get_current_data(target_hash, (void**)&ent) == SUCCESS;		 zend_hash_move_forward(target_hash)) {		type = zend_hash_get_current_key(target_hash, &key, &idx, 0);		if (type == HASH_KEY_IS_STRING) {			is_struct = 1;			break;		}		if (idx != ind) {			is_struct = 1;			break;		}		ind++;	}	if (is_struct) {		php_wddx_add_chunk_static(packet, WDDX_STRUCT_S);	} else {		sprintf(tmp_buf, WDDX_ARRAY_S, zend_hash_num_elements(target_hash));		php_wddx_add_chunk(packet, tmp_buf);	}	for (zend_hash_internal_pointer_reset(target_hash);		 zend_hash_get_current_data(target_hash, (void**)&ent) == SUCCESS;		 zend_hash_move_forward(target_hash)) {		if (*ent == arr)			continue;		if (is_struct) {			ent_type = zend_hash_get_current_key_ex(target_hash, &key, &key_len, &idx, 0, NULL);			if (ent_type == HASH_KEY_IS_STRING) {				php_wddx_serialize_var(packet, *ent, key, key_len TSRMLS_CC);			} else {				key_len = sprintf(tmp_buf, "%ld", idx);				php_wddx_serialize_var(packet, *ent, tmp_buf, key_len TSRMLS_CC);			}		} else			php_wddx_serialize_var(packet, *ent, NULL, 0 TSRMLS_CC);	}		if (is_struct) {		php_wddx_add_chunk_static(packet, WDDX_STRUCT_E);	} else {		php_wddx_add_chunk_static(packet, WDDX_ARRAY_E);	}}/* }}} *//* {{{ php_wddx_serialize_var */void php_wddx_serialize_var(wddx_packet *packet, zval *var, char *name, int name_len TSRMLS_DC){	char *tmp_buf;	char *name_esc;	int name_esc_len;	if (name) {		name_esc = php_escape_html_entities(name, name_len, &name_esc_len, 0, ENT_QUOTES, NULL TSRMLS_CC);		tmp_buf = emalloc(name_esc_len + sizeof(WDDX_VAR_S));		snprintf(tmp_buf, name_esc_len + sizeof(WDDX_VAR_S), WDDX_VAR_S, name_esc);		php_wddx_add_chunk(packet, tmp_buf);		efree(tmp_buf);		efree(name_esc);	}	switch(Z_TYPE_P(var)) {		case IS_STRING:			php_wddx_serialize_string(packet, var);			break;					case IS_LONG:		case IS_DOUBLE:			php_wddx_serialize_number(packet, var);			break;		case IS_BOOL:			php_wddx_serialize_boolean(packet, var);			break;		case IS_NULL:			php_wddx_serialize_unset(packet);			break;				case IS_ARRAY:			php_wddx_serialize_array(packet, var);			break;		case IS_OBJECT:			php_wddx_serialize_object(packet, var);			break;	}		if (name) {		php_wddx_add_chunk_static(packet, WDDX_VAR_E);	}}/* }}} *//* {{{ php_wddx_add_var */static void php_wddx_add_var(wddx_packet *packet, zval *name_var){	zval **val;	HashTable *target_hash;	TSRMLS_FETCH();		if (Z_TYPE_P(name_var) == IS_STRING)	{		if (zend_hash_find(EG(active_symbol_table), Z_STRVAL_P(name_var),							Z_STRLEN_P(name_var)+1, (void**)&val) != FAILURE) {			php_wddx_serialize_var(packet, *val, Z_STRVAL_P(name_var), Z_STRLEN_P(name_var) TSRMLS_CC);		}			}	else if (Z_TYPE_P(name_var) == IS_ARRAY || Z_TYPE_P(name_var) == IS_OBJECT)	{		target_hash = HASH_OF(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);							zend_hash_move_forward(target_hash);		}	}}/* }}} *//* {{{ php_wddx_push_element */static void php_wddx_push_element(void *user_data, const XML_Char *name, const XML_Char **atts){	st_entry ent;	wddx_stack *stack = (wddx_stack *)user_data;		if (!strcmp(name, EL_PACKET)) {		int i;				for (i=0; atts[i]; i++) {			if (!strcmp(atts[i], EL_VERSION)) {				/* nothing for now */			}		}	} else if (!strcmp(name, EL_STRING)) {		ent.type = ST_STRING;		SET_STACK_VARNAME;				ALLOC_ZVAL(ent.data);		INIT_PZVAL(ent.data);		Z_TYPE_P(ent.data) = IS_STRING;		Z_STRVAL_P(ent.data) = empty_string;		Z_STRLEN_P(ent.data) = 0;		wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));	} else if (!strcmp(name, EL_BINARY)) {		ent.type = ST_BINARY;		SET_STACK_VARNAME;				ALLOC_ZVAL(ent.data);		INIT_PZVAL(ent.data);		Z_TYPE_P(ent.data) = IS_STRING;		Z_STRVAL_P(ent.data) = empty_string;		Z_STRLEN_P(ent.data) = 0;		wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));	} else if (!strcmp(name, EL_CHAR)) {		int i;				for (i = 0; atts[i]; i++) {			if (!strcmp(atts[i], EL_CHAR_CODE) && atts[++i] && atts[i][0]) {				char tmp_buf[2];				sprintf(tmp_buf, "%c", (char)strtol(atts[i], NULL, 16));				php_wddx_process_data(user_data, tmp_buf, strlen(tmp_buf));				break;			}		}	} else if (!strcmp(name, EL_NUMBER)) {		ent.type = ST_NUMBER;		SET_STACK_VARNAME;				ALLOC_ZVAL(ent.data);		INIT_PZVAL(ent.data);		Z_TYPE_P(ent.data) = IS_LONG;		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] && atts[i][0]) {				ent.type = ST_BOOLEAN;				SET_STACK_VARNAME;				ALLOC_ZVAL(ent.data);				INIT_PZVAL(ent.data);				Z_TYPE_P(ent.data) = IS_BOOL;				wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));				php_wddx_process_data(user_data, atts[i], strlen(atts[i]));				break;			}		}	} else if (!strcmp(name, EL_NULL)) {		ent.type = ST_NULL;		SET_STACK_VARNAME;		ALLOC_ZVAL(ent.data);		INIT_PZVAL(ent.data);		ZVAL_NULL(ent.data);				wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));	} else if (!strcmp(name, EL_ARRAY)) {		ent.type = ST_ARRAY;		SET_STACK_VARNAME;				ALLOC_ZVAL(ent.data);		array_init(ent.data);		INIT_PZVAL(ent.data);		wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));	} else if (!strcmp(name, EL_STRUCT)) {		ent.type = ST_STRUCT;		SET_STACK_VARNAME;				ALLOC_ZVAL(ent.data);		array_init(ent.data);		INIT_PZVAL(ent.data);		wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));	} else if (!strcmp(name, EL_VAR)) {		int i;				for (i = 0; atts[i]; i++) {			if (!strcmp(atts[i], EL_NAME) && atts[++i] && atts[i][0]) {				char *decoded;				int decoded_len;				decoded = xml_utf8_decode(atts[i], strlen(atts[i]), &decoded_len, "ISO-8859-1");				stack->varname = decoded;				break;			}		}	} else if (!strcmp(name, EL_RECORDSET)) {		int i;		ent.type = ST_RECORDSET;		SET_STACK_VARNAME;		MAKE_STD_ZVAL(ent.data);		array_init(ent.data);		for (i = 0; atts[i]; i++) {			if (!strcmp(atts[i], "fieldNames") && atts[++i] && atts[i][0]) {				zval *tmp;				char *key;				char *p1, *p2, *endp;				char *decoded;				int decoded_len;				decoded = xml_utf8_decode(atts[i], strlen(atts[i]), &decoded_len, "ISO-8859-1");				endp = (char *)decoded + decoded_len;				p1 = (char *)decoded;				while ((p2 = php_memnstr(p1, ",", sizeof(",")-1, endp)) != NULL) {					key = estrndup(p1, p2 - p1);					MAKE_STD_ZVAL(tmp);					array_init(tmp);					add_assoc_zval_ex(ent.data, key, p2 - p1 + 1, tmp);					p1 = p2 + sizeof(",")-1;					efree(key);				}				if (p1 <= endp) {					MAKE_STD_ZVAL(tmp);					array_init(tmp);					add_assoc_zval_ex(ent.data, p1, endp - p1 + 1, tmp);				}				efree(decoded);				break;			}		}		wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));	} else if (!strcmp(name, EL_FIELD)) {		int i;		st_entry ent;		ent.type = ST_FIELD;		ent.varname = NULL;		ent.data = NULL;		for (i = 0; atts[i]; i++) {			if (!strcmp(atts[i], EL_NAME) && atts[++i] && atts[i][0]) {				char *decoded;				int decoded_len;				st_entry *recordset;				zval **field; 				decoded = xml_utf8_decode(atts[i], strlen(atts[i]), &decoded_len, "ISO-8859-1");				if (wddx_stack_top(stack, (void**)&recordset) == SUCCESS &&					recordset->type == ST_RECORDSET &&					zend_hash_find(Z_ARRVAL_P(recordset->data), decoded, decoded_len+1, (void**)&field) == SUCCESS) {					ent.data = *field;				}								efree(decoded);				break;			}		}		wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));	} else if (!strcmp(name, EL_DATETIME)) {		ent.type = ST_DATETIME;		SET_STACK_VARNAME;				ALLOC_ZVAL(ent.data);		INIT_PZVAL(ent.data);		Z_TYPE_P(ent.data) = IS_LONG;		wddx_stack_push((wddx_stack *)stack, &ent, sizeof(st_entry));	}}/* }}} *//* {{{ php_wddx_pop_element */static void php_wddx_pop_element(void *user_data, const XML_Char *name){	st_entry 			*ent1, *ent2;	wddx_stack 			*stack = (wddx_stack *)user_data;	HashTable 			*target_hash;	zend_class_entry 	*ce;	zval				*obj;	zval				*tmp;	TSRMLS_FETCH();/* OBJECTS_FIXME */	if (stack->top == 0)		return;	if (!strcmp(name, EL_STRING) || !strcmp(name, EL_NUMBER) ||		!strcmp(name, EL_BOOLEAN) || !strcmp(name, EL_NULL) ||

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -