cvs: php4 /ext/standard string.c

From: Date: Tue, 03 Oct 2000 16:47:25 +0000
Subject: cvs: php4 /ext/standard string.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-1923@lists.php.net to get a copy of this message
andi Tue Oct 3 09:47:25 2000 EDT Modified files: /php4/ext/standard string.c Log: - Fix dirname() Index: php4/ext/standard/string.c diff -u php4/ext/standard/string.c:1.160 php4/ext/standard/string.c:1.161 --- php4/ext/standard/string.c:1.160 Tue Oct 3 07:43:03 2000 +++ php4/ext/standard/string.c Tue Oct 3 09:47:25 2000 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c,v 1.160 2000/10/03 14:43:03 andi Exp $ */ +/* $Id: string.c,v 1.161 2000/10/03 16:47:25 andi Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -691,32 +691,55 @@ WRONG_PARAM_COUNT; } convert_to_string_ex(str); - ret = php_basename((*str)->value.str.val,(*str)->value.str.len); - RETVAL_STRING(ret,1) - efree(ret); + ret = php_basename(Z_STRVAL_PP(str), Z_STRLEN_PP(str)); + RETVAL_STRING(ret, 0) } /* }}} */ -PHPAPI void php_dirname(char *str, int len) +/* This function doesn't work with absolute paths in Win32 such as C:\foo + * (and it didn't before either). This needs to be fixed + */ +PHPAPI void php_dirname(char *path, int len) { - register char *c; + register char *end = path + len - 1; - c = str + len - 1; - while (*c == '/' -#ifdef PHP_WIN32 - || *c == '\\' -#endif - ) - c--; /* strip trailing slashes */ - *(c + 1) = '\0'; - if ((c = strrchr(str, '/')) -#ifdef PHP_WIN32 - || (c = strrchr(str, '\\')) -#endif - ) - *c='\0'; - else - *str='\0'; + if (len <= 0) { + /* Illegal use of this function */ + return; + } + + /* Strip trailing slashes */ + while (end >= path && IS_SLASH(*end)) { + end--; + } + if (end < path) { + /* The path only contained slashes */ + path[0] = DEFAULT_SLASH; + path[1] = '\0'; + return; + } + + /* Strip filename */ + while (end >= path && !IS_SLASH(*end)) { + end--; + } + if (end < path) { + /* No slash found, therefore return '.' */ + path[0] = '.'; + path[1] = '\0'; + return; + } + + /* Strip slashes which came before the file name */ + while (end >= path && IS_SLASH(*end)) { + end--; + } + if (end < path) { + path[0] = DEFAULT_SLASH; + path[1] = '\0'; + return; + } + *(end+1) = '\0'; } /* {{{ proto string dirname(string path) @@ -730,14 +753,9 @@ WRONG_PARAM_COUNT; } convert_to_string_ex(str); - ret = estrdup((*str)->value.str.val); - php_dirname(ret,(*str)->value.str.len); - if(*ret) { - RETVAL_STRING(ret,1); - } else { - RETVAL_FALSE; - } - efree(ret); + ret = estrndup(Z_STRVAL_PP(str), Z_STRLEN_PP(str)); + php_dirname(ret, Z_STRLEN_PP(str)); + RETVAL_STRING(ret, 0); } /* }}} */

« previous php.cvs (#1923) next »