You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/media-libs/fontconfig/files/fontconfig-2.10.92-use-glob...

165 lines
3.6 KiB

From f6244d2cf231e1dc756f3e941e61b9bf124879bb Mon Sep 17 00:00:00 2001
From: Akira TAGOH <akira@tagoh.org>
Date: Wed, 08 May 2013 02:57:49 +0000
Subject: Use the glob matching for filename
Regex is expensive to compare filenames. we already have the glob matching
and it works enough in this case.
Prior to this change, renaming FcConfigGlobMatch() to FcStrGlobMatch() and moving to fcstr.c
---
diff --git a/src/fccfg.c b/src/fccfg.c
index 7da50b5..fcdf73e 100644
--- a/src/fccfg.c
+++ b/src/fccfg.c
@@ -2211,57 +2211,13 @@ FcConfigGlobAdd (FcConfig *config,
}
static FcBool
-FcConfigGlobMatch (const FcChar8 *glob,
- const FcChar8 *string)
-{
- FcChar8 c;
-
- while ((c = *glob++))
- {
- switch (c) {
- case '*':
- /* short circuit common case */
- if (!*glob)
- return FcTrue;
- /* short circuit another common case */
- if (strchr ((char *) glob, '*') == 0)
- {
- size_t l1, l2;
-
- l1 = strlen ((char *) string);
- l2 = strlen ((char *) glob);
- if (l1 < l2)
- return FcFalse;
- string += (l1 - l2);
- }
- while (*string)
- {
- if (FcConfigGlobMatch (glob, string))
- return FcTrue;
- string++;
- }
- return FcFalse;
- case '?':
- if (*string++ == '\0')
- return FcFalse;
- break;
- default:
- if (*string++ != c)
- return FcFalse;
- break;
- }
- }
- return *string == '\0';
-}
-
-static FcBool
FcConfigGlobsMatch (const FcStrSet *globs,
const FcChar8 *string)
{
int i;
for (i = 0; i < globs->num; i++)
- if (FcConfigGlobMatch (globs->strs[i], string))
+ if (FcStrGlobMatch (globs->strs[i], string))
return FcTrue;
return FcFalse;
}
diff --git a/src/fcint.h b/src/fcint.h
index 8919958..65bf333 100644
--- a/src/fcint.h
+++ b/src/fcint.h
@@ -1090,6 +1090,10 @@ FcPrivate int
FcStrMatchIgnoreCaseAndDelims (const FcChar8 *s1, const FcChar8 *s2, const FcChar8 *delims);
FcPrivate FcBool
+FcStrGlobMatch (const FcChar8 *glob,
+ const FcChar8 *string);
+
+FcPrivate FcBool
FcStrUsesHome (const FcChar8 *s);
FcPrivate FcChar8 *
diff --git a/src/fcmatch.c b/src/fcmatch.c
index 2d7b798..84c9a9a 100644
--- a/src/fcmatch.c
+++ b/src/fcmatch.c
@@ -196,12 +196,10 @@ FcCompareFilename (FcValue *v1, FcValue *v2)
return 0.0;
else if (FcStrCmpIgnoreCase (s1, s2) == 0)
return 1.0;
- else if (FcStrRegexCmp (s2, s1))
+ else if (FcStrGlobMatch (s1, s2))
return 2.0;
- else if (FcStrRegexCmpIgnoreCase (s2, s1))
- return 3.0;
else
- return 4.0;
+ return 3.0;
}
#define PRI_NULL(n) \
diff --git a/src/fcstr.c b/src/fcstr.c
index 339a346..3a32031 100644
--- a/src/fcstr.c
+++ b/src/fcstr.c
@@ -459,6 +459,50 @@ FcStrMatchIgnoreCaseAndDelims (const FcChar8 *s1, const FcChar8 *s2, const FcCha
return w1.src - s1 - 1;
}
+FcBool
+FcStrGlobMatch (const FcChar8 *glob,
+ const FcChar8 *string)
+{
+ FcChar8 c;
+
+ while ((c = *glob++))
+ {
+ switch (c) {
+ case '*':
+ /* short circuit common case */
+ if (!*glob)
+ return FcTrue;
+ /* short circuit another common case */
+ if (strchr ((char *) glob, '*') == 0)
+ {
+ size_t l1, l2;
+
+ l1 = strlen ((char *) string);
+ l2 = strlen ((char *) glob);
+ if (l1 < l2)
+ return FcFalse;
+ string += (l1 - l2);
+ }
+ while (*string)
+ {
+ if (FcStrGlobMatch (glob, string))
+ return FcTrue;
+ string++;
+ }
+ return FcFalse;
+ case '?':
+ if (*string++ == '\0')
+ return FcFalse;
+ break;
+ default:
+ if (*string++ != c)
+ return FcFalse;
+ break;
+ }
+ }
+ return *string == '\0';
+}
+
const FcChar8 *
FcStrStrIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
{
--
cgit v0.9.0.2-2-gbebe