summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorache <ache@FreeBSD.org>1996-08-12 02:00:56 +0000
committerache <ache@FreeBSD.org>1996-08-12 02:00:56 +0000
commit95acc9d04c0ee3aaafedd42cab40628423f9fccc (patch)
treee1e07613966ea3fb533c92ce06d19c7c907e332e /lib
parentc8f56afb629104ce460c52fb523995a57b9938be (diff)
downloadFreeBSD-src-95acc9d04c0ee3aaafedd42cab40628423f9fccc.zip
FreeBSD-src-95acc9d04c0ee3aaafedd42cab40628423f9fccc.tar.gz
Use collate for alpha character ranges
Diffstat (limited to 'lib')
-rw-r--r--lib/libc/gen/glob.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/lib/libc/gen/glob.c b/lib/libc/gen/glob.c
index 2105f2a..bb2fb18 100644
--- a/lib/libc/gen/glob.c
+++ b/lib/libc/gen/glob.c
@@ -147,6 +147,7 @@ static int match __P((Char *, Char *, Char *));
#ifdef DEBUG
static void qprintf __P((const char *, Char *));
#endif
+static int collcmp __P((int, int));
int
glob(pattern, flags, errfunc, pglob)
@@ -668,6 +669,37 @@ globextend(path, pglob)
return(copy == NULL ? GLOB_NOSPACE : 0);
}
+static int
+collcmp (c1, c2)
+ int c1, c2;
+{
+ static char s1[2], s2[2];
+
+ if (c1 == c2)
+ return (0);
+ if ( (isascii(c1) && isascii(c2))
+ || (!isalpha(c1) && !isalpha(c2))
+ )
+ return (c1 - c2);
+ if (isalpha(c1) && !isalpha(c2)) {
+ if (isupper(c1))
+ return ('A' - c2);
+ else
+ return ('a' - c2);
+ } else if (isalpha(c2) && !isalpha(c1)) {
+ if (isupper(c2))
+ return (c1 - 'A');
+ else
+ return (c1 - 'a');
+ }
+ if (isupper(c1) && islower(c2))
+ return (-1);
+ else if (islower(c1) && isupper(c2))
+ return (1);
+ s1[0] = c1;
+ s2[0] = c2;
+ return strcoll(s1, s2);
+}
/*
* pattern matching function for filenames. Each occurrence of the *
@@ -703,7 +735,9 @@ match(name, pat, patend)
++pat;
while (((c = *pat++) & M_MASK) != M_END)
if ((*pat & M_MASK) == M_RNG) {
- if (c <= k && k <= pat[1])
+ if ( collcmp(CHAR(c), CHAR(k)) <= 0
+ && collcmp(CHAR(k), CHAR(pat[1])) <= 0
+ )
ok = 1;
pat += 2;
} else if (c == k)
OpenPOWER on IntegriCloud