diff options
author | Dmitry Stogov <dmitry@php.net> | 2006-11-10 11:20:58 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2006-11-10 11:20:58 +0000 |
commit | a68d5f0a89cfde3d6ed3dd30174e84f40e80eab1 (patch) | |
tree | 6a364f8c8d4cfffca66223d9b8f64db62b2c324b | |
parent | b71309f4a2a6058225fdc0e1cc83c0104f02d4e9 (diff) | |
download | php-git-a68d5f0a89cfde3d6ed3dd30174e84f40e80eab1.tar.gz |
opendir() is reimplemented using GetFistFile/GetNextFile those are faster then _findfirst/_findnext
-rw-r--r-- | TSRM/readdir.h | 13 | ||||
-rw-r--r-- | main/reentrancy.c | 4 | ||||
-rw-r--r-- | win32/readdir.c | 42 | ||||
-rw-r--r-- | win32/readdir.h | 10 |
4 files changed, 37 insertions, 32 deletions
diff --git a/TSRM/readdir.h b/TSRM/readdir.h index b0f1ad9e6f..139bc7bb70 100644 --- a/TSRM/readdir.h +++ b/TSRM/readdir.h @@ -7,11 +7,15 @@ * on Windows 95/NT. */ +#define _WIN32_WINNT 0x0400 + +#include <windows.h> + #include <io.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> - +#include <direct.h> /* struct dirent - same as Unix */ @@ -25,10 +29,10 @@ struct dirent { /* typedef DIR - not the same as Unix */ typedef struct { - long handle; /* _findfirst/_findnext handle */ + HANDLE handle; /* _findfirst/_findnext handle */ short offset; /* offset into directory */ short finished; /* 1 if there are not more files */ - struct _finddata_t fileinfo; /* from _findfirst/_findnext */ + WIN32_FIND_DATA fileinfo; /* from _findfirst/_findnext */ char *dir; /* the dir we are reading */ struct dirent dent; /* the dirent to return */ } DIR; @@ -38,7 +42,6 @@ DIR *opendir(const char *); struct dirent *readdir(DIR *); int readdir_r(DIR *, struct dirent *, struct dirent **); int closedir(DIR *); -void rewinddir(DIR *); - +int rewinddir(DIR *); #endif /* READDIR_H */ diff --git a/main/reentrancy.c b/main/reentrancy.c index 6ff7f44746..db83f4ec53 100644 --- a/main/reentrancy.c +++ b/main/reentrancy.c @@ -25,10 +25,6 @@ #include <dirent.h> #endif -#ifdef PHP_WIN32 -#include "win32/readdir.h" -#endif - #include "php_reentrancy.h" #include "ext/standard/php_rand.h" /* for PHP_RAND_MAX */ diff --git a/win32/readdir.c b/win32/readdir.c index 6aaafced44..67bb8ee739 100644 --- a/win32/readdir.c +++ b/win32/readdir.c @@ -2,8 +2,8 @@ #include <string.h> #include <errno.h> -#include "readdir.h" #include "php.h" +#include "readdir.h" /********************************************************************** * Implement dirent-style opendir/readdir/rewinddir/closedir on Win32 @@ -23,14 +23,14 @@ DIR *opendir(const char *dir) { DIR *dp; char *filespec; - long handle; + HANDLE handle; int index; - filespec = malloc(strlen(dir) + 2 + 1); + filespec = (char *)malloc(strlen(dir) + 2 + 1); strcpy(filespec, dir); index = strlen(filespec) - 1; if (index >= 0 && (filespec[index] == '/' || - (filespec[index] == '\\' && !IsDBCSLeadByte(filespec[index-1])))) + (filespec[index] == '\\' && (index == 0 || !IsDBCSLeadByte(filespec[index-1]))))) filespec[index] = '\0'; strcat(filespec, "/*"); @@ -38,8 +38,9 @@ DIR *opendir(const char *dir) dp->offset = 0; dp->finished = 0; - if ((handle = _findfirst(filespec, &(dp->fileinfo))) < 0) { - if (errno == ENOENT) { + if ((handle = FindFirstFile(filespec, &(dp->fileinfo))) == INVALID_HANDLE_VALUE) { + DWORD err = GetLastError(); + if (err == ERROR_NO_MORE_FILES) { dp->finished = 1; } else { free(dp); @@ -60,14 +61,14 @@ struct dirent *readdir(DIR *dp) return NULL; if (dp->offset != 0) { - if (_findnext(dp->handle, &(dp->fileinfo)) < 0) { + if (FindNextFile(dp->handle, &(dp->fileinfo)) == 0) { dp->finished = 1; return NULL; } } dp->offset++; - strlcpy(dp->dent.d_name, dp->fileinfo.name, _MAX_FNAME+1); + strlcpy(dp->dent.d_name, dp->fileinfo.cFileName, _MAX_FNAME+1); dp->dent.d_ino = 1; dp->dent.d_reclen = strlen(dp->dent.d_name); dp->dent.d_off = dp->offset; @@ -83,7 +84,7 @@ int readdir_r(DIR *dp, struct dirent *entry, struct dirent **result) } if (dp->offset != 0) { - if (_findnext(dp->handle, &(dp->fileinfo)) < 0) { + if (FindNextFile(dp->handle, &(dp->fileinfo)) == 0) { dp->finished = 1; *result = NULL; return 0; @@ -91,7 +92,7 @@ int readdir_r(DIR *dp, struct dirent *entry, struct dirent **result) } dp->offset++; - strlcpy(dp->dent.d_name, dp->fileinfo.name, _MAX_FNAME+1); + strlcpy(dp->dent.d_name, dp->fileinfo.cFileName, _MAX_FNAME+1); dp->dent.d_ino = 1; dp->dent.d_reclen = strlen(dp->dent.d_name); dp->dent.d_off = dp->offset; @@ -107,7 +108,7 @@ int closedir(DIR *dp) { if (!dp) return 0; - _findclose(dp->handle); + FindClose(dp->handle); if (dp->dir) free(dp->dir); if (dp) @@ -120,27 +121,28 @@ int rewinddir(DIR *dp) { /* Re-set to the beginning */ char *filespec; - long handle; + HANDLE handle; int index; - _findclose(dp->handle); + FindClose(dp->handle); dp->offset = 0; dp->finished = 0; - filespec = malloc(strlen(dp->dir) + 2 + 1); + filespec = (char *)malloc(strlen(dp->dir) + 2 + 1); strcpy(filespec, dp->dir); index = strlen(filespec) - 1; - if (index >= 0 && (filespec[index] == '/' || filespec[index] == '\\')) + if (index >= 0 && (filespec[index] == '/' || + (filespec[index] == '\\' && (index == 0 || !IsDBCSLeadByte(filespec[index-1]))))) filespec[index] = '\0'; strcat(filespec, "/*"); - if ((handle = _findfirst(filespec, &(dp->fileinfo))) < 0) { - if (errno == ENOENT) - dp->finished = 1; - } + if ((handle = FindFirstFile(filespec, &(dp->fileinfo))) == INVALID_HANDLE_VALUE) { + dp->finished = 1; + } + dp->handle = handle; free(filespec); -return 0; + return 0; } diff --git a/win32/readdir.h b/win32/readdir.h index 419dc95c24..139bc7bb70 100644 --- a/win32/readdir.h +++ b/win32/readdir.h @@ -7,11 +7,15 @@ * on Windows 95/NT. */ +#define _WIN32_WINNT 0x0400 + +#include <windows.h> + #include <io.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> - +#include <direct.h> /* struct dirent - same as Unix */ @@ -25,10 +29,10 @@ struct dirent { /* typedef DIR - not the same as Unix */ typedef struct { - long handle; /* _findfirst/_findnext handle */ + HANDLE handle; /* _findfirst/_findnext handle */ short offset; /* offset into directory */ short finished; /* 1 if there are not more files */ - struct _finddata_t fileinfo; /* from _findfirst/_findnext */ + WIN32_FIND_DATA fileinfo; /* from _findfirst/_findnext */ char *dir; /* the dir we are reading */ struct dirent dent; /* the dirent to return */ } DIR; |