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

📄 w32api.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
	printf("Type Size:        \t\t%d\n", (*th)->size);	printf("Member Count:     \t\t%d\n", (*th)->member_count);	printf("## Members ##\n");	printf("---------------------------------------------------------------------\n");	php_w32api_print_members((*th)->member_list);	printf("=====================================================================\n\n");	return 0;}void php_w32api_print_members(members *member_list){	if(member_list == NULL)		return;	printf("\tMember Name:     \t%s\n", member_list->member->member_name);	printf("\tMember Flags:    \t%d\n", member_list->member->flags);	printf("\tMember Type ID:  \t%d\n", member_list->member->member_type_id);	printf("\tMember Type Name:\t%s\n", member_list->member->member_type_name);	printf("\tMember Offset:   \t%d\n", member_list->member->offset);	printf("---------------------------------------------------------------------\n");	php_w32api_print_members(member_list->next_member);}void php_w32api_print_arguments(arguments *argument_list){	if(argument_list == NULL)		return;	printf("\tArgument Name:   \t%s\n", argument_list->arg->argument_name);	printf("\tArgument Flags:  \t%d\n", argument_list->arg->flags);	printf("\tArgument Type ID:\t%d\n", argument_list->arg->type_id);	printf("\tArg Type Name:   \t%s\n", argument_list->arg->type_name);	printf("---------------------------------------------------------------------\n");	php_w32api_print_arguments(argument_list->next_arg);}#endif/* ===================================================================================================== * Type Class Code * ===================================================================================================== *//* {{{ type_class_functions[] */function_entry type_class_functions[] = {	W32API_CLASS_FE(type, clone, NULL)	{NULL, NULL, NULL}};/* }}} *//* {{{ type_class_init(TSRMLS_DC) */int type_class_init(TSRMLS_D){	zend_class_entry ce;	INIT_OVERLOADED_CLASS_ENTRY(ce, 								"type", 								type_class_functions, 								NULL, 								W32API_PROP_GET_FUNCTION_N(type),								W32API_PROP_SET_FUNCTION_N(type));	WG(type_ce) = zend_register_internal_class(&ce TSRMLS_CC);	return SUCCESS;}/* }}} *//* {{{ W32API_PROP_SET_FUNCTION(type) *//* Most of this code is borrowed from php-gtk. Thanks to Andrei and Zeev for their  * help with the prop-get/set functions  */W32API_PROP_SET_FUNCTION(type){	zval result, temp;	zval *temp_ptr = &temp;	zval *new_val;	zend_overloaded_element *overloaded_property;	zend_llist_element *element;	zval **object = &property_reference->object;	int setter_retval, getter_retval;	TSRMLS_FETCH();	/* If we have $foo->bar->baz->boo->bin we have to do sucessive propgets	 * Until we can do our prop set (thanks Zeev, Andrei)	 */	for (element=property_reference->elements_list->head; element != property_reference->elements_list->tail; element=element->next) {		overloaded_property = (zend_overloaded_element *)element->data;		getter_retval = FAILURE;		if (Z_TYPE_P(overloaded_property) == OE_IS_OBJECT) {			if (Z_TYPE_PP(object) == IS_NULL ||				(Z_TYPE_PP(object) == IS_BOOL && Z_LVAL_PP(object) == 0) ||				(Z_TYPE_PP(object) == IS_STRING && Z_STRLEN_PP(object) == 0)) {				object_init(*object);			}					/* Trying to access a property on a non-object. */			if (Z_TYPE_PP(object) != IS_OBJECT) {				return FAILURE;			} 			getter_retval = php_w32api_do_prop_get(*object, &result, &element TSRMLS_CC);			if (getter_retval == SUCCESS) {				temp = result;				object = &temp_ptr;			} else {				if ((getter_retval = zend_hash_find(Z_OBJPROP_PP(object),											   Z_STRVAL(overloaded_property->element),											   Z_STRLEN(overloaded_property->element)+1,											   (void **)&object)) == FAILURE) {					MAKE_STD_ZVAL(new_val);					ZVAL_NULL(new_val);					zend_hash_update(Z_OBJPROP_PP(object),									 Z_STRVAL(overloaded_property->element),									 Z_STRLEN(overloaded_property->element)+1,									 &new_val, sizeof(void *), (void **)&object);				}			}		} else if (Z_TYPE_P(overloaded_property) == OE_IS_ARRAY) {			if (Z_TYPE_PP(object) == IS_NULL ||				(Z_TYPE_PP(object) == IS_BOOL && Z_LVAL_PP(object) == 0) ||				(Z_TYPE_PP(object) == IS_STRING && Z_STRLEN_PP(object) == 0)) {				array_init(*object);			}			/* Trying to access index on a non-array. */			if (Z_TYPE_PP(object) != IS_ARRAY) {				return FAILURE;			}						if (Z_TYPE(overloaded_property->element) == IS_STRING) {				getter_retval = zend_hash_find(Z_ARRVAL_PP(object),											   Z_STRVAL(overloaded_property->element),											   Z_STRLEN(overloaded_property->element)+1,											   (void **)&object);			} else if (Z_TYPE(overloaded_property->element) == IS_LONG) {				getter_retval = zend_hash_index_find(Z_ARRVAL_PP(object),													 Z_LVAL(overloaded_property->element),													 (void **)&object);			}			if (getter_retval == FAILURE) {				MAKE_STD_ZVAL(new_val);				ZVAL_NULL(new_val);				if (Z_TYPE(overloaded_property->element) == IS_STRING) {					zend_hash_update(Z_ARRVAL_PP(object),									  Z_STRVAL(overloaded_property->element),									  Z_STRLEN(overloaded_property->element)+1,									  &new_val, sizeof(void *), (void **)&object);				} else if (Z_TYPE(overloaded_property->element) == IS_LONG) {					zend_hash_index_update(Z_ARRVAL_PP(object),										   Z_LVAL(overloaded_property->element),										   &new_val, sizeof(void *), (void **)&object);				}			}		}		zval_dtor(&overloaded_property->element);	}		/* object is now the object we want to set our property on */	overloaded_property = (zend_overloaded_element *) element->data;	setter_retval = php_w32api_do_prop_set(*object, value, &element TSRMLS_CC);		zval_dtor(&overloaded_property->element);	return setter_retval;}/* }}} *//* {{{ W32API_PROP_GET_FUNCTION(type) */W32API_PROP_GET_FUNCTION(type){	zval result;	zval *result_ptr = &result;	zval **prop_result;	zend_overloaded_element *overloaded_property;	zend_llist_element *element;	zval object = *property_reference->object;	int getter_retval;	TSRMLS_FETCH();	for (element=property_reference->elements_list->head; element; element=element->next) {		overloaded_property = (zend_overloaded_element *) element->data;		getter_retval = FAILURE;		ZVAL_NULL(&result);		if (Z_TYPE_P(overloaded_property) == OE_IS_OBJECT) {			/* Trying to access a property on a non-object. */			if (Z_TYPE(object) != IS_OBJECT ||				Z_TYPE(overloaded_property->element) != IS_STRING) {				return result;			}			if ((getter_retval = php_w32api_do_prop_get(&object, &result, &element TSRMLS_CC) == FAILURE)) {								if ((getter_retval = zend_hash_find(Z_OBJPROP(object),											   Z_STRVAL(overloaded_property->element),											   Z_STRLEN(overloaded_property->element)+1,											   (void **)&prop_result)) == SUCCESS) {					result = **prop_result;				}			}		} else if (Z_TYPE_P(overloaded_property) == OE_IS_ARRAY) {			/* Trying to access index on a non-array. */			if (Z_TYPE(object) != IS_ARRAY) {				return result;			}			if (Z_TYPE(overloaded_property->element) == IS_STRING) {				getter_retval = zend_hash_find(Z_ARRVAL(object),											   Z_STRVAL(overloaded_property->element),											   Z_STRLEN(overloaded_property->element)+1,											   (void **)&prop_result);			} else if (Z_TYPE(overloaded_property->element) == IS_LONG) {				getter_retval = zend_hash_index_find(Z_ARRVAL(object),													 Z_LVAL(overloaded_property->element),													 (void **)&prop_result);			}			if (getter_retval == SUCCESS)				result = **prop_result;		}		zval_dtor(&overloaded_property->element);		object = result;		if (getter_retval == FAILURE) {			return result;		}	}	zval_add_ref(&result_ptr);	SEPARATE_ZVAL(&result_ptr);	return *result_ptr;}/* }}} *//* {{{ proto: Type Type::Clone() *	Creates an exact clone of the object. */W32API_CLASS_FUNCTION(type, clone){}/* }}} *//* ===================================================================================================== * Scanner & Parser Functions * ===================================================================================================== *//* ----------------------------- * Function Definition Functions * ----------------------------- *//* {{{ w32api_parser_load_function_ex * Callback for the parser, if the library name is cb.cb we are registering a  * callback so the LoadLibary and GetProcAddress code is skipped  */w32api_func_handle *w32api_parser_load_function_ex(char *return_type, char *function_name, char *alias_name, arguments *argument_list, char *library_name){	w32api_func_handle *return_value;	TSRMLS_FETCH();	return_value = (w32api_func_handle *)emalloc(sizeof(w32api_func_handle));	memset(return_value, '\0', sizeof(w32api_func_handle));	return_value->argument_list = argument_list;	return_value->flags = 0;	return_value->function_name = (alias_name)?alias_name:function_name;				/* This is estrdup'd in the Scanner already!! */	return_value->return_type_name = return_type;									/* This is estrdup'd in the Scanner already!! */	return_value->return_type_id = php_w32api_get_type_id_from_name(return_type);	if(strcmp("cb.cb", library_name))													/* Bit of a hack but we are registering a callback */	{		php_w32api_load_library(library_name, &return_value->lib TSRMLS_CC);		if(!return_value->lib)		{			/* php_w32api_load_library has already given error */			efree(return_value);			return NULL;		}		return_value->handle = GetProcAddress(return_value->lib->handle, function_name);		if(!return_value->handle)		{			/* Check for variation ending with A */			char *ascii_name = NULL;							ascii_name = emalloc(strlen(function_name) + 2);			strcpy(ascii_name, function_name);			ascii_name[strlen(function_name)] = 'A';			ascii_name[strlen(function_name) + 1] = '\0';			return_value->handle = GetProcAddress(return_value->lib->handle, ascii_name);			efree(ascii_name);						if(!return_value->handle)			{				/* TODO: php_error_docref and GetLastError etc */				php_error(E_WARNING, "Could not load function %s", function_name);				efree(return_value);				return NULL;			}		}	}	/* We want function_name in lowercase now */	php_strtolower(return_value->function_name, strlen(return_value->function_name));	/* Free it if we have a alias */	if(alias_name)		efree(function_name);	return return_value;}/* }}} */	/* {{{ w32api_parser_make_argument * Helper function for the parser */arguments *w32api_parser_make_argument(char *arg_type, char *arg_name, int byref){	arguments *return_value = NULL;								/* Pointer to our return value */	argument *argument_value = NULL;							/* Our actual argument */	argument_value = emalloc(sizeof(argument));	return_value = emalloc(sizeof(arguments));	return_value->arg = argument_value;	return_value->next_arg = return_value->prev_arg = NULL;	argument_value->flags = byref;	argument_value->argument_name = arg_name;	argument_value->type_name = arg_type;	argument_value->type_id = php_w32api_get_type_id_from_name(arg_type);	if(argument_value->type_id == W32API_UNKNOWN)	{		php_error(E_NOTICE, "Unknown type %s used as arugment type", arg_type);	}	return return_value;}/* }}} */	/* {{{ w32api_parser_join_arguments * Helper function for the parser */arguments *w32api_parser_join_arguments(arguments *lval, arguments *rval){	lval->next_arg = rval;	rval->prev_arg = lval;	return lval;}/* }}} */	/* {{{ w32api_function_definition_error * Error function for the parser */int w32api_function_definition_error(char *s){	php_error(E_ERROR, "Function Definition Parse Error: %s", s);	return 0;}/* }}} */	/* ------------------------- * Type Definition Functions * ------------------------- */w32api_type_handle *w32api_parser_register_type(char *type_name, members *member_list){	w32api_type_handle *return_value = NULL;	members *current_member;	int offset = 0;	int member_count = 0;	return_value = emalloc(sizeof(w32api_type_handle));	return_value->member_list = member_list;	return_value->type_name = type_name;										/* estrdup'd in parser */	return_value->member_count = 0;		current_member = return_value->member_list;	while(current_member != NULL)	{		return_value->member_count++;		current_member->member->offset = offset;		offset += php_w32api_get_type_size(current_member->member->member_type_id, current_member->member->member_type_name, current_member->member->flags);		current_member = current_member->next_member;	}	return_value->size = offset;	return return_value;}members *w32api_parser_type_make_value(char *type_name, char *member_name, long flags){	members *return_value = NULL;												/* Pointer to our return value */	member  *member_value = NULL;												/* Our actual member */	member_value = emalloc(sizeof(member));	return_value = emalloc(sizeof(members));	return_value->member = member_value;	return_value->next_member = return_value->prev_member = NULL;	member_value->member_name = member_name;									/* estrdup'd in parser */	member_value->member_type_name = type_name;									/* estrdup'd in parser */	member_value->member_type_id = php_w32api_get_type_id_from_name(type_name);	member_value->flags = flags;	return return_value;}members *w32api_parser_type_join_values(members *lval, members *rval){	lval->next_member = rval;	rval->prev_member = lval;	return lval;}/* {{{ w32api_function_definition_error * Error function for the parser */int w32api_type_definition_error(char *s){	php_error(E_ERROR, "Type Definition Parse Error: %s", s);	return 0;}/* }}} */	#endif /* HAVE_W32API */

⌨️ 快捷键说明

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