]> granicus.if.org Git - php/commitdiff
opendir() is reimplemented using GetFistFile/GetNextFile those are faster then _findf...
authorDmitry Stogov <dmitry@php.net>
Fri, 10 Nov 2006 11:20:58 +0000 (11:20 +0000)
committerDmitry Stogov <dmitry@php.net>
Fri, 10 Nov 2006 11:20:58 +0000 (11:20 +0000)
TSRM/readdir.h
main/reentrancy.c
win32/readdir.c
win32/readdir.h

index b0f1ad9e6f99b386a8ee656f8095be9bc681e044..139bc7bb7021545f54e920ac2dc50cbca67ac009 100644 (file)
@@ -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 */
index 6ff7f44746c4e593a088c6410773802b293d1f1e..db83f4ec53cd5436f11487d661b7bdb3e69920de 100644 (file)
 #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 */
 
index 6aaafced442b8414e4ad6311bb468184128e735b..67bb8ee739e809b5c2513714a37e634330af12af 100644 (file)
@@ -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;
 }
index 419dc95c24b05a76eec26ec56771c06caa299269..139bc7bb7021545f54e920ac2dc50cbca67ac009 100644 (file)
@@ -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;