UTF-8 support for SetFont and .nlf font name in ansi build
git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/trunk@6206 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
parent
4d94e1ae8a
commit
e57b4c5a67
5 changed files with 73 additions and 19 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
15
Source/utf.h
15
Source/utf.h
|
@ -15,6 +15,9 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifndef NSIS_UTF_H
|
||||
#define NSIS_UTF_H
|
||||
|
||||
#include "Platform.h"
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue