From: Andrei Zmievski Date: Mon, 11 Sep 2000 13:52:22 +0000 (+0000) Subject: (PHP pathinfo) Fixed leaks, saved some memory allocations, added X-Git-Tag: php-4.0.3RC1~193 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5ed3e24f47674036b0c02ff6b99abc78e97b815d;p=php (PHP pathinfo) Fixed leaks, saved some memory allocations, added more error checking. --- 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); } /* }}} */