[Commit] fontconfig/src fccfg.c,1.35,1.36 fcstr.c,1.18,1.19

James Su commit@keithp.com
Tue, 27 May 2003 18:34:41 -0700


Committed by: suzhe

Update of /local/src/CVS/fontconfig/src
In directory home.keithp.com:/tmp/cvs-serv32749/src

Modified Files:
	fccfg.c fcstr.c 
Log Message:
Fix "contains" op for strings and langsets.


Index: fccfg.c
===================================================================
RCS file: /local/src/CVS/fontconfig/src/fccfg.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -d -r1.35 -r1.36
--- fccfg.c	7 May 2003 16:13:24 -0000	1.35
+++ fccfg.c	28 May 2003 01:34:38 -0000	1.36
@@ -565,13 +565,17 @@
 	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 @@
 	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: fcstr.c
===================================================================
RCS file: /local/src/CVS/fontconfig/src/fcstr.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- fcstr.c	2 May 2003 01:11:53 -0000	1.18
+++ fcstr.c	28 May 2003 01:34:38 -0000	1.19
@@ -188,6 +188,109 @@
     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,