summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2014-02-23 18:08:35 +0800
committerXinchen Hui <laruence@gmail.com>2014-02-23 18:08:35 +0800
commitc0aba2c641a6bfe909011d0fc25acfdd63d85525 (patch)
tree4fc6c3d5422895be209118ddc52f707da35b5679
parent0e4cfad1e8f6d199fd396082985aa2a0bb7c716b (diff)
downloadphp-git-c0aba2c641a6bfe909011d0fc25acfdd63d85525.tar.gz
Refactor basename using zend_string
-rw-r--r--ext/spl/spl_directory.c45
-rw-r--r--ext/standard/file.c13
-rw-r--r--ext/standard/ftp_fopen_wrapper.c19
-rw-r--r--ext/standard/mail.c11
-rw-r--r--ext/standard/php_string.h2
-rw-r--r--ext/standard/string.c60
-rw-r--r--ext/zip/php_zip.c30
-rw-r--r--ext/zip/zip_stream.c11
8 files changed, 80 insertions, 111 deletions
diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c
index 0d2621c6ed..84ee3f823d 100644
--- a/ext/spl/spl_directory.c
+++ b/ext/spl/spl_directory.c
@@ -923,6 +923,7 @@ SPL_METHOD(SplFileInfo, getExtension)
const char *p;
size_t flen;
int path_len, idx;
+ zend_string *ret;
if (zend_parse_parameters_none() == FAILURE) {
return;
@@ -938,18 +939,16 @@ SPL_METHOD(SplFileInfo, getExtension)
flen = intern->file_name_len;
}
- php_basename(fname, flen, NULL, 0, &fname, &flen TSRMLS_CC);
+ ret = php_basename(fname, flen, NULL, 0 TSRMLS_CC);
- p = zend_memrchr(fname, '.', flen);
+ p = zend_memrchr(ret->val, '.', ret->len);
if (p) {
idx = p - fname;
- RETVAL_STRINGL(fname + idx + 1, flen - idx - 1);
- efree(fname);
+ RETVAL_STRINGL(ret->val + idx + 1, ret->len - idx - 1);
+ STR_RELEASE(ret);
return;
} else {
- if (fname) {
- efree(fname);
- }
+ STR_RELEASE(ret);
RETURN_EMPTY_STRING();
}
}
@@ -960,27 +959,23 @@ SPL_METHOD(SplFileInfo, getExtension)
SPL_METHOD(DirectoryIterator, getExtension)
{
spl_filesystem_object *intern = (spl_filesystem_object*)Z_OBJ_P(getThis());
- char *fname = NULL;
const char *p;
- size_t flen;
int idx;
+ zend_string *fname;
if (zend_parse_parameters_none() == FAILURE) {
return;
}
- php_basename(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), NULL, 0, &fname, &flen TSRMLS_CC);
+ fname = php_basename(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), NULL, 0 TSRMLS_CC);
- p = zend_memrchr(fname, '.', flen);
+ p = zend_memrchr(fname->val, '.', fname->len);
if (p) {
- idx = p - fname;
- RETVAL_STRINGL(fname + idx + 1, flen - idx - 1);
- efree(fname);
- return;
+ idx = p - fname->val;
+ RETVAL_STRINGL(fname->val + idx + 1, fname->len - idx - 1);
+ STR_RELEASE(fname);
} else {
- if (fname) {
- efree(fname);
- }
+ STR_RELEASE(fname);
RETURN_EMPTY_STRING();
}
}
@@ -1009,10 +1004,7 @@ SPL_METHOD(SplFileInfo, getBasename)
flen = intern->file_name_len;
}
- php_basename(fname, flen, suffix, slen, &fname, &flen TSRMLS_CC);
-
- RETVAL_STRINGL(fname, flen);
- efree(fname);
+ RETURN_STR(php_basename(fname, flen, suffix, slen TSRMLS_CC));
}
/* }}}*/
@@ -1021,18 +1013,17 @@ SPL_METHOD(SplFileInfo, getBasename)
SPL_METHOD(DirectoryIterator, getBasename)
{
spl_filesystem_object *intern = (spl_filesystem_object*)Z_OBJ_P(getThis());
- char *suffix = 0, *fname;
+ char *suffix = 0;
int slen = 0;
- size_t flen;
+ zend_string *fname;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &suffix, &slen) == FAILURE) {
return;
}
- php_basename(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), suffix, slen, &fname, &flen TSRMLS_CC);
+ fname = php_basename(intern->u.dir.entry.d_name, strlen(intern->u.dir.entry.d_name), suffix, slen TSRMLS_CC);
- RETVAL_STRINGL(fname, flen);
- efree(fname);
+ RETVAL_STR(fname);
}
/* }}} */
diff --git a/ext/standard/file.c b/ext/standard/file.c
index d471fa6899..596bdefc12 100644
--- a/ext/standard/file.c
+++ b/ext/standard/file.c
@@ -806,10 +806,9 @@ PHP_FUNCTION(tempnam)
{
char *dir, *prefix;
int dir_len, prefix_len;
- size_t p_len;
char *opened_path;
- char *p;
int fd;
+ zend_string *p;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ps", &dir, &dir_len, &prefix, &prefix_len) == FAILURE) {
return;
@@ -819,19 +818,19 @@ PHP_FUNCTION(tempnam)
RETURN_FALSE;
}
- php_basename(prefix, prefix_len, NULL, 0, &p, &p_len TSRMLS_CC);
- if (p_len > 64) {
- p[63] = '\0';
+ p = php_basename(prefix, prefix_len, NULL, 0 TSRMLS_CC);
+ if (p->len > 64) {
+ p->val[63] = '\0';
}
RETVAL_FALSE;
- if ((fd = php_open_temporary_fd_ex(dir, p, &opened_path, 1 TSRMLS_CC)) >= 0) {
+ if ((fd = php_open_temporary_fd_ex(dir, p->val, &opened_path, 1 TSRMLS_CC)) >= 0) {
close(fd);
//??? RETVAL_STRING(opened_path, 0);
RETVAL_STRING(opened_path);
}
- efree(p);
+ STR_RELEASE(p);
}
/* }}} */
diff --git a/ext/standard/ftp_fopen_wrapper.c b/ext/standard/ftp_fopen_wrapper.c
index b0b2c6ba8c..31b96fb68c 100644
--- a/ext/standard/ftp_fopen_wrapper.c
+++ b/ext/standard/ftp_fopen_wrapper.c
@@ -611,8 +611,7 @@ static size_t php_ftp_dirstream_read(php_stream *stream, char *buf, size_t count
php_stream_dirent *ent = (php_stream_dirent *)buf;
php_stream *innerstream;
size_t tmp_len;
- char *basename;
- size_t basename_len;
+ zend_string *basename;
innerstream = ((php_ftp_dirstream_data *)stream->abstract)->datastream;
@@ -628,20 +627,12 @@ static size_t php_ftp_dirstream_read(php_stream *stream, char *buf, size_t count
return 0;
}
- php_basename(ent->d_name, tmp_len, NULL, 0, &basename, &basename_len TSRMLS_CC);
- if (!basename) {
- return 0;
- }
-
- if (!basename_len) {
- efree(basename);
- return 0;
- }
+ basename = php_basename(ent->d_name, tmp_len, NULL, 0 TSRMLS_CC);
- tmp_len = MIN(sizeof(ent->d_name), basename_len - 1);
- memcpy(ent->d_name, basename, tmp_len);
+ tmp_len = MIN(sizeof(ent->d_name), basename->len - 1);
+ memcpy(ent->d_name, basename->val, tmp_len);
ent->d_name[tmp_len - 1] = '\0';
- efree(basename);
+ STR_RELEASE(basename);
/* Trim off trailing whitespace characters */
tmp_len--;
diff --git a/ext/standard/mail.c b/ext/standard/mail.c
index bfbcef6ceb..a97e3d51dc 100644
--- a/ext/standard/mail.c
+++ b/ext/standard/mail.c
@@ -278,17 +278,16 @@ PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char
}
if (PG(mail_x_header)) {
const char *tmp = zend_get_executed_filename(TSRMLS_C);
- char *f;
- size_t f_len;
+ zend_string *f;
- php_basename(tmp, strlen(tmp), NULL, 0,&f, &f_len TSRMLS_CC);
+ f = php_basename(tmp, strlen(tmp), NULL, 0 TSRMLS_CC);
if (headers != NULL) {
- spprintf(&hdr, 0, "X-PHP-Originating-Script: %ld:%s\n%s", php_getuid(TSRMLS_C), f, headers);
+ spprintf(&hdr, 0, "X-PHP-Originating-Script: %ld:%s\n%s", php_getuid(TSRMLS_C), f->val, headers);
} else {
- spprintf(&hdr, 0, "X-PHP-Originating-Script: %ld:%s\n", php_getuid(TSRMLS_C), f);
+ spprintf(&hdr, 0, "X-PHP-Originating-Script: %ld:%s\n", php_getuid(TSRMLS_C), f->val);
}
- efree(f);
+ STR_RELEASE(f);
}
if (!sendmail_path) {
diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h
index 197b0950a8..2209e158b9 100644
--- a/ext/standard/php_string.h
+++ b/ext/standard/php_string.h
@@ -125,7 +125,7 @@ PHPAPI char *php_addslashes(char *str, int length, int *new_length, int should_f
PHPAPI zend_string *php_addcslashes(const char *str, int length, int freeit, char *what, int wlength TSRMLS_DC);
PHPAPI void php_stripslashes(char *str, int *len TSRMLS_DC);
PHPAPI void php_stripcslashes(char *str, int *len);
-PHPAPI void php_basename(const char *s, size_t len, char *suffix, size_t sufflen, char **p_ret, size_t *p_len TSRMLS_DC);
+PHPAPI zend_string *php_basename(const char *s, size_t len, char *suffix, size_t sufflen TSRMLS_DC);
PHPAPI size_t php_dirname(char *str, size_t len);
PHPAPI char *php_stristr(char *s, char *t, size_t s_len, size_t t_len);
PHPAPI char *php_str_to_str_ex(char *haystack, int length, char *needle,
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 6af765fe2b..a5f2e6f4a3 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -1398,11 +1398,12 @@ PHP_FUNCTION(strtolower)
/* {{{ php_basename
*/
-PHPAPI void php_basename(const char *s, size_t len, char *suffix, size_t sufflen, char **p_ret, size_t *p_len TSRMLS_DC)
+PHPAPI zend_string *php_basename(const char *s, size_t len, char *suffix, size_t sufflen TSRMLS_DC)
{
- char *ret = NULL, *c, *comp, *cend;
+ char *c, *comp, *cend;
size_t inc_len, cnt;
int state;
+ zend_string *ret;
c = comp = cend = (char*)s;
cnt = len;
@@ -1470,15 +1471,8 @@ quit_loop:
len = cend - comp;
- if (p_ret) {
- ret = emalloc(len + 1);
- memcpy(ret, comp, len);
- ret[len] = '\0';
- *p_ret = ret;
- }
- if (p_len) {
- *p_len = len;
- }
+ ret = STR_INIT(comp, len, 0);
+ return ret;
}
/* }}} */
@@ -1486,17 +1480,14 @@ quit_loop:
Returns the filename component of the path */
PHP_FUNCTION(basename)
{
- char *string, *suffix = NULL, *ret;
+ char *string, *suffix = NULL;
int string_len, suffix_len = 0;
- size_t ret_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s", &string, &string_len, &suffix, &suffix_len) == FAILURE) {
return;
}
- php_basename(string, string_len, suffix, suffix_len, &ret, &ret_len TSRMLS_CC);
-//??? RETURN_STRINGL(ret, (int)ret_len, 0);
- RETURN_STRINGL(ret, (int)ret_len);
+ RETURN_STR(php_basename(string, string_len, suffix, suffix_len TSRMLS_CC));
}
/* }}} */
@@ -1532,10 +1523,10 @@ PHP_FUNCTION(dirname)
PHP_FUNCTION(pathinfo)
{
zval tmp;
- char *path, *ret = NULL;
+ char *path, *dirname;
int path_len, have_basename;
- size_t ret_len;
long opt = PHP_PATHINFO_ALL;
+ zend_string *ret;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &path, &path_len, &opt) == FAILURE) {
return;
@@ -1546,18 +1537,17 @@ PHP_FUNCTION(pathinfo)
array_init(&tmp);
if ((opt & PHP_PATHINFO_DIRNAME) == PHP_PATHINFO_DIRNAME) {
- ret = estrndup(path, path_len);
- php_dirname(ret, path_len);
- if (*ret) {
- add_assoc_string(&tmp, "dirname", ret, 1);
+ dirname = estrndup(path, path_len);
+ php_dirname(dirname, path_len);
+ if (*dirname) {
+ add_assoc_string(&tmp, "dirname", dirname, 1);
}
- efree(ret);
- ret = NULL;
+ efree(dirname);
}
if (have_basename) {
- php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
- add_assoc_stringl(&tmp, "basename", ret, ret_len, 0);
+ ret = php_basename(path, path_len, NULL, 0 TSRMLS_CC);
+ add_assoc_str(&tmp, "basename", ret);
}
if ((opt & PHP_PATHINFO_EXTENSION) == PHP_PATHINFO_EXTENSION) {
@@ -1565,14 +1555,14 @@ PHP_FUNCTION(pathinfo)
int idx;
if (!have_basename) {
- php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
+ ret = php_basename(path, path_len, NULL, 0 TSRMLS_CC);
}
- p = zend_memrchr(ret, '.', ret_len);
+ p = zend_memrchr(ret->val, '.', ret->len);
if (p) {
- idx = p - ret;
- add_assoc_stringl(&tmp, "extension", ret + idx + 1, ret_len - idx - 1, 1);
+ idx = p - ret->val;
+ add_assoc_stringl(&tmp, "extension", ret->val + idx + 1, ret->len - idx - 1, 1);
}
}
@@ -1582,17 +1572,17 @@ PHP_FUNCTION(pathinfo)
/* Have we already looked up the basename? */
if (!have_basename && !ret) {
- php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
+ ret = php_basename(path, path_len, NULL, 0 TSRMLS_CC);
}
- p = zend_memrchr(ret, '.', ret_len);
+ p = zend_memrchr(ret->val, '.', ret->len);
- idx = p ? (p - ret) : ret_len;
- add_assoc_stringl(&tmp, "filename", ret, idx, 1);
+ idx = p ? (p - ret->val) : ret->len;
+ add_assoc_stringl(&tmp, "filename", ret->val, idx, 1);
}
if (!have_basename && ret) {
- efree(ret);
+ STR_RELEASE(ret);
}
if (opt == PHP_PATHINFO_ALL) {
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c
index a4bdaf7aeb..4b59a68055 100644
--- a/ext/zip/php_zip.c
+++ b/ext/zip/php_zip.c
@@ -173,12 +173,11 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
char *file_dirname_fullpath;
char file_dirname[MAXPATHLEN];
size_t dir_len;
- char *file_basename;
- size_t file_basename_len;
int is_dir_only = 0;
char *path_cleaned;
size_t path_cleaned_len;
cwd_state new_state;
+ zend_string *file_basename;
new_state.cwd = CWD_STATE_ALLOC(1);
new_state.cwd[0] = '\0';
@@ -212,11 +211,11 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
len = spprintf(&file_dirname_fullpath, 0, "%s/%s", dest, file_dirname);
}
- php_basename(path_cleaned, path_cleaned_len, NULL, 0, &file_basename, (size_t *)&file_basename_len TSRMLS_CC);
+ file_basename = php_basename(path_cleaned, path_cleaned_len, NULL, 0 TSRMLS_CC);
if (ZIP_OPENBASEDIR_CHECKPATH(file_dirname_fullpath)) {
efree(file_dirname_fullpath);
- efree(file_basename);
+ STR_RELEASE(file_basename);
CWD_STATE_FREE(new_state.cwd);
return 0;
}
@@ -240,7 +239,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
if (!ret) {
efree(file_dirname_fullpath);
if (!is_dir_only) {
- efree(file_basename);
+ STR_RELEASE(file_basename);
CWD_STATE_FREE(new_state.cwd);
}
return 0;
@@ -254,16 +253,16 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
return 1;
}
- len = spprintf(&fullpath, 0, "%s/%s", file_dirname_fullpath, file_basename);
+ len = spprintf(&fullpath, 0, "%s/%s", file_dirname_fullpath, file_basename->val);
if (!len) {
efree(file_dirname_fullpath);
- efree(file_basename);
+ STR_RELEASE(file_basename);
CWD_STATE_FREE(new_state.cwd);
return 0;
} else if (len > MAXPATHLEN) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Full extraction path exceed MAXPATHLEN (%i)", MAXPATHLEN);
efree(file_dirname_fullpath);
- efree(file_basename);
+ STR_RELEASE(file_basename);
CWD_STATE_FREE(new_state.cwd);
return 0;
}
@@ -275,7 +274,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
if (ZIP_OPENBASEDIR_CHECKPATH(fullpath)) {
efree(fullpath);
efree(file_dirname_fullpath);
- efree(file_basename);
+ STR_RELEASE(file_basename);
CWD_STATE_FREE(new_state.cwd);
return 0;
}
@@ -309,7 +308,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil
done:
efree(fullpath);
- efree(file_basename);
+ STR_RELEASE(file_basename);
efree(file_dirname_fullpath);
CWD_STATE_FREE(new_state.cwd);
@@ -1773,13 +1772,14 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /*
char *file_stripped, *entry_name;
size_t entry_name_len, file_stripped_len;
char entry_name_buf[MAXPATHLEN];
- char *basename = NULL;
+ zend_string *basename = NULL;
if (zend_hash_index_find(Z_ARRVAL_P(return_value), i, (void **) &zval_file) == SUCCESS) {
if (remove_all_path) {
- php_basename(Z_STRVAL_PP(zval_file), Z_STRLEN_PP(zval_file), NULL, 0,
- &basename, (size_t *)&file_stripped_len TSRMLS_CC);
- file_stripped = basename;
+ basename = php_basename(Z_STRVAL_PP(zval_file), Z_STRLEN_PP(zval_file), NULL, 0,
+ &basename TSRMLS_CC);
+ file_stripped = basename->val;
+ file_stripped_len = basename->len;
} else if (remove_path && strstr(Z_STRVAL_PP(zval_file), remove_path) != NULL) {
file_stripped = Z_STRVAL_PP(zval_file) + remove_path_len + 1;
file_stripped_len = Z_STRLEN_PP(zval_file) - remove_path_len - 1;
@@ -1804,7 +1804,7 @@ static void php_zip_add_from_pattern(INTERNAL_FUNCTION_PARAMETERS, int type) /*
entry_name_len = Z_STRLEN_PP(zval_file);
}
if (basename) {
- efree(basename);
+ STR_RELEASE(basename);
basename = NULL;
}
if (php_zip_add_file(intern, Z_STRVAL_PP(zval_file), Z_STRLEN_PP(zval_file),
diff --git a/ext/zip/zip_stream.c b/ext/zip/zip_stream.c
index 8d02d89637..956f066064 100644
--- a/ext/zip/zip_stream.c
+++ b/ext/zip/zip_stream.c
@@ -118,13 +118,12 @@ static int php_zip_ops_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_D
struct zip_stat sb;
const char *path = stream->orig_path;
int path_len = strlen(stream->orig_path);
- char *file_basename;
- size_t file_basename_len;
char file_dirname[MAXPATHLEN];
struct zip *za;
char *fragment;
int fragment_len;
int err;
+ zend_string *file_basename;
fragment = strchr(path, '#');
if (!fragment) {
@@ -149,11 +148,11 @@ static int php_zip_ops_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_D
memcpy(file_dirname, path, path_len - fragment_len);
file_dirname[path_len - fragment_len] = '\0';
- php_basename((char *)path, path_len - fragment_len, NULL, 0, &file_basename, &file_basename_len TSRMLS_CC);
+ file_basename = php_basename((char *)path, path_len - fragment_len, NULL, 0 TSRMLS_CC);
fragment++;
if (ZIP_OPENBASEDIR_CHECKPATH(file_dirname)) {
- efree(file_basename);
+ STR_RELEASE(file_basename);
return -1;
}
@@ -161,7 +160,7 @@ static int php_zip_ops_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_D
if (za) {
memset(ssb, 0, sizeof(php_stream_statbuf));
if (zip_stat(za, fragment, ZIP_FL_NOCASE, &sb) != 0) {
- efree(file_basename);
+ STR_RELEASE(file_basename);
return -1;
}
zip_close(za);
@@ -185,7 +184,7 @@ static int php_zip_ops_stat(php_stream *stream, php_stream_statbuf *ssb TSRMLS_D
#endif
ssb->sb.st_ino = -1;
}
- efree(file_basename);
+ STR_RELEASE(file_basename);
return 0;
}
/* }}} */