diff options
Diffstat (limited to 'cpp/src')
-rw-r--r-- | cpp/src/IcePatch/Util.cpp | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/cpp/src/IcePatch/Util.cpp b/cpp/src/IcePatch/Util.cpp index 60f7a9536c8..691fb7c1ad4 100644 --- a/cpp/src/IcePatch/Util.cpp +++ b/cpp/src/IcePatch/Util.cpp @@ -41,6 +41,76 @@ # undef max #endif +// +// Sun-OS doesn't have scandir() or alphasort(). +// +#ifdef SUNOS + +static int +scandir(const char* dir, struct dirent*** namelist, + int (*select)(const struct dirent*), + int (*compar)(const void*, const void*)) +{ + DIR* d; + struct dirent* entry; + register int i = 0; + size_t entrysize; + + if((d=opendir(dir)) == 0) + { + return -1; + } + + *namelist = 0; + while((entry=readdir(d)) != 0) + { + if(select == 0 || (select != 0 && (*select)(entry))) + { + *namelist = (struct dirent**)realloc((void*)(*namelist), (size_t)((i + 1) * sizeof(struct dirent*))); + if(*namelist == 0) + { + return -1; + } + + entrysize = sizeof(struct dirent) - sizeof(entry->d_name) + strlen(entry->d_name) + 1; + (*namelist)[i] = (struct dirent*)malloc(entrysize); + if((*namelist)[i] == 0) + { + return -1; + } + memcpy((*namelist)[i], entry, entrysize); + ++i; + } + } + + if(closedir(d)) + { + return -1; + } + + if(i == 0) + { + return -1; + } + + if(compar != 0) + { + qsort((void *)(*namelist), (size_t)i, sizeof(struct dirent *), compar); + } + + return i; +} + +static int +alphasort(const void* v1, const void* v2) +{ + const struct dirent **a = (const struct dirent **)v1; + const struct dirent **b = (const struct dirent **)v2; + return(strcmp((*a)->d_name, (*b)->d_name)); +} + +#endif + using namespace std; using namespace Ice; using namespace IcePatch; |