]> granicus.if.org Git - php/commitdiff
(PHP pathinfo) Fixed leaks, saved some memory allocations, added
authorAndrei Zmievski <andrei@php.net>
Mon, 11 Sep 2000 13:52:22 +0000 (13:52 +0000)
committerAndrei Zmievski <andrei@php.net>
Mon, 11 Sep 2000 13:52:22 +0000 (13:52 +0000)
more error checking.

TODO
ext/standard/string.c

diff --git a/TODO b/TODO
index 7072466cfdede871bb95b3009275e39986501217..420c58a0e179c9290bdfec0cb605aa294ff0a96c 100644 (file)
--- a/TODO
+++ b/TODO
@@ -78,19 +78,6 @@ ext/standard
 ------------
     * add a version number to data serialized via serialize().
     * array_add(). (Andrei)
-    * implement pathinfo()
-        $a = pathinfo("/some/file.bla");
-
-        => array("dirname" => "/some/",
-                "basename" => "file.bla",
-                "extension" => "bla");
-
-
-        We could also make it return just one part as a sting if used
-        like this:
-
-        $a = pathinfo("/some/file.bla", PATHINFO_BASENAME);
-
     * possibly modify parsing of GPC data to automatically create arrays if
       variable name is seen more than once.
     * implement regex-cache for url-functions.
index fc61aa16b2d8a9f47cd597dcd0879613280a3ac6..c1e2da79489d5ec97e27bdfa92efc317ddfa3c61 100644 (file)
 #include "php_globals.h"
 #include "basic_functions.h"
 
-#define STR_PAD_LEFT   0
-#define STR_PAD_RIGHT  1
-#define STR_PAD_BOTH   2
-#define PHP_PATHINFO_BASENAME 0
-#define PHP_PATHINFO_DIRNAME 1
-#define PHP_PATHINFO_EXTENSION 2
+#define STR_PAD_LEFT                   0
+#define STR_PAD_RIGHT                  1
+#define STR_PAD_BOTH                   2
+#define PHP_PATHINFO_DIRNAME   0
+#define PHP_PATHINFO_BASENAME  1
+#define PHP_PATHINFO_EXTENSION         2
 
 void register_string_constants(INIT_FUNC_ARGS)
 {
        REGISTER_LONG_CONSTANT("STR_PAD_LEFT", STR_PAD_LEFT, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("STR_PAD_RIGHT", STR_PAD_RIGHT, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("STR_PAD_BOTH", STR_PAD_BOTH, CONST_CS | CONST_PERSISTENT);
-       REGISTER_LONG_CONSTANT("PATHINFO_BASENAME", PHP_PATHINFO_BASENAME, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("PATHINFO_DIRNAME", PHP_PATHINFO_DIRNAME, CONST_CS | CONST_PERSISTENT);
+       REGISTER_LONG_CONSTANT("PATHINFO_BASENAME", PHP_PATHINFO_BASENAME, CONST_CS | CONST_PERSISTENT);
        REGISTER_LONG_CONSTANT("PATHINFO_EXTENSION", PHP_PATHINFO_EXTENSION, CONST_CS | CONST_PERSISTENT);
 }
 
@@ -727,61 +727,65 @@ PHP_FUNCTION(dirname)
    Return information about a certain string */
 PHP_FUNCTION(pathinfo)
 {
-       zval **str, **uopt, *tmp;
+       zval **path, **uopt, *tmp;
        char *ret;
        int argc = ZEND_NUM_ARGS(), opt, len;
        
        if (argc < 1 || argc > 2 ||
-           zend_get_parameters_ex(argc, &str, &uopt) == FAILURE) {
+           zend_get_parameters_ex(argc, &path, &uopt) == FAILURE) {
                WRONG_PARAM_COUNT;
        }
-       convert_to_string_ex(str);
-       len = Z_STRLEN_PP(str);
+       convert_to_string_ex(path);
+       len = Z_STRLEN_PP(path);
        
        if (argc > 1) {
                convert_to_long_ex(uopt);
                opt = Z_LVAL_PP(uopt);
+               if (opt < PHP_PATHINFO_BASENAME || opt > PHP_PATHINFO_EXTENSION) {
+                       php_error(E_WARNING, "Invalid option in call to %s()",
+                                         get_active_function_name());
+                       return;
+               }
        }
        
        MAKE_STD_ZVAL(tmp);
        array_init(tmp);
        
        if (opt == PHP_PATHINFO_BASENAME || argc < 2) {
-               ret = estrndup(Z_STRVAL_PP(str), len);
+               ret = estrndup(Z_STRVAL_PP(path), len);
                php_dirname(ret, len);
                if (*ret)
-                       add_assoc_string(tmp, "basename", ret, 1);
+                       add_assoc_string(tmp, "dirname", ret, 1);
                efree(ret);
        }
        
+       if (opt == PHP_PATHINFO_DIRNAME || argc < 2) {
+               ret = php_basename(Z_STRVAL_PP(path), len);
+               add_assoc_string(tmp, "basename", ret, 0);
+       }                       
+       
        if (opt == PHP_PATHINFO_EXTENSION || argc < 2) {
                char *p;
                int idx;
 
-               ret = estrndup(Z_STRVAL_PP(str), len);
-               p = strrchr(ret, '.');
+               p = strrchr(Z_STRVAL_PP(path), '.');
                if (*p) {
-                       idx = p - ret;
-                       add_assoc_stringl(tmp, "extension", ret + idx + 1, len - idx - 1, 1);
+                       idx = p - Z_STRVAL_PP(path);
+                       add_assoc_stringl(tmp, "extension", Z_STRVAL_PP(path) + idx + 1, len - idx - 1, 1);
                }
-               efree(ret);
        }
        
-       if (opt == PHP_PATHINFO_DIRNAME || argc < 2) {
-               ret = php_basename(Z_STRVAL_PP(str), len);
-               add_assoc_string(tmp, "dirname", ret, 1);
-       }                       
-       
-       if (zend_hash_num_elements(Z_ARRVAL_P(tmp)) == 1) {
+       if (argc == 2) {
                zval **element;
                zend_hash_get_current_data(Z_ARRVAL_P(tmp), (void **)&element);
                *return_value = **element;
        } else {
-               array_init(return_value);
                *return_value = *tmp;
        }
 
        zval_copy_ctor(return_value);
+       zval_dtor(tmp);
+       efree(tmp);
 }
 /* }}} */