📄 php_domxml.c
字号:
if (ctx) { if (ctx->user) { zval *wrapper = ctx->user; zval_ptr_dtor(&wrapper); } xmlXPathFreeContext(ctx); }}#endifstatic void php_free_xml_parser(zend_rsrc_list_entry *rsrc TSRMLS_DC){ xmlParserCtxtPtr parser = (xmlParserCtxtPtr) rsrc->ptr; if (parser) { zval *wrapper = dom_object_get_data(parser); zval_ptr_dtor(&wrapper); xmlFreeParserCtxt(parser); }}#if HAVE_DOMXSLTstatic void xsltstylesheet_set_data(void *obj, zval *wrapper){ ((xsltStylesheetPtr) obj)->_private = wrapper;}static zval *xsltstylesheet_get_data(void *obj){ return ((zval *) (((xsltStylesheetPtr) obj)->_private));}static void php_free_xslt_stylesheet(zend_rsrc_list_entry *rsrc TSRMLS_DC){ xsltStylesheetPtr sheet = (xsltStylesheetPtr) rsrc->ptr; zval *wrapper; int refcount = 0; if (sheet) { wrapper = xsltstylesheet_get_data(sheet); if (wrapper != NULL ) { refcount = wrapper->refcount; zval_ptr_dtor(&wrapper); /* only set it to null, if refcount was 1 before, otherwise it has still needed references */ if (refcount == 1) { xsltstylesheet_set_data(sheet, NULL); } } xsltFreeStylesheet(sheet); }}static void *php_xsltstylesheet_get_object(zval *wrapper, int rsrc_type1, int rsrc_type2 TSRMLS_DC){ void *obj; zval **handle; int type; if (NULL == wrapper) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "xsltstylesheet_get_object() invalid wrapper object passed"); return NULL; } if (Z_TYPE_P(wrapper) != IS_OBJECT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "wrapper is not an object"); return NULL; } if (zend_hash_index_find(Z_OBJPROP_P(wrapper), 0, (void **) &handle) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Underlying object missing"); return NULL; } obj = zend_list_find(Z_LVAL_PP(handle), &type); if (!obj || ((type != rsrc_type1) && (type != rsrc_type2))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Underlying object missing or of invalid type"); return NULL; } return obj;}static void php_xsltstylesheet_set_object(zval *wrapper, void *obj, int rsrc_type TSRMLS_DC){ zval *handle, *addr; MAKE_STD_ZVAL(handle); Z_TYPE_P(handle) = IS_LONG; Z_LVAL_P(handle) = zend_list_insert(obj, rsrc_type); MAKE_STD_ZVAL(addr); Z_TYPE_P(addr) = IS_LONG; Z_LVAL_P(addr) = (long) obj; zend_hash_index_update(Z_OBJPROP_P(wrapper), 0, &handle, sizeof(zval *), NULL); zend_hash_index_update(Z_OBJPROP_P(wrapper), 1, &addr, sizeof(zval *), NULL); zval_add_ref(&wrapper); xsltstylesheet_set_data(obj, wrapper);}#endif /* HAVE_DOMXSLT *//* Not used? *//*static void *php_xpath_get_object(zval *wrapper, int rsrc_type1, int rsrc_type2 TSRMLS_DC){ void *obj; zval **handle; int type; if (NULL == wrapper) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "php_xpath_get_object() invalid wrapper object passed"); return NULL; } if (Z_TYPE_P(wrapper) != IS_OBJECT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "wrapper is not an object"); return NULL; } if (zend_hash_index_find(Z_OBJPROP_P(wrapper), 0, (void **) &handle) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Underlying object missing"); return NULL; } obj = zend_list_find(Z_LVAL_PP(handle), &type); if (!obj || ((type != rsrc_type1) && (type != rsrc_type2))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Underlying object missing or of invalid type"); return NULL; } return obj;}*/static zval *php_xpathobject_new(xmlXPathObjectPtr obj, int *found TSRMLS_DC){ zval *wrapper; MAKE_STD_ZVAL(wrapper); object_init_ex(wrapper, xpathobject_class_entry); return (wrapper);}static void *php_xpath_get_context(zval *wrapper, int rsrc_type1, int rsrc_type2 TSRMLS_DC){ void *obj; zval **handle; int type; if (NULL == wrapper) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "php_xpath_get_context() invalid wrapper object passed"); return NULL; } if (Z_TYPE_P(wrapper) != IS_OBJECT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "wrapper is not an object"); return NULL; } if (zend_hash_index_find(Z_OBJPROP_P(wrapper), 0, (void **) &handle) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Underlying object missing"); return NULL; } obj = zend_list_find(Z_LVAL_PP(handle), &type); if (!obj || ((type != rsrc_type1) && (type != rsrc_type2))) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Underlying object missing or of invalid type"); return NULL; } return obj;}static void xpath_context_set_data(void *obj, zval *wrapper){/* char tmp[20]; sprintf(tmp, "%08X", obj); fprintf(stderr, "Adding %s to hash\n", tmp);*/ ((xmlXPathContextPtr) obj)->user = (void *) wrapper;}static zval *xpath_context_get_data(void *obj){/* char tmp[20]; sprintf(tmp, "%08X", obj); fprintf(stderr, "Trying getting %s from hash ...", tmp); if(((xmlXPathContextPtr) obj)->user) fprintf(stderr, " found\n"); else fprintf(stderr, " not found\n");*/ return ((zval *) (((xmlXPathContextPtr) obj)->user));}static void php_xpath_set_context(zval *wrapper, void *obj, int rsrc_type TSRMLS_DC){ zval *handle, *addr; MAKE_STD_ZVAL(handle); Z_TYPE_P(handle) = IS_LONG; Z_LVAL_P(handle) = zend_list_insert(obj, rsrc_type); MAKE_STD_ZVAL(addr); Z_TYPE_P(addr) = IS_LONG; Z_LVAL_P(addr) = (long) obj; zend_hash_index_update(Z_OBJPROP_P(wrapper), 0, &handle, sizeof(zval *), NULL); zend_hash_index_update(Z_OBJPROP_P(wrapper), 1, &addr, sizeof(zval *), NULL); zval_add_ref(&wrapper); xpath_context_set_data(obj, wrapper);}static zval *php_xpathcontext_new(xmlXPathContextPtr obj, int *found TSRMLS_DC){ zval *wrapper; int rsrc_type; *found = 0; if (!obj) { MAKE_STD_ZVAL(wrapper); ZVAL_NULL(wrapper); return wrapper; } if ((wrapper = (zval *) xpath_context_get_data((void *) obj))) { zval_add_ref(&wrapper); *found = 1; return wrapper; } MAKE_STD_ZVAL(wrapper);/* fprintf(stderr, "Adding new XPath Context\n");*/ object_init_ex(wrapper, xpathctx_class_entry); rsrc_type = le_xpathctxp; php_xpath_set_context(wrapper, (void *) obj, rsrc_type TSRMLS_CC); return (wrapper);}/* helper functions for xmlparser stuff */static void xmlparser_set_data(void *obj, zval *wrapper){ ((xmlParserCtxtPtr) obj)->_private = wrapper;}static void php_xmlparser_set_object(zval *wrapper, void *obj, int rsrc_type TSRMLS_DC){ zval *handle, *addr; MAKE_STD_ZVAL(handle); Z_TYPE_P(handle) = IS_LONG; Z_LVAL_P(handle) = zend_list_insert(obj, rsrc_type); MAKE_STD_ZVAL(addr); Z_TYPE_P(addr) = IS_LONG; Z_LVAL_P(addr) = (long) obj; zend_hash_index_update(Z_OBJPROP_P(wrapper), 0, &handle, sizeof(zval *), NULL); zend_hash_index_update(Z_OBJPROP_P(wrapper), 1, &addr, sizeof(zval *), NULL); zval_add_ref(&wrapper); xmlparser_set_data(obj, wrapper);}static zval *php_xmlparser_new(xmlParserCtxtPtr obj, int *found TSRMLS_DC){ zval *wrapper; int rsrc_type; *found = 0; if (!obj) { MAKE_STD_ZVAL(wrapper); ZVAL_NULL(wrapper); return wrapper; } MAKE_STD_ZVAL(wrapper); object_init_ex(wrapper, domxmlparser_class_entry); rsrc_type = le_domxmlparserp; php_xmlparser_set_object(wrapper, (void *) obj, rsrc_type TSRMLS_CC); return (wrapper);}/* {{{ php_xmlparser_make_params() Translates a PHP array to a xmlparser parameters array */static char **php_xmlparser_make_params(zval *idvars TSRMLS_DC){ HashTable *parht; int parsize; zval **value; char *expr, *string_key = NULL; ulong num_key; char **params = NULL; int i = 0; parht = HASH_OF(idvars); parsize = (2 * zend_hash_num_elements(parht) + 1) * sizeof(char *); params = (char **)emalloc(parsize); memset((char *)params, 0, parsize); for (zend_hash_internal_pointer_reset(parht); zend_hash_get_current_data(parht, (void **)&value) == SUCCESS; zend_hash_move_forward(parht)) { if (zend_hash_get_current_key(parht, &string_key, &num_key, 1) != HASH_KEY_IS_STRING) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid argument or parameter array"); return NULL; } else { SEPARATE_ZVAL(value); convert_to_string_ex(value); expr = Z_STRVAL_PP(value); if (expr) { params[i++] = string_key; params[i++] = expr; } } } params[i++] = NULL; return params;}/* }}} *//* end parser stuff */static void *php_dom_get_object(zval *wrapper, int rsrc_type1, int rsrc_type2 TSRMLS_DC){ void *obj; zval **handle; int type; if (NULL == wrapper) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "php_dom_get_object() invalid wrapper object passed"); return NULL; } if (Z_TYPE_P(wrapper) != IS_OBJECT) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "wrapper is not an object"); return NULL; } if (zend_hash_index_find(Z_OBJPROP_P(wrapper), 0, (void **) &handle) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Underlying object missing"); return NULL; } obj = zend_list_find(Z_LVAL_PP(handle), &type);/* The following test should be replaced with search in all parents */ if (!obj) { /* || ((type != rsrc_type1) && (type != rsrc_type2))) { */ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Underlying object missing or of invalid type"); return NULL; } return obj;}static void php_dom_set_object(zval *wrapper, void *obj, int rsrc_type TSRMLS_DC){ zval *handle, *addr; MAKE_STD_ZVAL(handle); Z_TYPE_P(handle) = IS_LONG; Z_LVAL_P(handle) = zend_list_insert(obj, rsrc_type); MAKE_STD_ZVAL(addr); Z_TYPE_P(addr) = IS_LONG; Z_LVAL_P(addr) = (long) obj; zend_hash_index_update(Z_OBJPROP_P(wrapper), 0, &handle, sizeof(zval *), NULL); zend_hash_index_update(Z_OBJPROP_P(wrapper), 1, &addr, sizeof(zval *), NULL); zval_add_ref(&wrapper); dom_object_set_data(obj, wrapper);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -