Browse Source

Add in alphasort (working fine) and scandir (just a stub for now).
-Erik

Eric Andersen 23 years ago
parent
commit
4cc6f73f67
3 changed files with 90 additions and 1 deletions
  1. 1 1
      libc/misc/dirent/Makefile
  2. 10 0
      libc/misc/dirent/alphasort.c
  3. 79 0
      libc/misc/dirent/scandir.c

+ 1 - 1
libc/misc/dirent/Makefile

@@ -24,7 +24,7 @@ TOPDIR=../../
 include $(TOPDIR)Rules.mak
 LIBC=$(TOPDIR)libc.a
 
-CSRC=closedir.c dirfd.c opendir.c readdir.c rewinddir.c seekdir.c telldir.c
+CSRC=alphasort.c closedir.c dirfd.c opendir.c readdir.c rewinddir.c scandir.c seekdir.c telldir.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 OBJS=$(COBJS)
 

+ 10 - 0
libc/misc/dirent/alphasort.c

@@ -0,0 +1,10 @@
+#include <string.h>
+#include "dirstream.h"
+
+int alphasort(const __ptr_t __e1, const __ptr_t __e2)
+{
+    const struct dirent *a = __e1;
+    const struct dirent *b = __e2;
+    return (strcmp(a->d_name, b->d_name));
+}
+

+ 79 - 0
libc/misc/dirent/scandir.c

@@ -0,0 +1,79 @@
+/* -*- Mode: C; c-file-style: "gnu" -*- */
+/*
+   Copyright (c) 2000 Petter Reinholdtsen
+
+   Permission is hereby granted, free of charge, to any person
+   obtaining a copy of this software and associated documentation
+   files (the "Software"), to deal in the Software without
+   restriction, including without limitation the rights to use, copy,
+   modify, merge, publish, distribute, sublicense, and/or sell copies
+   of the Software, and to permit persons to whom the Software is
+   furnished to do so, subject to the following conditions:
+
+   The above copyright notice and this permission notice shall be
+   included in all copies or substantial portions of the Software.
+
+   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+   SOFTWARE.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include "dirstream.h"
+
+/*
+ * FIXME: This is a simple hack version which doesn't sort the data, and
+ * just passes all unsorted.
+ */
+
+int scandir(const char *dir, struct dirent ***namelist,
+			 int (*selector) (const struct dirent *),
+			 int (*compar) (const __ptr_t, const __ptr_t))
+{
+    DIR *d = opendir(dir);
+    struct dirent *current;
+    struct dirent **names;
+    int count = 0;
+    int pos = 0;
+    int result = -1;
+
+    if (NULL == d)
+        return -1;
+
+    while (NULL != readdir(d))
+        count++;
+
+    names = malloc(sizeof (struct dirent *) * count);
+
+    closedir(d);
+    d = opendir(dir);
+    if (NULL == d)
+        return -1;
+
+    while (NULL != (current = readdir(d))) {
+        if (NULL == selector || selector(current)) {
+            struct dirent *copyentry = malloc(current->d_reclen);
+
+            memcpy(copyentry, current, current->d_reclen);
+
+            names[pos] = copyentry;
+            pos++;
+        }
+    }
+    result = closedir(d);
+
+    if (pos != count)
+        names = realloc(names, sizeof (struct dirent *) * pos);
+
+    *namelist = names;
+
+    return pos;
+}