]> git.wh0rd.org - fontconfig.git/commitdiff
Fix "contains" op for strings and langsets.
authorJames Su <suzhe@turbolinux.com.cn>
Wed, 28 May 2003 01:34:38 +0000 (01:34 +0000)
committerJames Su <suzhe@turbolinux.com.cn>
Wed, 28 May 2003 01:34:38 +0000 (01:34 +0000)
fontconfig/fontconfig.h
src/fccfg.c
src/fcstr.c

index 1f0bd9c54aefffb4ab9e845836548be58c050e30..a4954f643615460965b029eebe9788ade27d0de3 100644 (file)
@@ -737,6 +737,12 @@ FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
 int
 FcStrCmp (const FcChar8 *s1, const FcChar8 *s2);
 
+const FcChar8 *
+FcStrStrIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
+
+const FcChar8 *
+FcStrStr (const FcChar8 *s1, const FcChar8 *s2);
+
 int
 FcUtf8ToUcs4 (const FcChar8 *src_orig,
              FcChar32      *dst,
index 3684d790f6011378baafa0f99ebaa99f2b23429b..cbb6ecbc8281a22d77df19e77615ce7eddb10f0c 100644 (file)
@@ -565,13 +565,17 @@ FcConfigCompareValue (const FcValue       m_o,
        case FcTypeString:
            switch (op) {
            case FcOpEqual:    
-           case FcOpContains:
                ret = FcStrCmpIgnoreCase (m.u.s, v.u.s) == 0;
                break;
+           case FcOpContains:
+               ret = FcStrStrIgnoreCase (m.u.s, v.u.s) != 0;
+               break;
            case FcOpNotEqual:
-           case FcOpNotContains:
                ret = FcStrCmpIgnoreCase (m.u.s, v.u.s) != 0;
                break;
+           case FcOpNotContains:
+               ret = FcStrStrIgnoreCase (m.u.s, v.u.s) == 0;
+               break;
            default:
                break;
            }
@@ -613,16 +617,16 @@ FcConfigCompareValue (const FcValue       m_o,
        case FcTypeLangSet:
            switch (op) {
            case FcOpContains:
-               ret = FcLangSetContains (v.u.l, m.u.l);
+               ret = FcLangSetContains (m.u.l, v.u.l);
                break;
            case FcOpNotContains:
-               ret = FcLangSetContains (v.u.l, m.u.l);
+               ret = FcLangSetContains (m.u.l, v.u.l);
                break;
            case FcOpEqual:
-               ret = FcLangSetEqual (v.u.l, m.u.l);
+               ret = FcLangSetEqual (m.u.l, v.u.l);
                break;
            case FcOpNotEqual:
-               ret = !FcLangSetEqual (v.u.l, m.u.l);
+               ret = !FcLangSetEqual (m.u.l, v.u.l);
                break;
            default:
                break;
index ecbfd297c59120627659146eb8532cb9d8f52039..e67563dcf55bef38db8e98d95b26977a09983ed3 100644 (file)
@@ -188,6 +188,109 @@ FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
     return 0;
 }
 
+const FcChar8 *
+FcStrStrIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
+{
+    FcChar8 c1, c2;
+    const FcChar8 * p = s1;
+    const FcChar8 * b = s2;
+
+    if (!s1 || !s2)
+       return 0;
+
+    if (s1 == s2)
+       return s1;
+
+again:
+    c2 = *s2++;
+    c2 = FcToLower (c2);
+
+    if (!c2)
+       return 0;
+
+    for (;;) 
+    {
+       p = s1;
+       c1 = *s1++;
+       if (!c1 || (c1 = FcToLower (c1)) == c2)
+           break;
+    }
+
+    if (c1 != c2)
+       return 0;
+
+    for (;;)
+    {
+       c1 = *s1;
+       c2 = *s2;
+       if (c1 && c2 && (c1 = FcToLower (c1)) != (c2 = FcToLower (c2)))
+       {
+           s1 = p + 1;
+           s2 = b;
+           goto again;
+       }
+       if (!c2)
+           return p;
+       if (!c1)
+           return 0;
+       ++ s1;
+       ++ s2;
+    }
+
+    return 0;
+}
+
+const FcChar8 *
+FcStrStr (const FcChar8 *s1, const FcChar8 *s2)
+{
+    FcChar8 c1, c2;
+    const FcChar8 * p = s1;
+    const FcChar8 * b = s2;
+
+    if (!s1 || !s2)
+       return 0;
+
+    if (s1 == s2)
+       return s1;
+
+again:
+    c2 = *s2++;
+
+    if (!c2)
+       return 0;
+
+    for (;;) 
+    {
+       p = s1;
+       c1 = *s1++;
+       if (!c1 || c1 == c2)
+           break;
+    }
+
+    if (c1 != c2)
+       return 0;
+
+    for (;;)
+    {
+       c1 = *s1;
+       c2 = *s2;
+       if (c1 && c2 && c1 != c2)
+       {
+           s1 = p + 1;
+           s2 = b;
+           goto again;
+       }
+       if (!c2)
+           return p;
+       if (!c1)
+           return 0;
+       ++ s1;
+       ++ s2;
+    }
+
+    return 0;
+}
+
 int
 FcUtf8ToUcs4 (const FcChar8 *src_orig,
              FcChar32      *dst,