X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffcxml.c;h=0952b0b4424f30c967cdc975621945131d214fea;hb=2b0f3f1128e479dd3d32022336c967655e6c4821;hp=7b7bbfd1062a1a6d85336a3a136854d0ee4effc1;hpb=a1b6e34a9a17a4a675bdc993aa465b92d7122376;p=fontconfig.git diff --git a/src/fcxml.c b/src/fcxml.c index 7b7bbfd..0952b0b 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -57,6 +57,7 @@ #define STRICT #include #undef STRICT +#include #endif static void @@ -132,18 +133,6 @@ FcExprCreateBool (FcConfig *config, FcBool b) return e; } -static FcExpr * -FcExprCreateNil (FcConfig *config) -{ - FcExpr *e = FcConfigAllocExpr (config); - if (e) - { - FcMemAlloc (FC_MEM_EXPR, sizeof (FcExpr)); - e->op = FcOpNil; - } - return e; -} - static FcExpr * FcExprCreateField (FcConfig *config, const char *field) { @@ -327,7 +316,7 @@ static const struct { { "config", FcElementConfig }, { "match", FcElementMatch }, { "alias", FcElementAlias }, - + { "blank", FcElementBlank }, { "rescan", FcElementRescan }, @@ -2031,7 +2020,10 @@ FcEndElement(void *userData, const XML_Char *name) { FcConfigParse *parse = userData; FcChar8 *data; - +#ifdef _WIN32 + FcChar8 buffer[1000]; +#endif + if (!parse->pstack) return; switch (parse->pstack->element) { @@ -2050,61 +2042,47 @@ FcEndElement(void *userData, const XML_Char *name) if (strcmp (data, "CUSTOMFONTDIR") == 0) { char *p; - FcStrFree (data); - data = malloc (1000); - if (!data) - { - FcConfigMessage (parse, FcSevereError, "out of memory"); - break; - } - FcMemAlloc (FC_MEM_STRING, 1000); - if(!GetModuleFileName(NULL, data, 1000)) + data = buffer; + if (!GetModuleFileName (NULL, buffer, sizeof (buffer) - 20)) { FcConfigMessage (parse, FcSevereError, "GetModuleFileName failed"); - FcStrFree (data); break; } - p = strrchr (data, '\\'); + /* + * Must use the multi-byte aware function to search + * for backslash because East Asian double-byte code + * pages have characters with backslash as the second + * byte. + */ + p = _mbsrchr (data, '\\'); if (p) *p = '\0'; strcat (data, "\\fonts"); } else if (strcmp (data, "APPSHAREFONTDIR") == 0) { char *p; - FcStrFree (data); - data = malloc (1000); - if (!data) - { - FcConfigMessage (parse, FcSevereError, "out of memory"); - break; - } - FcMemAlloc (FC_MEM_STRING, 1000); - if(!GetModuleFileName(NULL, data, 1000)) + data = buffer; + if (!GetModuleFileName (NULL, buffer, sizeof (buffer) - 20)) { FcConfigMessage (parse, FcSevereError, "GetModuleFileName failed"); - FcStrFree (data); break; } - p = strrchr (data, '\\'); + p = _mbsrchr (data, '\\'); if (p) *p = '\0'; strcat (data, "\\..\\share\\fonts"); } else if (strcmp (data, "WINDOWSFONTDIR") == 0) { int rc; - FcStrFree (data); - data = malloc (1000); - if (!data) - { - FcConfigMessage (parse, FcSevereError, "out of memory"); - break; - } - FcMemAlloc (FC_MEM_STRING, 1000); - rc = GetSystemWindowsDirectory (data, 800); - if (rc == 0 || rc > 800) + data = buffer; +#if _WIN32_WINNT >= 0x0500 + rc = GetSystemWindowsDirectory (buffer, sizeof (buffer) - 20); +#else + rc = GetWindowsDirectory (buffer, sizeof (buffer) - 20); +#endif + if (rc == 0 || rc > sizeof (buffer) - 20) { FcConfigMessage (parse, FcSevereError, "GetSystemWindowsDirectory failed"); - FcStrFree (data); break; } if (data [strlen (data) - 1] != '\\')