+PHP_HTTP_API php_http_buffer_t *php_http_params_to_string(php_http_buffer_t *buf, HashTable *params, const char *pss, size_t psl, const char *ass, size_t asl, const char *vss, size_t vsl TSRMLS_DC)
+{
+ zval **zparam;
+ HashPosition pos1, pos2;
+ php_http_array_hashkey_t key1 = php_http_array_hashkey_init(0), key2 = php_http_array_hashkey_init(0);
+
+ if (!buf) {
+ buf = php_http_buffer_init(NULL);
+ }
+
+ FOREACH_HASH_KEYVAL(pos1, params, key1, zparam) {
+ /* new param ? */
+ if (PHP_HTTP_BUFFER_LEN(buf)) {
+ php_http_buffer_append(buf, pss, psl);
+ }
+
+ /* add name */
+ if (key1.type == HASH_KEY_IS_STRING) {
+ php_http_buffer_append(buf, key1.str, key1.len - 1);
+ } else {
+ php_http_buffer_appendf(buf, "%lu", key1.num);
+ }
+
+ if (Z_TYPE_PP(zparam) != IS_ARRAY) {
+ zval *tmp = php_http_ztyp(IS_STRING, *zparam);
+
+ php_http_buffer_append(buf, vss, vsl);
+ php_http_buffer_append(buf, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+ zval_ptr_dtor(&tmp);
+ } else {
+ zval **zvalue, **zargs, **zarg;
+
+ /* got a value? */
+ if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(zparam), ZEND_STRS("value"), (void *) &zvalue)) {
+ if (Z_TYPE_PP(zvalue) != IS_BOOL) {
+ zval *tmp = php_http_ztyp(IS_STRING, *zvalue);
+
+ php_http_buffer_append(buf, vss, vsl);
+ php_http_buffer_append(buf, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+ zval_ptr_dtor(&tmp);
+ } else if (!Z_BVAL_PP(zvalue)) {
+ php_http_buffer_append(buf, vss, vsl);
+ php_http_buffer_appends(buf, "0");
+ }
+ }
+ /* add arguments */
+ if (SUCCESS != zend_hash_find(Z_ARRVAL_PP(zparam), ZEND_STRS("arguments"), (void *) &zargs)) {
+ zargs = zparam;
+ }
+
+ if (Z_TYPE_PP(zargs) == IS_ARRAY) {
+ FOREACH_KEYVAL(pos2, *zargs, key2, zarg) {
+ /* skip "value" if zargs == zparam */
+ if (zargs == zparam && key2.type == HASH_KEY_IS_STRING && !strcmp(key2.str, "value")) {
+ continue;
+ }
+
+ /* new arg? */
+ if (PHP_HTTP_BUFFER_LEN(buf)) {
+ php_http_buffer_append(buf, ass, asl);
+ }
+
+ /* add name */
+ if (key2.type == HASH_KEY_IS_STRING) {
+ php_http_buffer_append(buf, key2.str, key2.len - 1);
+ } else {
+ php_http_buffer_appendf(buf, "%lu", key2.num);
+ }
+ /* add value */
+ if (Z_TYPE_PP(zarg) != IS_BOOL) {
+ zval *tmp = php_http_ztyp(IS_STRING, *zarg);
+ int escaped_len;
+
+ Z_STRVAL_P(tmp) = php_addslashes(Z_STRVAL_P(tmp), Z_STRLEN_P(tmp), &escaped_len, 1 TSRMLS_CC);
+ php_http_buffer_append(buf, vss, vsl);
+ if (escaped_len != Z_STRLEN_P(tmp)) {
+ php_http_buffer_appends(buf, "\"");
+ php_http_buffer_append(buf, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp) = escaped_len);
+ php_http_buffer_appends(buf, "\"");
+ } else {
+ php_http_buffer_append(buf, Z_STRVAL_P(tmp), Z_STRLEN_P(tmp));
+ }
+ zval_ptr_dtor(&tmp);
+ } else if (!Z_BVAL_PP(zarg)) {
+ php_http_buffer_append(buf, vss, vsl);
+ php_http_buffer_appends(buf, "0");
+ }
+ }
+ }
+ }
+ }
+
+ php_http_buffer_shrink(buf);
+ php_http_buffer_fix(buf);
+
+ return buf;
+}
+