summaryrefslogtreecommitdiff
path: root/ext/standard/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/string.c')
-rw-r--r--ext/standard/string.c30
1 files changed, 18 insertions, 12 deletions
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;
}