Document ASCII limitations of Fc character conversion macros

Fix off-by-one error in utf-8 case walking code. Add FcStrDowncase (useful
    for testing case conversion functions)
This commit is contained in:
Keith Packard 2004-12-29 19:37:14 +00:00
parent 02748dd3b8
commit 479f551f6d
3 changed files with 35 additions and 4 deletions

View File

@ -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> 2004-12-29 Keith Packard <keithp@keithp.com>
* .cvsignore: * .cvsignore:

View File

@ -749,9 +749,13 @@ FcStrCopy (const FcChar8 *s);
FcChar8 * FcChar8 *
FcStrCopyFilename (const FcChar8 *s); FcStrCopyFilename (const FcChar8 *s);
#define FcIsUpper(c) (('A' <= (c) && (c) <= 'Z')) /* These are ASCII only, suitable only for pattern element names */
#define FcIsLower(c) (('a' <= (c) && (c) <= 'z')) #define FcIsUpper(c) ((0101 <= (c) && (c) <= 0132))
#define FcToLower(c) (FcIsUpper(c) ? (c) - 'A' + 'a' : (c)) #define FcIsLower(c) ((0141 <= (c) && (c) <= 0172))
#define FcToLower(c) (FcIsUpper(c) ? (c) - 0101 + 0141 : (c))
FcChar8 *
FcStrDowncase (const FcChar8 *s);
int int
FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2); FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);

View File

@ -92,7 +92,7 @@ FcStrCaseWalkerLong (FcCaseWalker *w, FcChar8 r)
FcChar32 ucs4; FcChar32 ucs4;
int slen; int slen;
slen = FcUtf8ToUcs4 (w->src - 1, &ucs4, w->len); slen = FcUtf8ToUcs4 (w->src - 1, &ucs4, w->len + 1);
if (slen <= 0) if (slen <= 0)
return r; return r;
if (FC_MIN_FOLD_CHAR <= ucs4 && ucs4 <= FC_MAX_FOLD_CHAR) if (FC_MIN_FOLD_CHAR <= ucs4 && ucs4 <= FC_MAX_FOLD_CHAR)
@ -188,6 +188,25 @@ FcStrCaseWalkerNextIgnoreBlanks (FcCaseWalker *w)
return r; 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 int
FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2) FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2)
{ {