cellog Sun Jun 15 23:00:47 2008 UTC
Modified files: (Branch: PHP_5_3)
/php-src/ext/phar phar.c phar.phar
Log:
minor performance improvement
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/phar.c?r1=1.370.2.18&r2=1.370.2.19&diff_format=u
Index: php-src/ext/phar/phar.c
diff -u php-src/ext/phar/phar.c:1.370.2.18 php-src/ext/phar/phar.c:1.370.2.19
--- php-src/ext/phar/phar.c:1.370.2.18 Sun Jun 15 21:42:19 2008
+++ php-src/ext/phar/phar.c Sun Jun 15 23:00:46 2008
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: phar.c,v 1.370.2.18 2008/06/15 21:42:19 cellog Exp $ */
+/* $Id: phar.c,v 1.370.2.19 2008/06/15 23:00:46 cellog Exp $ */
#define PHAR_MAIN 1
#include "phar_internal.h"
@@ -1894,74 +1894,84 @@
*/
char *phar_fix_filepath(char *path, int *new_len, int use_cwd TSRMLS_DC) /*
{{{ */
{
+ char newpath[MAXPATHLEN];
+ int newpath_len;
char *ptr, *free_path, *new_phar;
char *tok;
int ptr_length, new_phar_len = 1, path_length = *new_len;
if (PHAR_G(cwd_len) && use_cwd && path_length > 2 && path[0] == '.' &&
path[1] == '/') {
- free_path = path;
- new_phar_len = PHAR_G(cwd_len);
- new_phar = estrndup(PHAR_G(cwd), new_phar_len);
+ newpath_len = PHAR_G(cwd_len);
+ memcpy(newpath, PHAR_G(cwd), newpath_len);
} else {
- free_path = path;
- new_phar = estrndup("/\0", 2);
+ newpath[0] = '/';
+ newpath_len = 1;
+ }
+ ptr = path;
+ if (*ptr == '/') ++ptr;
+ tok = ptr;
+ do {
+ ptr = memchr(ptr, '/', path_length - (ptr - path));
+ } while (ptr && ptr - tok == 0 && *ptr == '/' && ++ptr && ++tok);
+ if (!ptr && (path_length - (tok - path))) {
+ switch (path_length - (tok - path)) {
+ case 1 :
+ if (*tok == '.') {
+ efree(path);
+ *new_len = 1;
+ return estrndup("/", 1);
+ }
+ break;
+ case 2 :
+ if (tok[0] == '.' && tok[1] == '.') {
+ efree(path);
+ *new_len = 1;
+ return estrndup("/", 1);
+ }
+ }
+ return path;
}
- tok = NULL;
- ptr = tsrm_strtok_r(path, "/", &tok);
while (ptr) {
- ptr_length = strlen(ptr);
-
- if (IS_DIRECTORY_UP(ptr, ptr_length)) {
- char save;
-
- save = '/';
-
-#define PREVIOUS new_phar[new_phar_len - 1]
-
- while (new_phar_len > 1 &&
- !IS_BACKSLASH(PREVIOUS)) {
- save = PREVIOUS;
- PREVIOUS = '\0';
- new_phar_len--;
- }
-
- if (new_phar[0] != '/') {
- new_phar[new_phar_len++] = save;
- new_phar[new_phar_len] = '\0';
- } else if (new_phar_len > 1) {
- PREVIOUS = '\0';
- new_phar_len--;
- }
- } else if (!IS_DIRECTORY_CURRENT(ptr, ptr_length)) {
- if (new_phar_len > 1) {
- new_phar = (char *) erealloc(new_phar,
new_phar_len+ptr_length+1+1);
- new_phar[new_phar_len++] = '/';
- memcpy(&new_phar[new_phar_len], ptr,
ptr_length+1);
+ ptr_length = ptr - tok;
+last_time:
+ if (IS_DIRECTORY_UP(tok, ptr_length)) {
+#define PREVIOUS newpath[newpath_len - 1]
+
+ while (newpath_len > 1 && !IS_BACKSLASH(PREVIOUS)) {
+ newpath_len--;
+ }
+
+ if (newpath[0] != '/') {
+ newpath[newpath_len] = '\0';
+ } else if (newpath_len > 1) {
+ --newpath_len;
+ }
+ } else if (!IS_DIRECTORY_CURRENT(tok, ptr_length)) {
+ if (newpath_len > 1) {
+ newpath[newpath_len++] = '/';
+ memcpy(newpath + newpath_len, tok,
ptr_length+1);
} else {
- new_phar = (char *) erealloc(new_phar,
new_phar_len+ptr_length+1);
- memcpy(&new_phar[new_phar_len], ptr,
ptr_length+1);
+ memcpy(newpath + newpath_len, tok,
ptr_length+1);
}
- new_phar_len += ptr_length;
+ newpath_len += ptr_length;
+ }
+ if (ptr == path + path_length) {
+ break;
+ }
+ tok = ++ptr;
+ do {
+ ptr = memchr(ptr, '/', path_length - (ptr - path));
+ } while (ptr && ptr - tok == 0 && *ptr == '/' && ++ptr &&
++tok);
+ if (!ptr && (path_length - (tok - path))) {
+ ptr_length = path_length - (tok - path);
+ ptr = path + path_length;
+ goto last_time;
}
- ptr = tsrm_strtok_r(NULL, "/", &tok);
- }
-
- if (path[path_length-1] == '/' && new_phar_len > 1) {
- new_phar = (char*)erealloc(new_phar, new_phar_len + 2);
- new_phar[new_phar_len++] = '/';
- new_phar[new_phar_len] = 0;
- }
-
- efree(free_path);
-
- if (new_phar_len == 0) {
- new_phar = (char *) erealloc(new_phar, new_phar_len+1+1);
- new_phar[new_phar_len] = '/';
- new_phar[++new_phar_len] = '\0';
}
- *new_len = new_phar_len;
- return new_phar;
+ efree(path);
+ *new_len = newpath_len;
+ return estrndup(newpath, newpath_len);
}
/* }}} */
@@ -3398,7 +3408,7 @@
php_info_print_table_header(2, "Phar: PHP Archive support", "enabled");
php_info_print_table_row(2, "Phar EXT version", PHP_PHAR_VERSION);
php_info_print_table_row(2, "Phar API version", PHP_PHAR_API_VERSION);
- php_info_print_table_row(2, "CVS revision", "$Revision: 1.370.2.18 $");
+ php_info_print_table_row(2, "CVS revision", "$Revision: 1.370.2.19 $");
php_info_print_table_row(2, "Phar-based phar archives", "enabled");
php_info_print_table_row(2, "Tar-based phar archives", "enabled");
php_info_print_table_row(2, "ZIP-based phar archives", "enabled");
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/phar.phar?r1=1.7.2.17&r2=1.7.2.18&diff_format=u
Index: php-src/ext/phar/phar.phar
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php