diff options
| -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; +}  | 
