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:
anders_k 2011-12-07 08:18:41 +00:00
parent 4d94e1ae8a
commit e57b4c5a67
5 changed files with 73 additions and 19 deletions

View file

@ -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

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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

View file

@ -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;