diff --git a/Source/lang.cpp b/Source/lang.cpp index bbc7ebc4..e39da4e5 100644 --- a/Source/lang.cpp +++ b/Source/lang.cpp @@ -513,10 +513,10 @@ int CEXEBuild::SetUTF8LangString(TCHAR *name, LANGID lang, const char* stru8) if (!table) return PS_ERROR; if (!Platform_SupportsUTF8Conversion()) return PS_ERROR; - EXEHEADTCHAR_T *bufEHTStr = UTF8ToExeHeadTStr(stru8, table->nlf.m_uCodePage); + EXEHEADTCHAR_T *bufEHTStr = UTF8ToExeHeadTStrDup(stru8, table->nlf.m_uCodePage); if (!bufEHTStr) return PS_ERROR; const int ret = SetLangString(name, lang, bufEHTStr, sizeof(EXEHEADTCHAR_T) > 1); - ExeHeadTStrFree(bufEHTStr); + free(bufEHTStr); return ret; } #endif @@ -1049,7 +1049,20 @@ LanguageTable * CEXEBuild::LoadLangFile(TCHAR *filename) { if (!unicode && nlf->m_szFont) // convert font name from ANSI to Unicode now that we know the language codepage { TCHAR* str = nlf->m_szFont; - nlf->m_szFont = _tcsdup(CtoTString2(TtoCString(str),table->nlf.m_uCodePage)); + nlf->m_szFont = _tcsdup(CtoTString2(TtoCString(str), table->nlf.m_uCodePage)); + free(str); + } +#else + if (8 == fencoding && nlf->m_szFont) + { + TCHAR* str = nlf->m_szFont; + EXEHEADTCHAR_T *bufConv = UTF8ToExeHeadTStrDup(str, table->nlf.m_uCodePage); + nlf->m_szFont = bufConv; + if (!nlf->m_szFont) + { + ERROR_MSG(_T("Error: Unable to convert font name\n")); + return 0; + } free(str); } #endif @@ -1127,7 +1140,7 @@ LanguageTable * CEXEBuild::LoadLangFile(TCHAR *filename) { ERROR_MSG(_T("Error: UTF-8 language files not supported on this OS!\n")); return 0; } - EXEHEADTCHAR_T *bufConv = UTF8ToExeHeadTStr(buf, nlf->m_uCodePage); + EXEHEADTCHAR_T *bufConv = UTF8ToExeHeadTStrDup(buf, nlf->m_uCodePage); if (!bufConv) { ERROR_MSG(_T("Error: Invalid UTF-8? (string #%d - \"%s\")\n"), i, NLFStrings[i].szLangStringName); return 0; @@ -1139,7 +1152,7 @@ LanguageTable * CEXEBuild::LoadLangFile(TCHAR *filename) { buf[NSIS_MAX_STRLEN-1] = _T('\0'); // Make sure we fail the "String too long" check } } - ExeHeadTStrFree(bufConv); + free(bufConv); } #endif diff --git a/Source/script.cpp b/Source/script.cpp index 2d07f49b..5b0e4a3a 100644 --- a/Source/script.cpp +++ b/Source/script.cpp @@ -2778,22 +2778,54 @@ int CEXEBuild::doCommand(int which_token, LineParser &line) #endif case TOK_SETFONT: { + unsigned char failed = 0; if (!_tcsnicmp(line.gettoken_str(1), _T("/LANG="), 6)) { LANGID lang_id = _ttoi(line.gettoken_str(1) + 6); LanguageTable *table = GetLangTable(lang_id); - table->nlf.m_szFont = (TCHAR*)malloc((_tcslen(line.gettoken_str(2))+1)*sizeof(TCHAR)); - _tcscpy(table->nlf.m_szFont, line.gettoken_str(2)); + const TCHAR*facename = line.gettoken_str(2); +#ifndef _UNICODE + if (build_include_isutf8) + { + EXEHEADTCHAR_T *bufEHTStr = UTF8ToExeHeadTStrDup(facename, table->nlf.m_uCodePage); + table->nlf.m_szFont = bufEHTStr; + } + else +#endif + { + table->nlf.m_szFont = _tcsdup(facename); + } table->nlf.m_iFontSize = line.gettoken_int(3); - - SCRIPT_MSG(_T("SetFont: lang=%d \"%s\" %s\n"), lang_id, line.gettoken_str(2), line.gettoken_str(3)); + + if (table->nlf.m_szFont) + SCRIPT_MSG(_T("SetFont: lang=%d \"%s\" %s\n"), lang_id, facename, line.gettoken_str(3)); + else + ++failed; } else { - _tcsnccpy(build_font, line.gettoken_str(1), COUNTOF(build_font)); + const TCHAR*facename = line.gettoken_str(1); +#ifndef _UNICODE + if (build_include_isutf8) + { + EXEHEADTCHAR_T *bufEHTStr = UTF8ToExeHeadTStrDup(facename, CP_ACP); + if (!bufEHTStr) ++failed; + _tcsnccpy(build_font, bufEHTStr, COUNTOF(build_font)); + free(bufEHTStr); + } + else +#endif + { + _tcsnccpy(build_font, facename, COUNTOF(build_font)); + } build_font_size = line.gettoken_int(2); - SCRIPT_MSG(_T("SetFont: \"%s\" %s\n"), line.gettoken_str(1), line.gettoken_str(2)); + if (!failed) SCRIPT_MSG(_T("SetFont: \"%s\" %s\n"), facename, line.gettoken_str(2)); + } + if (failed) + { + ERROR_MSG(_T("Error: Unable to convert font name\n")); + return PS_ERROR; } } return PS_OK; diff --git a/Source/utf.cpp b/Source/utf.cpp index 1f6a4959..fe78f233 100644 --- a/Source/utf.cpp +++ b/Source/utf.cpp @@ -37,7 +37,7 @@ static EXEHEADWCHAR_T* ExeHeadWStrAlloc(UINT cch) #ifdef _UNICODE #else // !_UNICODE -EXEHEADTCHAR_T* UTF8ToExeHeadTStr(LPCSTR StrU8,UINT Codepage) +EXEHEADTCHAR_T* UTF8ToExeHeadTStrDup(LPCSTR StrU8,UINT Codepage) { int cchW = MultiByteToWideChar(CP_UTF8,UTF8MBTWCFLAGS,StrU8,-1,NULL,0); if (!cchW) return NULL; @@ -51,7 +51,7 @@ EXEHEADTCHAR_T* UTF8ToExeHeadTStr(LPCSTR StrU8,UINT Codepage) { if (!WideCharToMultiByte(Codepage,0,bufWStr,cchW,outstr,cbA,NULL,NULL)) { - ExeHeadTStrFree(outstr); + free(outstr); outstr = NULL; } } diff --git a/Source/utf.h b/Source/utf.h index 96a227db..3365ea90 100644 --- a/Source/utf.h +++ b/Source/utf.h @@ -15,6 +15,9 @@ * */ +#ifndef NSIS_UTF_H +#define NSIS_UTF_H + #include "Platform.h" #include #include @@ -28,9 +31,13 @@ typedef EXEHEADWCHAR_T EXEHEADTCHAR_T; #else // !_UNICODE typedef char EXEHEADTCHAR_T; -#define ExeHeadTStrFree free -inline EXEHEADTCHAR_T* ExeHeadTStrAlloc(UINT cb) {return (EXEHEADTCHAR_T*) malloc(cb);} -extern EXEHEADTCHAR_T* UTF8ToExeHeadTStr(LPCSTR StrU8,UINT Codepage); + +inline EXEHEADTCHAR_T* ExeHeadTStrAlloc(UINT cb) +{ + // NOTE: UTF8ToExeHeadTStrDup calls this so we are required to use malloc + return (EXEHEADTCHAR_T*) malloc(cb); +} +extern EXEHEADTCHAR_T* UTF8ToExeHeadTStrDup(LPCSTR StrU8,UINT Codepage); #endif // ?_UNICODE @@ -41,3 +48,5 @@ extern EXEHEADTCHAR_T* UTF8ToExeHeadTStr(LPCSTR StrU8,UINT Codepage); * if it is not it tries its best to restore the data. */ extern bool IsUTF8BOM(FILE*fstrm); + +#endif // NSIS_UTF_H diff --git a/Source/util.cpp b/Source/util.cpp index e2be0010..bb35d412 100644 --- a/Source/util.cpp +++ b/Source/util.cpp @@ -221,7 +221,7 @@ int WideCharToMultiByte(UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, char cp[128]; create_code_page_string(cp, sizeof(cp), CodePage); - iconv_t cd = iconv_open(cp, "UCS-2LE"); + iconv_t cd = iconv_open(cp, "UCS-2LE"); //TODO: Should "UCS-2LE" be "wchar_t"? if (cd == (iconv_t) -1) { return 0; } @@ -257,7 +257,7 @@ int MultiByteToWideChar(UINT CodePage, DWORD dwFlags, LPCSTR lpMultiByteStr, char cp[128]; create_code_page_string(cp, sizeof(cp), CodePage); - iconv_t cd = iconv_open("UCS-2LE", cp); + iconv_t cd = iconv_open("UCS-2LE", cp); //TODO: Should "UCS-2LE" be "wchar_t"? if (cd == (iconv_t) -1) { return 0; } @@ -291,7 +291,7 @@ BOOL IsValidCodePage(UINT CodePage) TCHAR cp[128]; create_code_page_string(cp, sizeof(cp), CodePage); - iconv_t cd = iconv_open(_T("UCS-2LE"), cp); + iconv_t cd = iconv_open(_T("UCS-2LE"), cp); //TODO: Should "UCS-2LE" be "wchar_t"? if (cd == (iconv_t) -1) return FALSE;