]> git.wh0rd.org - fontconfig.git/commitdiff
Document ASCII limitations of Fc character conversion macros
authorKeith Packard <keithp@keithp.com>
Wed, 29 Dec 2004 19:37:14 +0000 (19:37 +0000)
committerKeith Packard <keithp@keithp.com>
Wed, 29 Dec 2004 19:37:14 +0000 (19:37 +0000)
Fix off-by-one error in utf-8 case walking code. Add FcStrDowncase (useful
    for testing case conversion functions)

ChangeLog
fontconfig/fontconfig.h
src/fcstr.c

index f84e0c47c5b99cba61dc41070cca67b2994f464a..70228f0a35c425200b4c0669c5684c7107ec4147 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2004-12-29  Keith Packard  <keithp@keithp.com>
+
+       * fontconfig/fontconfig.h:
+       Document ASCII limitations of Fc character conversion macros
+       * src/fcstr.c: (FcStrCaseWalkerLong), (FcStrDowncase):
+       Fix off-by-one error in utf-8 case walking code.
+       Add FcStrDowncase (useful for testing case conversion functions)
+
 2004-12-29  Keith Packard  <keithp@keithp.com>
 
        * .cvsignore:
index ab312da8110b190d0ed76d1c73a8daf0c7410217..f0252598d68229f39b265d6fa49e87323153f86f 100644 (file)
@@ -749,9 +749,13 @@ FcStrCopy (const FcChar8 *s);
 FcChar8 *
 FcStrCopyFilename (const FcChar8 *s);
     
-#define FcIsUpper(c)   (('A' <= (c) && (c) <= 'Z'))
-#define FcIsLower(c)   (('a' <= (c) && (c) <= 'z'))
-#define FcToLower(c)   (FcIsUpper(c) ? (c) - 'A' + 'a' : (c))
+/* These are ASCII only, suitable only for pattern element names */
+#define FcIsUpper(c)   ((0101 <= (c) && (c) <= 0132))
+#define FcIsLower(c)   ((0141 <= (c) && (c) <= 0172))
+#define FcToLower(c)   (FcIsUpper(c) ? (c) - 0101 + 0141 : (c))
+
+FcChar8 *
+FcStrDowncase (const FcChar8 *s);
 
 int
 FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
index 61f1897d9ee11e2dc2aa8b05a27f64b27de8b554..730e44061eecfaa475bf6a598bc1a42a70a22c06 100644 (file)
@@ -92,7 +92,7 @@ FcStrCaseWalkerLong (FcCaseWalker *w, FcChar8 r)
     FcChar32   ucs4;
     int                slen;
 
-    slen = FcUtf8ToUcs4 (w->src - 1, &ucs4, w->len);
+    slen = FcUtf8ToUcs4 (w->src - 1, &ucs4, w->len + 1);
     if (slen <= 0)
        return r;
     if (FC_MIN_FOLD_CHAR <= ucs4 && ucs4 <= FC_MAX_FOLD_CHAR)
@@ -188,6 +188,25 @@ FcStrCaseWalkerNextIgnoreBlanks (FcCaseWalker *w)
     return r;
 }
 
+FcChar8 *
+FcStrDowncase (const FcChar8 *s)
+{
+    FcCaseWalker    w;
+    int                    len = 0;
+    FcChar8        *dst, *d;
+
+    FcStrCaseWalkerInit (s, &w);
+    while (FcStrCaseWalkerNext (&w))
+       len++;
+    d = dst = malloc (len + 1);
+    if (!d)
+       return 0;
+    FcMemAlloc (FC_MEM_STRING, len + 1);
+    FcStrCaseWalkerInit (s, &w);
+    while ((*d++ = FcStrCaseWalkerNext (&w)));
+    return dst;
+}
+
 int
 FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
 {