X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ffcxml.c;h=031a7da1f0bc95735d98c44ed4675c3ca54ed897;hb=df88f72dae564eab44d6a09effdb56412db95951;hp=cdb14b67c1dfb4d04a4ed97aad22daa477f3ed88;hpb=db1af30227cdcd1e5ea6c83fb96fb06679a58a0a;p=platform%2Fupstream%2Ffontconfig.git diff --git a/src/fcxml.c b/src/fcxml.c index cdb14b6..031a7da 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -54,8 +54,12 @@ #ifdef _WIN32 #include +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;