mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Fix broken build by adding scandir and alphasort for win32
This commit is contained in:
@@ -31,7 +31,13 @@
|
||||
#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);
|
||||
#else
|
||||
#include "dirent.h"
|
||||
#endif
|
||||
|
||||
#ifndef S_ISREG
|
||||
#define S_ISREG(mode) (((mode) & S_IFMT) == S_IFREG)
|
||||
|
||||
@@ -141,3 +141,83 @@ 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;
|
||||
}
|
||||
|
||||
@@ -39,6 +39,10 @@ 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 */
|
||||
|
||||
Reference in New Issue
Block a user