Fix obtaining real path from pre-defined names for Win32

Fixes https://gitlab.freedesktop.org/fontconfig/fontconfig/issues/166
This commit is contained in:
Akira TAGOH 2019-06-24 08:07:27 +00:00
parent 189685365a
commit 83840fd1fa
1 changed files with 18 additions and 28 deletions

View File

@ -1286,7 +1286,6 @@ static FcChar8 *
_get_real_path_from_prefix(FcConfigParse *parse, const FcChar8 *path, const FcChar8 *prefix) _get_real_path_from_prefix(FcConfigParse *parse, const FcChar8 *path, const FcChar8 *prefix)
{ {
#ifdef _WIN32 #ifdef _WIN32
const FcChar8 *data;
FcChar8 buffer[1000] = { 0 }; FcChar8 buffer[1000] = { 0 };
#endif #endif
FcChar8 *parent = NULL, *retval = NULL; FcChar8 *parent = NULL, *retval = NULL;
@ -1321,19 +1320,11 @@ _get_real_path_from_prefix(FcConfigParse *parse, const FcChar8 *path, const FcCh
if (!FcStrIsAbsoluteFilename (path) && path[0] != '~') if (!FcStrIsAbsoluteFilename (path) && path[0] != '~')
FcConfigMessage (parse, FcSevereWarning, "Use of ambiguous path in <%s> element. please add prefix=\"cwd\" if current behavior is desired.", FcElementReverseMap (parse->pstack->element)); FcConfigMessage (parse, FcSevereWarning, "Use of ambiguous path in <%s> element. please add prefix=\"cwd\" if current behavior is desired.", FcElementReverseMap (parse->pstack->element));
} }
if (parent)
{
retval = FcStrBuildFilename (parent, path, NULL);
}
else
{
retval = FcStrdup (path);
}
#else #else
if (strcmp ((const char *) path, "CUSTOMFONTDIR") == 0) if (strcmp ((const char *) path, "CUSTOMFONTDIR") == 0)
{ {
FcChar8 *p; FcChar8 *p;
data = buffer; path = buffer;
if (!GetModuleFileName (NULL, (LPCH) buffer, sizeof (buffer) - 20)) if (!GetModuleFileName (NULL, (LPCH) buffer, sizeof (buffer) - 20))
{ {
FcConfigMessage (parse, FcSevereError, "GetModuleFileName failed"); FcConfigMessage (parse, FcSevereError, "GetModuleFileName failed");
@ -1345,55 +1336,54 @@ _get_real_path_from_prefix(FcConfigParse *parse, const FcChar8 *path, const FcCh
* pages have characters with backslash as the second * pages have characters with backslash as the second
* byte. * byte.
*/ */
p = _mbsrchr (data, '\\'); p = _mbsrchr (path, '\\');
if (p) *p = '\0'; if (p) *p = '\0';
strcat ((char *) data, "\\fonts"); strcat ((char *) path, "\\fonts");
} }
else if (strcmp ((const char *) path, "APPSHAREFONTDIR") == 0) else if (strcmp ((const char *) path, "APPSHAREFONTDIR") == 0)
{ {
FcChar8 *p; FcChar8 *p;
data = buffer; path = buffer;
if (!GetModuleFileName (NULL, (LPCH) buffer, sizeof (buffer) - 20)) if (!GetModuleFileName (NULL, (LPCH) buffer, sizeof (buffer) - 20))
{ {
FcConfigMessage (parse, FcSevereError, "GetModuleFileName failed"); FcConfigMessage (parse, FcSevereError, "GetModuleFileName failed");
return NULL; return NULL;
} }
p = _mbsrchr (data, '\\'); p = _mbsrchr (path, '\\');
if (p) *p = '\0'; if (p) *p = '\0';
strcat ((char *) data, "\\..\\share\\fonts"); strcat ((char *) path, "\\..\\share\\fonts");
} }
else if (strcmp ((const char *) path, "WINDOWSFONTDIR") == 0) else if (strcmp ((const char *) path, "WINDOWSFONTDIR") == 0)
{ {
int rc; int rc;
data = buffer; path = buffer;
rc = pGetSystemWindowsDirectory ((LPSTR) buffer, sizeof (buffer) - 20); rc = pGetSystemWindowsDirectory ((LPSTR) buffer, sizeof (buffer) - 20);
if (rc == 0 || rc > sizeof (buffer) - 20) if (rc == 0 || rc > sizeof (buffer) - 20)
{ {
FcConfigMessage (parse, FcSevereError, "GetSystemWindowsDirectory failed"); FcConfigMessage (parse, FcSevereError, "GetSystemWindowsDirectory failed");
return NULL; return NULL;
} }
if (data [strlen ((const char *) data) - 1] != '\\') if (path [strlen ((const char *) path) - 1] != '\\')
strcat ((char *) data, "\\"); strcat ((char *) path, "\\");
strcat ((char *) data, "fonts"); strcat ((char *) path, "fonts");
} }
else else
{ {
data = path;
if (!prefix) if (!prefix)
{ {
if (!FcStrIsAbsoluteFilename (path) && path[0] != '~') if (!FcStrIsAbsoluteFilename (path) && path[0] != '~')
FcConfigMessage (parse, FcSevereWarning, "Use of ambiguous path in <%s> element. please add prefix=\"cwd\" if current behavior is desired.", FcElementReverseMap (parse->pstack->element)); FcConfigMessage (parse, FcSevereWarning, "Use of ambiguous path in <%s> element. please add prefix=\"cwd\" if current behavior is desired.", FcElementReverseMap (parse->pstack->element));
} }
}
#endif
if (parent) if (parent)
{ {
retval = FcStrBuildFilename (parent, data, NULL); retval = FcStrBuildFilename (parent, path, NULL);
} }
else else
{ {
retval = FcStrdup (data); retval = FcStrdup (path);
} }
}
#endif
return retval; return retval;
} }