From ad017699b15d3bfd297372540407d8b5bec2ace3 Mon Sep 17 00:00:00 2001 From: Andrei Zmievski Date: Fri, 4 Aug 2006 21:06:11 +0000 Subject: [PATCH] Upgrade pathinfo() to Unicode support. --- ext/standard/string.c | 92 +++++++++++++++++++++++++++---------------- unicode-progress.txt | 8 +--- 2 files changed, 59 insertions(+), 41 deletions(-) diff --git a/ext/standard/string.c b/ext/standard/string.c index f76988408b..9804a9dcc2 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -2050,73 +2050,95 @@ PHP_FUNCTION(dirname) } /* }}} */ -/* {{{ proto array pathinfo(string path[, int options]) +/* {{{ proto array pathinfo(string path[, int options]) U Returns information about a certain string */ PHP_FUNCTION(pathinfo) { + zstr path, ret = NULL_ZSTR; + int path_len, have_basename, have_ext, have_filename; + zend_uchar path_type; + int ret_len; zval *tmp; - char *path, *ret = NULL; - int path_len, have_basename; - size_t ret_len; long opt = PHP_PATHINFO_ALL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &path, &path_len, &opt) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t|l", &path, &path_len, &path_type, &opt) == FAILURE) { return; } have_basename = ((opt & PHP_PATHINFO_BASENAME) == PHP_PATHINFO_BASENAME); - + have_filename = ((opt & PHP_PATHINFO_FILENAME) == PHP_PATHINFO_FILENAME); + have_ext = ((opt & PHP_PATHINFO_EXTENSION) == PHP_PATHINFO_EXTENSION); + MAKE_STD_ZVAL(tmp); array_init(tmp); if ((opt & PHP_PATHINFO_DIRNAME) == PHP_PATHINFO_DIRNAME) { - ret = estrndup(path, path_len); - php_dirname(ret, path_len); - if (*ret) { - add_assoc_rt_string(tmp, "dirname", ret, 1); + if (path_type == IS_UNICODE) { + ret.u = eustrndup(path.u, path_len); + ret_len = php_u_dirname(ret.u, path_len); + } else { + ret.s = estrndup(path.s, path_len); + ret_len = php_dirname(ret.s, path_len); } - efree(ret); - ret = NULL; + if (ret_len > 0) { + add_assoc_zstrl(tmp, "dirname", path_type, ret, ret_len, 1); + } + efree(ret.v); + ret = NULL_ZSTR; } + if (have_basename || have_ext || have_filename) { + if (path_type == IS_UNICODE) { + php_u_basename(path.u, path_len, NULL, 0, &ret.u, &ret_len TSRMLS_CC); + } else { + php_basename(path.s, path_len, NULL, 0, &ret.s, &ret_len TSRMLS_CC); + } + } + if (have_basename) { - php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC); - add_assoc_rt_stringl(tmp, "basename", ret, ret_len, 0); + add_assoc_zstrl(tmp, "basename", path_type, ret, ret_len, 0); } - if ((opt & PHP_PATHINFO_EXTENSION) == PHP_PATHINFO_EXTENSION) { - char *p; - int idx; + if (have_ext) { + zstr ext; + int ext_len; - if (!have_basename) { - php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC); + if (path_type == IS_UNICODE) { + ext.u = u_strrchr(ret.u, (UChar) 0x2e /*'.'*/); + if (ext.u) { + ext.u++; + ext_len = ret_len - (ext.u - ret.u); + } + } else { + ext.s = strrchr(ret.s, '.'); + if (ext.s) { + ext.s++; + ext_len = ret_len - (ext.s - ret.s); + } } - p = strrchr(ret, '.'); - - if (p) { - idx = p - ret; - add_assoc_rt_stringl(tmp, "extension", ret + idx + 1, ret_len - idx - 1, 1); + if (ext.v) { + add_assoc_zstrl(tmp, "extension", path_type, ext, ext_len, 1); } } - if ((opt & PHP_PATHINFO_FILENAME) == PHP_PATHINFO_FILENAME) { - char *p; + if (have_filename) { + zstr p; int idx; - /* Have we alrady looked up the basename? */ - if (!have_basename && !ret) { - php_basename(path, path_len, NULL, 0, &ret, &ret_len TSRMLS_CC); + if (path_type == IS_UNICODE) { + p.u = u_strrchr(ret.u, (UChar) 0x2e /*'.'*/); + idx = p.u ? (p.u - ret.u) : ret_len; + } else { + p.s = strrchr(ret.s, '.'); + idx = p.s ? (p.s - ret.s) : ret_len; } - p = strrchr(ret, '.'); - - idx = p ? (p - ret) : ret_len; - add_assoc_stringl(tmp, "filename", ret, idx, 1); + add_assoc_zstrl(tmp, "filename", path_type, ret, idx, 1); } - if (!have_basename && ret) { - efree(ret); + if (!have_basename && ret.v) { + efree(ret.v); } if (opt == PHP_PATHINFO_ALL) { diff --git a/unicode-progress.txt b/unicode-progress.txt index b4c55c32dd..9ee93b9e66 100644 --- a/unicode-progress.txt +++ b/unicode-progress.txt @@ -29,9 +29,6 @@ ext/standard Params API. Do we really want to go through the whole Unicode table? May need to use hashtable instead of array. - dirname() - Create php_u_dirname() - hebrev(), hebrevc() Figure out if this is something we can use ICU for, internally. Check with Zeev. @@ -48,9 +45,6 @@ ext/standard nl2br() Params API, IS_UNICODE support - pathinfo() - Simple upgrade, based on php_u_basename/php_u_dirname - parse_str() Params API. How do we deal with encoding of the data? @@ -204,10 +198,12 @@ ext/standard addslashes() bin2hex() chr() + dirname() explode() implode() levenshtein() ord() + pathinfo() range() similar_text() str_pad() -- 2.50.1