From 1a2c9641465f2c64fbb49749688ca465ad3cd6fe Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sun, 8 Feb 2009 22:40:17 +0000 Subject: Add strverscmp() and versionsort[64](). By Hai Zaar (haizaar AT codefidence.com) --- include/dirent.h | 19 +++++++++++++++++++ include/string.h | 2 -- libc/misc/dirent/Makefile.in | 4 ++-- libc/misc/dirent/versionsort.c | 15 +++++++++++++++ libc/misc/dirent/versionsort64.c | 17 +++++++++++++++++ 5 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 libc/misc/dirent/versionsort.c create mode 100644 libc/misc/dirent/versionsort64.c diff --git a/include/dirent.h b/include/dirent.h index e2fce367c..d17f10998 100644 --- a/include/dirent.h +++ b/include/dirent.h @@ -293,6 +293,25 @@ extern int alphasort64 (__const void *__e1, __const void *__e2) __THROW __attribute_pure__ __nonnull ((1, 2)); # endif +/* Function to compare two `struct dirent's alphabetically. */ +# ifndef __USE_FILE_OFFSET64 +extern int versionsort (__const void *__e1, __const void *__e2) + __THROW __attribute_pure__ __nonnull ((1, 2)); +# else +# ifdef __REDIRECT +extern int __REDIRECT (versionsort, + (__const void *__e1, __const void *__e2), + versionsort64) __attribute_pure__ __nonnull ((1, 2)); +# else +# define versionsort versionsort64 +# endif +# endif + +# if defined __USE_GNU && defined __USE_LARGEFILE64 +extern int versionsort64 (__const void *__e1, __const void *__e2) + __THROW __attribute_pure__ __nonnull ((1, 2)); +# endif + #endif /* Use BSD or misc. */ __END_DECLS diff --git a/include/string.h b/include/string.h index ab1076565..6d6469100 100644 --- a/include/string.h +++ b/include/string.h @@ -422,11 +422,9 @@ libc_hidden_proto(strsep) #ifdef __USE_GNU /* Compare S1 and S2 as strings holding name & indices/version numbers. */ -# if 0 extern int strverscmp (__const char *__s1, __const char *__s2) __THROW __attribute_pure__ __nonnull ((1, 2)); libc_hidden_proto(strverscmp) -# endif /* Return a string describing the meaning of the signal number in SIG. */ extern char *strsignal (int __sig) __THROW; diff --git a/libc/misc/dirent/Makefile.in b/libc/misc/dirent/Makefile.in index e2a48e757..b3a017896 100644 --- a/libc/misc/dirent/Makefile.in +++ b/libc/misc/dirent/Makefile.in @@ -6,10 +6,10 @@ # CSRC := alphasort.c closedir.c dirfd.c opendir.c readdir.c rewinddir.c \ - scandir.c seekdir.c telldir.c readdir_r.c + scandir.c seekdir.c telldir.c readdir_r.c versionsort.c ifeq ($(UCLIBC_HAS_LFS),y) -CSRC += readdir64.c alphasort64.c scandir64.c readdir64_r.c +CSRC += readdir64.c alphasort64.c scandir64.c readdir64_r.c versionsort64.c endif MISC_DIRENT_DIR := $(top_srcdir)libc/misc/dirent diff --git a/libc/misc/dirent/versionsort.c b/libc/misc/dirent/versionsort.c new file mode 100644 index 000000000..53476e67f --- /dev/null +++ b/libc/misc/dirent/versionsort.c @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2008-2009 Hai Zaar, Codefidence Ltd + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#include +#include +#include "dirstream.h" + +int versionsort(const void *a, const void *b) +{ + return strverscmp((*(const struct dirent **) a)->d_name, + (*(const struct dirent **) b)->d_name); +} diff --git a/libc/misc/dirent/versionsort64.c b/libc/misc/dirent/versionsort64.c new file mode 100644 index 000000000..684a46283 --- /dev/null +++ b/libc/misc/dirent/versionsort64.c @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2008-2009 Hai Zaar, Codefidence Ltd + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#include <_lfs_64.h> + +#include +#include +#include "dirstream.h" + +int versionsort64(const void *a, const void *b) +{ + return strverscmp((*(const struct dirent64 **) a)->d_name, + (*(const struct dirent64 **) b)->d_name); +} -- cgit v1.2.3