summaryrefslogtreecommitdiff
path: root/win32/readdir.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>1999-04-07 21:05:13 +0000
committerZeev Suraski <zeev@php.net>1999-04-07 21:05:13 +0000
commitaceaabceffd537a0ed83fa25e189b08eae585f4a (patch)
treebcef55f16a2ae57c1c883b34347f9e6906ca6dfe /win32/readdir.c
parentd94f3e22ae6fe17d82b189dc362e975a906f919a (diff)
downloadphp-git-aceaabceffd537a0ed83fa25e189b08eae585f4a.tar.gz
PHP 4.0
Diffstat (limited to 'win32/readdir.c')
-rw-r--r--win32/readdir.c111
1 files changed, 111 insertions, 0 deletions
diff --git a/win32/readdir.c b/win32/readdir.c
new file mode 100644
index 0000000000..2ebec905e3
--- /dev/null
+++ b/win32/readdir.c
@@ -0,0 +1,111 @@
+#include <malloc.h>
+#include <string.h>
+#include <errno.h>
+
+#define NEEDRDH 1
+#include "readdir.h"
+
+/**********************************************************************
+ * Implement dirent-style opendir/readdir/closedir on Window 95/NT
+ *
+ * Functions defined are opendir(), readdir() and closedir() with the
+ * same prototypes as the normal dirent.h implementation.
+ *
+ * Does not implement telldir(), seekdir(), rewinddir() or scandir().
+ * The dirent struct is compatible with Unix, except that d_ino is
+ * always 1 and d_off is made up as we go along.
+ *
+ * The DIR typedef is not compatible with Unix.
+ **********************************************************************/
+
+DIR *opendir(const char *dir)
+{
+ DIR *dp;
+ char *filespec;
+ long handle;
+ int index;
+
+ filespec = malloc(strlen(dir) + 2 + 1);
+ strcpy(filespec, dir);
+ index = strlen(filespec) - 1;
+ if (index >= 0 && (filespec[index] == '/' || filespec[index] == '\\'))
+ filespec[index] = '\0';
+ strcat(filespec, "/*");
+
+ dp = (DIR *) malloc(sizeof(DIR));
+ dp->offset = 0;
+ dp->finished = 0;
+ dp->dir = strdup(dir);
+
+ if ((handle = _findfirst(filespec, &(dp->fileinfo))) < 0) {
+ if (errno == ENOENT)
+ dp->finished = 1;
+ else
+ return NULL;
+ }
+ dp->handle = handle;
+ free(filespec);
+
+ return dp;
+}
+
+struct dirent *readdir(DIR * dp)
+{
+ if (!dp || dp->finished)
+ return NULL;
+
+ if (dp->offset != 0) {
+ if (_findnext(dp->handle, &(dp->fileinfo)) < 0) {
+ dp->finished = 1;
+ return NULL;
+ }
+ }
+ dp->offset++;
+
+ strncpy(dp->dent.d_name, dp->fileinfo.name, _MAX_FNAME);
+ dp->dent.d_ino = 1;
+ dp->dent.d_reclen = strlen(dp->dent.d_name);
+ dp->dent.d_off = dp->offset;
+
+ return &(dp->dent);
+}
+
+int closedir(DIR * dp)
+{
+ if (!dp)
+ return 0;
+ _findclose(dp->handle);
+ if (dp->dir)
+ free(dp->dir);
+ if (dp)
+ free(dp);
+
+ return 0;
+}
+
+void rewinddir(DIR *dir_Info)
+{
+ /* Re-set to the beginning */
+ char *filespec;
+ long handle;
+ int index;
+
+ dir_Info->handle = 0;
+ dir_Info->offset = 0;
+ dir_Info->finished = 0;
+
+ filespec = malloc(strlen(dir_Info->dir) + 2 + 1);
+ strcpy(filespec, dir_Info->dir);
+ index = strlen(filespec) - 1;
+ if (index >= 0 && (filespec[index] == '/' || filespec[index] == '\\'))
+ filespec[index] = '\0';
+ strcat(filespec, "/*");
+
+ if ((handle = _findfirst(filespec, &(dir_Info->fileinfo))) < 0) {
+ if (errno == ENOENT) {
+ dir_Info->finished = 1;
+ }
+ }
+ dir_Info->handle = handle;
+ free(filespec);
+}