]> granicus.if.org Git - php/commitdiff
MFH
authorAntony Dovgal <tony2001@php.net>
Mon, 17 Jul 2006 06:45:08 +0000 (06:45 +0000)
committerAntony Dovgal <tony2001@php.net>
Mon, 17 Jul 2006 06:45:08 +0000 (06:45 +0000)
ext/standard/string.c
ext/standard/tests/strings/pathinfo.phpt [new file with mode: 0644]

index cc3fba9fc010e27ba7e5f40908cafb37531dc9eb..3323f306af51dc3ab22f52215ba7e51934f2253c 100644 (file)
@@ -1341,7 +1341,7 @@ PHP_FUNCTION(pathinfo)
 {
        zval *tmp;
        char *path, *ret = NULL;
-       int path_len;
+       int path_len, have_basename;
        size_t ret_len;
        long opt = PHP_PATHINFO_ALL;
 
@@ -1349,6 +1349,8 @@ PHP_FUNCTION(pathinfo)
                return;
        }
 
+       have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME);
+       
        MAKE_STD_ZVAL(tmp);
        array_init(tmp);
        
@@ -1359,19 +1361,18 @@ PHP_FUNCTION(pathinfo)
                        add_assoc_string(tmp, "dirname", ret, 1);
                }
                efree(ret);
+               ret = NULL;
        }
        
-       if ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME) {
+       if (have_basename) {
                php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
                add_assoc_stringl(tmp, "basename", ret, ret_len, 0);
-       }                       
+       }
        
        if ((opt & PHP_PATHINFO_EXTENSION) == PHP_PATHINFO_EXTENSION) {
                char *p;
                int idx;
-               int have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME);
 
-               /* Have we alrady looked up the basename? */
                if (!have_basename) {
                        php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
                }
@@ -1382,19 +1383,14 @@ PHP_FUNCTION(pathinfo)
                        idx = p - ret;
                        add_assoc_stringl(tmp, "extension", ret + idx + 1, ret_len - idx - 1, 1);
                }
-
-               if (!have_basename) {
-                       efree(ret);
-               }
        }
        
        if ((opt & PHP_PATHINFO_FILENAME) == PHP_PATHINFO_FILENAME) {
                char *p;
                int idx;
-               int have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME);
 
                /* Have we alrady looked up the basename? */
-               if (!have_basename) {
+               if (!have_basename && !ret) {
                        php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC);
                }
 
@@ -1402,10 +1398,10 @@ PHP_FUNCTION(pathinfo)
 
                idx = p ? (p - ret) : ret_len;
                add_assoc_stringl(tmp, "filename", ret, idx, 1);
+       }
 
-               if (!have_basename) {
-                       efree(ret);
-               }
+       if (!have_basename && ret) {
+               efree(ret);
        }
 
        if (opt == PHP_PATHINFO_ALL) {
diff --git a/ext/standard/tests/strings/pathinfo.phpt b/ext/standard/tests/strings/pathinfo.phpt
new file mode 100644 (file)
index 0000000..c1d58f0
--- /dev/null
@@ -0,0 +1,108 @@
+--TEST--
+pathinfo() tests
+--FILE--
+<?php
+
+var_dump(pathinfo());
+var_dump(pathinfo(""));
+var_dump(pathinfo("."));
+var_dump(pathinfo(".."));
+var_dump(pathinfo("/"));
+var_dump(pathinfo("./"));
+var_dump(pathinfo("/."));
+var_dump(pathinfo(".cvsignore"));
+var_dump(pathinfo(__FILE__, PATHINFO_BASENAME));
+var_dump(pathinfo(__FILE__, PATHINFO_FILENAME));
+var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION));
+var_dump(pathinfo(__FILE__, PATHINFO_DIRNAME));
+var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_FILENAME|PATHINFO_DIRNAME));
+var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_FILENAME|PATHINFO_BASENAME));
+var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_FILENAME));
+var_dump(pathinfo(__FILE__, PATHINFO_EXTENSION|PATHINFO_BASENAME));
+var_dump(pathinfo(__FILE__, PATHINFO_FILENAME|PATHINFO_DIRNAME));
+var_dump(pathinfo(__FILE__, PATHINFO_FILENAME|PATHINFO_BASENAME));
+var_dump(pathinfo(__FILE__, PATHINFO_DIRNAME|PATHINFO_EXTENSION));
+var_dump(pathinfo(__FILE__, PATHINFO_DIRNAME|PATHINFO_BASENAME));
+
+echo "Done\n";
+?>
+--EXPECTF--    
+Warning: pathinfo() expects at least 1 parameter, 0 given in %s on line %d
+NULL
+array(2) {
+  ["basename"]=>
+  string(0) ""
+  ["filename"]=>
+  string(0) ""
+}
+array(4) {
+  ["dirname"]=>
+  string(1) "."
+  ["basename"]=>
+  string(1) "."
+  ["extension"]=>
+  string(0) ""
+  ["filename"]=>
+  string(0) ""
+}
+array(4) {
+  ["dirname"]=>
+  string(1) "."
+  ["basename"]=>
+  string(2) ".."
+  ["extension"]=>
+  string(0) ""
+  ["filename"]=>
+  string(1) "."
+}
+array(3) {
+  ["dirname"]=>
+  string(1) "/"
+  ["basename"]=>
+  string(0) ""
+  ["filename"]=>
+  string(0) ""
+}
+array(4) {
+  ["dirname"]=>
+  string(1) "."
+  ["basename"]=>
+  string(1) "."
+  ["extension"]=>
+  string(0) ""
+  ["filename"]=>
+  string(0) ""
+}
+array(4) {
+  ["dirname"]=>
+  string(1) "/"
+  ["basename"]=>
+  string(1) "."
+  ["extension"]=>
+  string(0) ""
+  ["filename"]=>
+  string(0) ""
+}
+array(4) {
+  ["dirname"]=>
+  string(1) "."
+  ["basename"]=>
+  string(10) ".cvsignore"
+  ["extension"]=>
+  string(9) "cvsignore"
+  ["filename"]=>
+  string(0) ""
+}
+string(12) "pathinfo.php"
+string(8) "pathinfo"
+string(3) "php"
+string(%d) "%s/strings"
+string(%d) "%s/strings"
+string(12) "pathinfo.php"
+string(3) "php"
+string(12) "pathinfo.php"
+string(%d) "%s/strings"
+string(12) "pathinfo.php"
+string(%d) "%s/strings"
+string(%d) "%s/strings"
+Done