]> granicus.if.org Git - php/commitdiff
Moved the scandir code into it's own files so that it can be used by other
authorIlia Alshanetsky <iliaa@php.net>
Mon, 27 Jan 2003 20:39:31 +0000 (20:39 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Mon, 27 Jan 2003 20:39:31 +0000 (20:39 +0000)
OSes where libc does not have a native scandir() implementation.

configure.in
main/php_ini.c
main/php_scandir.c [new file with mode: 0644]
main/php_scandir.h [new file with mode: 0644]
win32/readdir.c
win32/readdir.h

index 5596c4c1e80accdf750a028a8da452ef5365dd3a..2532ededfe6058514f736f510852a7f286e8c2be 100644 (file)
@@ -445,6 +445,7 @@ dnl -------------------------------------------------------------------------
 
 AC_FUNC_VPRINTF
 AC_CHECK_FUNCS(
+alphasort \
 asctime_r \
 chroot \
 ctime_r \
@@ -480,6 +481,7 @@ random \
 rand_r \
 regcomp \
 res_search \
+scandir \
 setitimer \
 setlocale \
 localeconv \
@@ -1093,7 +1095,7 @@ PHP_SUBST(install_targets)
 PHP_ADD_SOURCES(TSRM, TSRM.c tsrm_strtok_r.c tsrm_virtual_cwd.c)
 
 PHP_ADD_SOURCES(main, main.c snprintf.c spprintf.c php_sprintf.c \
-       safe_mode.c fopen_wrappers.c alloca.c \
+       safe_mode.c fopen_wrappers.c alloca.c  php_scandir.c \
        php_ini.c SAPI.c rfc1867.c php_content_types.c strlcpy.c \
        strlcat.c mergesort.c reentrancy.c php_variables.c php_ticks.c \
        streams.c network.c php_open_temporary_file.c php_logos.c \
index ed9ac9cb98948cd738e3c9d0aabf0ebb17e39198..97038fbbcd02de9e8af142f46b73cdc15b6edbf2 100644 (file)
 #include "SAPI.h"
 #include "php_main.h"
 
-#ifdef PHP_WIN32
-#include "readdir.h"
-/* this makes no sence, vc6 errors if this declaration is not here */
-extern int alphasort(const struct dirent **a, const struct dirent **b);
+#if !HAVE_SCANDIR || !HAVE_ALPHASORT
+ #include "php_scandir.h"
 #else
-#include "dirent.h"
+ #include <dirent.h>
 #endif
 
 #ifndef S_ISREG
diff --git a/main/php_scandir.c b/main/php_scandir.c
new file mode 100644 (file)
index 0000000..8974a69
--- /dev/null
@@ -0,0 +1,112 @@
+/* 
+   +----------------------------------------------------------------------+
+   | PHP Version 4                                                        |
+   +----------------------------------------------------------------------+
+   | Copyright (c) 1997-2003 The PHP Group                                |
+   +----------------------------------------------------------------------+
+   | This source file is subject to version 2.02 of the PHP license,      |
+   | that is bundled with this package in the file LICENSE, and is        |
+   | available at through the world-wide-web at                           |
+   | http://www.php.net/license/2_02.txt.                                 |
+   | If you did not receive a copy of the PHP license and are unable to   |
+   | obtain it through the world-wide-web, please send a note to          |
+   | license@php.net so we can mail you a copy immediately.               |
+   +----------------------------------------------------------------------+
+   | Author: Shane Caraveo <shane@caraveo.com>                            |
+   |         Ilia Alshanetsky <ilia@prohost.org>                          |
+   +----------------------------------------------------------------------+
+ */
+
+#include "php_scandir.h"
+#include "php_config.h"
+
+#ifndef HAVE_SCANDIR
+ #include <sys/types.h>
+
+ #ifdef HAVE_DIRENT_H
+  #include <dirent.h>
+ #endif
+
+ #ifdef PHP_WIN32
+  #include "win32/readdir.h"
+ #endif  
+
+ #include <stdlib.h>
+ #include <search.h>
+#endif
+
+#ifndef HAVE_ALPHASORT
+int alphasort(const struct dirent **a, const struct dirent **b)
+{
+       return strcoll((*a)->d_name,(*b)->d_name);
+}
+#endif
+
+#ifndef HAVE_SCANDIR
+int scandir(const char *dirname, struct dirent **namelist[], int (*selector) (const struct dirent *entry), int (*compare) (const struct dirent **a, const struct dirent **b))
+{
+       DIR *dirp = NULL;
+       struct dirent **vector = NULL;
+       struct dirent *dp = NULL;
+       int vector_size = 0;
+       int nfiles = 0;
+
+       if (namelist == NULL) {
+               return -1;
+       }
+
+       if (!(dirp = opendir(dirname))) {
+               return -1;
+       }
+
+       while ((dp = readdir(dirp)) != NULL) {
+               int dsize = 0;
+               struct dirent *newdp = NULL;
+
+               if (selector && (*selector)(dp) == 0) {
+                       continue;
+               }
+
+               if (nfiles == vector_size) {
+                       struct dirent **newv;
+                       if (vector_size == 0) {
+                               vector_size = 10;
+                       } else { 
+                               vector_size *= 2;
+                       }
+
+                       newv = (struct dirent **) realloc (vector, vector_size * sizeof (struct dirent *));
+                       if (!newv) {
+                               return -1;
+                       }
+                       vector = newv;
+               }
+
+               dsize = sizeof (struct dirent) + ((strlen(dp->d_name) + 1) * sizeof(char));
+               newdp = (struct dirent *) malloc(dsize);
+
+               if (newdp == NULL) {
+                       goto fail;
+               }
+
+               vector[nfiles++] = (struct dirent *) memcpy(newdp, dp, dsize);
+       }
+
+       closedir(dirp);
+
+       *namelist = vector;
+
+       if (compare) {
+               qsort (*namelist, nfiles, sizeof(struct dirent *), compare);
+       }
+
+       return nfiles;
+
+fail:
+       while (nfiles-- > 0) {
+               free(vector[nfiles]);
+       }
+       free(vector);
+       return -1;      
+}
+#endif
diff --git a/main/php_scandir.h b/main/php_scandir.h
new file mode 100644 (file)
index 0000000..a658ad0
--- /dev/null
@@ -0,0 +1,18 @@
+#include <sys/types.h>
+#include "php_config.h"
+
+#ifdef HAVE_DIRENT_H
+# include <dirent.h>
+#endif
+
+#ifdef PHP_WIN32
+#include "win32/readdir.h"
+#endif
+
+#ifndef HAVE_ALPHASORT 
+int alphasort(const struct dirent **a, const struct dirent **b);
+#endif
+
+#ifndef HAVE_SCANDIR
+int scandir(const char *dirname, struct dirent **namelist[], int (*selector) (const struct dirent *entry), int (*compare) (const struct dirent **a, const struct dirent **b));
+#endif
index 78db689b294dbb6198e5b1b46e5819e3f8d092c3..e33d19bde5be274629d90685518a4748c703e348 100644 (file)
@@ -141,83 +141,3 @@ int rewinddir(DIR *dp)
 
 return 0;
 }
-
-int alphasort(const struct dirent **a, const struct dirent **b)
-{
-       return strcoll((*a)->d_name,(*b)->d_name);
-}
-
-int scandir(const char *dirname,
-                       struct dirent **namelist[],
-                       int (*selector) (const struct dirent *entry),
-                       int (*compare) (const struct dirent **a, const struct dirent **b))
-{
-       DIR *dirp = NULL;
-       struct dirent **vector = NULL;
-       struct dirent *dp = NULL;
-       int vector_size = 0;
-
-       int nfiles = 0;
-       int fail = 0;
-
-       if (namelist == NULL)
-               return -1;
-
-       dirp = opendir(dirname);
-       if (dirp == NULL)
-               return -1;
-
-       for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp))
-       {
-               int dsize = 0;
-               struct dirent *newdp = NULL;
-
-               if (selector && (*selector)(dp) == 0)
-                       continue;
-
-               if (nfiles == vector_size)
-               {
-                       struct dirent **newv;
-                       if (vector_size == 0)
-                               vector_size = 10;
-                       else
-                               vector_size *= 2;
-
-                       newv = (struct dirent **) realloc (vector, vector_size * sizeof (struct dirent *));
-                       if (newv == NULL)
-                       {
-                               fail = 1;
-                               break;
-                       }
-                       vector = newv;
-               }
-
-               dsize = sizeof (struct dirent) + ((strlen(dp->d_name) + 1) * sizeof(char));
-               newdp = (struct dirent *) malloc(dsize);
-
-               if (newdp == NULL)
-               {
-                       fail = 1;
-                       break;
-               }
-
-               vector[nfiles++] = (struct dirent *) memcpy(newdp, dp, dsize);
-       }
-
-       closedir(dirp);
-
-       if (fail)
-       {
-               while (nfiles-- > 0) free(vector[nfiles]);
-               free(vector);
-               return -1;
-       }
-
-
-       *namelist = vector;
-
-       if (compare)
-               qsort (*namelist,nfiles,sizeof (struct dirent *),compare);
-
-       return nfiles;
-}
index b63015355a5e25c8cfbd4a3a13e3ed9bc76e7e62..419dc95c24b05a76eec26ec56771c06caa299269 100644 (file)
@@ -39,10 +39,5 @@ struct dirent *readdir(DIR *);
 int readdir_r(DIR *, struct dirent *, struct dirent **);
 int closedir(DIR *);
 int rewinddir(DIR *);
-int scandir(const char *dirname,
-                       struct dirent **namelist[],
-                       int (*selector) (const struct dirent *entry),
-                       int (*compare) (const struct dirent **a, const struct dirent **b));
-int alphasort(const struct dirent **a, const struct dirent **b);
 
 #endif /* READDIR_H */