summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TODO13
-rw-r--r--ext/standard/string.c54
2 files changed, 29 insertions, 38 deletions
diff --git a/TODO b/TODO
index 7072466cfd..420c58a0e1 100644
--- 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.
diff --git a/ext/standard/string.c b/ext/standard/string.c
index fc61aa16b2..c1e2da7948 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -36,20 +36,20 @@
#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);
}
/* }}} */