X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_misc.c;h=3ad9988955f279ff8e366d398ec41d5d41c2036e;hp=c4661b7befc2988875ba6cacfbbbaf96cff83c96;hb=0b83632b2b0a03eeca090f993259ccd95ab646fb;hpb=6cc24086f57aa1e8f4d6a2c12361635e7c24f60f diff --git a/php_http_misc.c b/php_http_misc.c index c4661b7..3ad9988 100644 --- a/php_http_misc.c +++ b/php_http_misc.c @@ -6,7 +6,7 @@ | modification, are permitted provided that the conditions mentioned | | in the accompanying LICENSE file are met. | +--------------------------------------------------------------------+ - | Copyright (c) 2004-2011, Michael Wallner | + | Copyright (c) 2004-2013, Michael Wallner | +--------------------------------------------------------------------+ */ @@ -142,6 +142,29 @@ int php_http_select_str(const char *cmp, int argc, ...) /* ARRAYS */ +PHP_HTTP_API unsigned php_http_array_list(HashTable *ht TSRMLS_DC, unsigned argc, ...) +{ + HashPosition pos; + unsigned argl = 0; + va_list argv; + + va_start(argv, argc); + for ( zend_hash_internal_pointer_reset_ex(ht, &pos); + SUCCESS == zend_hash_has_more_elements_ex(ht, &pos) && (argl < argc); + zend_hash_move_forward_ex(ht, &pos)) + { + zval **data, ***argp = (zval ***) va_arg(argv, zval ***); + + if (SUCCESS == zend_hash_get_current_data_ex(ht, (void *) &data, &pos)) { + *argp = data; + ++argl; + } + } + va_end(argv); + + return argl; +} + int php_http_array_apply_append_func(void *pDest TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key) { int flags; @@ -206,12 +229,6 @@ int php_http_array_apply_merge_func(void *pDest TSRMLS_DC, int num_args, va_list /* PASS CALLBACK */ -PHP_HTTP_API size_t php_http_pass_wrapper(php_http_pass_callback_arg_t *cb, const char *str, size_t len) -{ - TSRMLS_FETCH(); - return cb->cb_zts(cb->cb_arg, str, len TSRMLS_CC); -} - PHP_HTTP_API size_t php_http_pass_fcall_callback(void *cb_arg, const char *str, size_t len) { php_http_pass_fcall_arg_t *fcd = cb_arg; @@ -253,7 +270,8 @@ void php_http_error(long type TSRMLS_DC, long code, const char *format, ...) char *message; zend_class_entry *ce = php_http_exception_class_entry; - if (0&& EG(exception_class) && instanceof_function(EG(exception_class), php_http_exception_class_entry TSRMLS_CC)) { + /* FIXME wat? */ + if (0&& EG(exception_class) && instanceof_function(EG(exception_class), ce TSRMLS_CC)) { ce = EG(exception_class); } @@ -271,6 +289,34 @@ void php_http_error(long type TSRMLS_DC, long code, const char *format, ...) va_end(args); } +/* ZEND */ + +STATUS php_http_method_call(zval *object, const char *method_str, size_t method_len, int argc, zval **argv[], zval **retval_ptr TSRMLS_DC) +{ + zend_fcall_info fci; + zval zmethod; + zval *retval; + STATUS rv; + + fci.size = sizeof(fci); + fci.object_ptr = object; + fci.function_name = &zmethod; + fci.retval_ptr_ptr = retval_ptr ? retval_ptr : &retval; + fci.param_count = argc; + fci.params = argv; + fci.no_separation = 1; + fci.symbol_table = NULL; + fci.function_table = NULL; + + INIT_PZVAL(&zmethod); + ZVAL_STRINGL(&zmethod, method_str, method_len, 0); + rv = zend_call_function(&fci, NULL TSRMLS_CC); + + if (!retval_ptr && retval) { + zval_ptr_dtor(&retval); + } + return rv; +} /* * Local variables: * tab-width: 4