summaryrefslogtreecommitdiff
path: root/Zend/zend_string.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_string.c')
-rw-r--r--Zend/zend_string.c40
1 files changed, 35 insertions, 5 deletions
diff --git a/Zend/zend_string.c b/Zend/zend_string.c
index 75e7e6249f..570aeece61 100644
--- a/Zend/zend_string.c
+++ b/Zend/zend_string.c
@@ -28,8 +28,8 @@ ZEND_API zend_string_init_interned_func_t zend_string_init_interned;
static zend_string* ZEND_FASTCALL zend_new_interned_string_permanent(zend_string *str);
static zend_string* ZEND_FASTCALL zend_new_interned_string_request(zend_string *str);
-static zend_string* ZEND_FASTCALL zend_string_init_interned_permanent(const char *str, size_t size, int permanent);
-static zend_string* ZEND_FASTCALL zend_string_init_interned_request(const char *str, size_t size, int permanent);
+static zend_string* ZEND_FASTCALL zend_string_init_interned_permanent(const char *str, size_t size, bool permanent);
+static zend_string* ZEND_FASTCALL zend_string_init_interned_request(const char *str, size_t size, bool permanent);
/* Any strings interned in the startup phase. Common to all the threads,
won't be free'd until process exit. If we want an ability to
@@ -67,7 +67,7 @@ ZEND_KNOWN_STRINGS(_ZEND_STR_DSC)
NULL
};
-static zend_always_inline void zend_init_interned_strings_ht(HashTable *interned_strings, int permanent)
+static zend_always_inline void zend_init_interned_strings_ht(HashTable *interned_strings, bool permanent)
{
zend_hash_init(interned_strings, 1024, NULL, _str_dtor, permanent);
if (permanent) {
@@ -251,7 +251,7 @@ static zend_string* ZEND_FASTCALL zend_new_interned_string_request(zend_string *
return ret;
}
-static zend_string* ZEND_FASTCALL zend_string_init_interned_permanent(const char *str, size_t size, int permanent)
+static zend_string* ZEND_FASTCALL zend_string_init_interned_permanent(const char *str, size_t size, bool permanent)
{
zend_string *ret;
zend_ulong h = zend_inline_hash_func(str, size);
@@ -267,7 +267,7 @@ static zend_string* ZEND_FASTCALL zend_string_init_interned_permanent(const char
return zend_add_interned_string(ret, &interned_strings_permanent, IS_STR_PERMANENT);
}
-static zend_string* ZEND_FASTCALL zend_string_init_interned_request(const char *str, size_t size, int permanent)
+static zend_string* ZEND_FASTCALL zend_string_init_interned_request(const char *str, size_t size, bool permanent)
{
zend_string *ret;
zend_ulong h = zend_inline_hash_func(str, size);
@@ -461,3 +461,33 @@ ZEND_API zend_bool ZEND_FASTCALL I_WRAP_SONAME_FNNAME_ZU(NONE,zend_string_equal_
#endif
#endif
+
+ZEND_API zend_string *zend_string_concat2(
+ const char *str1, size_t str1_len,
+ const char *str2, size_t str2_len)
+{
+ size_t len = str1_len + str2_len;
+ zend_string *res = zend_string_alloc(len, 0);
+
+ memcpy(ZSTR_VAL(res), str1, str1_len);
+ memcpy(ZSTR_VAL(res) + str1_len, str2, str2_len);
+ ZSTR_VAL(res)[len] = '\0';
+
+ return res;
+}
+
+ZEND_API zend_string *zend_string_concat3(
+ const char *str1, size_t str1_len,
+ const char *str2, size_t str2_len,
+ const char *str3, size_t str3_len)
+{
+ size_t len = str1_len + str2_len + str3_len;
+ zend_string *res = zend_string_alloc(len, 0);
+
+ memcpy(ZSTR_VAL(res), str1, str1_len);
+ memcpy(ZSTR_VAL(res) + str1_len, str2, str2_len);
+ memcpy(ZSTR_VAL(res) + str1_len + str2_len, str3, str3_len);
+ ZSTR_VAL(res)[len] = '\0';
+
+ return res;
+}