{
zval *tmp;
char *path, *ret = NULL;
- int path_len;
+ int path_len, have_basename;
size_t ret_len;
long opt = PHP_PATHINFO_ALL;
return;
}
+ have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME);
+
MAKE_STD_ZVAL(tmp);
array_init(tmp);
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);
}
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);
}
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) {
--- /dev/null
+--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