summaryrefslogtreecommitdiff
path: root/cpp/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src')
-rw-r--r--cpp/src/IcePatch/Util.cpp70
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;