]> granicus.if.org Git - php/commitdiff
Refactor basename using zend_string
authorXinchen Hui <laruence@gmail.com>
Sun, 23 Feb 2014 10:08:35 +0000 (18:08 +0800)
committerXinchen Hui <laruence@gmail.com>
Sun, 23 Feb 2014 10:08:35 +0000 (18:08 +0800)
ext/spl/spl_directory.c
ext/standard/file.c
ext/standard/ftp_fopen_wrapper.c
ext/standard/mail.c
ext/standard/php_string.h
ext/standard/string.c
ext/zip/php_zip.c
ext/zip/zip_stream.c

index 0d2621c6ed43e66fbce05ec43c8a4b3261abd04c..84ee3f823de3e11bbb5cae4d86e1e7ac42ce5ffe 100644 (file)
@@ -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);
 }
 /* }}} */
 
index d471fa6899b389a369cfa096dfc6586f55727c50..596bdefc12c957099027828063250532fdf415a4 100644 (file)
@@ -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);
 }
 /* }}} */
 
index b0b2c6ba8c6e9efc7d3022982ff2e84a26d2f9d9..31b96fb68c39c141318577441f096e49ca022ce2 100644 (file)
@@ -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--;
index bfbcef6ceb769a8fe2055fce53769da44ab88c38..a97e3d51dc868bbfc8ae0e07fb7834df630fa402 100644 (file)
@@ -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) {
index 197b0950a8e657a0b78a4a87b19d307e4b4faa05..2209e158b9f48fdb2b94dc9f07fdde609e4183ad 100644 (file)
@@ -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,
index 6af765fe2b34f2a4ef625635f003c17a4ea5a17e..a5f2e6f4a34873bfbe2cb9bb4722ac0982398f68 100644 (file)
@@ -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) {
index a4bdaf7aeb394190fb55b47980ff423d20ac818a..4b59a680553a0c760c718f0ccf9d33a63d93b71d 100644 (file)
@@ -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),
index 8d02d89637b412c7c021f23c0a7ca83cc045e540..956f06606482622fc70ee3f4a53f8bb1b174b8cd 100644 (file)
@@ -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;
 }
 /* }}} */