diff options
Diffstat (limited to 'libc/misc/dirent')
-rw-r--r-- | libc/misc/dirent/Makefile | 2 | ||||
-rw-r--r-- | libc/misc/dirent/alphasort.c | 10 | ||||
-rw-r--r-- | libc/misc/dirent/scandir.c | 79 |
3 files changed, 90 insertions, 1 deletions
diff --git a/libc/misc/dirent/Makefile b/libc/misc/dirent/Makefile index e09773ead..8de2054b6 100644 --- a/libc/misc/dirent/Makefile +++ b/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) diff --git a/libc/misc/dirent/alphasort.c b/libc/misc/dirent/alphasort.c new file mode 100644 index 000000000..f0ff0497a --- /dev/null +++ b/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)); +} + diff --git a/libc/misc/dirent/scandir.c b/libc/misc/dirent/scandir.c new file mode 100644 index 000000000..2b07e294c --- /dev/null +++ b/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; +} |