]> git.wh0rd.org - fontconfig.git/blobdiff - src/fclang.c
Bug 28958 - lang=en matches other langs
[fontconfig.git] / src / fclang.c
index 0f2f963d0dae0fcbc63ced64736c5a430e903294..1c78328048bb385003ffc43d24e00699a6eb356b 100644 (file)
@@ -7,9 +7,9 @@
  * documentation for any purpose is hereby granted without fee, provided that
  * the above copyright notice appear in all copies and that both that
  * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
+ * documentation, and that the name of the author(s) not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
@@ -39,7 +39,7 @@ typedef struct {
 
 struct _FcLangSet {
     FcStrSet   *extra;
-    int         map_size;
+    FcChar32    map_size;
     FcChar32   map[NUM_LANG_SET_MAP];
 };
 
@@ -72,7 +72,7 @@ FcLangSetBitGet (const FcLangSet *ls,
 }
 
 FcLangSet *
-FcFreeTypeLangSet (const FcCharSet  *charset, 
+FcFreeTypeLangSet (const FcCharSet  *charset,
                   const FcChar8    *exclusiveLang)
 {
     int                    i, j;
@@ -85,7 +85,7 @@ FcFreeTypeLangSet (const FcCharSet  *charset,
     ls = FcLangSetCreate ();
     if (!ls)
        return 0;
-    if (FcDebug() & FC_DBG_LANGSET) 
+    if (FcDebug() & FC_DBG_LANGSET)
     {
        printf ("font charset");
        FcCharSetPrint (charset);
@@ -93,7 +93,7 @@ FcFreeTypeLangSet (const FcCharSet  *charset,
     }
     for (i = 0; i < NUM_LANG_CHAR_SET; i++)
     {
-       if (FcDebug() & FC_DBG_LANGSET) 
+       if (FcDebug() & FC_DBG_LANGSET)
        {
            printf ("%s charset", fcLangCharSets[i].lang);
            FcCharSetPrint (&fcLangCharSets[i].charset);
@@ -112,7 +112,7 @@ FcFreeTypeLangSet (const FcCharSet  *charset,
                continue;
 
            for (j = 0; j < fcLangCharSets[i].charset.num; j++)
-               if (FcCharSetLeaf(&fcLangCharSets[i].charset, j) != 
+               if (FcCharSetLeaf(&fcLangCharSets[i].charset, j) !=
                    FcCharSetLeaf(exclusiveCharset, j))
                    continue;
        }
@@ -121,7 +121,7 @@ FcFreeTypeLangSet (const FcCharSet  *charset,
        {
            if (missing && missing < 10)
            {
-               FcCharSet   *missed = FcCharSetSubtract (&fcLangCharSets[i].charset, 
+               FcCharSet   *missed = FcCharSetSubtract (&fcLangCharSets[i].charset,
                                                         charset);
                FcChar32    ucs4;
                FcChar32    map[FC_CHARSET_MAP_SIZE];
@@ -154,8 +154,8 @@ FcFreeTypeLangSet (const FcCharSet  *charset,
 
     if (FcDebug() & FC_DBG_SCANV)
        printf ("\n");
-    
-    
+
+
     return ls;
 }
 
@@ -188,7 +188,7 @@ FcLangCompare (const FcChar8 *s1, const FcChar8 *s2)
 }
 
 /*
- * Return FcTrue when super contains sub. 
+ * Return FcTrue when super contains sub.
  *
  * super contains sub if super and sub have the same
  * language and either the same country or one
@@ -329,9 +329,9 @@ FcLangSetIndex (const FcChar8 *lang)
 {
     int            low, high, mid = 0;
     int            cmp = 0;
-    FcChar8 firstChar = FcToLower(lang[0]); 
+    FcChar8 firstChar = FcToLower(lang[0]);
     FcChar8 secondChar = firstChar ? FcToLower(lang[1]) : '\0';
-    
+
     if (firstChar < 'a')
     {
        low = 0;
@@ -360,11 +360,11 @@ FcLangSetIndex (const FcChar8 *lang)
        {   /* fast path for resolving 2-letter languages (by far the most common) after
             * finding the first char (probably already true because of the hash table) */
            cmp = fcLangCharSets[mid].lang[1] - secondChar;
-           if (cmp == 0 && 
-               (fcLangCharSets[mid].lang[2] != '\0' || 
+           if (cmp == 0 &&
+               (fcLangCharSets[mid].lang[2] != '\0' ||
                 lang[2] != '\0'))
            {
-               cmp = FcStrCmpIgnoreCase(fcLangCharSets[mid].lang+2, 
+               cmp = FcStrCmpIgnoreCase(fcLangCharSets[mid].lang+2,
                                         lang+2);
            }
        }
@@ -505,6 +505,7 @@ FcLangSetCompare (const FcLangSet *lsa, const FcLangSet *lsb)
 
 /*
  * Used in computing values -- mustn't allocate any storage
+ * XXX Not thread-safe
  */
 FcLangSet *
 FcLangSetPromote (const FcChar8 *lang)
@@ -515,6 +516,7 @@ FcLangSetPromote (const FcChar8 *lang)
     int                        id;
 
     memset (ls.map, '\0', sizeof (ls.map));
+    ls.map_size = NUM_LANG_SET_MAP;
     ls.extra = 0;
     id = FcLangSetIndex (lang);
     if (id > 0)
@@ -537,9 +539,10 @@ FcChar32
 FcLangSetHash (const FcLangSet *ls)
 {
     FcChar32   h = 0;
-    int                i;
+    int                i, count;
 
-    for (i = 0; i < ls->map_size; i++)
+    count = FC_MIN (ls->map_size, NUM_LANG_SET_MAP);
+    for (i = 0; i < count; i++)
        h ^= ls->map[i];
     if (ls->extra)
        h ^= ls->extra->num;
@@ -726,7 +729,7 @@ FcLangSetContains (const FcLangSet *lsa, const FcLangSet *lsb)
        if (missing)
        {
            for (j = 0; j < 32; j++)
-               if (missing & (1 << j)) 
+               if (missing & (1 << j))
                {
                    if (!FcLangSetContainsLang (lsa,
                                                fcLangCharSets[fcLangCharSetIndicesInv[i*32 + j]].lang))
@@ -777,7 +780,9 @@ FcLangSetSerialize(FcSerialize *serialize, const FcLangSet *l)
 
     if (!l_serialize)
        return NULL;
-    *l_serialize = *l;
+    memset (l_serialize->map, '\0', sizeof (l_serialize->map));
+    memcpy (l_serialize->map, l->map, FC_MIN (sizeof (l_serialize->map), l->map_size * sizeof (l->map[0])));
+    l_serialize->map_size = NUM_LANG_SET_MAP;
     l_serialize->extra = NULL; /* We don't serialize ls->extra */
     return l_serialize;
 }