📄 w32api.c
字号:
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 + -