diff options
author | Denys Vlasenko | 2011-05-23 00:40:54 +0200 |
---|---|---|
committer | Denys Vlasenko | 2011-05-23 00:40:54 +0200 |
commit | b24ef035bd08919075edd79b906e18909ac44eb9 (patch) | |
tree | 78485aace67fbbf061b339b81af143b074ee4108 | |
parent | 7948ecb505135c811a44bc8f8e391622d893d383 (diff) | |
download | busybox-b24ef035bd08919075edd79b906e18909ac44eb9.zip busybox-b24ef035bd08919075edd79b906e18909ac44eb9.tar.gz |
find: cater for libc w/o FNM_CASEFOLD
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | findutils/find.c | 34 | ||||
-rw-r--r-- | libbb/Kbuild.src | 1 | ||||
-rw-r--r-- | libbb/bb_basename.c | 18 | ||||
-rw-r--r-- | libbb/get_last_path_component.c | 10 |
4 files changed, 42 insertions, 21 deletions
diff --git a/findutils/find.c b/findutils/find.c index 7918240..050d637 100644 --- a/findutils/find.c +++ b/findutils/find.c @@ -330,7 +330,11 @@ #include <fnmatch.h> #include "libbb.h" #if ENABLE_FEATURE_FIND_REGEX -#include "xregex.h" +# include "xregex.h" +#endif +/* GNUism: */ +#ifndef FNM_CASEFOLD +# define FNM_CASEFOLD 0 #endif /* This is a NOEXEC applet. Be very careful! */ @@ -474,6 +478,22 @@ static int exec_actions(action ***appp, const char *fileName, const struct stat } +#if !FNM_CASEFOLD +static char *strcpy_upcase(char *dst, const char *src) +{ + char *d = dst; + while (1) { + unsigned char ch = *src++; + if (ch >= 'a' && ch <= 'z') + ch -= ('a' - 'A'); + *d++ = ch; + if (ch == '\0') + break; + } + return dst; +} +#endif + ACTF(name) { const char *tmp = bb_basename(fileName); @@ -489,13 +509,25 @@ ACTF(name) * but somewhere between 4.1.20 and 4.4.0 GNU find stopped using it. * find -name '*foo' should match .foo too: */ +#if FNM_CASEFOLD return fnmatch(ap->pattern, tmp, (ap->iname ? FNM_CASEFOLD : 0)) == 0; +#else + if (ap->iname) + tmp = strcpy_upcase(alloca(strlen(tmp) + 1), tmp); + return fnmatch(ap->pattern, tmp, 0) == 0; +#endif } #if ENABLE_FEATURE_FIND_PATH ACTF(path) { +# if FNM_CASEFOLD return fnmatch(ap->pattern, fileName, (ap->ipath ? FNM_CASEFOLD : 0)) == 0; +# else + if (ap->ipath) + fileName = strcpy_upcase(alloca(strlen(fileName) + 1), fileName); + return fnmatch(ap->pattern, fileName, 0) == 0; +# endif } #endif #if ENABLE_FEATURE_FIND_REGEX diff --git a/libbb/Kbuild.src b/libbb/Kbuild.src index a22e708..fa6e5b6 100644 --- a/libbb/Kbuild.src +++ b/libbb/Kbuild.src @@ -13,7 +13,6 @@ INSERT lib-y += appletlib.o lib-y += ask_confirmation.o lib-y += bb_askpass.o -lib-y += bb_basename.o lib-y += bb_bswap_64.o lib-y += bb_do_delay.o lib-y += bb_pwd.o diff --git a/libbb/bb_basename.c b/libbb/bb_basename.c deleted file mode 100644 index d678360..0000000 --- a/libbb/bb_basename.c +++ /dev/null @@ -1,18 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* - * Utility routines. - * - * Copyright (C) 2007 Denys Vlasenko - * - * Licensed under GPLv2, see file LICENSE in this source tree. - */ - -#include "libbb.h" - -const char* FAST_FUNC bb_basename(const char *name) -{ - const char *cp = strrchr(name, '/'); - if (cp) - return cp + 1; - return name; -} diff --git a/libbb/get_last_path_component.c b/libbb/get_last_path_component.c index 72598d2..04fdf2a 100644 --- a/libbb/get_last_path_component.c +++ b/libbb/get_last_path_component.c @@ -6,8 +6,16 @@ * * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ - #include "libbb.h" + +const char* FAST_FUNC bb_basename(const char *name) +{ + const char *cp = strrchr(name, '/'); + if (cp) + return cp + 1; + return name; +} + /* * "/" -> "/" * "abc" -> "abc" |