zval *element;
php_process_env_t env;
zend_string *string_key;
- char *data;
#ifndef PHP_WIN32
char **ep;
#endif
char *p;
- uint cnt, l, sizeenv=0, el_len;
- ulong num_key;
+ uint cnt, l, sizeenv=0;
HashTable *target_hash;
memset(&env, 0, sizeof(env));
}
/* first, we have to get the size of all the elements in the hash */
- ZEND_HASH_FOREACH_KEY_VAL(target_hash, num_key, string_key, element) {
- zval tmp;
-
- if (Z_TYPE_P(element) != IS_STRING) {
- ZVAL_DUP(&tmp, element);
- convert_to_string(&tmp);
- el_len = Z_STRLEN(tmp);
- zval_dtor(&tmp);
- } else {
- el_len = Z_STRLEN_P(element);
- }
+ ZEND_HASH_FOREACH_STR_KEY_VAL(target_hash, string_key, element) {
+ zend_string *str = zval_get_string(element);
+ uint el_len = str->len;
+ STR_RELEASE(str);
+
if (el_len == 0) {
continue;
}
- sizeenv += el_len+1;
+ sizeenv += el_len + 1;
if (string_key) {
if (string_key->len == 0) {
#endif
p = env.envp = (char *) pecalloc(sizeenv + 4, 1, is_persistent);
- ZEND_HASH_FOREACH_KEY_VAL(target_hash, num_key, string_key, element) {
- zval tmp;
-
- if (Z_TYPE_P(element) != IS_STRING) {
- ZVAL_DUP(&tmp, element);
- convert_to_string(&tmp);
- } else {
- ZVAL_COPY_VALUE(&tmp, element);
- }
-
- el_len = Z_STRLEN(tmp);
+ ZEND_HASH_FOREACH_STR_KEY_VAL(target_hash, string_key, element) {
+ zend_string *str = zval_get_string(element);
- if (el_len == 0) {
+ if (str->len == 0) {
goto next_element;
}
- data = Z_STRVAL(tmp);
-
if (string_key) {
if (string_key->len == 0) {
goto next_element;
}
- l = string_key->len + el_len + 2;
+ l = string_key->len + str->len + 2;
memcpy(p, string_key->val, string_key->len);
strncat(p, "=", 1);
- strncat(p, data, el_len);
+ strncat(p, str->val, str->len);
#ifndef PHP_WIN32
*ep = p;
#endif
p += l;
} else {
- memcpy(p,data,el_len);
+ memcpy(p, str->val, str->len);
#ifndef PHP_WIN32
*ep = p;
++ep;
#endif
- p += el_len + 1;
+ p += str->len + 1;
}
next_element:
- if (Z_TYPE_P(element) != IS_STRING) {
- zval_dtor(&tmp);
- }
+ STR_RELEASE(str);
} ZEND_HASH_FOREACH_END();
assert((uint)(p - env.envp) <= sizeenv);