diff options
author | Xinchen Hui <laruence@gmail.com> | 2014-02-23 18:08:35 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2014-02-23 18:08:35 +0800 |
commit | c0aba2c641a6bfe909011d0fc25acfdd63d85525 (patch) | |
tree | 4fc6c3d5422895be209118ddc52f707da35b5679 | |
parent | 0e4cfad1e8f6d199fd396082985aa2a0bb7c716b (diff) | |
download | php-git-c0aba2c641a6bfe909011d0fc25acfdd63d85525.tar.gz |
Refactor basename using zend_string
-rw-r--r-- | ext/spl/spl_directory.c | 45 | ||||
-rw-r--r-- | ext/standard/file.c | 13 | ||||
-rw-r--r-- | ext/standard/ftp_fopen_wrapper.c | 19 | ||||
-rw-r--r-- | ext/standard/mail.c | 11 | ||||
-rw-r--r-- | ext/standard/php_string.h | 2 | ||||
-rw-r--r-- | ext/standard/string.c | 60 | ||||
-rw-r--r-- | ext/zip/php_zip.c | 30 | ||||
-rw-r--r-- | ext/zip/zip_stream.c | 11 |
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; } /* }}} */ |