Skip to content

StringsEncoding: correct bitmap loading #1987

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 14, 2019
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 36 additions & 24 deletions CoreFoundation/StringEncodings.subproj/CFUniChar.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ extern void _CFGetFrameworkPath(wchar_t *path, int maxLength);

#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED
#define USE_MACHO_SEGMENT 1
#elif DEPLOYMENT_RUNTIME_SWIFT && (DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_FREEBSD)
#elif DEPLOYMENT_RUNTIME_SWIFT && (DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_FREEBSD || DEPLOYMENT_TARGET_WINDOWS)
#define USE_RAW_SYMBOL 1
#endif

Expand Down Expand Up @@ -301,46 +301,38 @@ static bool __CFUniCharLoadBytesFromFile(const wchar_t *fileName, const void **b
#else
#error Unknown or unspecified DEPLOYMENT_TARGET
#endif

#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI || DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_FREEBSD
static bool __CFUniCharLoadFile(const char *bitmapName, const void **bytes, int64_t *fileSize) {
#elif DEPLOYMENT_TARGET_WINDOWS
static bool __CFUniCharLoadFile(const wchar_t *bitmapName, const void **bytes, int64_t *fileSize) {

#if __CF_BIG_ENDIAN__
#define CF_UNICODE_DATA_SYM __CFUnicodeDataB
#else
#error Unknown or unspecified DEPLOYMENT_TARGET
#define CF_UNICODE_DATA_SYM __CFUnicodeDataL
#endif

#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI || DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_FREEBSD
static bool __CFUniCharLoadFile(const char *bitmapName, const void **bytes, int64_t *fileSize) {
#if USE_MACHO_SEGMENT
*bytes = __CFGetSectDataPtr("__UNICODE", bitmapName, NULL);
*bytes = __CFGetSectDataPtr("__UNICODE", bitmapName, NULL);

if (NULL != fileSize) *fileSize = 0;

return *bytes ? true : false;
#elif USE_RAW_SYMBOL
extern void *__CFCharacterSetBitmapData;
#if __CF_BIG_ENDIAN__
extern void *__CFUnicodeDataB;
#else
extern void *__CFUnicodeDataL;
#endif
extern void *CF_UNICODE_DATA_SYM;
extern void *__CFUniCharPropertyDatabase;

if (strcmp(bitmapName, CF_UNICHAR_BITMAP_FILE) == 0) {
*bytes = &__CFCharacterSetBitmapData;
} else if (strcmp(bitmapName, MAPPING_TABLE_FILE) == 0) {
#if __CF_BIG_ENDIAN__
*bytes = &__CFUnicodeDataB;
#else
*bytes = &__CFUnicodeDataL;
#endif
*bytes = &CF_UNICODE_DATA_SYM;
} else if (strcmp(bitmapName, PROP_DB_FILE) == 0) {
*bytes = &__CFUniCharPropertyDatabase;
}

if (NULL != fileSize) *fileSize = 0;

return *bytes ? true : false;
#else
#if DEPLOYMENT_TARGET_MACOSX || DEPLOYMENT_TARGET_EMBEDDED || DEPLOYMENT_TARGET_EMBEDDED_MINI || DEPLOYMENT_TARGET_LINUX || DEPLOYMENT_TARGET_FREEBSD
char cpath[MAXPATHLEN];
__CFUniCharCharacterSetPath(cpath);
strlcat(cpath, bitmapName, MAXPATHLEN);
Expand All @@ -349,16 +341,36 @@ static bool __CFUniCharLoadFile(const wchar_t *bitmapName, const void **bytes, i
bool result = __CFUniCharLoadBytesFromFile(possiblyFrameworkRootedCPath, bytes, fileSize);
if (needToFree) free((void *)possiblyFrameworkRootedCPath);
return result;
#endif
}
#elif DEPLOYMENT_TARGET_WINDOWS
static bool __CFUniCharLoadFile(const wchar_t *bitmapName, const void **bytes, int64_t *fileSize) {
#if USE_RAW_SYMBOL
extern void *__CFCharacterSetBitmapData;
extern void *CF_UNICODE_DATA_SYM;
extern void *__CFUniCharPropertyDatabase;

if (wcscmp(bitmapName, CF_UNICHAR_BITMAP_FILE) == 0) {
*bytes = &__CFCharacterSetBitmapData;
} else if (wcscmp(bitmapName, MAPPING_TABLE_FILE) == 0) {
*bytes = &CF_UNICODE_DATA_SYM;
} else if (wcscmp(bitmapName, PROP_DB_FILE) == 0) {
*bytes = &__CFUniCharPropertyDatabase;
}

if (NULL != fileSize) *fileSize = 0;

return *bytes ? true : false;
#else
wchar_t wpath[MAXPATHLEN];
__CFUniCharCharacterSetPath(wpath);
wcsncat(wpath, bitmapName, MAXPATHLEN);
return __CFUniCharLoadBytesFromFile(wpath, bytes, fileSize);
#endif
}
#else
#error Unknown or unspecified DEPLOYMENT_TARGET
#endif
#endif
}

// Bitmap functions
/*
Expand Down