cvs: php4 /ext/standard string.c

From: Date: Tue, 22 Jan 2002 03:35:24 +0000
Subject: cvs: php4 /ext/standard string.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-9126@lists.php.net to get a copy of this message
elixer Mon Jan 21 22:35:24 2002 EDT Modified files: /php4/ext/standard string.c Log: Fix for bug #15130. Way too much effort for this bug, but cleaned up code a bit, use zend_parse_parameters(), etc, etc. We only look for extensions in the basename, not the full path. Index: php4/ext/standard/string.c diff -u php4/ext/standard/string.c:1.261 php4/ext/standard/string.c:1.262 --- php4/ext/standard/string.c:1.261 Sat Jan 5 18:49:57 2002 +++ php4/ext/standard/string.c Mon Jan 21 22:35:23 2002 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c,v 1.261 2002/01/05 23:49:57 jimw Exp $ */ +/* $Id: string.c,v 1.262 2002/01/22 03:35:23 elixer Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -46,9 +46,10 @@ #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 +#define PHP_PATHINFO_DIRNAME 1 +#define PHP_PATHINFO_BASENAME 2 +#define PHP_PATHINFO_EXTENSION 4 +#define PHP_PATHINFO_ALL (PHP_PATHINFO_DIRNAME | PHP_PATHINFO_BASENAME | PHP_PATHINFO_EXTENSION) /* {{{ register_string_constants */ @@ -1164,59 +1165,65 @@ Returns information about a certain string */ PHP_FUNCTION(pathinfo) { - zval **path, **uopt, *tmp; - char *ret; - int argc = ZEND_NUM_ARGS(), opt, len; - - if (argc < 1 || argc > 2 || - zend_get_parameters_ex(argc, &path, &uopt) == FAILURE) { - WRONG_PARAM_COUNT; - } - 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_DIRNAME || opt > PHP_PATHINFO_EXTENSION) { - php_error(E_WARNING, "Invalid option in call to pathinfo()"); - RETURN_FALSE; - } + zval *tmp; + char *path, *ret; + int path_len; + int opt = PHP_PATHINFO_ALL; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &path, &path_len, &opt) == FAILURE) { + return; } MAKE_STD_ZVAL(tmp); array_init(tmp); - if (argc < 2 || opt == PHP_PATHINFO_DIRNAME) { - ret = estrndup(Z_STRVAL_PP(path), len); - php_dirname(ret, len); + if ((opt & PHP_PATHINFO_DIRNAME) == PHP_PATHINFO_DIRNAME) { + ret = estrndup(path, path_len); + php_dirname(ret, path_len); if (*ret) add_assoc_string(tmp, "dirname", ret, 1); efree(ret); } - if (argc < 2 || opt == PHP_PATHINFO_BASENAME) { - ret = php_basename(Z_STRVAL_PP(path), len, NULL, 0); + if ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME) { + ret = php_basename(path, path_len, NULL, 0); add_assoc_string(tmp, "basename", ret, 0); } - if (argc < 2 || opt == PHP_PATHINFO_EXTENSION) { + if ((opt & PHP_PATHINFO_EXTENSION) == PHP_PATHINFO_EXTENSION) { char *p; int idx; + int ret_len; + int have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME); + + /* Have we alrady looked up the basename? */ + if (!have_basename) { + ret = php_basename(path, path_len, NULL, 0); + } + + ret_len = strlen(ret); + + p = strrchr(ret, '.'); - p = strrchr(Z_STRVAL_PP(path), '.'); if (p) { - idx = p - Z_STRVAL_PP(path); - add_assoc_stringl(tmp, "extension", Z_STRVAL_PP(path) + idx + 1, len - idx - 1, 1); + idx = p - ret; + add_assoc_stringl(tmp, "extension", ret + idx + 1, ret_len - idx - 1, 1); + } + + if (!have_basename) { + efree(ret); } } - if (argc == 2) { - zval **element; - zend_hash_get_current_data(Z_ARRVAL_P(tmp), (void **) &element); - *return_value = **element; - } else { + if (opt == PHP_PATHINFO_ALL) { *return_value = *tmp; + } else { + zval **element; + if (zend_hash_get_current_data(Z_ARRVAL_P(tmp), (void **) &element) == SUCCESS) { + *return_value = **element; + } else { + ZVAL_EMPTY_STRING(return_value); + } } zval_copy_ctor(return_value);

« previous php.cvs (#9126) next »