Imported Upstream version 2.12.1
[platform/upstream/fontconfig.git] / src / fcxml.c
index cdb14b6..031a7da 100644 (file)
 
 #ifdef _WIN32
 #include <mbstring.h>
+extern FcChar8 fontconfig_instprefix[];
 #endif
 
+static FcChar8  *__fc_userdir = NULL;
+static FcChar8  *__fc_userconf = NULL;
+
 static void
 FcExprDestroy (FcExpr *e);
 
@@ -78,6 +82,7 @@ FcRuleDestroy (FcRule *rule)
     case FcRuleEdit:
        FcEditDestroy (rule->u.edit);
        break;
+    case FcRuleUnknown:
     default:
        break;
     }
@@ -608,6 +613,7 @@ FcTypeName (FcType type)
        return "langset";
     case FcTypeRange:
        return "range";
+    case FcTypeUnknown:
     default:
        return "unknown";
     }
@@ -805,6 +811,7 @@ FcRuleCreate (FcRuleType type,
     case FcRuleEdit:
        r->u.edit = (FcEdit *) p;
        break;
+    case FcRuleUnknown:
     default:
        free (r);
        r = NULL;
@@ -1253,9 +1260,11 @@ static void
 FcParseBlank (FcConfigParse *parse)
 {
     int                n = FcVStackElements (parse);
+#if 0
     FcChar32   i, begin, end;
-    FcRange    r;
+#endif
 
+    FcConfigMessage (parse, FcSevereWarning, "blank doesn't take any effect anymore. please remove it from your fonts.conf");
     while (n-- > 0)
     {
        FcVStack    *v = FcVStackFetch (parse, n);
@@ -1267,13 +1276,15 @@ FcParseBlank (FcConfigParse *parse)
        }
        switch ((int) v->tag) {
        case FcVStackInteger:
+#if 0
            if (!FcBlanksAdd (parse->config->blanks, v->u.integer))
                goto bail;
            break;
+#endif
        case FcVStackRange:
-           r = FcRangeCanonicalize (v->u.range);
-           begin = (FcChar32)r.u.d.begin;
-           end = (FcChar32)r.u.d.end;
+#if 0
+           begin = (FcChar32) v->u.range->begin;
+           end = (FcChar32) v->u.range->end;
            if (begin <= end)
            {
              for (i = begin; i <= end; i++)
@@ -1282,6 +1293,7 @@ FcParseBlank (FcConfigParse *parse)
                      goto bail;
              }
            }
+#endif
            break;
        default:
            FcConfigMessage (parse, FcSevereError, "invalid element in blank");
@@ -1340,7 +1352,11 @@ FcParseInt (FcConfigParse *parse)
 static double
 FcStrtod (char *s, char **end)
 {
+#ifndef __BIONIC__
     struct lconv    *locale_data;
+#endif
+    const char     *decimal_point;
+    int                    dlen;
     char           *dot;
     double         v;
 
@@ -1348,14 +1364,21 @@ FcStrtod (char *s, char **end)
      * Have to swap the decimal point to match the current locale
      * if that locale doesn't use 0x2e
      */
+#ifndef __BIONIC__
+    locale_data = localeconv ();
+    decimal_point = locale_data->decimal_point;
+    dlen = strlen (decimal_point);
+#else
+    decimal_point = ".";
+    dlen = 1;
+#endif
+
     if ((dot = strchr (s, 0x2e)) &&
-       (locale_data = localeconv ()) &&
-       (locale_data->decimal_point[0] != 0x2e ||
-        locale_data->decimal_point[1] != 0))
+       (decimal_point[0] != 0x2e ||
+        decimal_point[1] != 0))
     {
        char    buf[128];
        int     slen = strlen (s);
-       int     dlen = strlen (locale_data->decimal_point);
        
        if (slen + dlen > (int) sizeof (buf))
        {
@@ -1369,7 +1392,7 @@ FcStrtod (char *s, char **end)
            /* mantissa */
            strncpy (buf, s, dot - s);
            /* decimal point */
-           strcpy (buf + (dot - s), locale_data->decimal_point);
+           strcpy (buf + (dot - s), decimal_point);
            /* rest of number */
            strcpy (buf + (dot - s) + dlen, dot + 1);
            buf_end = 0;
@@ -1586,7 +1609,6 @@ FcParseCharSet (FcConfigParse *parse)
     FcVStack   *vstack;
     FcCharSet  *charset = FcCharSetCreate ();
     FcChar32   i, begin, end;
-    FcRange    r;
     int n = 0;
 
     while ((vstack = FcVStackPeek (parse)))
@@ -1601,9 +1623,8 @@ FcParseCharSet (FcConfigParse *parse)
                n++;
            break;
        case FcVStackRange:
-           r = FcRangeCanonicalize (vstack->u.range);
-           begin = (FcChar32)r.u.d.begin;
-           end = (FcChar32)r.u.d.end;
+           begin = (FcChar32) vstack->u.range->begin;
+           end = (FcChar32) vstack->u.range->end;
 
            if (begin <= end)
            {
@@ -2187,7 +2208,25 @@ FcParseCacheDir (FcConfigParse *parse)
        data = prefix;
     }
 #ifdef _WIN32
-    if (strcmp ((const char *) data, "WINDOWSTEMPDIR_FONTCONFIG_CACHE") == 0)
+    else if (data[0] == '/' && fontconfig_instprefix[0] != '\0')
+    {
+       size_t plen = strlen ((const char *)fontconfig_instprefix);
+       size_t dlen = strlen ((const char *)data);
+
+       prefix = malloc (plen + 1 + dlen + 1);
+       if (!prefix)
+       {
+           FcConfigMessage (parse, FcSevereError, "out of memory");
+           goto bail;
+       }
+       strcpy ((char *) prefix, (char *) fontconfig_instprefix);
+       prefix[plen] = FC_DIR_SEPARATOR;
+       memcpy (&prefix[plen + 1], data, dlen);
+       prefix[plen + 1 + dlen] = 0;
+       FcStrFree (data);
+       data = prefix;
+    }
+    else if (strcmp ((const char *) data, "WINDOWSTEMPDIR_FONTCONFIG_CACHE") == 0)
     {
        int rc;
        FcStrFree (data);
@@ -2243,6 +2282,24 @@ FcParseCacheDir (FcConfigParse *parse)
        FcStrFree (data);
 }
 
+void
+FcConfigPathFini (void)
+{
+    FcChar8 *s;
+
+retry_dir:
+    s = fc_atomic_ptr_get (&__fc_userdir);
+    if (!fc_atomic_ptr_cmpexch (&__fc_userdir, s, NULL))
+       goto retry_dir;
+    free (s);
+
+retry_conf:
+    s = fc_atomic_ptr_get (&__fc_userconf);
+    if (!fc_atomic_ptr_cmpexch (&__fc_userconf, s, NULL))
+       goto retry_conf;
+    free (s);
+}
+
 static void
 FcParseInclude (FcConfigParse *parse)
 {
@@ -2253,8 +2310,7 @@ FcParseInclude (FcConfigParse *parse)
     FcBool         deprecated = FcFalse;
 #endif
     FcChar8        *prefix = NULL, *p;
-    static FcChar8  *userdir = NULL;
-    static FcChar8  *userconf = NULL;
+    FcChar8        *userdir = NULL, *userconf = NULL;
 
     s = FcStrBufDoneStatic (&parse->pstack->str);
     if (!s)
@@ -2265,8 +2321,8 @@ FcParseInclude (FcConfigParse *parse)
     attr = FcConfigGetAttribute (parse, "ignore_missing");
     if (attr && FcConfigLexBool (parse, (FcChar8 *) attr) == FcTrue)
        ignore_missing = FcTrue;
-#ifndef _WIN32
     attr = FcConfigGetAttribute (parse, "deprecated");
+#ifndef _WIN32
     if (attr && FcConfigLexBool (parse, (FcChar8 *) attr) == FcTrue)
         deprecated = FcTrue;
 #endif
@@ -2284,6 +2340,7 @@ FcParseInclude (FcConfigParse *parse)
     {
        size_t plen = strlen ((const char *)prefix);
        size_t dlen = strlen ((const char *)s);
+       FcChar8 *u;
 
        p = realloc (prefix, plen + 1 + dlen + 1);
        if (!p)
@@ -2299,14 +2356,32 @@ FcParseInclude (FcConfigParse *parse)
        if (FcFileIsDir (s))
        {
        userdir:
+           userdir = fc_atomic_ptr_get (&__fc_userdir);
            if (!userdir)
-               userdir = FcStrdup (s);
+           {
+               u = FcStrdup (s);
+               if (!fc_atomic_ptr_cmpexch (&__fc_userdir, userdir, u))
+               {
+                   free (u);
+                   goto userdir;
+               }
+               userdir = u;
+           }
        }
        else if (FcFileIsFile (s))
        {
        userconf:
+           userconf = fc_atomic_ptr_get (&__fc_userconf);
            if (!userconf)
-               userconf = FcStrdup (s);
+           {
+               u = FcStrdup (s);
+               if (!fc_atomic_ptr_cmpexch (&__fc_userconf, userconf, u))
+               {
+                   free (u);
+                   goto userconf;
+               }
+               userconf = u;
+           }
        }
        else
        {
@@ -2330,6 +2405,7 @@ FcParseInclude (FcConfigParse *parse)
         filename = FcConfigFilename(s);
        if (deprecated == FcTrue &&
            filename != NULL &&
+           userdir != NULL &&
            !FcFileIsLink (filename))
        {
            if (FcFileIsDir (filename))
@@ -3093,7 +3169,7 @@ FcConfigParseAndLoadDir (FcConfig *config,
     strcat ((char *) file, "/");
     base = file + strlen ((char *) file);
 
-    files = FcStrSetCreate ();
+    files = FcStrSetCreateEx (FCSS_GROW_BY_64);
     if (!files)
     {
        ret = FcFalse;