summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xext/standard/basic_functions.c8
-rw-r--r--ext/standard/basic_functions.h3
-rw-r--r--ext/standard/string.c30
3 files changed, 23 insertions, 18 deletions
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 51a44a3ffb..b2b30a05e4 100755
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -458,7 +458,6 @@ PHP_RINIT_FUNCTION(basic) /* {{{ */
memset(&BG(unserialize), 0, sizeof(BG(unserialize)));
BG(strtok_string) = NULL;
- ZVAL_UNDEF(&BG(strtok_zval));
BG(strtok_last) = NULL;
BG(ctype_string) = NULL;
BG(locale_changed) = 0;
@@ -497,9 +496,10 @@ PHP_RINIT_FUNCTION(basic) /* {{{ */
PHP_RSHUTDOWN_FUNCTION(basic) /* {{{ */
{
- zval_ptr_dtor(&BG(strtok_zval));
- ZVAL_UNDEF(&BG(strtok_zval));
- BG(strtok_string) = NULL;
+ if (BG(strtok_string)) {
+ zend_string_release(BG(strtok_string));
+ BG(strtok_string) = NULL;
+ }
#ifdef HAVE_PUTENV
tsrm_env_lock();
zend_hash_destroy(&BG(putenv_ht));
diff --git a/ext/standard/basic_functions.h b/ext/standard/basic_functions.h
index 00727668dc..52db18ce85 100644
--- a/ext/standard/basic_functions.h
+++ b/ext/standard/basic_functions.h
@@ -60,8 +60,7 @@ typedef int32_t php_int32;
typedef struct _php_basic_globals {
HashTable *user_shutdown_function_names;
HashTable putenv_ht;
- zval strtok_zval;
- char *strtok_string;
+ zend_string *strtok_string;
zend_string *ctype_string; /* current LC_CTYPE locale (or NULL for 'C') */
zend_bool locale_changed; /* locale was changed and has to be restored */
char *strtok_last;
diff --git a/ext/standard/string.c b/ext/standard/string.c
index b8572671fa..bdaaeea47f 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -1271,16 +1271,24 @@ PHP_FUNCTION(strtok)
if (ZEND_NUM_ARGS() == 1) {
tok = str;
} else {
- zval_ptr_dtor(&BG(strtok_zval));
- ZVAL_STRINGL(&BG(strtok_zval), ZSTR_VAL(str), ZSTR_LEN(str));
- BG(strtok_last) = BG(strtok_string) = Z_STRVAL(BG(strtok_zval));
+ if (BG(strtok_string)) {
+ zend_string_release(BG(strtok_string));
+ }
+ BG(strtok_string) = zend_string_copy(str);
+ BG(strtok_last) = ZSTR_VAL(str);
BG(strtok_len) = ZSTR_LEN(str);
}
- p = BG(strtok_last); /* Where we start to search */
- pe = BG(strtok_string) + BG(strtok_len);
+ if (!BG(strtok_string)) {
+ /* String to tokenize not set. */
+ // TODO: Should this warn?
+ RETURN_FALSE;
+ }
- if (!p || p >= pe) {
+ p = BG(strtok_last); /* Where we start to search */
+ pe = ZSTR_VAL(BG(strtok_string)) + BG(strtok_len);
+ if (p >= pe) {
+ /* Reached the end of the string. */
RETURN_FALSE;
}
@@ -1295,9 +1303,7 @@ PHP_FUNCTION(strtok)
while (STRTOK_TABLE(p)) {
if (++p >= pe) {
/* no other chars left */
- BG(strtok_last) = NULL;
- RETVAL_FALSE;
- goto restore;
+ goto return_false;
}
skipped++;
}
@@ -1314,14 +1320,14 @@ return_token:
RETVAL_STRINGL(BG(strtok_last) + skipped, (p - BG(strtok_last)) - skipped);
BG(strtok_last) = p + 1;
} else {
+return_false:
RETVAL_FALSE;
- BG(strtok_last) = NULL;
+ zend_string_release(BG(strtok_string));
+ BG(strtok_string) = NULL;
}
/* Restore table -- usually faster then memset'ing the table on every invocation */
-restore:
token = ZSTR_VAL(tok);
-
while (token < token_end) {
STRTOK_TABLE(token++) = 0;
}