diff --git a/Contrib/AdvSplash/advsplash.c b/Contrib/AdvSplash/advsplash.c
index bdf8acfc..c441f200 100644
--- a/Contrib/AdvSplash/advsplash.c
+++ b/Contrib/AdvSplash/advsplash.c
@@ -1,3 +1,4 @@
+// Unicode support by Jim Park -- 08/22/2007
// For layered windows
#define _WIN32_WINNT 0x0500
@@ -15,7 +16,7 @@ int g_rv;
int resolution;
int sleep_val, fadein_val, fadeout_val, state, timeleft, keycolor, nt50,
alphaparam;
-const char classname[4] = "_sp";
+const TCHAR classname[4] = _T("_sp");
typedef BOOL(_stdcall * _tSetLayeredWindowAttributesProc) (HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
@@ -170,11 +171,11 @@ void CALLBACK TimeProc(UINT uID,
}
void __declspec(dllexport) show(HWND hwndParent, int string_size,
- char *variables, stack_t ** stacktop)
+ TCHAR *variables, stack_t ** stacktop)
{
DEVMODE dm;
- char fn[MAX_PATH];
- char temp[64];
+ TCHAR fn[MAX_PATH];
+ TCHAR temp[64];
g_rv = -1;
resolution = RESOLUTION;
@@ -223,10 +224,10 @@ void __declspec(dllexport) show(HWND hwndParent, int string_size,
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = classname;
if (RegisterClass(&wc)) {
- char fn2[MAX_PATH];
+ TCHAR fn2[MAX_PATH];
lstrcpy(fn2, fn);
- lstrcat(fn, ".bmp");
- lstrcat(fn2, ".wav");
+ lstrcat(fn, _T(".bmp"));
+ lstrcat(fn2, _T(".wav"));
g_hbm =
LoadImage(NULL, fn, IMAGE_BITMAP, 0, 0,
LR_CREATEDIBSECTION | LR_LOADFROMFILE);
@@ -235,7 +236,7 @@ void __declspec(dllexport) show(HWND hwndParent, int string_size,
UINT timerEvent;
// Get Bitmap Information
- GetObject(g_hbm, sizeof(bm), (LPSTR) & bm);
+ GetObject(g_hbm, sizeof(bm), & bm);
myWnd =
CreateWindowEx(WS_EX_TOOLWINDOW |
@@ -246,7 +247,7 @@ void __declspec(dllexport) show(HWND hwndParent, int string_size,
// Set transparency / key color
if (nt50) {
// Get blending proc address
- HANDLE user32 = GetModuleHandle("user32");
+ HANDLE user32 = GetModuleHandle(_T("user32"));
SetLayeredWindowAttributesProc =
(_tSetLayeredWindowAttributesProc) GetProcAddress(user32,
"SetLayeredWindowAttributes");
@@ -283,6 +284,6 @@ void __declspec(dllexport) show(HWND hwndParent, int string_size,
UnregisterClass(wc.lpszClassName, g_hInstance);
}
}
- wsprintf(temp, "%d", g_rv);
+ wsprintf(temp, _T("%d"), g_rv);
pushstring(temp);
}
diff --git a/Contrib/Banner/Banner.c b/Contrib/Banner/Banner.c
index 018cd447..f4b42cd3 100644
--- a/Contrib/Banner/Banner.c
+++ b/Contrib/Banner/Banner.c
@@ -2,6 +2,8 @@
#include // nsis plugin
#include "../../Source/exehead/resource.h"
+// Unicode support added by Jim Park -- 08/02/2007
+
// Turn a pair of chars into a word
// Turn four chars into a dword
#ifdef __BIG_ENDIAN__ // Not very likely, but, still...
@@ -17,7 +19,7 @@ HWND hwBanner;
HANDLE hThread;
BOOL bFailed;
-char buf[1024];
+TCHAR buf[1024];
BOOL CALLBACK BannerProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
@@ -116,7 +118,7 @@ static UINT_PTR PluginCallback(enum NSPIM msg)
return 0;
}
-void __declspec(dllexport) show(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) show(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
EXDLL_INIT();
@@ -155,13 +157,13 @@ void __declspec(dllexport) show(HWND hwndParent, int string_size, char *variable
}
}
-void __declspec(dllexport) getWindow(HWND hwndParent, int string_size, char *variables, stack_t **stacktop)
+void __declspec(dllexport) getWindow(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop)
{
- wsprintf(buf, "%u", hwBanner);
+ wsprintf(buf, _T("%u"), hwBanner);
pushstring(buf);
}
-void __declspec(dllexport) destroy(HWND hwndParent, int string_size, char *variables, stack_t **stacktop)
+void __declspec(dllexport) destroy(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop)
{
if (!hwBanner)
return;
diff --git a/Contrib/BgImage/BgImage.cpp b/Contrib/BgImage/BgImage.cpp
index 4a3fc7d0..6a6a9763 100644
--- a/Contrib/BgImage/BgImage.cpp
+++ b/Contrib/BgImage/BgImage.cpp
@@ -1,3 +1,5 @@
+// Unicode support by Jim Park -- 08/22/2007
+
#include
#include
#include // nsis plugin
@@ -8,9 +10,9 @@
g_stringsize=string_size; \
g_stacktop=stacktop; }
-#define NSISFunc(name) extern "C" void __declspec(dllexport) name(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+#define NSISFunc(name) extern "C" void __declspec(dllexport) name(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
-char szTemp[2048];
+TCHAR szTemp[2048];
HWND hWndImage, hWndParent;
HINSTANCE g_hInstance;
@@ -37,7 +39,7 @@ struct myImageList {
BYTE iType;
union {
HBITMAP hBitmap;
- char *szText;
+ TCHAR *szText;
COLORREF cGradientFrom;
};
RECT rPos;
@@ -80,14 +82,14 @@ NSISFunc(SetReturn) {
extra->RegisterPluginCallback(g_hInstance, PluginCallback);
popstring(szTemp);
- bReturn = !lstrcmpi(szTemp, "on");
+ bReturn = !lstrcmpi(szTemp, _T("on"));
}
-static void __stdcall my_pushstring(char *str)
+static void __stdcall my_pushstring(TCHAR *str)
{
stack_t *th;
if (!g_stacktop || !bReturn) return;
- th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize);
+ th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+(g_stringsize*sizeof(TCHAR)));
lstrcpyn(th->text,str,g_stringsize);
th->next=*g_stacktop;
*g_stacktop=th;
@@ -104,7 +106,7 @@ NSISFunc(SetBg) {
hWndParent = hwndParent;
if (!hwndParent) {
- my_pushstring("can't find parent window");
+ my_pushstring(_T("can't find parent window"));
LCS();
return;
}
@@ -120,18 +122,18 @@ NSISFunc(SetBg) {
LoadCursor(0, IDC_ARROW),
0,
0,
- "NSISBGImage",
+ _T("NSISBGImage"),
0
};
ATOM atomClass = RegisterClassEx(&wc);
if (!atomClass) {
- my_pushstring("can't create window");
+ my_pushstring(_T("can't create window"));
return;
}
hWndImage = CreateWindowEx(
WS_EX_TOOLWINDOW,
- (LPSTR)(DWORD)atomClass,
+ (LPTSTR)(DWORD)atomClass,
0,
WS_CLIPSIBLINGS|WS_POPUP,
0,
@@ -144,7 +146,7 @@ NSISFunc(SetBg) {
0
);
if (!hWndImage) {
- my_pushstring("can't create window");
+ my_pushstring(_T("can't create window"));
LCS();
return;
}
@@ -225,7 +227,7 @@ done:
);
}
- my_pushstring("success");
+ my_pushstring(_T("success"));
}
NSISFunc(AddImage) {
@@ -233,7 +235,7 @@ NSISFunc(AddImage) {
myImageList *newImg = (myImageList *)GlobalAlloc(GPTR, sizeof(myImageList));
if (!newImg) {
- my_pushstring("memory allocation error");
+ my_pushstring(_T("memory allocation error"));
LCS();
return;
}
@@ -242,7 +244,7 @@ NSISFunc(AddImage) {
newImg->cTransparent = (COLORREF)-1;
popstring(szTemp);
- if (!lstrcmpi(szTemp, "/TRANSPARENT")) {
+ if (!lstrcmpi(szTemp, _T("/TRANSPARENT"))) {
newImg->iType = MIL_TRANSPARENT_BITMAP;
newImg->cTransparent = GetColor();
popstring(szTemp);
@@ -265,7 +267,7 @@ NSISFunc(AddImage) {
while (img->next) img = img->next;
img->next = newImg;
- my_pushstring("success");
+ my_pushstring(_T("success"));
LCS();
}
@@ -275,7 +277,7 @@ NSISFunc(AddText) {
myImageList *newImg = (myImageList *)GlobalAlloc(GPTR, sizeof(myImageList));
if (!newImg) {
- my_pushstring("memory allocation error");
+ my_pushstring(_T("memory allocation error"));
LCS();
return;
}
@@ -283,9 +285,9 @@ NSISFunc(AddText) {
newImg->iType = MIL_TEXT;
popstring(szTemp);
- newImg->szText = (char *)GlobalAlloc(GPTR, lstrlen(szTemp)+1);
+ newImg->szText = (TCHAR *)GlobalAlloc(GPTR, (lstrlen(szTemp)+1)*sizeof(TCHAR));
if (!newImg->szText) {
- my_pushstring("memory allocation error");
+ my_pushstring(_T("memory allocation error"));
GlobalFree(newImg);
LCS();
return;
@@ -303,7 +305,7 @@ NSISFunc(AddText) {
while (img->next) img = img->next;
img->next = newImg;
- my_pushstring("success");
+ my_pushstring(_T("success"));
LCS();
}
@@ -351,7 +353,7 @@ NSISFunc(Destroy) {
hWndImage = 0;
oldProc = NULL;
Clear(0, 0, 0, 0, 0);
- UnregisterClass("NSISBGImage", g_hInstance);
+ UnregisterClass(_T("NSISBGImage"), g_hInstance);
}
NSISFunc(Sound) {
@@ -576,7 +578,7 @@ HBITMAP __stdcall LoadBitmapFile(long right, long bottom, BITMAP *bBitmap)
{
HBITMAP hBitmap = (HBITMAP)LoadImage(0, szTemp, IMAGE_BITMAP, right, bottom, LR_LOADFROMFILE);
if (!hBitmap || !GetObject(hBitmap, sizeof(BITMAP), (void *)bBitmap)) {
- my_pushstring("can't load bitmap");
+ my_pushstring(_T("can't load bitmap"));
if (hBitmap)
DeleteObject(hBitmap);
LCS();
diff --git a/Contrib/Dialer/dialer.c b/Contrib/Dialer/dialer.c
index c78ac4b5..ed8414d8 100644
--- a/Contrib/Dialer/dialer.c
+++ b/Contrib/Dialer/dialer.c
@@ -1,10 +1,12 @@
+// Unicode support by Jim Park -- 08/22/2007
+
#define WIN32_LEAN_AND_MEAN
#include
#include
#include // nsis plugin
-#define NSISFunction(funcname) void __declspec(dllexport) funcname(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+#define NSISFunction(funcname) void __declspec(dllexport) funcname(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) {
return TRUE;
@@ -16,8 +18,9 @@ BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) {
HMODULE hWinInet = NULL;
+// GetProcAddress only takes ANSI.
FARPROC GetWinInetFunc(char *func) {
- hWinInet = LoadLibrary("wininet.dll");
+ hWinInet = LoadLibrary(_T("wininet.dll"));
if (hWinInet)
return GetProcAddress(hWinInet, func);
return NULL;
@@ -44,9 +47,9 @@ NSISFunction(AutodialOnline) {
EXDLL_INIT();
if (pInternetAutodial(INTERNET_AUTODIAL_FORCE_ONLINE, 0))
- pushstring("online");
+ pushstring(_T("online"));
else
- pushstring("offline");
+ pushstring(_T("offline"));
FreeWinInet();
}
@@ -62,9 +65,9 @@ NSISFunction(AutodialUnattended) {
EXDLL_INIT();
if (pInternetAutodial(INTERNET_AUTODIAL_FORCE_UNATTENDED , 0))
- pushstring("online");
+ pushstring(_T("online"));
else
- pushstring("offline");
+ pushstring(_T("offline"));
FreeWinInet();
}
@@ -80,9 +83,9 @@ NSISFunction(AttemptConnect) {
EXDLL_INIT();
if (pInternetAttemptConnect(0) == ERROR_SUCCESS)
- pushstring("online");
+ pushstring(_T("online"));
else
- pushstring("offline");
+ pushstring(_T("offline"));
FreeWinInet();
}
@@ -100,9 +103,9 @@ NSISFunction(GetConnectedState) {
EXDLL_INIT();
if (pInternetGetConnectedState(&dwState, 0))
- pushstring("online");
+ pushstring(_T("online"));
else
- pushstring("offline");
+ pushstring(_T("offline"));
FreeWinInet();
}
@@ -118,9 +121,9 @@ NSISFunction(AutodialHangup) {
EXDLL_INIT();
if (pInternetAutodialHangup(0))
- pushstring("success");
+ pushstring(_T("success"));
else
- pushstring("failure");
+ pushstring(_T("failure"));
FreeWinInet();
}
diff --git a/Contrib/ExDLL/SConscript b/Contrib/ExDLL/SConscript
index 3d2beaf4..55380302 100644
--- a/Contrib/ExDLL/SConscript
+++ b/Contrib/ExDLL/SConscript
@@ -8,6 +8,7 @@ lib_files = Split("""
api_files = Split("""
pluginapi.h
+ nsis_tchar.h
#Source/exehead/api.h
""")
@@ -18,7 +19,7 @@ example = Split("""
exdll.dsw
exdll_with_unit.dpr
exdll-vs2008.sln
- exdll-vs2008.vcproj
+ exdll-vs2008.vcproj
nsis.pas
extdll.inc
""")
diff --git a/Contrib/ExDLL/exdll.c b/Contrib/ExDLL/exdll.c
index 6e5c1ac7..8d3a51bc 100644
--- a/Contrib/ExDLL/exdll.c
+++ b/Contrib/ExDLL/exdll.c
@@ -5,8 +5,11 @@ HINSTANCE g_hInstance;
HWND g_hwndParent;
+// To work with Unicode version of NSIS, please use TCHAR-type
+// functions for accessing the variables and the stack.
+
void __declspec(dllexport) myFunction(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop,
+ TCHAR *variables, stack_t **stacktop,
extra_parameters *extra)
{
g_hwndParent=hwndParent;
@@ -23,8 +26,8 @@ void __declspec(dllexport) myFunction(HWND hwndParent, int string_size,
// do your stuff here
{
- char buf[1024];
- wsprintf(buf,"$0=%s\n",getuservariable(INST_0));
+ TCHAR buf[1024];
+ wsprintf(buf,_T("$0=%s\n"),getuservariable(INST_0));
MessageBox(g_hwndParent,buf,0,MB_OK);
}
}
diff --git a/Contrib/ExDLL/nsis_tchar.h b/Contrib/ExDLL/nsis_tchar.h
new file mode 100644
index 00000000..9532d4e4
--- /dev/null
+++ b/Contrib/ExDLL/nsis_tchar.h
@@ -0,0 +1,214 @@
+/*
+ * nsis_tchar.h
+ *
+ * This file is a part of NSIS.
+ *
+ * Copyright (C) 1999-2007 Nullsoft and Contributors
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty.
+ *
+ * For Unicode support by Jim Park -- 08/30/2007
+ */
+
+// Jim Park: Only those we use are listed here.
+
+#pragma once
+
+#ifdef _UNICODE
+
+#ifndef _T
+#define __T(x) L ## x
+#define _T(x) __T(x)
+#define _TEXT(x) __T(x)
+#endif
+typedef wchar_t TCHAR;
+typedef wchar_t _TUCHAR;
+
+// program
+#define _tmain wmain
+#define _tWinMain wWinMain
+#define _tenviron _wenviron
+#define __targv __wargv
+
+// printfs
+#define _ftprintf fwprintf
+#define _sntprintf _snwprintf
+#define _stprintf _swprintf
+#define _tprintf wprintf
+#define _vftprintf vfwprintf
+#define _vsntprintf _vsnwprintf
+#define _vstprintf _vswprintf
+
+// scanfs
+#define _tscanf wscanf
+#define _stscanf swscanf
+
+// string manipulations
+#define _tcscat wcscat
+#define _tcschr wcschr
+#define _tcsclen wcslen
+#define _tcscpy wcscpy
+#define _tcsdup _wcsdup
+#define _tcslen wcslen
+#define _tcsnccpy wcsncpy
+#define _tcsncpy wcsncpy
+#define _tcsrchr wcsrchr
+#define _tcsstr wcsstr
+#define _tcstok wcstok
+
+// string comparisons
+#define _tcscmp wcscmp
+#define _tcsicmp _wcsicmp
+#define _tcsncicmp _wcsnicmp
+#define _tcsncmp wcsncmp
+#define _tcsnicmp _wcsnicmp
+
+// upper / lower
+#define _tcslwr _wcslwr
+#define _tcsupr _wcsupr
+#define _totlower towlower
+#define _totupper towupper
+
+// conversions to numbers
+#define _tcstoi64 _wcstoi64
+#define _tcstol wcstol
+#define _tcstoul wcstoul
+#define _tstof _wtof
+#define _tstoi _wtoi
+#define _tstoi64 _wtoi64
+#define _ttoi _wtoi
+#define _ttoi64 _wtoi64
+#define _ttol _wtol
+
+// conversion from numbers to strings
+#define _itot _itow
+#define _ltot _ltow
+#define _i64tot _i64tow
+#define _ui64tot _ui64tow
+
+// file manipulations
+#define _tfopen _wfopen
+#define _topen _wopen
+#define _tremove _wremove
+#define _tunlink _wunlink
+
+// reading and writing to i/o
+#define _fgettc fgetwc
+#define _fgetts fgetws
+#define _fputts fputws
+#define _gettchar getwchar
+
+// directory
+#define _tchdir _wchdir
+
+// environment
+#define _tgetenv _wgetenv
+#define _tsystem _wsystem
+
+// time
+#define _tcsftime wcsftime
+
+#else // ANSI
+
+#ifndef _T
+#define _T(x) x
+#define _TEXT(x) x
+#endif
+typedef char TCHAR;
+typedef unsigned char _TUCHAR;
+
+// program
+#define _tmain main
+#define _tWinMain WinMain
+#define _tenviron environ
+#define __targv __argv
+
+// printfs
+#define _ftprintf fprintf
+#define _sntprintf _snprintf
+#define _stprintf sprintf
+#define _tprintf printf
+#define _vftprintf vfprintf
+#define _vsntprintf _vsnprintf
+#define _vstprintf vsprintf
+
+// scanfs
+#define _tscanf scanf
+#define _stscanf sscanf
+
+// string manipulations
+#define _tcscat strcat
+#define _tcschr strchr
+#define _tcsclen strlen
+#define _tcscnlen strnlen
+#define _tcscpy strcpy
+#define _tcsdup _strdup
+#define _tcslen strlen
+#define _tcsnccpy strncpy
+#define _tcsrchr strrchr
+#define _tcsstr strstr
+#define _tcstok strtok
+
+// string comparisons
+#define _tcscmp strcmp
+#define _tcsicmp _stricmp
+#define _tcsncmp strncmp
+#define _tcsncicmp _strnicmp
+#define _tcsnicmp _strnicmp
+
+// upper / lower
+#define _tcslwr _strlwr
+#define _tcsupr _strupr
+
+#define _totupper toupper
+#define _totlower tolower
+
+// conversions to numbers
+#define _tcstol strtol
+#define _tcstoul strtoul
+#define _tstof atof
+#define _tstoi atoi
+#define _tstoi64 _atoi64
+#define _tstoi64 _atoi64
+#define _ttoi atoi
+#define _ttoi64 _atoi64
+#define _ttol atol
+
+// conversion from numbers to strings
+#define _i64tot _i64toa
+#define _itot _itoa
+#define _ltot _ltoa
+#define _ui64tot _ui64toa
+
+// file manipulations
+#define _tfopen fopen
+#define _topen _open
+#define _tremove remove
+#define _tunlink _unlink
+
+// reading and writing to i/o
+#define _fgettc fgetc
+#define _fgetts fgets
+#define _fputts fputs
+#define _gettchar getchar
+
+// directory
+#define _tchdir _chdir
+
+// environment
+#define _tgetenv getenv
+#define _tsystem system
+
+// time
+#define _tcsftime strftime
+
+#endif
+
+// is functions (the same in Unicode / ANSI)
+#define _istgraph isgraph
+#define _istascii __isascii
+
+#define __TFILE__ _T(__FILE__)
+#define __TDATE__ _T(__DATE__)
+#define __TTIME__ _T(__TIME__)
diff --git a/Contrib/ExDLL/pluginapi.c b/Contrib/ExDLL/pluginapi.c
index 906f16a0..5aeba504 100644
--- a/Contrib/ExDLL/pluginapi.c
+++ b/Contrib/ExDLL/pluginapi.c
@@ -4,11 +4,11 @@
unsigned int g_stringsize;
stack_t **g_stacktop;
-char *g_variables;
+TCHAR *g_variables;
// utility functions (not required but often useful)
-int NSISCALL popstring(char *str)
+int NSISCALL popstring(TCHAR *str)
{
stack_t *th;
if (!g_stacktop || !*g_stacktop) return 1;
@@ -19,7 +19,7 @@ int NSISCALL popstring(char *str)
return 0;
}
-int NSISCALL popstringn(char *str, int maxlen)
+int NSISCALL popstringn(TCHAR *str, int maxlen)
{
stack_t *th;
if (!g_stacktop || !*g_stacktop) return 1;
@@ -30,7 +30,7 @@ int NSISCALL popstringn(char *str, int maxlen)
return 0;
}
-void NSISCALL pushstring(const char *str)
+void NSISCALL pushstring(const TCHAR *str)
{
stack_t *th;
if (!g_stacktop) return;
@@ -40,13 +40,13 @@ void NSISCALL pushstring(const char *str)
*g_stacktop=th;
}
-char * NSISCALL getuservariable(const int varnum)
+TCHAR * NSISCALL getuservariable(const int varnum)
{
if (varnum < 0 || varnum >= __INST_LAST) return NULL;
return g_variables+varnum*g_stringsize;
}
-void NSISCALL setuservariable(const int varnum, const char *var)
+void NSISCALL setuservariable(const int varnum, const TCHAR *var)
{
if (var != NULL && varnum >= 0 && varnum < __INST_LAST)
lstrcpyA(g_variables + varnum*g_stringsize, var);
@@ -54,29 +54,29 @@ void NSISCALL setuservariable(const int varnum, const char *var)
// playing with integers
-int NSISCALL myatoi(const char *s)
+int NSISCALL myatoi(const TCHAR *s)
{
int v=0;
- if (*s == '0' && (s[1] == 'x' || s[1] == 'X'))
+ if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X')))
{
s++;
for (;;)
{
int c=*(++s);
- if (c >= '0' && c <= '9') c-='0';
- else if (c >= 'a' && c <= 'f') c-='a'-10;
- else if (c >= 'A' && c <= 'F') c-='A'-10;
+ if (c >= _T('0') && c <= _T('9')) c-=_T('0');
+ else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10;
+ else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10;
else break;
v<<=4;
v+=c;
}
}
- else if (*s == '0' && s[1] <= '7' && s[1] >= '0')
+ else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0'))
{
for (;;)
{
int c=*(++s);
- if (c >= '0' && c <= '7') c-='0';
+ if (c >= _T('0') && c <= _T('7')) c-=_T('0');
else break;
v<<=3;
v+=c;
@@ -85,10 +85,10 @@ int NSISCALL myatoi(const char *s)
else
{
int sign=0;
- if (*s == '-') sign++; else s--;
+ if (*s == _T('-')) sign++; else s--;
for (;;)
{
- int c=*(++s) - '0';
+ int c=*(++s) - _T('0');
if (c < 0 || c > 9) break;
v*=10;
v+=c;
@@ -99,14 +99,14 @@ int NSISCALL myatoi(const char *s)
return v;
}
-unsigned NSISCALL myatou(const char *s)
+unsigned NSISCALL myatou(const TCHAR *s)
{
unsigned int v=0;
for (;;)
{
unsigned int c=*s++;
- if (c >= '0' && c <= '9') c-='0';
+ if (c >= _T('0') && c <= _T('9')) c-=_T('0');
else break;
v*=10;
v+=c;
@@ -114,29 +114,29 @@ unsigned NSISCALL myatou(const char *s)
return v;
}
-int NSISCALL myatoi_or(const char *s)
+int NSISCALL myatoi_or(const TCHAR *s)
{
int v=0;
- if (*s == '0' && (s[1] == 'x' || s[1] == 'X'))
+ if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X')))
{
s++;
for (;;)
{
int c=*(++s);
- if (c >= '0' && c <= '9') c-='0';
- else if (c >= 'a' && c <= 'f') c-='a'-10;
- else if (c >= 'A' && c <= 'F') c-='A'-10;
+ if (c >= _T('0') && c <= _T('9')) c-=_T('0');
+ else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10;
+ else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10;
else break;
v<<=4;
v+=c;
}
}
- else if (*s == '0' && s[1] <= '7' && s[1] >= '0')
+ else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0'))
{
for (;;)
{
int c=*(++s);
- if (c >= '0' && c <= '7') c-='0';
+ if (c >= _T('0') && c <= _T('7')) c-=_T('0');
else break;
v<<=3;
v+=c;
@@ -145,10 +145,10 @@ int NSISCALL myatoi_or(const char *s)
else
{
int sign=0;
- if (*s == '-') sign++; else s--;
+ if (*s == _T('-')) sign++; else s--;
for (;;)
{
- int c=*(++s) - '0';
+ int c=*(++s) - _T('0');
if (c < 0 || c > 9) break;
v*=10;
v+=c;
@@ -157,7 +157,7 @@ int NSISCALL myatoi_or(const char *s)
}
// Support for simple ORed expressions
- if (*s == '|')
+ if (*s == _T('|'))
{
v |= myatoi_or(s+1);
}
@@ -167,7 +167,7 @@ int NSISCALL myatoi_or(const char *s)
int NSISCALL popint()
{
- char buf[128];
+ TCHAR buf[128];
if (popstringn(buf,sizeof(buf)))
return 0;
@@ -176,7 +176,7 @@ int NSISCALL popint()
int NSISCALL popint_or()
{
- char buf[128];
+ TCHAR buf[128];
if (popstringn(buf,sizeof(buf)))
return 0;
@@ -185,7 +185,7 @@ int NSISCALL popint_or()
void NSISCALL pushint(int value)
{
- char buffer[1024];
- wsprintf(buffer, "%d", value);
+ TCHAR buffer[1024];
+ wsprintf(buffer, _T("%d"), value);
pushstring(buffer);
}
diff --git a/Contrib/ExDLL/pluginapi.h b/Contrib/ExDLL/pluginapi.h
index 63b8b846..522bcab0 100644
--- a/Contrib/ExDLL/pluginapi.h
+++ b/Contrib/ExDLL/pluginapi.h
@@ -6,6 +6,7 @@ extern "C" {
#endif
#include "api.h"
+#include "nsis_tchar.h"
#ifndef NSISCALL
# define NSISCALL __stdcall
@@ -18,7 +19,7 @@ extern "C" {
typedef struct _stack_t {
struct _stack_t *next;
- char text[1]; // this should be the length of string_size
+ TCHAR text[1]; // this should be the length of string_size
} stack_t;
enum
@@ -53,19 +54,25 @@ __INST_LAST
extern unsigned int g_stringsize;
extern stack_t **g_stacktop;
-extern char *g_variables;
+extern TCHAR *g_variables;
-int NSISCALL popstring(char *str); // 0 on success, 1 on empty stack
-int NSISCALL popstringn(char *str, int maxlen); // with length limit, pass 0 for g_stringsize
+int NSISCALL popstring(TCHAR *str); // 0 on success, 1 on empty stack
+int NSISCALL popstringn(TCHAR *str, int maxlen); // with length limit, pass 0 for g_stringsize
int NSISCALL popint(); // pops an integer
int NSISCALL popint_or(); // with support for or'ing (2|4|8)
-int NSISCALL myatoi(const char *s); // converts a string to an integer
-unsigned NSISCALL myatou(const char *s); // converts a string to an unsigned integer, decimal only
-int NSISCALL myatoi_or(const char *s); // with support for or'ing (2|4|8)
-void NSISCALL pushstring(const char *str);
+int NSISCALL myatoi(const TCHAR *s); // converts a string to an integer
+unsigned NSISCALL myatou(const TCHAR *s); // converts a string to an unsigned integer, decimal only
+int NSISCALL myatoi_or(const TCHAR *s); // with support for or'ing (2|4|8)
+void NSISCALL pushstring(const TCHAR *str);
void NSISCALL pushint(int value);
-char * NSISCALL getuservariable(const int varnum);
-void NSISCALL setuservariable(const int varnum, const char *var);
+TCHAR * NSISCALL getuservariable(const int varnum);
+void NSISCALL setuservariable(const int varnum, const TCHAR *var);
+
+// ANSI defs
+
+#define PopStringA(x) popstring(x)
+#define PushStringA(x) pushstring(x)
+#define SetUserVariableA(x,y) setuservariable(x,y)
#ifdef __cplusplus
}
diff --git a/Contrib/InstallOptions/InstallerOptions.cpp b/Contrib/InstallOptions/InstallerOptions.cpp
index d8303b06..247fe07e 100644
--- a/Contrib/InstallOptions/InstallerOptions.cpp
+++ b/Contrib/InstallOptions/InstallerOptions.cpp
@@ -4,6 +4,8 @@
*
* See Readme.html for documentation and license
*
+ * Unicode support by Jim Park -- 08/01/2007
+ *
*********************************************************/
#include
@@ -34,9 +36,9 @@ void WINAPI FREE(void *d) { if (d) GlobalFree((HGLOBAL)d); }
#define stricmp(x,y) lstrcmpi(x,y)
//#define abs(x) ((x) < 0 ? -(x) : (x))
-char *WINAPI STRDUP(const char *c)
+TCHAR *WINAPI STRDUP(const TCHAR *c)
{
- char *t=(char*)MALLOC(lstrlen(c)+1);
+ TCHAR *t=(TCHAR*)MALLOC((lstrlen(c)+1)*sizeof(TCHAR));
return lstrcpy(t,c);
}
@@ -111,27 +113,27 @@ char *WINAPI STRDUP(const char *c)
#define FLAG_FOCUS 0x10000000 // Controls that can receive focus
struct TableEntry {
- char *pszName;
+ TCHAR *pszName;
int nValue;
};
-int WINAPI LookupToken(TableEntry*, char*);
-int WINAPI LookupTokens(TableEntry*, char*);
+int WINAPI LookupToken(TableEntry*, TCHAR*);
+int WINAPI LookupTokens(TableEntry*, TCHAR*);
-void WINAPI ConvertNewLines(char *str);
+void WINAPI ConvertNewLines(TCHAR *str);
// all allocated buffers must be first in the struct
// when adding more allocated buffers to FieldType, don't forget to change this define
#define FIELD_BUFFERS 6
struct FieldType {
- char *pszText;
- char *pszState;
- char *pszRoot;
+ TCHAR *pszText;
+ TCHAR *pszState;
+ TCHAR *pszRoot;
- char *pszListItems;
- char *pszFilter;
+ TCHAR *pszListItems;
+ TCHAR *pszFilter;
- char *pszValidateText;
+ TCHAR *pszValidateText;
int nMinLength;
int nMaxLength;
@@ -147,7 +149,7 @@ struct FieldType {
HANDLE hImage; // this is used by image/icon field to save the handle to the image
int nField; // field number in INI file
- char *pszHwndEntry; // "HWND" or "HWND2"
+ TCHAR *pszHwndEntry; // "HWND" or "HWND2"
long wndProc;
};
@@ -156,7 +158,7 @@ struct FieldType {
// use a value larger than MAX_PATH to prevent need for excessive growing.
#define BUFFER_SIZE 8192 // 8kb of mem is max char count in multiedit
-char szBrowseButtonCaption[] = "...";
+TCHAR szBrowseButtonCaption[] = _T("...");
HWND hConfigWindow = NULL;
HWND hMainWindow = NULL;
@@ -168,11 +170,11 @@ HINSTANCE m_hInstance = NULL;
struct _stack_t *pFilenameStackEntry = NULL;
-char *pszFilename = NULL;
-char *pszTitle = NULL;
-char *pszCancelButtonText = NULL;
-char *pszNextButtonText = NULL;
-char *pszBackButtonText = NULL;
+TCHAR *pszFilename = NULL;
+TCHAR *pszTitle = NULL;
+TCHAR *pszCancelButtonText = NULL;
+TCHAR *pszNextButtonText = NULL;
+TCHAR *pszBackButtonText = NULL;
int bBackEnabled = FALSE;
int bCancelEnabled = FALSE; // by ORTIM: 13-August-2002
@@ -237,8 +239,8 @@ bool INLINE ValidateFields() {
if (((pField->nMaxLength > 0) && (nLength > pField->nMaxLength)) ||
((pField->nMinLength > 0) && (nLength < pField->nMinLength))) {
if (pField->pszValidateText) {
- char szTitle[1024];
- GetWindowText(hMainWindow, szTitle, sizeof(szTitle));
+ TCHAR szTitle[1024];
+ GetWindowText(hMainWindow, szTitle, _countof(szTitle));
MessageBox(hConfigWindow, pField->pszValidateText, szTitle, MB_OK|MB_ICONWARNING);
}
mySetFocus(pField->hwnd);
@@ -251,9 +253,9 @@ bool INLINE ValidateFields() {
}
bool WINAPI SaveSettings(void) {
- static char szField[25];
+ static TCHAR szField[25];
int nBufLen = BUFFER_SIZE;
- char *pszBuffer = (char*)MALLOC(nBufLen);
+ TCHAR *pszBuffer = (TCHAR*)MALLOC(nBufLen*sizeof(TCHAR));
if (!pszBuffer) return false;
int nIdx;
@@ -271,7 +273,7 @@ bool WINAPI SaveSettings(void) {
case FIELD_CHECKBOX:
case FIELD_RADIOBUTTON:
- wsprintf(pszBuffer, "%d", !!mySendMessage(hwnd, BM_GETCHECK, 0, 0));
+ wsprintf(pszBuffer, _T("%d"), !!mySendMessage(hwnd, BM_GETCHECK, 0, 0));
break;
case FIELD_LISTBOX:
@@ -285,17 +287,17 @@ bool WINAPI SaveSettings(void) {
if (nLength > nBufLen) {
FREE(pszBuffer);
nBufLen = nLength;
- pszBuffer = (char*)MALLOC(nBufLen);
+ pszBuffer = (TCHAR*)MALLOC(nBufLen*sizeof(TCHAR));
if (!pszBuffer) return false;
}
- char *pszItem = (char*)MALLOC(nBufLen);
+ TCHAR *pszItem = (TCHAR*)MALLOC(nBufLen*sizeof(TCHAR));
if (!pszItem) return false;
- *pszBuffer = '\0';
+ *pszBuffer = _T('\0');
int nNumItems = mySendMessage(hwnd, LB_GETCOUNT, 0, 0);
for (int nIdx2 = 0; nIdx2 < nNumItems; nIdx2++) {
if (mySendMessage(hwnd, LB_GETSEL, nIdx2, 0) > 0) {
- if (*pszBuffer) lstrcat(pszBuffer, "|");
+ if (*pszBuffer) lstrcat(pszBuffer, _T("|"));
mySendMessage(hwnd, LB_GETTEXT, (WPARAM)nIdx2, (LPARAM)pszItem);
lstrcat(pszBuffer, pszItem);
}
@@ -315,35 +317,38 @@ bool WINAPI SaveSettings(void) {
FREE(pszBuffer);
// add a bit extra so we do this less often
nBufLen = nLength + 20;
- pszBuffer = (char*)MALLOC(nBufLen);
+ pszBuffer = (TCHAR*)MALLOC(nBufLen*sizeof(TCHAR));
if (!pszBuffer) return false;
}
- *pszBuffer='"';
+ *pszBuffer=_T('"');
GetWindowText(hwnd, pszBuffer+1, nBufLen-1);
- pszBuffer[nLength+1]='"';
- pszBuffer[nLength+2]='\0';
+ pszBuffer[nLength+1]=_T('"');
+ pszBuffer[nLength+2]=_T('\0');
if (pField->nType == FIELD_TEXT && (pField->nFlags & FLAG_MULTILINE))
{
- char *pszBuf2 = (char*)MALLOC(nBufLen*2); // double the size, consider the worst case, all chars are \r\n
- char *p1, *p2;
+ TCHAR *pszBuf2 = (TCHAR*)MALLOC(nBufLen*2*sizeof(TCHAR)); // double the size, consider the worst case, all chars are \r\n
+ TCHAR *p1, *p2;
for (p1 = pszBuffer, p2 = pszBuf2; *p1; p1 = CharNext(p1), p2 = CharNext(p2))
{
switch (*p1) {
- case '\t':
+ case _T('\t'):
*(LPWORD)p2 = CHAR2_TO_WORD('\\', 't');
p2++;
break;
- case '\n':
+ case _T('\n'):
*(LPWORD)p2 = CHAR2_TO_WORD('\\', 'n');
p2++;
break;
- case '\r':
+ case _T('\r'):
*(LPWORD)p2 = CHAR2_TO_WORD('\\', 'r');
p2++;
break;
- case '\\':
+ case _T('\\'):
*p2++ = '\\';
+ // Jim Park: used to be p2++ but that's a bug that works because
+ // CharNext()'s behavior at terminating null char. But still
+ // definitely, unsafe.
default:
lstrcpyn(p2, p1, CharNext(p1) - p1 + 1);
break;
@@ -357,13 +362,13 @@ bool WINAPI SaveSettings(void) {
break;
}
}
- wsprintf(szField, "Field %d", CurrField);
- WritePrivateProfileString(szField, "State", pszBuffer, pszFilename);
+ wsprintf(szField, _T("Field %d"), CurrField);
+ WritePrivateProfileString(szField, _T("State"), pszBuffer, pszFilename);
}
// Tell NSIS which control was activated, if any
- wsprintf(pszBuffer, "%d", g_NotifyField);
- WritePrivateProfileString("Settings", "State", pszBuffer, pszFilename);
+ wsprintf(pszBuffer, _T("%d"), g_NotifyField);
+ WritePrivateProfileString(_T("Settings"), _T("State"), pszBuffer, pszFilename);
FREE(pszBuffer);
@@ -372,20 +377,20 @@ bool WINAPI SaveSettings(void) {
#define BROWSE_WIDTH 15
-static char szResult[BUFFER_SIZE];
-char *pszAppName;
+static TCHAR szResult[BUFFER_SIZE];
+TCHAR *pszAppName;
DWORD WINAPI myGetProfileString(LPCTSTR lpKeyName)
{
- *szResult = '\0';
- return GetPrivateProfileString(pszAppName, lpKeyName, "", szResult, BUFFER_SIZE, pszFilename);
+ *szResult = _T('\0');
+ return GetPrivateProfileString(pszAppName, lpKeyName, _T(""), szResult, BUFFER_SIZE, pszFilename);
}
-char * WINAPI myGetProfileStringDup(LPCTSTR lpKeyName)
+TCHAR * WINAPI myGetProfileStringDup(LPCTSTR lpKeyName)
{
int nSize = myGetProfileString(lpKeyName);
if (nSize)
- return strdup(szResult);
+ return strdup(szResult); // uses STRDUP
else
return NULL;
}
@@ -396,25 +401,25 @@ UINT WINAPI myGetProfileInt(LPCTSTR lpKeyName, INT nDefault)
}
int WINAPI ReadSettings(void) {
- static char szField[25];
+ static TCHAR szField[25];
int nIdx, nCtrlIdx;
- pszAppName = "Settings";
- pszTitle = myGetProfileStringDup("Title");
- pszCancelButtonText = myGetProfileStringDup("CancelButtonText");
- pszNextButtonText = myGetProfileStringDup("NextButtonText");
- pszBackButtonText = myGetProfileStringDup("BackButtonText");
+ pszAppName = _T("Settings");
+ pszTitle = myGetProfileStringDup(_T("Title"));
+ pszCancelButtonText = myGetProfileStringDup(_T("CancelButtonText"));
+ pszNextButtonText = myGetProfileStringDup(_T("NextButtonText"));
+ pszBackButtonText = myGetProfileStringDup(_T("BackButtonText"));
- nNumFields = myGetProfileInt("NumFields", 0);
+ nNumFields = myGetProfileInt(_T("NumFields"), 0);
- nRectId = myGetProfileInt("Rect", DEFAULT_RECT);
+ nRectId = myGetProfileInt(_T("Rect"), DEFAULT_RECT);
- bBackEnabled = myGetProfileInt("BackEnabled", -1);
+ bBackEnabled = myGetProfileInt(_T("BackEnabled"), -1);
// by ORTIM: 13-August-2002
- bCancelEnabled = myGetProfileInt("CancelEnabled", -1);
- bCancelShow = myGetProfileInt("CancelShow", -1);
+ bCancelEnabled = myGetProfileInt(_T("CancelEnabled"), -1);
+ bCancelShow = myGetProfileInt(_T("CancelShow"), -1);
- bRTL = myGetProfileInt("RTL", 0);
+ bRTL = myGetProfileInt(_T("RTL"), 0);
if (nNumFields > 0) {
// make this twice as large for the worst case that every control is a browse button.
@@ -426,117 +431,117 @@ int WINAPI ReadSettings(void) {
for (nIdx = 0, nCtrlIdx = 0; nCtrlIdx < nNumFields; nCtrlIdx++, nIdx++) {
// Control types
static TableEntry TypeTable[] = {
- { "LABEL", FIELD_LABEL },
- { "TEXT", FIELD_TEXT },
- { "PASSWORD", FIELD_TEXT },
- { "LISTBOX", FIELD_LISTBOX },
- { "COMBOBOX", FIELD_COMBOBOX },
- { "DROPLIST", FIELD_COMBOBOX },
- { "FILEREQUEST", FIELD_FILEREQUEST },
- { "DIRREQUEST", FIELD_DIRREQUEST },
- { "CHECKBOX", FIELD_CHECKBOX },
- { "RADIOBUTTON", FIELD_RADIOBUTTON },
- { "ICON", FIELD_ICON },
- { "BITMAP", FIELD_BITMAP },
- { "GROUPBOX", FIELD_GROUPBOX },
+ { _T("LABEL"), FIELD_LABEL },
+ { _T("TEXT"), FIELD_TEXT },
+ { _T("PASSWORD"), FIELD_TEXT },
+ { _T("LISTBOX"), FIELD_LISTBOX },
+ { _T("COMBOBOX"), FIELD_COMBOBOX },
+ { _T("DROPLIST"), FIELD_COMBOBOX },
+ { _T("FILEREQUEST"), FIELD_FILEREQUEST },
+ { _T("DIRREQUEST"), FIELD_DIRREQUEST },
+ { _T("CHECKBOX"), FIELD_CHECKBOX },
+ { _T("RADIOBUTTON"), FIELD_RADIOBUTTON },
+ { _T("ICON"), FIELD_ICON },
+ { _T("BITMAP"), FIELD_BITMAP },
+ { _T("GROUPBOX"), FIELD_GROUPBOX },
#ifdef IO_ENABLE_LINK
- { "LINK", FIELD_LINK },
+ { _T("LINK"), FIELD_LINK },
#else
- { "LINK", FIELD_LABEL },
+ { _T("LINK"), FIELD_LABEL },
#endif
- { "BUTTON", FIELD_BUTTON },
- { "HLINE", FIELD_HLINE },
- { "VLINE", FIELD_VLINE },
- { NULL, 0 }
+ { _T("BUTTON"), FIELD_BUTTON },
+ { _T("HLINE"), FIELD_HLINE },
+ { _T("VLINE"), FIELD_VLINE },
+ { NULL, 0 }
};
// Control flags
static TableEntry FlagTable[] = {
- { "NOTIFY", LBS_NOTIFY },
- { "WARN_IF_EXIST", OFN_OVERWRITEPROMPT },
- { "FILE_HIDEREADONLY", OFN_HIDEREADONLY },
- { "MULTISELECT", LBS_MULTIPLESEL },
- { "READONLY", FLAG_READONLY },
- { "RIGHT", BS_LEFTTEXT },
- { "PASSWORD", FLAG_PASSWORD },
- { "ONLY_NUMBERS", FLAG_ONLYNUMBERS },
- { "MULTILINE", FLAG_MULTILINE },
- { "NOWORDWRAP", FLAG_NOWORDWRAP },
- { "WANTRETURN", FLAG_WANTRETURN },
- { "EXTENDEDSELCT", LBS_EXTENDEDSEL },
- { "PATH_MUST_EXIST", OFN_PATHMUSTEXIST },
- { "FILE_MUST_EXIST", OFN_FILEMUSTEXIST },
- { "PROMPT_CREATE", OFN_CREATEPROMPT },
- { "DROPLIST", FLAG_DROPLIST },
- { "RESIZETOFIT", FLAG_RESIZETOFIT },
- { "NOTABSTOP", WS_TABSTOP },
- { "GROUP", WS_GROUP },
- { "REQ_SAVE", FLAG_SAVEAS },
- { "FILE_EXPLORER", OFN_EXPLORER },
- { "HSCROLL", WS_HSCROLL },
- { "VSCROLL", WS_VSCROLL },
- { "DISABLED", WS_DISABLED },
- { "TRANSPARENT", TRANSPARENT_BMP },
- { "FOCUS", FLAG_FOCUS },
- { NULL, 0 }
+ { _T("NOTIFY"), LBS_NOTIFY },
+ { _T("WARN_IF_EXIST"), OFN_OVERWRITEPROMPT },
+ { _T("FILE_HIDEREADONLY"), OFN_HIDEREADONLY },
+ { _T("MULTISELECT"), LBS_MULTIPLESEL },
+ { _T("READONLY"), FLAG_READONLY },
+ { _T("RIGHT"), BS_LEFTTEXT },
+ { _T("PASSWORD"), FLAG_PASSWORD },
+ { _T("ONLY_NUMBERS"), FLAG_ONLYNUMBERS },
+ { _T("MULTILINE"), FLAG_MULTILINE },
+ { _T("NOWORDWRAP"), FLAG_NOWORDWRAP },
+ { _T("WANTRETURN"), FLAG_WANTRETURN },
+ { _T("EXTENDEDSELCT"), LBS_EXTENDEDSEL },
+ { _T("PATH_MUST_EXIST"), OFN_PATHMUSTEXIST },
+ { _T("FILE_MUST_EXIST"), OFN_FILEMUSTEXIST },
+ { _T("PROMPT_CREATE"), OFN_CREATEPROMPT },
+ { _T("DROPLIST"), FLAG_DROPLIST },
+ { _T("RESIZETOFIT"), FLAG_RESIZETOFIT },
+ { _T("NOTABSTOP"), WS_TABSTOP },
+ { _T("GROUP"), WS_GROUP },
+ { _T("REQ_SAVE"), FLAG_SAVEAS },
+ { _T("FILE_EXPLORER"), OFN_EXPLORER },
+ { _T("HSCROLL"), WS_HSCROLL },
+ { _T("VSCROLL"), WS_VSCROLL },
+ { _T("DISABLED"), WS_DISABLED },
+ { _T("TRANSPARENT"), TRANSPARENT_BMP },
+ { _T("FOCUS"), FLAG_FOCUS },
+ { NULL, 0 }
};
FieldType *pField = pFields + nIdx;
pField->nField = nCtrlIdx + 1;
- pField->pszHwndEntry = "HWND";
+ pField->pszHwndEntry = _T("HWND");
- wsprintf(szField, "Field %d", nCtrlIdx + 1);
+ wsprintf(szField, _T("Field %d"), nCtrlIdx + 1);
pszAppName = szField;
// Get the control type
- myGetProfileString("TYPE");
+ myGetProfileString(_T("TYPE"));
pField->nType = LookupToken(TypeTable, szResult);
if (pField->nType == FIELD_INVALID)
continue;
// Lookup flags associated with the control type
pField->nFlags = LookupToken(FlagTable, szResult);
- myGetProfileString("Flags");
+ myGetProfileString(_T("Flags"));
pField->nFlags |= LookupTokens(FlagTable, szResult);
// pszState must not be NULL!
- myGetProfileString("State");
- pField->pszState = strdup(szResult);
+ myGetProfileString(_T("State"));
+ pField->pszState = strdup(szResult); // uses STRDUP
// ListBox items list
{
- int nResult = myGetProfileString("ListItems");
+ int nResult = myGetProfileString(_T("ListItems"));
if (nResult) {
// add an extra | character to the end to simplify the loop where we add the items.
- pField->pszListItems = (char*)MALLOC(nResult + 2);
- strcpy(pField->pszListItems, szResult);
- pField->pszListItems[nResult] = '|';
- pField->pszListItems[nResult + 1] = '\0';
+ pField->pszListItems = (TCHAR*)MALLOC((nResult + 2)*sizeof(TCHAR));
+ lstrcpy(pField->pszListItems, szResult);
+ pField->pszListItems[nResult] = _T('|');
+ pField->pszListItems[nResult + 1] = _T('\0');
}
}
// Label Text - convert newline
- pField->pszText = myGetProfileStringDup("TEXT");
+ pField->pszText = myGetProfileStringDup(_T("TEXT"));
if (pField->nType == FIELD_LABEL || pField->nType == FIELD_LINK)
ConvertNewLines(pField->pszText);
// Dir request - root folder
- pField->pszRoot = myGetProfileStringDup("ROOT");
+ pField->pszRoot = myGetProfileStringDup(_T("ROOT"));
// ValidateText - convert newline
- pField->pszValidateText = myGetProfileStringDup("ValidateText");
+ pField->pszValidateText = myGetProfileStringDup(_T("ValidateText"));
ConvertNewLines(pField->pszValidateText);
{
- int nResult = GetPrivateProfileString(szField, "Filter", "All Files|*.*", szResult, sizeof(szResult), pszFilename);
+ int nResult = GetPrivateProfileString(szField, _T("Filter"), _T("All Files|*.*"), szResult, _countof(szResult), pszFilename);
if (nResult) {
// Convert the filter to the format required by Windows: NULL after each
// item followed by a terminating NULL
- pField->pszFilter = (char*)MALLOC(nResult + 2);
- strcpy(pField->pszFilter, szResult);
- char *pszPos = pField->pszFilter;
+ pField->pszFilter = (TCHAR*)MALLOC((nResult + 2)*sizeof(TCHAR));
+ lstrcpy(pField->pszFilter, szResult);
+ TCHAR *pszPos = pField->pszFilter;
while (*pszPos)
{
- if (*pszPos == '|')
+ if (*pszPos == _T('|'))
*pszPos++ = 0;
else
pszPos = CharNext(pszPos);
@@ -544,15 +549,15 @@ int WINAPI ReadSettings(void) {
}
}
- pField->rect.left = myGetProfileInt("LEFT", 0);
- pField->rect.top = myGetProfileInt("TOP", 0);
- pField->rect.right = myGetProfileInt("RIGHT", 0);
- pField->rect.bottom = myGetProfileInt("BOTTOM", 0);
- pField->nMinLength = myGetProfileInt("MinLen", 0);
- pField->nMaxLength = myGetProfileInt("MaxLen", 0);
+ pField->rect.left = myGetProfileInt(_T("LEFT"), 0);
+ pField->rect.top = myGetProfileInt(_T("TOP"), 0);
+ pField->rect.right = myGetProfileInt(_T("RIGHT"), 0);
+ pField->rect.bottom = myGetProfileInt(_T("BOTTOM"), 0);
+ pField->nMinLength = myGetProfileInt(_T("MinLen"), 0);
+ pField->nMaxLength = myGetProfileInt(_T("MaxLen"), 0);
// Text color for LINK control, default is pure blue
- pField->hImage = (HANDLE)myGetProfileInt("TxtColor", RGB(0,0,255));
+ pField->hImage = (HANDLE)myGetProfileInt(_T("TxtColor"), RGB(0,0,255));
pField->nControlID = 1200 + nIdx;
if (pField->nType == FIELD_FILEREQUEST || pField->nType == FIELD_DIRREQUEST)
@@ -568,7 +573,7 @@ int WINAPI ReadSettings(void) {
pNewField->rect.top = pField->rect.top;
pField->rect.right = pNewField->rect.left - 3;
pNewField->nField = nCtrlIdx + 1;
- pNewField->pszHwndEntry = "HWND2";
+ pNewField->pszHwndEntry = _T("HWND2");
nNumFields++;
nIdx++;
}
@@ -605,7 +610,7 @@ LRESULT WINAPI WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify)
FieldType *pField = pFields + nIdx;
- char szBrowsePath[MAX_PATH];
+ TCHAR szBrowsePath[MAX_PATH];
switch (pField->nType) {
case FIELD_FILEREQUEST: {
@@ -615,10 +620,10 @@ LRESULT WINAPI WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify)
ofn.hwndOwner = hConfigWindow;
ofn.lpstrFilter = pField->pszFilter;
ofn.lpstrFile = szBrowsePath;
- ofn.nMaxFile = sizeof(szBrowsePath);
+ ofn.nMaxFile = _countof(szBrowsePath);
ofn.Flags = pField->nFlags & (OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_CREATEPROMPT | OFN_EXPLORER);
- GetWindowText(pField->hwnd, szBrowsePath, sizeof(szBrowsePath));
+ GetWindowText(pField->hwnd, szBrowsePath, _countof(szBrowsePath));
tryagain:
GetCurrentDirectory(BUFFER_SIZE, szResult); // save working dir
@@ -629,7 +634,7 @@ LRESULT WINAPI WMCommandProc(HWND hWnd, UINT id, HWND hwndCtl, UINT codeNotify)
break;
}
else if (szBrowsePath[0] && CommDlgExtendedError() == FNERR_INVALIDFILENAME) {
- szBrowsePath[0] = '\0';
+ szBrowsePath[0] = _T('\0');
goto tryagain;
}
@@ -880,17 +885,17 @@ int WINAPI NumbersOnlyPasteWndProc(HWND hWin, UINT uMsg, WPARAM wParam, LPARAM l
if (hData)
{
- char *lpData = (char *) GlobalLock(hData);
+ TCHAR *lpData = (TCHAR *) GlobalLock(hData);
if (lpData)
{
int iLen = lstrlen(lpData);
- char *lpFilteredData = (char *) MALLOC(iLen + 1);
+ TCHAR *lpFilteredData = (TCHAR *) MALLOC((iLen + 1)*sizeof(TCHAR));
if (lpFilteredData)
{
for (int i = 0, j = 0; i < iLen; i++)
{
- if (lpData[i] >= '0' && lpData[i] <= '9')
+ if (lpData[i] >= _T('0') && lpData[i] <= _T('9'))
{
lpFilteredData[j] = lpData[i];
j++;
@@ -926,14 +931,14 @@ int WINAPI createCfgDlg()
if (!mainwnd)
{
popstring(NULL);
- pushstring("error finding mainwnd");
+ pushstring(_T("error finding mainwnd"));
return 1; // cannot be used in silent mode unfortunately.
}
if (!g_stacktop || !*g_stacktop || !(pszFilename = (*g_stacktop)->text) || !pszFilename[0] || !ReadSettings())
{
popstring(NULL);
- pushstring("error finding config");
+ pushstring(_T("error finding config"));
return 1;
}
@@ -941,7 +946,7 @@ int WINAPI createCfgDlg()
if (!childwnd)
{
popstring(NULL);
- pushstring("error finding childwnd");
+ pushstring(_T("error finding childwnd"));
return 1;
}
@@ -993,7 +998,7 @@ int WINAPI createCfgDlg()
else
{
popstring(NULL);
- pushstring("error creating dialog");
+ pushstring(_T("error creating dialog"));
return 1;
}
@@ -1005,88 +1010,88 @@ int WINAPI createCfgDlg()
for (int nIdx = 0; nIdx < nNumFields; nIdx++) {
static struct {
- char* pszClass;
+ TCHAR* pszClass;
DWORD dwStyle;
DWORD dwRTLStyle;
DWORD dwExStyle;
DWORD dwRTLExStyle;
} ClassTable[] = {
- { "STATIC", // FIELD_HLINE
+ { _T("STATIC"), // FIELD_HLINE
DEFAULT_STYLES | SS_ETCHEDHORZ | SS_SUNKEN,
DEFAULT_STYLES | SS_ETCHEDHORZ | SS_SUNKEN,
WS_EX_TRANSPARENT,
WS_EX_TRANSPARENT | RTL_EX_STYLES },
- { "STATIC", // FIELD_VLINE
+ { _T("STATIC"), // FIELD_VLINE
DEFAULT_STYLES | SS_ETCHEDVERT | SS_SUNKEN,
DEFAULT_STYLES | SS_ETCHEDVERT | SS_SUNKEN,
WS_EX_TRANSPARENT,
WS_EX_TRANSPARENT | RTL_EX_STYLES },
- { "STATIC", // FIELD_LABEL
+ { _T("STATIC"), // FIELD_LABEL
DEFAULT_STYLES,
DEFAULT_STYLES | SS_RIGHT,
WS_EX_TRANSPARENT,
WS_EX_TRANSPARENT | RTL_EX_STYLES },
- { "STATIC", // FIELD_ICON
+ { _T("STATIC"), // FIELD_ICON
DEFAULT_STYLES | SS_ICON,
DEFAULT_STYLES | SS_ICON,
0,
RTL_EX_STYLES },
- { "STATIC", // FIELD_BITMAP
+ { _T("STATIC"), // FIELD_BITMAP
DEFAULT_STYLES | SS_BITMAP,
DEFAULT_STYLES | SS_BITMAP,
0,
RTL_EX_STYLES },
- { "BUTTON", // FIELD_BROWSEBUTTON
+ { _T("BUTTON"), // FIELD_BROWSEBUTTON
DEFAULT_STYLES | WS_TABSTOP,
DEFAULT_STYLES | WS_TABSTOP,
0,
RTL_EX_STYLES },
- { "BUTTON", // FIELD_LINK
+ { _T("BUTTON"), // FIELD_LINK
DEFAULT_STYLES | WS_TABSTOP | BS_OWNERDRAW,
DEFAULT_STYLES | WS_TABSTOP | BS_OWNERDRAW | BS_RIGHT,
0,
RTL_EX_STYLES },
- { "BUTTON", // FIELD_BUTTON
+ { _T("BUTTON"), // FIELD_BUTTON
DEFAULT_STYLES | WS_TABSTOP,
DEFAULT_STYLES | WS_TABSTOP,
0,
RTL_EX_STYLES },
- { "BUTTON", // FIELD_GROUPBOX
+ { _T("BUTTON"), // FIELD_GROUPBOX
DEFAULT_STYLES | BS_GROUPBOX,
DEFAULT_STYLES | BS_GROUPBOX | BS_RIGHT,
WS_EX_TRANSPARENT,
WS_EX_TRANSPARENT | RTL_EX_STYLES },
- { "BUTTON", // FIELD_CHECKBOX
+ { _T("BUTTON"), // FIELD_CHECKBOX
DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTOCHECKBOX | BS_MULTILINE,
DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTOCHECKBOX | BS_MULTILINE | BS_RIGHT | BS_LEFTTEXT,
0,
RTL_EX_STYLES },
- { "BUTTON", // FIELD_RADIOBUTTON
+ { _T("BUTTON"), // FIELD_RADIOBUTTON
DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTORADIOBUTTON | BS_MULTILINE,
DEFAULT_STYLES | WS_TABSTOP | BS_TEXT | BS_VCENTER | BS_AUTORADIOBUTTON | BS_MULTILINE | BS_RIGHT | BS_LEFTTEXT,
0,
RTL_EX_STYLES },
- { "EDIT", // FIELD_TEXT
+ { _T("EDIT"), // FIELD_TEXT
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL,
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | RTL_EX_STYLES },
- { "EDIT", // FIELD_FILEREQUEST
+ { _T("EDIT"), // FIELD_FILEREQUEST
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL,
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | RTL_EX_STYLES },
- { "EDIT", // FIELD_DIRREQUEST
+ { _T("EDIT"), // FIELD_DIRREQUEST
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL,
DEFAULT_STYLES | WS_TABSTOP | ES_AUTOHSCROLL | ES_RIGHT,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | RTL_EX_STYLES },
- { "COMBOBOX", // FIELD_COMBOBOX
+ { _T("COMBOBOX"), // FIELD_COMBOBOX
DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | WS_CLIPCHILDREN | CBS_AUTOHSCROLL | CBS_HASSTRINGS,
DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | WS_CLIPCHILDREN | CBS_AUTOHSCROLL | CBS_HASSTRINGS,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE | WS_EX_RIGHT | RTL_EX_STYLES },
- { "LISTBOX", // FIELD_LISTBOX
+ { _T("LISTBOX"), // FIELD_LISTBOX
DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | LBS_DISABLENOSCROLL | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT,
DEFAULT_STYLES | WS_TABSTOP | WS_VSCROLL | LBS_DISABLENOSCROLL | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT,
WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE,
@@ -1133,7 +1138,7 @@ int WINAPI createCfgDlg()
rect.left = mainWndWidth - right;
}
- char *title = pField->pszText;
+ TCHAR *title = pField->pszText;
switch (pField->nType) {
case FIELD_ICON:
case FIELD_BITMAP:
@@ -1198,10 +1203,10 @@ int WINAPI createCfgDlg()
);
{
- char szField[64];
- char szHwnd[64];
- wsprintf(szField, "Field %d", pField->nField);
- wsprintf(szHwnd, "%d", hwCtrl);
+ TCHAR szField[64];
+ TCHAR szHwnd[64];
+ wsprintf(szField, _T("Field %d"), pField->nField);
+ wsprintf(szHwnd, _T("%d"), hwCtrl);
WritePrivateProfileString(szField, pField->pszHwndEntry, szHwnd, pszFilename);
}
@@ -1223,7 +1228,7 @@ int WINAPI createCfgDlg()
case FIELD_CHECKBOX:
case FIELD_RADIOBUTTON:
- if (pField->pszState[0] == '1')
+ if (pField->pszState[0] == _T('1'))
mySendMessage(hwCtrl, BM_SETCHECK, (WPARAM)BST_CHECKED, 0);
break;
@@ -1242,12 +1247,12 @@ int WINAPI createCfgDlg()
nFindMsg = LB_FINDSTRINGEXACT;
nSetSelMsg = LB_SETCURSEL;
}
- char *pszStart, *pszEnd, *pszList;
+ TCHAR *pszStart, *pszEnd, *pszList;
pszStart = pszEnd = pszList = STRDUP(pField->pszListItems);
// pszListItems has a trailing pipe
while (*pszEnd) {
- if (*pszEnd == '|') {
- *pszEnd = '\0';
+ if (*pszEnd == _T('|')) {
+ *pszEnd = _T('\0');
if (*pszStart)
mySendMessage(hwCtrl, nAddMsg, 0, (LPARAM) pszStart);
pszStart = ++pszEnd;
@@ -1261,9 +1266,9 @@ int WINAPI createCfgDlg()
mySendMessage(hwCtrl, LB_SETSEL, FALSE, (LPARAM)-1);
pszStart = pszEnd = pField->pszState;
for (;;) {
- char c = *pszEnd;
- if (c == '|' || c == '\0') {
- *pszEnd = '\0';
+ TCHAR c = *pszEnd;
+ if (c == _T('|') || c == _T('\0')) {
+ *pszEnd = _T('\0');
if (*pszStart)
{
int nItem = mySendMessage(hwCtrl, LB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)pszStart);
@@ -1429,8 +1434,8 @@ int WINAPI createCfgDlg()
mySetWindowText(mainwnd,pszTitle);
pFilenameStackEntry = *g_stacktop;
*g_stacktop = (*g_stacktop)->next;
- static char tmp[32];
- wsprintf(tmp,"%d",hConfigWindow);
+ static TCHAR tmp[32];
+ wsprintf(tmp,_T("%d"),hConfigWindow);
pushstring(tmp);
return 0;
}
@@ -1477,7 +1482,7 @@ void WINAPI showCfgDlg()
int j = FIELD_BUFFERS;
while (j--)
- FREE(((char **) pField)[j]);
+ FREE(((TCHAR **) pField)[j]);
if (pField->nType == FIELD_BITMAP) {
DeleteObject(pField->hImage);
@@ -1488,18 +1493,18 @@ void WINAPI showCfgDlg()
}
FREE(pFields);
- pushstring(g_is_cancel?"cancel":g_is_back?"back":"success");
+ pushstring(g_is_cancel?_T("cancel"):g_is_back?_T("back"):_T("success"));
}
int initCalled;
extern "C" void __declspec(dllexport) dialog(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop)
+ TCHAR *variables, stack_t **stacktop)
{
hMainWindow=hwndParent;
EXDLL_INIT();
if (initCalled) {
- pushstring("error");
+ pushstring(_T("error"));
return;
}
if (createCfgDlg())
@@ -1514,14 +1519,16 @@ static UINT_PTR PluginCallback(enum NSPIM msg)
}
extern "C" void __declspec(dllexport) initDialog(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop,
+ TCHAR *variables, stack_t **stacktop,
extra_parameters *extra)
{
hMainWindow=hwndParent;
EXDLL_INIT();
+
extra->RegisterPluginCallback(m_hInstance, PluginCallback);
+
if (initCalled) {
- pushstring("error");
+ pushstring(_T("error"));
return;
}
if (createCfgDlg())
@@ -1530,11 +1537,11 @@ extern "C" void __declspec(dllexport) initDialog(HWND hwndParent, int string_siz
}
extern "C" void __declspec(dllexport) show(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop)
+ TCHAR *variables, stack_t **stacktop)
{
EXDLL_INIT();
if (!initCalled) {
- pushstring("error");
+ pushstring(_T("error"));
return;
}
initCalled--;
@@ -1548,23 +1555,41 @@ extern "C" BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lp
}
-int WINAPI LookupToken(TableEntry* psTable_, char* pszToken_)
+/**
+ * Looks up a single token in the psTable_ and returns its mapped numerical value.
+ *
+ * @param psTable_ The lookup table.
+ * @param pszToken_ The token to lookup.
+ * @return The integer value related to the token, otherwise 0.
+ */
+int WINAPI LookupToken(TableEntry* psTable_, TCHAR* pszToken_)
{
for (int i = 0; psTable_[i].pszName; i++)
- if (!stricmp(pszToken_, psTable_[i].pszName))
+ if (!lstrcmpi(pszToken_, psTable_[i].pszName))
return psTable_[i].nValue;
return 0;
}
-int WINAPI LookupTokens(TableEntry* psTable_, char* pszTokens_)
+/**
+ * In a string of tokens separated by vertical bars '|', look them up in the
+ * Lookup Table psTable and return their logical OR of their subsequent
+ * integer values.
+ *
+ * @param psTable_ The lookup table to search in.
+ * @param pszToken String of tokens separated by '|' whose values are to be
+ * ORed together.
+ * @return The ORed value of the token values. If no tokens were found, it
+ * will return 0.
+ */
+int WINAPI LookupTokens(TableEntry* psTable_, TCHAR* pszTokens_)
{
int n = 0;
- char *pszStart = pszTokens_;
- char *pszEnd = pszTokens_;
+ TCHAR *pszStart = pszTokens_;
+ TCHAR *pszEnd = pszTokens_;
for (;;) {
- char c = *pszEnd;
- if (c == '|' || c == '\0') {
- *pszEnd = '\0';
+ TCHAR c = *pszEnd;
+ if (c == _T('|') || c == _T('\0')) {
+ *pszEnd = _T('\0');
n |= LookupToken(psTable_, pszStart);
*pszEnd = c;
if (!c)
@@ -1577,8 +1602,15 @@ int WINAPI LookupTokens(TableEntry* psTable_, char* pszTokens_)
return n;
}
-void WINAPI ConvertNewLines(char *str) {
- char *p1, *p2, *p3;
+/**
+ * ConvertNewLines takes a string and turns escape sequences written
+ * as separate chars e.g. "\\t" into the special char they represent
+ * '\t'. The transformation is done in place.
+ *
+ * @param str [in/out] The string to convert.
+ */
+void WINAPI ConvertNewLines(TCHAR *str) {
+ TCHAR *p1, *p2, *p3;
if (!str)
return;
@@ -1589,23 +1621,23 @@ void WINAPI ConvertNewLines(char *str) {
{
switch (*(LPWORD)p1)
{
- case CHAR2_TO_WORD('\\', 't'):
- *p2 = '\t';
+ case CHAR2_TO_WORD(_T('\\'), _T('t')):
+ *p2 = _T('\t');
p1 += 2;
p2++;
break;
- case CHAR2_TO_WORD('\\', 'n'):
- *p2 = '\n';
+ case CHAR2_TO_WORD(_T('\\'), _T('n')):
+ *p2 = _T('\n');
p1 += 2;
p2++;
break;
- case CHAR2_TO_WORD('\\', 'r'):
- *p2 = '\r';
+ case CHAR2_TO_WORD(_T('\\'), _T('r')):
+ *p2 = _T('\r');
p1 += 2;
p2++;
break;
- case CHAR2_TO_WORD('\\', '\\'):
- *p2 = '\\';
+ case CHAR2_TO_WORD(_T('\\'), _T('\\')):
+ *p2 = _T('\\');
p1 += 2;
p2++;
break;
diff --git a/Contrib/LangDLL/LangDLL.c b/Contrib/LangDLL/LangDLL.c
index 537e3ad2..99f0db7d 100644
--- a/Contrib/LangDLL/LangDLL.c
+++ b/Contrib/LangDLL/LangDLL.c
@@ -1,5 +1,6 @@
#include
#include "resource.h"
+#include
// JF> updated usage
// call like this:
@@ -8,6 +9,8 @@
// LangDLL:LangDialog "Language Selection" "Choose a language" 2 French 1036 English 1033
// or (the F after the 2 means we're supplying font information)
// LangDLL:LangDialog "Language Selection" "Choose a language" 2F French 1036 English 1033 12 Garamond
+//
+// Unicode support added by Jim Park -- 07/27/2007
#include // nsis plugin
@@ -15,8 +18,8 @@
HINSTANCE g_hInstance;
HWND g_hwndParent;
-char temp[1024];
-char g_wndtitle[1024], g_wndtext[1024];
+TCHAR temp[1024];
+TCHAR g_wndtitle[1024], g_wndtext[1024];
int dofont;
int docp;
@@ -24,15 +27,15 @@ int langs_num;
int visible_langs_num;
struct lang {
- char *name;
- char *id;
+ TCHAR *name;
+ TCHAR *id;
UINT cp;
} *langs;
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
int i, size;
- char *selected_language = NULL;
+ TCHAR *selected_language = NULL;
static HFONT font;
switch (uMsg) {
case WM_INITDIALOG:
@@ -62,7 +65,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
size = myatou(temp);
if (!popstring(temp)) {
LOGFONT f = {0,};
- if (lstrcmp(temp, "MS Shell Dlg")) {
+ if (lstrcmp(temp, _T("MS Shell Dlg"))) {
f.lfHeight = -MulDiv(size, GetDeviceCaps(GetDC(hwndDlg), LOGPIXELSY), 72);
lstrcpy(f.lfFaceName, temp);
font = CreateFontIndirect(&f);
@@ -84,17 +87,17 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
i = SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_GETCURSEL, 0, 0);
i = SendDlgItemMessage(hwndDlg, IDC_LANGUAGE, CB_GETITEMDATA, i, 0);
if (i != CB_ERR && i) {
- pushstring((char *) i);
+ pushstring((TCHAR *) i);
} else {
// ?!
- pushstring("cancel");
+ pushstring(_T("cancel"));
}
// end dialog
EndDialog(hwndDlg, 0);
break;
case IDCANCEL:
// push "cancel" on the stack
- pushstring("cancel");
+ pushstring(_T("cancel"));
// end dialog
EndDialog(hwndDlg, 0);
break;
@@ -111,7 +114,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
}
void __declspec(dllexport) LangDialog(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop)
+ TCHAR *variables, stack_t **stacktop)
{
g_hwndParent=hwndParent;
EXDLL_INIT();
@@ -130,12 +133,12 @@ void __declspec(dllexport) LangDialog(HWND hwndParent, int string_size,
// parse flags
{
- char *p=temp;
+ TCHAR *p=temp;
while (*p)
{
- if (*p == 'A') doauto=1; // parse auto count flag
- if (*p == 'F') dofont=1; // parse font flag
- if (*p == 'C') docp=1; // parse codepage flag
+ if (*p == _T('A')) doauto=1; // parse auto count flag
+ if (*p == _T('F')) dofont=1; // parse font flag
+ if (*p == _T('C')) docp=1; // parse codepage flag
p++;
}
}
@@ -173,12 +176,12 @@ void __declspec(dllexport) LangDialog(HWND hwndParent, int string_size,
// fill language struct
for (i = 0; i < langs_num; i++) {
if (popstring(temp)) { visible_langs_num = 0; break; }
- langs[visible_langs_num].name = GlobalAlloc(GPTR, lstrlen(temp)+1);
+ langs[visible_langs_num].name = (TCHAR*) GlobalAlloc(GPTR, (lstrlen(temp)+1)*sizeof(TCHAR));
if (!langs[visible_langs_num].name) { visible_langs_num = 0; break; }
lstrcpy(langs[visible_langs_num].name, temp);
if (popstring(temp)) { visible_langs_num = 0; break; }
- langs[visible_langs_num].id = GlobalAlloc(GPTR, lstrlen(temp)+1);
+ langs[visible_langs_num].id = (TCHAR*) GlobalAlloc(GPTR, (lstrlen(temp)+1)*sizeof(TCHAR));
if (!langs[visible_langs_num].id) { visible_langs_num = 0; break; }
lstrcpy(langs[visible_langs_num].id, temp);
@@ -188,6 +191,10 @@ void __declspec(dllexport) LangDialog(HWND hwndParent, int string_size,
langs[visible_langs_num].cp = myatou(temp);
}
+ // If Unicode, show everything.
+#ifdef _UNICODE
+ visible_langs_num++;
+#else
if (!docp || langs[visible_langs_num].cp == GetACP() || langs[visible_langs_num].cp == 0)
{
visible_langs_num++;
@@ -197,6 +204,7 @@ void __declspec(dllexport) LangDialog(HWND hwndParent, int string_size,
GlobalFree(langs[visible_langs_num].name);
GlobalFree(langs[visible_langs_num].id);
}
+#endif
}
// pop the empty string to keep the stack clean
@@ -213,7 +221,7 @@ void __declspec(dllexport) LangDialog(HWND hwndParent, int string_size,
}
else if (visible_langs_num == 0)
{
- pushstring("");
+ pushstring(_T(""));
}
else
{
diff --git a/Contrib/Library/LibraryLocal/LibraryLocal.cpp b/Contrib/Library/LibraryLocal/LibraryLocal.cpp
index 9ec104c3..67b98466 100644
--- a/Contrib/Library/LibraryLocal/LibraryLocal.cpp
+++ b/Contrib/Library/LibraryLocal/LibraryLocal.cpp
@@ -3,10 +3,12 @@
LibraryLocal - used by the Library.nsh macros
Get the version of local DLL and TLB files
Written by Joost Verburg
+ Unicode support by Jim Park -- 07/27/2007
*/
#include "../../../Source/Platform.h"
+#include "../../../Source/tstring.h"
#include
#include
@@ -21,23 +23,27 @@ int g_noconfig=0;
int g_display_errors=1;
FILE *g_output=stdout;
-int GetTLBVersion(string& filepath, DWORD& high, DWORD & low)
+int GetTLBVersion(tstring& filepath, DWORD& high, DWORD & low)
{
#ifdef _WIN32
int found = 0;
- char fullpath[1024];
- char *p;
- if (!GetFullPathName(filepath.c_str(), sizeof(fullpath), fullpath, &p))
+ TCHAR fullpath[1024];
+ TCHAR *p;
+ if (!GetFullPathName(filepath.c_str(), _countof(fullpath), fullpath, &p))
return 0;
- WCHAR *ole_filename = winchar_fromansi(fullpath);
-
ITypeLib* typeLib;
HRESULT hr;
-
+
+#ifdef _UNICODE
+ hr = LoadTypeLib(fullpath, &typeLib);
+#else
+ // If built without UNICODE, we still need to convert this string to a Unicode string.
+ WCHAR *ole_filename = winchar_fromansi(fullpath);
hr = LoadTypeLib(ole_filename, &typeLib);
+#endif
if (SUCCEEDED(hr)) {
@@ -67,16 +73,16 @@ int GetTLBVersion(string& filepath, DWORD& high, DWORD & low)
#endif
}
-int main(int argc, char* argv[])
+int _tmain(int argc, TCHAR* argv[])
{
// Parse the command line
- string cmdline;
+ tstring cmdline;
- string mode;
- string filename;
- string filepath;
+ tstring mode;
+ tstring filename;
+ tstring filepath;
int filefound = 0;
@@ -90,7 +96,7 @@ int main(int argc, char* argv[])
// Validate filename
- ifstream fs(filename.c_str());
+ tifstream fs(filename.c_str());
if (fs.is_open())
{
@@ -110,7 +116,7 @@ int main(int argc, char* argv[])
// DLL / EXE
- if (mode.compare("D") == 0)
+ if (mode.compare(_T("D")) == 0)
{
versionfound = GetDLLVersion(filename, high, low);
@@ -119,7 +125,7 @@ int main(int argc, char* argv[])
// TLB
- if (mode.compare("T") == 0)
+ if (mode.compare(_T("T")) == 0)
{
versionfound = GetTLBVersion(filename, high, low);
@@ -130,23 +136,23 @@ int main(int argc, char* argv[])
// Write the version to an NSIS header file
- ofstream header(argv[3], ofstream::out);
+ tofstream header(argv[3], tofstream::out);
if (header)
{
if (!filefound)
{
- header << "!define LIBRARY_VERSION_FILENOTFOUND" << endl;
+ header << _T("!define LIBRARY_VERSION_FILENOTFOUND") << endl;
}
else if (!versionfound)
{
- header << "!define LIBRARY_VERSION_NONE" << endl;
+ header << _T("!define LIBRARY_VERSION_NONE") << endl;
}
else
{
- header << "!define LIBRARY_VERSION_HIGH " << high << endl;
- header << "!define LIBRARY_VERSION_LOW " << low << endl;
+ header << _T("!define LIBRARY_VERSION_HIGH ") << high << endl;
+ header << _T("!define LIBRARY_VERSION_LOW ") << low << endl;
}
header.close();
diff --git a/Contrib/Library/RegTool/RegTool.c b/Contrib/Library/RegTool/RegTool.c
index b835d716..72cb983e 100644
--- a/Contrib/Library/RegTool/RegTool.c
+++ b/Contrib/Library/RegTool/RegTool.c
@@ -1,40 +1,41 @@
#include
+#include "../../ExDll/nsis_tchar.h"
#define STR_SIZE 1024
-void RegFile(char cmd, char *file, int x64);
-void RegDll(char *file);
-void RegTypeLib(char *file);
-void DeleteFileOnReboot(char *pszFile);
+void RegFile(TCHAR cmd, TCHAR *file, int x64);
+void RegDll(TCHAR *file);
+void RegTypeLib(TCHAR *file);
+void DeleteFileOnReboot(TCHAR *pszFile);
-int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
+int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
- char *cmdline;
- char seekchar = ' ';
+ TCHAR *cmdline;
+ TCHAR seekchar = _T(' ');
cmdline = GetCommandLine();
- if (*cmdline == '\"')
+ if (*cmdline == _T('\"'))
seekchar = *cmdline++;
while (*cmdline && *cmdline != seekchar)
cmdline = CharNext(cmdline);
cmdline = CharNext(cmdline);
- while (*cmdline == ' ')
+ while (*cmdline == _T(' '))
cmdline++;
- if (*cmdline++ != '/')
+ if (*cmdline++ != _T('/'))
{
ExitProcess(1);
return 0;
}
- if (*cmdline == 'S')
+ if (*cmdline == _T('S'))
{
HKEY rootkey;
- if (SUCCEEDED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\NSIS.Library.RegTool.v3", 0, KEY_READ, &rootkey)))
+ if (SUCCEEDED(RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("Software\\NSIS.Library.RegTool.v3"), 0, KEY_READ, &rootkey)))
{
- char keyname[STR_SIZE];
+ TCHAR keyname[STR_SIZE];
while (RegEnumKey(rootkey, 0, keyname, STR_SIZE) == ERROR_SUCCESS)
{
@@ -44,24 +45,24 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
{
DWORD t, count, l = sizeof(DWORD);
- if (SUCCEEDED(RegQueryValueEx(key, "count", NULL, &t, (LPBYTE) &count, &l)) && t == REG_DWORD)
+ if (SUCCEEDED(RegQueryValueEx(key, _T("count"), NULL, &t, (LPBYTE) &count, &l)) && t == REG_DWORD)
{
DWORD j;
- char valname[128], mode[3], file[STR_SIZE];
+ TCHAR valname[128], mode[3], file[STR_SIZE];
for (j = 1; j <= count; j++)
{
- wsprintf(valname, "%u.mode", j);
+ wsprintf(valname, _T("%u.mode"), j);
l = sizeof(mode);
if (FAILED(RegQueryValueEx(key, valname, NULL, &t, (LPBYTE) mode, &l)) || t != REG_SZ)
continue;
- wsprintf(valname, "%u.file", j);
+ wsprintf(valname, _T("%u.file"), j);
l = STR_SIZE;
if (FAILED(RegQueryValueEx(key, valname, NULL, &t, (LPBYTE) file, &l)) || t != REG_SZ)
continue;
- RegFile(mode[0], file, mode[1] == 'X');
+ RegFile(mode[0], file, mode[1] == _T('X'));
}
}
@@ -71,11 +72,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
}
RegCloseKey(rootkey);
- RegDeleteKey(HKEY_LOCAL_MACHINE, "Software\\NSIS.Library.RegTool.v3");
+ RegDeleteKey(HKEY_LOCAL_MACHINE, _T("Software\\NSIS.Library.RegTool.v3"));
}
{
- char file[STR_SIZE];
+ TCHAR file[STR_SIZE];
if (GetModuleFileName(GetModuleHandle(NULL), file, STR_SIZE))
{
DeleteFileOnReboot(file);
@@ -87,11 +88,11 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
OleInitialize(NULL);
- if (*cmdline == 'D')
+ if (*cmdline == _T('D'))
{
RegDll(cmdline + 1);
}
- else if (*cmdline == 'T')
+ else if (*cmdline == _T('T'))
{
RegTypeLib(cmdline + 1);
}
@@ -106,7 +107,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
void SafeWow64EnableWow64FsRedirection(BOOL Wow64FsEnableRedirection)
{
- HMODULE kernel = GetModuleHandle("kernel32");
+ HMODULE kernel = GetModuleHandle(_T("kernel32"));
if (kernel)
{
FARPROC proc = GetProcAddress(kernel, "Wow64EnableWow64FsRedirection");
@@ -121,26 +122,26 @@ void SafeWow64EnableWow64FsRedirection(BOOL Wow64FsEnableRedirection)
}
}
-void RegFile(char cmd, char *file, int x64)
+void RegFile(TCHAR cmd, TCHAR *file, int x64)
{
- char self[STR_SIZE];
- char cmdline[STR_SIZE];
+ TCHAR self[STR_SIZE];
+ TCHAR cmdline[STR_SIZE];
int ready = 0;
- if (!*file || (cmd != 'D' && cmd != 'T' && cmd != 'E'))
+ if (!*file || (cmd != _T('D') && cmd != _T('T') && cmd != _T('E')))
return;
- if (cmd == 'E')
+ if (cmd == _T('E'))
{
- wsprintf(cmdline, "\"%s\" /regserver", file);
+ wsprintf(cmdline, _T("\"%s\" /regserver"), file);
ready++;
}
else if (!x64)
{
if (GetModuleFileName(GetModuleHandle(NULL), self, STR_SIZE))
{
- wsprintf(cmdline, "\"%s\" /%c%s", self, cmd, file);
+ wsprintf(cmdline, _T("\"%s\" /%c%s"), self, cmd, file);
ready++;
}
}
@@ -148,7 +149,7 @@ void RegFile(char cmd, char *file, int x64)
{
if (GetSystemDirectory(self, STR_SIZE))
{
- wsprintf(cmdline, "\"%s\\regsvr32.exe\" /s \"%s\"", self, file);
+ wsprintf(cmdline, _T("\"%s\\regsvr32.exe\" /s \"%s\""), self, file);
ready++;
SafeWow64EnableWow64FsRedirection(FALSE);
@@ -176,7 +177,7 @@ void RegFile(char cmd, char *file, int x64)
}
}
-void RegDll(char *file)
+void RegDll(TCHAR *file)
{
HMODULE mod = LoadLibraryEx(file, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
if (mod)
@@ -188,7 +189,7 @@ void RegDll(char *file)
}
}
-void RegTypeLib(char *file)
+void RegTypeLib(TCHAR *file)
{
WCHAR wfile[STR_SIZE];
@@ -202,12 +203,12 @@ void RegTypeLib(char *file)
}
}
-char *mystrstri(char *a, char *b)
+TCHAR *mystrstri(TCHAR *a, TCHAR *b)
{
int l = lstrlen(b);
while (lstrlen(a) >= l)
{
- char c = a[l];
+ TCHAR c = a[l];
a[l] = 0;
if (!lstrcmpi(a, b))
{
@@ -222,23 +223,23 @@ char *mystrstri(char *a, char *b)
void mini_memcpy(void *out, const void *in, int len)
{
- char *c_out=(char*)out;
- char *c_in=(char *)in;
+ TCHAR *c_out=(TCHAR*)out;
+ TCHAR *c_in=(TCHAR *)in;
while (len-- > 0)
{
*c_out++=*c_in++;
}
}
-void DeleteFileOnReboot(char *pszFile)
+void DeleteFileOnReboot(TCHAR *pszFile)
{
BOOL fOk = 0;
- HMODULE hLib=GetModuleHandle("KERNEL32.dll");
+ HMODULE hLib=GetModuleHandle(_T("KERNEL32.dll"));
if (hLib)
{
- typedef BOOL (WINAPI *mfea_t)(LPCSTR lpExistingFileName,LPCSTR lpNewFileName,DWORD dwFlags);
+ typedef BOOL (WINAPI *mfea_t)(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,DWORD dwFlags);
mfea_t mfea;
- mfea=(mfea_t) GetProcAddress(hLib,"MoveFileExA");
+ mfea=(mfea_t) GetProcAddress(hLib,_CRT_STRINGIZE(MoveFileEx));
if (mfea)
{
fOk=mfea(pszFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
@@ -247,10 +248,10 @@ void DeleteFileOnReboot(char *pszFile)
if (!fOk)
{
- static char szRenameLine[1024];
- static char wininit[1024];
+ static TCHAR szRenameLine[1024];
+ static TCHAR wininit[1024];
int cchRenameLine;
- char *szRenameSec = "[Rename]\r\n";
+ TCHAR *szRenameSec = _T("[Rename]\r\n");
HANDLE hfile, hfilemap;
DWORD dwFileSize, dwRenameLinePos;
@@ -260,10 +261,10 @@ void DeleteFileOnReboot(char *pszFile)
spn = GetShortPathName(pszFile,wininit,1024);
if (!spn || spn > 1024)
return;
- cchRenameLine = wsprintf(szRenameLine,"NUL=%s\r\n",wininit);
+ cchRenameLine = wsprintf(szRenameLine,_T("NUL=%s\r\n"),wininit);
GetWindowsDirectory(wininit, 1024-16);
- lstrcat(wininit, "\\wininit.ini");
+ lstrcat(wininit, _T("\\wininit.ini"));
hfile = CreateFile(wininit,
GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
@@ -275,11 +276,11 @@ void DeleteFileOnReboot(char *pszFile)
if (hfilemap != NULL)
{
- LPSTR pszWinInit = (LPSTR) MapViewOfFile(hfilemap, FILE_MAP_WRITE, 0, 0, 0);
+ LPTSTR pszWinInit = (LPTSTR) MapViewOfFile(hfilemap, FILE_MAP_WRITE, 0, 0, 0);
if (pszWinInit != NULL)
{
- LPSTR pszRenameSecInFile = mystrstri(pszWinInit, szRenameSec);
+ LPTSTR pszRenameSecInFile = mystrstri(pszWinInit, szRenameSec);
if (pszRenameSecInFile == NULL)
{
lstrcpy(pszWinInit+dwFileSize, szRenameSec);
@@ -288,11 +289,11 @@ void DeleteFileOnReboot(char *pszFile)
}
else
{
- char *pszFirstRenameLine = pszRenameSecInFile+10;
- char *pszNextSec = mystrstri(pszFirstRenameLine,"\n[");
+ TCHAR *pszFirstRenameLine = pszRenameSecInFile+10;
+ TCHAR *pszNextSec = mystrstri(pszFirstRenameLine,_T("\n["));
if (pszNextSec)
{
- char *p = ++pszNextSec;
+ TCHAR *p = ++pszNextSec;
while (p < pszWinInit + dwFileSize) {
p[cchRenameLine] = *p;
p++;
diff --git a/Contrib/Library/TypeLib/TypeLib.cpp b/Contrib/Library/TypeLib/TypeLib.cpp
index 97379e70..24de9592 100644
--- a/Contrib/Library/TypeLib/TypeLib.cpp
+++ b/Contrib/Library/TypeLib/TypeLib.cpp
@@ -3,19 +3,20 @@
NSIS plug-in for Type Library Registration/UnRegistration
Written by Joost Verburg
+ Unicode support by Jim Park -- 08/23/2007
+
*/
#include
#include // nsis plugin
+#include
-#define NSISFunction(funcname) extern "C" void __declspec(dllexport) funcname(HWND hwndParent, int string_size, char *variables, stack_t **stacktop)
+#define NSISFunction(funcname) extern "C" void __declspec(dllexport) funcname(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop)
extern "C" BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) {
return TRUE;
}
-// Functions
-
NSISFunction(Register) {
EXDLL_INIT();
@@ -107,11 +108,11 @@ NSISFunction(GetLibVersion) {
if (SUCCEEDED(hr))
{
- char buf[33];
+ TCHAR buf[33];
- wsprintf(buf, "%d", typelibAttr->wMajorVerNum);
+ wsprintf(buf, _T("%d"), typelibAttr->wMajorVerNum);
pushstring(buf);
- wsprintf(buf, "%d", typelibAttr->wMinorVerNum);
+ wsprintf(buf, _T("%d"), typelibAttr->wMinorVerNum);
pushstring(buf);
typeLib->ReleaseTLibAttr(typelibAttr);
@@ -119,8 +120,8 @@ NSISFunction(GetLibVersion) {
}
else
{
- pushstring("0");
- pushstring("0");
+ pushstring(_T("0"));
+ pushstring(_T("0"));
}
typeLib->Release();
@@ -128,8 +129,8 @@ NSISFunction(GetLibVersion) {
}
else
{
- pushstring("0");
- pushstring("0");
+ pushstring(_T("0"));
+ pushstring(_T("0"));
}
}
diff --git a/Contrib/MakeLangId/MakeLangId.cpp b/Contrib/MakeLangId/MakeLangId.cpp
index 02df7d94..4c9a1a97 100644
--- a/Contrib/MakeLangId/MakeLangId.cpp
+++ b/Contrib/MakeLangId/MakeLangId.cpp
@@ -1,12 +1,15 @@
+// Unicode support by Jim Park -- 08/23/2007
+
#include
#include
+#include "../ExDLL/nsis_tchar.h"
#include "resource.h"
-#define CBL(x) {x,#x}
+#define CBL(x) {x,_T(#x)}
struct line {
unsigned short id;
- char *name;
+ TCHAR *name;
};
line primary[] = {
@@ -201,17 +204,17 @@ BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) {
}
else if (HIWORD(wParam) == CBN_SELCHANGE) {
if (SendDlgItemMessage(hwndDlg, IDC_PRIMARY, CB_GETCURSEL, 0, 0) != CB_ERR && SendDlgItemMessage(hwndDlg, IDC_SUB, CB_GETCURSEL, 0, 0) != CB_ERR) {
- char lang[512];
- wsprintf(lang, "Language ID: %d", MAKELANGID(primary[SendDlgItemMessage(hwndDlg, IDC_PRIMARY, CB_GETCURSEL, 0, 0)].id, sub[SendDlgItemMessage(hwndDlg, IDC_SUB, CB_GETCURSEL, 0, 0)].id));
+ TCHAR lang[512];
+ wsprintf(lang, _T("Language ID: %d"), MAKELANGID(primary[SendDlgItemMessage(hwndDlg, IDC_PRIMARY, CB_GETCURSEL, 0, 0)].id, sub[SendDlgItemMessage(hwndDlg, IDC_SUB, CB_GETCURSEL, 0, 0)].id));
SetDlgItemText(hwndDlg, IDC_RESULT, lang);
}
}
else if (LOWORD(wParam) == IDOK) {
if (SendDlgItemMessage(hwndDlg, IDC_PRIMARY, CB_GETCURSEL, 0, 0) != CB_ERR && SendDlgItemMessage(hwndDlg, IDC_SUB, CB_GETCURSEL, 0, 0) != CB_ERR) {
- HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, 16);
+ HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, 16*sizeof(TCHAR));
if (!hMem) return 0;
- char *lang_id = (char *)GlobalLock(hMem);
- wsprintf(lang_id, "%u", MAKELANGID(primary[SendDlgItemMessage(hwndDlg, IDC_PRIMARY, CB_GETCURSEL, 0, 0)].id, sub[SendDlgItemMessage(hwndDlg, IDC_SUB, CB_GETCURSEL, 0, 0)].id));
+ TCHAR *lang_id = (TCHAR *)GlobalLock(hMem);
+ wsprintf(lang_id, _T("%u"), MAKELANGID(primary[SendDlgItemMessage(hwndDlg, IDC_PRIMARY, CB_GETCURSEL, 0, 0)].id, sub[SendDlgItemMessage(hwndDlg, IDC_SUB, CB_GETCURSEL, 0, 0)].id));
GlobalUnlock(hMem);
if (!OpenClipboard(hwndDlg)) return 0;
EmptyClipboard();
@@ -224,9 +227,9 @@ BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) {
return 0;
}
-int APIENTRY WinMain(HINSTANCE hInstance,
+int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
+ LPTSTR lpCmdLine,
int nCmdShow)
{
InitCommonControls();
diff --git a/Contrib/Makensisw/afxres.h b/Contrib/Makensisw/afxres.h
index d4c5e1fe..cc81d957 100644
--- a/Contrib/Makensisw/afxres.h
+++ b/Contrib/Makensisw/afxres.h
@@ -1,3 +1,5 @@
+// Reviewed for Unicode support by Jim Park -- 08/17/2007
+
#define _WIN32_IE 0x0400
#include
diff --git a/Contrib/Makensisw/jnetlib/asyncdns.cpp b/Contrib/Makensisw/jnetlib/asyncdns.cpp
index a73adc05..bb465181 100644
--- a/Contrib/Makensisw/jnetlib/asyncdns.cpp
+++ b/Contrib/Makensisw/jnetlib/asyncdns.cpp
@@ -6,6 +6,9 @@
** License: zlib
*/
+// Reviewed for Unicode support by Jim Park -- 08/16/2007
+// Note: For Unicode Support, all string functions must explicitly use
+// ANSI versions if UNICODE is defined.
#include "netinc.h"
#include "util.h"
@@ -57,14 +60,14 @@ int JNL_AsyncDNS::resolve(char *hostname, unsigned long *addr)
return 0;
}
- if (lstrcmpi(m_hostname,hostname)) m_addr=0;
+ if (lstrcmpiA(m_hostname,hostname)) m_addr=0;
else if (m_addr == INADDR_NONE) return -1;
else if (m_addr)
{
*addr=m_addr;
return 0;
}
- lstrcpy(m_hostname,hostname);
+ lstrcpyA(m_hostname,hostname);
if (m_thread_kill)
{
diff --git a/Contrib/Makensisw/jnetlib/asyncdns.h b/Contrib/Makensisw/jnetlib/asyncdns.h
index 69b92979..c982a0e9 100644
--- a/Contrib/Makensisw/jnetlib/asyncdns.h
+++ b/Contrib/Makensisw/jnetlib/asyncdns.h
@@ -14,6 +14,9 @@
** 4. enjoy.
*/
+// Reviewed for Unicode support by Jim Park -- 08/16/2007
+// Note: Inet host name is strictly ANSI, no UNICODE for now.
+
#ifndef _ASYNCDNS_H_
#define _ASYNCDNS_H_
diff --git a/Contrib/Makensisw/jnetlib/connection.cpp b/Contrib/Makensisw/jnetlib/connection.cpp
index 29eef953..ccb345e7 100644
--- a/Contrib/Makensisw/jnetlib/connection.cpp
+++ b/Contrib/Makensisw/jnetlib/connection.cpp
@@ -4,6 +4,8 @@
** Author: Justin Frankel
** File: connection.cpp - JNL TCP connection implementation
** License: zlib
+**
+** Reviewed for Unicode support by Jim Park -- 08/17/2007
*/
#include "netinc.h"
diff --git a/Contrib/Makensisw/jnetlib/connection.h b/Contrib/Makensisw/jnetlib/connection.h
index 4a1a4031..67356ca0 100644
--- a/Contrib/Makensisw/jnetlib/connection.h
+++ b/Contrib/Makensisw/jnetlib/connection.h
@@ -50,6 +50,8 @@
** make the socket close after sending all the data sent.
**
** 8. delete ye' ol' object.
+**
+** Reviewed for Unicode Support by Jim Park -- 08/17/2007
*/
#ifndef _CONNECTION_H_
diff --git a/Contrib/Makensisw/jnetlib/httpget.cpp b/Contrib/Makensisw/jnetlib/httpget.cpp
index 232a5dc4..49c778eb 100644
--- a/Contrib/Makensisw/jnetlib/httpget.cpp
+++ b/Contrib/Makensisw/jnetlib/httpget.cpp
@@ -4,6 +4,12 @@
** Author: Justin Frankel
** File: httpget.cpp - JNL HTTP GET implementation
** License: zlib
+**
+** Reviewed for Unicode Support by Jim Park -- 08/17/2007
+** Note: The functions that work on char's should be explicitely set to use the
+** ANSI versions. Some of the functions like wprintf() are #defined to be
+** the wide-char versions when _UNICODE is defined. So these must be explictly
+** set to use the ANSI versions.
*/
#include "netinc.h"
@@ -181,14 +187,14 @@ void JNL_HTTPGet::connect(char *url)
if (!m_http_proxyhost || !m_http_proxyhost[0])
{
- wsprintf(str,"GET %s HTTP/1.0\r\n",m_http_request);
+ wsprintfA(str,"GET %s HTTP/1.0\r\n",m_http_request);
}
else
{
- wsprintf(str,"GET %s HTTP/1.0\r\n",m_http_url);
+ wsprintfA(str,"GET %s HTTP/1.0\r\n",m_http_url);
}
- wsprintf(str+strlen(str),"Host: %s\r\n",m_http_host);
+ wsprintfA(str+strlen(str),"Host: %s\r\n",m_http_host);
if (m_http_lpinfo&&m_http_lpinfo[0])
{
diff --git a/Contrib/Makensisw/jnetlib/httpget.h b/Contrib/Makensisw/jnetlib/httpget.h
index 9fb3f43c..5e088e0b 100644
--- a/Contrib/Makensisw/jnetlib/httpget.h
+++ b/Contrib/Makensisw/jnetlib/httpget.h
@@ -37,6 +37,12 @@
** note that user, pass, port, and /requestwhatever are all optional :)
** note that also, http:// is really not important. if you do poo://
** or even leave out the http:// altogether, it will still work.
+**
+** Reviewed for Unicode Support by Jim Park -- 08/17/2007
+** Note: The functions that work on char's should be explicitely set to use the
+** ANSI versions. Some of the functions like wprintf() are #defined to be
+** the wide-char versions when _UNICODE is defined. So these must be explictly
+** set to use the ANSI versions.
*/
#ifndef _HTTPGET_H_
diff --git a/Contrib/Makensisw/jnetlib/netinc.h b/Contrib/Makensisw/jnetlib/netinc.h
index 57262a45..22145d4e 100644
--- a/Contrib/Makensisw/jnetlib/netinc.h
+++ b/Contrib/Makensisw/jnetlib/netinc.h
@@ -4,6 +4,12 @@
** Author: Justin Frankel
** File: netinc.h - network includes and portability defines (used internally)
** License: zlib
+**
+** Reviewed for Unicode Support by Jim Park -- 08/17/2007
+** Note: The functions that work on char's should be explicitely set to use the
+** ANSI versions. Some of the functions like lstrcpy() are #defined to be
+** the wide-char versions when _UNICODE is defined. So these must be explictly
+** set to use the ANSI versions.
*/
#ifndef _NETINC_H_
@@ -72,10 +78,10 @@ extern void mini_memset(void *,char,int);
extern void mini_memcpy(void *,void*,int);
#define memset mini_memset
#define memcpy mini_memcpy
-#define strcpy lstrcpy
-#define strncpy lstrcpyn
-#define strcat lstrcat
-#define strlen lstrlen
+#define strcpy lstrcpyA
+#define strncpy lstrcpynA
+#define strcat lstrcatA
+#define strlen lstrlenA
#define malloc(x) GlobalAlloc(GPTR,(x))
#define free(x) { if (x) GlobalFree(x); }
diff --git a/Contrib/Makensisw/jnetlib/util.cpp b/Contrib/Makensisw/jnetlib/util.cpp
index 2cd60de0..a8d8b46b 100644
--- a/Contrib/Makensisw/jnetlib/util.cpp
+++ b/Contrib/Makensisw/jnetlib/util.cpp
@@ -4,6 +4,12 @@
** Author: Justin Frankel
** File: util.cpp - JNL implementation of basic network utilities
** License: zlib
+**
+** Reviewed for Unicode Support by Jim Park -- 08/17/2007
+** Note: The functions that work on char's should be explicitely set to use the
+** ANSI versions. Some of the functions like wprintf() are #defined to be
+** the wide-char versions when _UNICODE is defined. So these must be explictly
+** set to use the ANSI versions.
*/
#include "netinc.h"
diff --git a/Contrib/Makensisw/jnetlib/util.h b/Contrib/Makensisw/jnetlib/util.h
index da5c14e4..7216c32f 100644
--- a/Contrib/Makensisw/jnetlib/util.h
+++ b/Contrib/Makensisw/jnetlib/util.h
@@ -22,6 +22,11 @@
** JNL::addr_to_ipstr(unsigned long addr, char *host, int maxhostlen);
** gives you the dotted decimal notation of an integer ip address.
**
+** Reviewed for Unicode Support by Jim Park -- 08/17/2007
+** Note: The functions that work on char's should be explicitely set to use the
+** ANSI versions. Some of the functions like wprintf() are #defined to be
+** the wide-char versions when _UNICODE is defined. So these must be explictly
+** set to use the ANSI versions.
*/
#ifndef _UTIL_H_
diff --git a/Contrib/Makensisw/makensisw.cpp b/Contrib/Makensisw/makensisw.cpp
index a75758b7..d95d8327 100644
--- a/Contrib/Makensisw/makensisw.cpp
+++ b/Contrib/Makensisw/makensisw.cpp
@@ -17,6 +17,8 @@
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
+
+ Unicode support by Jim Park -- 08/18/2007
*/
#define MAKENSISW_CPP
@@ -34,7 +36,7 @@ NFINDREPLACE g_find;
extern NTOOLBAR g_toolbar;
int g_symbol_set_mode;
-int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmdShow) {
+int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, TCHAR *cmdParam, int cmdShow) {
MSG msg;
int status;
HACCEL haccel;
@@ -44,19 +46,19 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmd
my_memset(&g_find,0,sizeof(NFINDREPLACE));
g_sdata.hInstance=GetModuleHandle(0);
g_sdata.symbols = NULL;
- g_sdata.sigint_event = CreateEvent(NULL, FALSE, FALSE, "makensis win32 signint event");
+ g_sdata.sigint_event = CreateEvent(NULL, FALSE, FALSE, _T("makensis win32 signint event"));
RestoreSymbols();
- HINSTANCE hRichEditDLL = LoadLibrary("RichEd32.dll");
+ HINSTANCE hRichEditDLL = LoadLibrary(_T("RichEd32.dll"));
if (!InitBranding()) {
- MessageBox(0,NSISERROR,"Error",MB_ICONEXCLAMATION|MB_OK);
+ MessageBox(0,NSISERROR,_T("Error"),MB_ICONEXCLAMATION|MB_OK);
return 1;
}
ResetObjects();
HWND hDialog = CreateDialog(g_sdata.hInstance,MAKEINTRESOURCE(DLG_MAIN),0,DialogProc);
if (!hDialog) {
- MessageBox(0,DLGERROR,"Error",MB_ICONEXCLAMATION|MB_OK);
+ MessageBox(0,DLGERROR,_T("Error"),MB_ICONEXCLAMATION|MB_OK);
return 1;
}
haccel = LoadAccelerators(g_sdata.hInstance, MAKEINTRESOURCE(IDK_ACCEL));
@@ -80,7 +82,7 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmd
return msg.wParam;
}
-void SetScript(const char *script, bool clearArgs /*= true*/)
+void SetScript(const TCHAR *script, bool clearArgs /*= true*/)
{
if (g_sdata.script)
{
@@ -94,24 +96,25 @@ void SetScript(const char *script, bool clearArgs /*= true*/)
GlobalFree(g_sdata.script_cmd_args);
}
- g_sdata.script_cmd_args = GlobalAlloc(GHND, 1);
+ // Pointing to a single char. Maybe _T('\0')
+ g_sdata.script_cmd_args = GlobalAlloc(GHND, sizeof(TCHAR));
}
- g_sdata.script = (char *) GlobalAlloc(GPTR, lstrlen(script) + 1);
+ g_sdata.script = (TCHAR *) GlobalAlloc(GPTR, (lstrlen(script) + 1)*sizeof(TCHAR));
lstrcpy(g_sdata.script, script);
}
-void AddScriptCmdArgs(const char *arg)
+void AddScriptCmdArgs(const TCHAR *arg)
{
g_sdata.script_cmd_args = GlobalReAlloc(g_sdata.script_cmd_args,
- GlobalSize(g_sdata.script_cmd_args) + lstrlen(arg) + 2 /* quotes */ + 1 /* space */,
+ GlobalSize(g_sdata.script_cmd_args) + (lstrlen(arg) + 2/* quotes */ + 1 /* space */)*sizeof(TCHAR),
0);
- char *args = (char *) GlobalLock(g_sdata.script_cmd_args);
+ TCHAR *args = (TCHAR *) GlobalLock(g_sdata.script_cmd_args);
- lstrcat(args, " \"");
+ lstrcat(args, _T(" \""));
lstrcat(args, arg);
- lstrcat(args, "\"");
+ lstrcat(args, _T("\""));
GlobalUnlock(g_sdata.script_cmd_args);
}
@@ -119,23 +122,23 @@ void AddScriptCmdArgs(const char *arg)
void ProcessCommandLine()
{
int argc;
- char **argv;
+ TCHAR **argv;
int i, j;
int argSpaceSize;
- argSpaceSize = SetArgv((char *)GetCommandLine(), &argc, &argv);
+ argSpaceSize = SetArgv((TCHAR *)GetCommandLine(), &argc, &argv);
if (argc > 1) {
for (i = 1; i < argc; i++)
{
- if (!lstrncmpi(argv[i], "/XSetCompressor ", lstrlen("/XSetCompressor ")))
+ if (!lstrncmpi(argv[i], _T("/XSetCompressor "), lstrlen(_T("/XSetCompressor "))))
{
- char *p = argv[i] + lstrlen("/XSetCompressor ");
- if(!lstrncmpi(p,"/FINAL ", lstrlen("/FINAL ")))
+ TCHAR *p = argv[i] + lstrlen(_T("/XSetCompressor "));
+ if(!lstrncmpi(p,_T("/FINAL "), lstrlen(_T("/FINAL "))))
{
- p += lstrlen("/FINAL ");
+ p += lstrlen(_T("/FINAL "));
}
- while (*p == ' ') p++;
+ while (*p == _T(' ')) p++;
for (j = (int) COMPRESSOR_SCRIPT + 1; j < (int) COMPRESSOR_BEST; j++)
{
@@ -145,11 +148,11 @@ void ProcessCommandLine()
}
}
}
- else if (!lstrcmpi(argv[i], "/ChooseCompressor"))
+ else if (!lstrcmpi(argv[i], _T("/ChooseCompressor")))
{
g_sdata.userSelectCompressor = TRUE;
}
- else if (argv[i][0] == '-' || argv[i][0] == '/')
+ else if (argv[i][0] == _T('-') || argv[i][0] == _T('/'))
{
AddScriptCmdArgs(argv[i]);
}
@@ -185,11 +188,11 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
CreateToolBar();
InitTooltips(g_sdata.hwnd);
SetBranding(g_sdata.hwnd);
- HFONT hFont = CreateFont(14,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_DONTCARE,"Courier New");
+ HFONT hFont = CreateFont(14,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_DONTCARE,_T("Courier New"));
SendDlgItemMessage(hwndDlg,IDC_LOGWIN,WM_SETFONT,(WPARAM)hFont,0);
RestoreWindowPos(g_sdata.hwnd);
RestoreCompressor();
- SetScript("");
+ SetScript(_T(""));
g_sdata.compressor = COMPRESSOR_NONE_SELECTED;
g_sdata.userSelectCompressor = FALSE;
@@ -243,7 +246,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
}
case WM_DROPFILES: {
int num;
- char szTmp[MAX_PATH];
+ TCHAR szTmp[MAX_PATH];
num = DragQueryFile((HDROP)wParam,(UINT)-1,NULL,0);
if (num==1) {
DragQueryFile((HDROP)wParam,0,szTmp,MAX_PATH);
@@ -254,7 +257,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
CompileNSISScript();
}
} else {
- MessageBox(hwndDlg,MULTIDROPERROR,"Error",MB_OK|MB_ICONSTOP);
+ MessageBox(hwndDlg,MULTIDROPERROR,_T("Error"),MB_OK|MB_ICONSTOP);
}
DragFinish((HDROP)wParam);
break;
@@ -267,7 +270,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
case WM_ENTERSIZEMOVE:
{
GetClientRect(g_sdata.hwnd, &g_resize.resizeRect);
- return TRUE;
+ return TRUE;
}
case WM_SIZE:
{
@@ -299,8 +302,8 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
}
if(g_sdata.compressor == COMPRESSOR_BEST) {
if (g_sdata.retcode==0 && FileExists(g_sdata.output_exe)) {
- char temp_file_name[1024];
- wsprintf(temp_file_name,"%s_makensisw_temp",g_sdata.output_exe);
+ TCHAR temp_file_name[1024];
+ wsprintf(temp_file_name,_T("%s_makensisw_temp"),g_sdata.output_exe);
if(!lstrcmpi(g_sdata.compressor_name,compressor_names[(int)COMPRESSOR_SCRIPT+1])) {
SetCompressorStats();
CopyFile(g_sdata.output_exe,temp_file_name,false);
@@ -354,7 +357,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
}
if(this_compressor == ((int)COMPRESSOR_BEST - 1)) {
- char buf[1024];
+ TCHAR buf[1024];
g_sdata.compressor_name = compressor_names[(int)COMPRESSOR_SCRIPT+1];
@@ -369,7 +372,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
LogMessage(g_sdata.hwnd, g_sdata.compressor_stats);
}
DeleteFile(temp_file_name);
- lstrcpy(g_sdata.compressor_stats,"");
+ lstrcpy(g_sdata.compressor_stats,_T(""));
}
else {
g_sdata.compressor_name = compressor_names[this_compressor+1];
@@ -385,16 +388,16 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
if (!g_sdata.retcode) {
MessageBeep(MB_ICONASTERISK);
if (g_sdata.warnings)
- SetTitle(g_sdata.hwnd,"Finished with Warnings");
+ SetTitle(g_sdata.hwnd,_T("Finished with Warnings"));
else
- SetTitle(g_sdata.hwnd,"Finished Sucessfully");
+ SetTitle(g_sdata.hwnd,_T("Finished Sucessfully"));
// Added by Darren Owen (DrO) on 1/10/2003
if(g_sdata.recompile_test)
PostMessage(g_sdata.hwnd, WM_COMMAND, LOWORD(IDC_TEST), 0);
}
else {
MessageBeep(MB_ICONEXCLAMATION);
- SetTitle(g_sdata.hwnd,"Compile Error: See Log for Details");
+ SetTitle(g_sdata.hwnd,_T("Compile Error: See Log for Details"));
}
// Added by Darren Owen (DrO) on 1/10/2003
@@ -455,8 +458,8 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (cds->dwData) {
case MAKENSIS_NOTIFY_SCRIPT:
if (g_sdata.input_script) GlobalFree(g_sdata.input_script);
- g_sdata.input_script = (char *)GlobalAlloc(GPTR, cds->cbData);
- lstrcpy(g_sdata.input_script, (char *)cds->lpData);
+ g_sdata.input_script = (TCHAR *)GlobalAlloc(GPTR, cds->cbData * sizeof(TCHAR));
+ lstrcpy(g_sdata.input_script, (TCHAR *)cds->lpData);
break;
case MAKENSIS_NOTIFY_WARNING:
g_sdata.warnings++;
@@ -465,8 +468,8 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
break;
case MAKENSIS_NOTIFY_OUTPUT:
if (g_sdata.output_exe) GlobalFree(g_sdata.output_exe);
- g_sdata.output_exe = (char *)GlobalAlloc(GPTR, cds->cbData);
- lstrcpy(g_sdata.output_exe, (char *)cds->lpData);
+ g_sdata.output_exe = (TCHAR *)GlobalAlloc(GPTR, cds->cbData * sizeof(TCHAR));
+ lstrcpy(g_sdata.output_exe, (TCHAR *)cds->lpData);
break;
}
return TRUE;
@@ -476,11 +479,11 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (LOWORD(wParam)) {
case IDM_BROWSESCR: {
if (g_sdata.input_script) {
- char str[MAX_PATH],*str2;
+ TCHAR str[MAX_PATH],*str2;
lstrcpy(str,g_sdata.input_script);
- str2=my_strrchr(str,'\\');
+ str2=my_strrchr(str,_T('\\'));
if(str2!=NULL) *(str2+1)=0;
- ShellExecute(g_sdata.hwnd,"open",str,NULL,NULL,SW_SHOWNORMAL);
+ ShellExecute(g_sdata.hwnd,_T("open"),str,NULL,NULL,SW_SHOWNORMAL);
}
return TRUE;
}
@@ -491,12 +494,12 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
}
case IDM_NSISHOME:
{
- ShellExecute(g_sdata.hwnd,"open",NSIS_URL,NULL,NULL,SW_SHOWNORMAL);
+ ShellExecuteA(g_sdata.hwnd,"open",NSIS_URL,NULL,NULL,SW_SHOWNORMAL);
return TRUE;
}
case IDM_FORUM:
{
- ShellExecute(g_sdata.hwnd,"open",NSIS_FOR,NULL,NULL,SW_SHOWNORMAL);
+ ShellExecuteA(g_sdata.hwnd,"open",NSIS_FOR,NULL,NULL,SW_SHOWNORMAL);
return TRUE;
}
case IDM_NSISUPDATE:
@@ -518,17 +521,17 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
{
if (!g_sdata.thread) {
OPENFILENAME l={sizeof(l),};
- char buf[MAX_PATH];
+ TCHAR buf[MAX_PATH];
l.hwndOwner = hwndDlg;
- l.lpstrFilter = "NSIS Script (*.nsi)\0*.nsi\0All Files (*.*)\0*.*\0";
+ l.lpstrFilter = _T("NSIS Script (*.nsi)\0*.nsi\0All Files (*.*)\0*.*\0");
l.lpstrFile = buf;
l.nMaxFile = MAX_STRING-1;
- l.lpstrTitle = "Load Script";
- l.lpstrDefExt = "log";
+ l.lpstrTitle = _T("Load Script");
+ l.lpstrDefExt = _T("log");
l.lpstrFileTitle = NULL;
l.lpstrInitialDir = NULL;
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST;
- lstrcpy(buf,"");
+ lstrcpy(buf,_T(""));
if (GetOpenFileName(&l)) {
SetScript(buf);
PushMRUFile(g_sdata.script);
@@ -582,18 +585,18 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
case IDC_TEST:
{
if (g_sdata.output_exe) {
- ShellExecute(g_sdata.hwnd,"open",g_sdata.output_exe,NULL,NULL,SW_SHOWNORMAL);
+ ShellExecute(g_sdata.hwnd,_T("open"),g_sdata.output_exe,NULL,NULL,SW_SHOWNORMAL);
}
return TRUE;
}
case IDM_EDITSCRIPT:
{
if (g_sdata.input_script) {
- if ((int)ShellExecute(g_sdata.hwnd,"open",g_sdata.input_script,NULL,NULL,SW_SHOWNORMAL)<=32) {
- char path[MAX_PATH];
+ if ((int)ShellExecute(g_sdata.hwnd,_T("open"),g_sdata.input_script,NULL,NULL,SW_SHOWNORMAL)<=32) {
+ TCHAR path[MAX_PATH];
if (GetWindowsDirectory(path,sizeof(path))) {
- lstrcat(path,"\\notepad.exe");
- ShellExecute(g_sdata.hwnd,"open",path,g_sdata.input_script,NULL,SW_SHOWNORMAL);
+ lstrcat(path,_T("\\notepad.exe"));
+ ShellExecute(g_sdata.hwnd,_T("open"),path,g_sdata.input_script,NULL,SW_SHOWNORMAL);
}
}
}
@@ -625,21 +628,21 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
case IDM_SAVE:
{
OPENFILENAME l={sizeof(l),};
- char buf[MAX_STRING];
+ TCHAR buf[MAX_STRING];
l.hwndOwner = hwndDlg;
- l.lpstrFilter = "Log Files (*.log)\0*.log\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
+ l.lpstrFilter = _T("Log Files (*.log)\0*.log\0Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0");
l.lpstrFile = buf;
l.nMaxFile = MAX_STRING-1;
- l.lpstrTitle = "Save Output";
- l.lpstrDefExt = "log";
+ l.lpstrTitle = _T("Save Output");
+ l.lpstrDefExt = _T("log");
l.lpstrInitialDir = NULL;
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST;
- lstrcpy(buf,"output");
+ lstrcpy(buf,_T("output"));
if (GetSaveFileName(&l)) {
HANDLE hFile = CreateFile(buf,GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);
if (hFile) {
int len=SendDlgItemMessage(g_sdata.hwnd,IDC_LOGWIN,WM_GETTEXTLENGTH,0,0);
- char *existing_text=(char*)GlobalAlloc(GPTR,len);
+ TCHAR *existing_text=(TCHAR*)GlobalAlloc(GPTR,len * sizeof(TCHAR));
existing_text[0]=0;
GetDlgItemText(g_sdata.hwnd, IDC_LOGWIN, existing_text, len);
DWORD dwWritten = 0;
@@ -657,7 +660,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
g_find.fr.lStructSize = sizeof(FINDREPLACE);
g_find.fr.hwndOwner = hwndDlg;
g_find.fr.Flags = FR_NOUPDOWN;
- g_find.fr.lpstrFindWhat = (char *)GlobalAlloc(GPTR, 128);
+ g_find.fr.lpstrFindWhat = (TCHAR *)GlobalAlloc(GPTR, 128 * sizeof(TCHAR));
if (!g_find.fr.lpstrFindWhat) return TRUE;
g_find.fr.wFindWhatLen = 128;
g_find.hwndFind = FindText(&g_find.fr);
@@ -716,12 +719,12 @@ DWORD WINAPI MakeNSISProc(LPVOID p) {
else sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = true;
if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) {
- ErrorMessage(g_sdata.hwnd,"There was an error creating the output pipe.");
+ ErrorMessage(g_sdata.hwnd,_T("There was an error creating the output pipe."));
PostMessage(g_sdata.hwnd,WM_MAKENSIS_PROCESSCOMPLETE,0,0);
return 1;
}
if (!CreatePipe(&read_stdin,&newstdin,&sa,0)) {
- ErrorMessage(g_sdata.hwnd,"There was an error creating the input pipe.");
+ ErrorMessage(g_sdata.hwnd,_T("There was an error creating the input pipe."));
PostMessage(g_sdata.hwnd,WM_MAKENSIS_PROCESSCOMPLETE,0,0);
return 1;
}
@@ -732,8 +735,8 @@ DWORD WINAPI MakeNSISProc(LPVOID p) {
si.hStdError = newstdout;
si.hStdInput = newstdin;
if (!CreateProcess(NULL,g_sdata.compile_command,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi)) {
- char buf[MAX_STRING];
- wsprintf(buf,"Could not execute:\r\n %s.",g_sdata.compile_command);
+ TCHAR buf[MAX_STRING];
+ wsprintf(buf,_T("Could not execute:\r\n %s."),g_sdata.compile_command);
ErrorMessage(g_sdata.hwnd,buf);
CloseHandle(newstdout);
CloseHandle(read_stdout);
@@ -746,7 +749,7 @@ DWORD WINAPI MakeNSISProc(LPVOID p) {
while (dwExit == STILL_ACTIVE || dwRead) {
PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL);
if (dwRead) {
- ReadFile(read_stdout, szBuf, sizeof(szBuf)-1, &dwRead, NULL);
+ ReadFile(read_stdout, szBuf, sizeof(szBuf)-sizeof(TCHAR), &dwRead, NULL);
szBuf[dwRead] = 0;
LogMessage(g_sdata.hwnd, szBuf);
}
@@ -804,16 +807,16 @@ BOOL CALLBACK AboutProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) {
{
HFONT bfont = CreateFont(13,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
- FIXED_PITCH|FF_DONTCARE, "Tahoma");
+ FIXED_PITCH|FF_DONTCARE, _T("Tahoma"));
HFONT bfontb = CreateFont(13,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
- FIXED_PITCH|FF_DONTCARE, "Tahoma");
+ FIXED_PITCH|FF_DONTCARE, _T("Tahoma"));
HFONT rfont = CreateFont(12,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
- FIXED_PITCH|FF_DONTCARE, "MS Shell Dlg");
+ FIXED_PITCH|FF_DONTCARE, _T("MS Shell Dlg"));
HFONT rfontb = CreateFont(12,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
- FIXED_PITCH|FF_DONTCARE, "MS Shell Dlg");
+ FIXED_PITCH|FF_DONTCARE, _T("MS Shell Dlg"));
if (bfont&&bfontb) {
SendDlgItemMessage(hwndDlg, IDC_ABOUTVERSION, WM_SETFONT, (WPARAM)bfontb, FALSE);
SendDlgItemMessage(hwndDlg, IDC_ABOUTCOPY, WM_SETFONT, (WPARAM)bfont, FALSE);
@@ -876,7 +879,7 @@ void EnableSymbolEditButtons(HWND hwndDlg)
}
}
-void SetSymbols(HWND hwndDlg, char **symbols)
+void SetSymbols(HWND hwndDlg, TCHAR **symbols)
{
int i = 0;
SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_RESETCONTENT , 0, 0);
@@ -892,16 +895,16 @@ void SetSymbols(HWND hwndDlg, char **symbols)
EnableWindow(GetDlgItem(hwndDlg, IDDEL), FALSE);
}
-char **GetSymbols(HWND hwndDlg)
+TCHAR **GetSymbols(HWND hwndDlg)
{
int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETCOUNT, 0, 0);
- char **symbols = NULL;
+ TCHAR **symbols = NULL;
if(n > 0) {
- HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, (n+1)*sizeof(char *));
- symbols = (char **)GlobalLock(hMem);
+ HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, (n+1)*sizeof(TCHAR *));
+ symbols = (TCHAR **)GlobalLock(hMem);
for (int i = 0; i < n; i++) {
int len = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXTLEN, (WPARAM)i, 0);
- symbols[i] = (char *)GlobalAlloc(GPTR, (len+1)*sizeof(char));
+ symbols[i] = (TCHAR *)GlobalAlloc(GPTR, (len+1)*sizeof(TCHAR));
SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXT, (WPARAM)i, (LPARAM)symbols[i]);
}
symbols[n] = NULL;
@@ -928,8 +931,8 @@ BOOL CALLBACK SettingsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
}
case WM_MAKENSIS_LOADSYMBOLSET:
{
- char *name = (char *)wParam;
- char **symbols = LoadSymbolSet(name);
+ TCHAR *name = (TCHAR *)wParam;
+ TCHAR **symbols = LoadSymbolSet(name);
HGLOBAL hMem;
SetSymbols(hwndDlg, symbols);
@@ -942,8 +945,8 @@ BOOL CALLBACK SettingsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
}
case WM_MAKENSIS_SAVESYMBOLSET:
{
- char *name = (char *)wParam;
- char **symbols = GetSymbols(hwndDlg);
+ TCHAR *name = (TCHAR *)wParam;
+ TCHAR **symbols = GetSymbols(hwndDlg);
HGLOBAL hMem;
if(symbols) {
@@ -981,20 +984,20 @@ BOOL CALLBACK SettingsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXTLENGTH, 0, 0);
if(n > 0) {
- char *buf = (char *)GlobalAlloc(GPTR, (n+1)*sizeof(char));
+ TCHAR *buf = (TCHAR *)GlobalAlloc(GPTR, (n+1)*sizeof(TCHAR));
SendDlgItemMessage(hwndDlg, IDC_SYMBOL, WM_GETTEXT, n+1, (LPARAM)buf);
- if(my_strstr(buf," ") || my_strstr(buf,"\t")) {
- MessageBox(hwndDlg,SYMBOLSERROR,"Error",MB_OK|MB_ICONSTOP);
+ if(my_strstr(buf,_T(" ")) || my_strstr(buf,_T("\t"))) {
+ MessageBox(hwndDlg,SYMBOLSERROR,_T("Error"),MB_OK|MB_ICONSTOP);
GlobalFree(buf);
break;
}
n = SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_GETTEXTLENGTH, 0, 0);
if(n > 0) {
- char *buf2 = (char *)GlobalAlloc(GPTR, (n+1)*sizeof(char));
+ TCHAR *buf2 = (TCHAR *)GlobalAlloc(GPTR, (n+1)*sizeof(TCHAR));
SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_GETTEXT, n+1, (LPARAM)buf2);
- char *buf3 = (char *)GlobalAlloc(GPTR, (lstrlen(buf)+lstrlen(buf2)+2)*sizeof(char));
- wsprintf(buf3,"%s=%s",buf,buf2);
+ TCHAR *buf3 = (TCHAR *)GlobalAlloc(GPTR, (lstrlen(buf)+lstrlen(buf2)+2)*sizeof(TCHAR));
+ wsprintf(buf3,_T("%s=%s"),buf,buf2);
GlobalFree(buf);
buf = buf3;
GlobalFree(buf2);
@@ -1023,9 +1026,9 @@ BOOL CALLBACK SettingsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
if(num == 1) {
int n = SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXTLEN, (WPARAM)index, 0);
if(n > 0) {
- char *buf = (char *)GlobalAlloc(GPTR, (n+1)*sizeof(char));
+ TCHAR *buf = (TCHAR *)GlobalAlloc(GPTR, (n+1)*sizeof(TCHAR));
SendDlgItemMessage(hwndDlg, IDC_SYMBOLS, LB_GETTEXT, (WPARAM)index, (LPARAM)buf);
- char *p = my_strstr(buf,"=");
+ TCHAR *p = my_strstr(buf,_T("="));
if(p) {
SendDlgItemMessage(hwndDlg, IDC_VALUE, WM_SETTEXT, 0, (LPARAM)(p+1));
*p=0;
@@ -1157,7 +1160,7 @@ BOOL CALLBACK SymbolSetProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
HKEY hSubKey;
if (RegOpenKeyEx(hKey,REGSYMSUBKEY,0,KEY_READ,&hSubKey) == ERROR_SUCCESS) {
- char subkey[1024];
+ TCHAR subkey[1024];
int i=0;
while (RegEnumKey(hSubKey,i,subkey,sizeof(subkey)) == ERROR_SUCCESS) {
@@ -1189,7 +1192,7 @@ BOOL CALLBACK SymbolSetProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
case IDOK:
{
HWND hwndEdit;
- char name[SYMBOL_SET_NAME_MAXLEN+1];
+ TCHAR name[SYMBOL_SET_NAME_MAXLEN+1];
hwndEdit = FindWindowEx(GetDlgItem(hwndDlg, IDC_NAMES), 0, 0, 0); // Handle of list
hwndEdit = FindWindowEx(GetDlgItem(hwndDlg, IDC_NAMES), hwndEdit, 0, 0); //Handle of edit box
@@ -1224,7 +1227,7 @@ BOOL CALLBACK SymbolSetProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam
int n = SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETCURSEL, 0, 0);
if(n != CB_ERR) {
long len = SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETLBTEXTLEN, (WPARAM)n, 0);
- char *buf = (char *)GlobalAlloc(GPTR, (len+1)*sizeof(char));
+ TCHAR *buf = (TCHAR *)GlobalAlloc(GPTR, (len+1)*sizeof(TCHAR));
if(SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_GETLBTEXT, (WPARAM)n, (LPARAM)buf) != CB_ERR) {
SendDlgItemMessage(hwndDlg, IDC_NAMES, CB_DELETESTRING, n, 0);
DeleteSymbolSet(buf);
@@ -1269,7 +1272,7 @@ void SetCompressor(NCOMPRESSOR compressor)
if(g_sdata.compressor != compressor) {
WORD command;
- char *compressor_name;
+ TCHAR *compressor_name;
if(compressor > COMPRESSOR_SCRIPT && compressor < COMPRESSOR_BEST) {
command = compressor_commands[(int)compressor];
@@ -1282,7 +1285,7 @@ void SetCompressor(NCOMPRESSOR compressor)
else {
compressor = COMPRESSOR_SCRIPT;
command = IDM_COMPRESSOR_SCRIPT;
- compressor_name = "";
+ compressor_name = _T("");
}
g_sdata.compressor = compressor;
g_sdata.compressor_name = compressor_name;
diff --git a/Contrib/Makensisw/makensisw.h b/Contrib/Makensisw/makensisw.h
index beadc3fc..eca24156 100644
--- a/Contrib/Makensisw/makensisw.h
+++ b/Contrib/Makensisw/makensisw.h
@@ -18,6 +18,7 @@
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
+ Unicode support by Jim Park -- 08/10/2007
*/
#ifndef MAKENSIS_H
#define MAKENSIS_H
@@ -25,6 +26,7 @@
#define _WIN32_IE 0x0400
#include
#include
+#include "../ExDLL/nsis_tchar.h"
#include "utils.h"
#define _RICHEDIT_VER 0x0200
#include
@@ -35,39 +37,39 @@
#define NSIS_FOR "http://forums.winamp.com/forumdisplay.php?forumid=65"
#define NSIS_UPDATE "http://nsis.sourceforge.net/update.php?version="
#define NSIS_DL_URL "http://nsis.sourceforge.net/download/"
-#define USAGE "Usage:\r\n\r\n - File | Load Script...\r\n - Drag the .nsi file into this window\r\n - Right click the .nsi file and choose \"Compile NSIS Script\""
-#define COPYRIGHT "Copyright © 2002 Robert Rainwater"
-#define CONTRIB "Fritz Elfert, Justin Frankel, Amir Szekely, Sunil Kamath, Joost Verburg"
+#define USAGE _T("Usage:\r\n\r\n - File | Load Script...\r\n - Drag the .nsi file into this window\r\n - Right click the .nsi file and choose \"Compile NSIS Script\"")
+#define COPYRIGHT _T("Copyright © 2002 Robert Rainwater")
+#define CONTRIB _T("Fritz Elfert, Justin Frankel, Amir Szekely, Sunil Kamath, Joost Verburg")
#define DOCPATH "http://nsis.sourceforge.net/Docs/"
-#define LOCALDOCS "\\NSIS.chm"
-#define NSISERROR "Unable to intialize MakeNSIS. Please verify that makensis.exe is in the same directory as makensisw.exe."
-#define DLGERROR "Unable to intialize MakeNSISW."
-#define SYMBOLSERROR "Symbol cannot contain whitespace characters"
-#define MULTIDROPERROR "Dropping more than one script at a time is not supported"
-#define NSISUPDATEPROMPT "Running NSIS Update will close MakeNSISW.\nContinue?"
+#define LOCALDOCS _T("\\NSIS.chm")
+#define NSISERROR _T("Unable to intialize MakeNSIS. Please verify that makensis.exe is in the same directory as makensisw.exe.")
+#define DLGERROR _T("Unable to intialize MakeNSISW.")
+#define SYMBOLSERROR _T("Symbol cannot contain whitespace characters")
+#define MULTIDROPERROR _T("Dropping more than one script at a time is not supported")
+#define NSISUPDATEPROMPT _T("Running NSIS Update will close MakeNSISW.\nContinue?")
#define REGSEC HKEY_CURRENT_USER
#define REGSECDEF HKEY_LOCAL_MACHINE
-#define REGKEY "Software\\NSIS"
-#define REGLOC "MakeNSISWPlacement"
-#define REGCOMPRESSOR "MakeNSISWCompressor"
-#define REGSYMSUBKEY "Symbols"
-#define REGMRUSUBKEY "MRU"
-#define EXENAME "makensis.exe"
+#define REGKEY _T("Software\\NSIS")
+#define REGLOC _T("MakeNSISWPlacement")
+#define REGCOMPRESSOR _T("MakeNSISWCompressor")
+#define REGSYMSUBKEY _T("Symbols")
+#define REGMRUSUBKEY _T("MRU")
+#define EXENAME _T("makensis.exe")
#define MAX_STRING 256
#define TIMEOUT 100
#define MINWIDTH 350
#define MINHEIGHT 180
-#define COMPRESSOR_MESSAGE "\n\nThe %s compressor created the smallest installer (%d bytes)."
-#define RESTORED_COMPRESSOR_MESSAGE "\n\nThe %s compressor created the smallest installer (%d bytes)."
-#define EXE_HEADER_COMPRESSOR_STAT "EXE header size:"
-#define TOTAL_SIZE_COMPRESSOR_STAT "Total size:"
+#define COMPRESSOR_MESSAGE _T("\n\nThe %s compressor created the smallest installer (%d bytes).")
+#define RESTORED_COMPRESSOR_MESSAGE _T("\n\nThe %s compressor created the smallest installer (%d bytes).")
+#define EXE_HEADER_COMPRESSOR_STAT _T("EXE header size:")
+#define TOTAL_SIZE_COMPRESSOR_STAT _T("Total size:")
#define SYMBOL_SET_NAME_MAXLEN 40
-#define LOAD_SYMBOL_SET_DLG_NAME "Load Symbol Definitions Set"
-#define SAVE_SYMBOL_SET_DLG_NAME "Save Symbol Definitions Set"
-#define LOAD_BUTTON_TEXT "Load"
-#define SAVE_BUTTON_TEXT "Save"
-#define LOAD_SYMBOL_SET_MESSAGE "Please select a name for the Symbol Definitions Set to load."
-#define SAVE_SYMBOL_SET_MESSAGE "Please enter or select a name for the Symbol Definitions Set to save."
+#define LOAD_SYMBOL_SET_DLG_NAME _T("Load Symbol Definitions Set")
+#define SAVE_SYMBOL_SET_DLG_NAME _T("Save Symbol Definitions Set")
+#define LOAD_BUTTON_TEXT _T("Load")
+#define SAVE_BUTTON_TEXT _T("Save")
+#define LOAD_SYMBOL_SET_MESSAGE _T("Please select a name for the Symbol Definitions Set to load.")
+#define SAVE_SYMBOL_SET_MESSAGE _T("Please enter or select a name for the Symbol Definitions Set to save.")
#define WM_MAKENSIS_PROCESSCOMPLETE (WM_USER+1001)
#define WM_MAKENSIS_LOADSYMBOLSET (WM_USER+1002)
@@ -93,22 +95,22 @@ typedef enum {
} NCOMPRESSOR;
#ifdef MAKENSISW_CPP
-char *compressor_names[] = {"",
- "zlib",
- "/SOLID zlib",
- "bzip2",
- "/SOLID bzip2",
- "lzma",
- "/SOLID lzma",
- "Best"};
-char *compressor_display_names[] = {"Defined in Script/Compiler Default",
- "ZLIB",
- "ZLIB (solid)",
- "BZIP2",
- "BZIP2 (solid)",
- "LZMA",
- "LZMA (solid)",
- "Best Compressor"};
+TCHAR *compressor_names[] = {_T(""),
+ _T("zlib"),
+ _T("/SOLID zlib"),
+ _T("bzip2"),
+ _T("/SOLID bzip2"),
+ _T("lzma"),
+ _T("/SOLID lzma"),
+ _T("Best")};
+TCHAR *compressor_display_names[] = {_T("Defined in Script/Compiler Default"),
+ _T("ZLIB"),
+ _T("ZLIB (solid)"),
+ _T("BZIP2"),
+ _T("BZIP2 (solid)"),
+ _T("LZMA"),
+ _T("LZMA (solid)"),
+ _T("Best Compressor")};
WORD compressor_commands[] = {IDM_COMPRESSOR_SCRIPT,
IDM_ZLIB,
IDM_ZLIB_SOLID,
@@ -140,9 +142,9 @@ int compressor_strings[] = {IDS_SCRIPT,
// Extern Variables
-extern const char* NSISW_VERSION;
+extern const TCHAR* NSISW_VERSION;
-int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmdShow);
+int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrevInst, TCHAR *cmdParam, int cmdShow);
BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
DWORD WINAPI MakeNSISProc(LPVOID p);
BOOL CALLBACK DialogResize(HWND hWnd, LPARAM /* unused*/);
@@ -151,27 +153,27 @@ BOOL CALLBACK AboutProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK SettingsProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK SymbolSetProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK CompressorProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam);
-void SetScript(const char *script, bool clearArgs = true);
+void SetScript(const TCHAR *script, bool clearArgs = true);
void CompileNSISScript();
-char* BuildSymbols();
+TCHAR* BuildSymbols();
void SetCompressor(NCOMPRESSOR);
void RestoreSymbols();
void SaveSymbols();
-void DeleteSymbolSet(char *);
-char** LoadSymbolSet(char *);
-void SaveSymbolSet(char *, char **);
+void DeleteSymbolSet(TCHAR *);
+TCHAR** LoadSymbolSet(TCHAR *);
+void SaveSymbolSet(TCHAR *, TCHAR **);
void RestoreMRUList();
void SaveMRUList();
typedef struct NSISScriptData {
- char *script;
+ TCHAR *script;
HGLOBAL script_cmd_args;
- char *compile_command;
- char *output_exe;
- char *input_script;
- char *branding;
- char *brandingv;
- char **symbols;
+ TCHAR *compile_command;
+ TCHAR *output_exe;
+ TCHAR *input_script;
+ TCHAR *branding;
+ TCHAR *brandingv;
+ TCHAR **symbols;
int retcode;
BOOL userSelectCompressor;
DWORD logLength;
@@ -188,9 +190,9 @@ typedef struct NSISScriptData {
CHARRANGE textrange;
NCOMPRESSOR default_compressor;
NCOMPRESSOR compressor;
- char *compressor_name;
- char compressor_stats[512];
- char *best_compressor_name;
+ TCHAR *compressor_name;
+ TCHAR compressor_stats[512];
+ TCHAR *best_compressor_name;
// Added by Darren Owen (DrO) on 1/10/2003
int recompile_test;
} NSCRIPTDATA;
diff --git a/Contrib/Makensisw/toolbar.cpp b/Contrib/Makensisw/toolbar.cpp
index 55edbf7a..850330fc 100644
--- a/Contrib/Makensisw/toolbar.cpp
+++ b/Contrib/Makensisw/toolbar.cpp
@@ -18,6 +18,8 @@
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
+ Unicode support by Jim Park -- 08/20/2007
+
*/
#define TOOLBAR_CPP
@@ -25,6 +27,7 @@
#include "resource.h"
#include "noclib.h"
#include "toolbar.h"
+#include "../ExDLL/nsis_tchar.h"
NTOOLBAR g_toolbar;
extern NSCRIPTDATA g_sdata;
@@ -65,7 +68,7 @@ void CreateToolBar()
g_toolbar.hwnd = CreateWindowEx (
0L,
TOOLBARCLASSNAME,
- "",
+ _T(""),
WS_CHILD | WS_VISIBLE | TBSTYLE_TRANSPARENT | TBSTYLE_FLAT,
0, 0, 0, 30,
g_sdata.hwnd,
@@ -77,7 +80,7 @@ void CreateToolBar()
SendMessage(g_toolbar.hwnd, TB_ADDBUTTONS, BUTTONCOUNT, (LONG) &tbButton);
// For Comctl32.dll version detection
- HMODULE hMod = GetModuleHandle("comctl32.dll");
+ HMODULE hMod = GetModuleHandle(_T("comctl32.dll"));
if (GetProcAddress(hMod, "InitCommonControlsEx")) { // Version 4.70
// Modern toolbar, 24-bit bitmaps
@@ -120,8 +123,8 @@ void UpdateToolBarCompressorButton()
{
int iBitmap;
int iString;
- char szBuffer[64];
- char temp[32];
+ TCHAR szBuffer[64];
+ TCHAR temp[32];
TOOLINFO ti;
my_memset(&ti, 0, sizeof(TOOLINFO));
@@ -139,13 +142,13 @@ void UpdateToolBarCompressorButton()
sizeof(temp));
my_memset(szBuffer, 0, sizeof(szBuffer));
lstrcat(szBuffer,temp);
- lstrcat(szBuffer," [");
+ lstrcat(szBuffer,_T(" ["));
LoadString(g_sdata.hInstance,
iString,
temp,
sizeof(temp));
lstrcat(szBuffer,temp);
- lstrcat(szBuffer,"]");
+ lstrcat(szBuffer,_T("]"));
SendMessage(g_toolbar.hwnd, TB_CHANGEBITMAP, (WPARAM) IDM_COMPRESSOR, (LPARAM) MAKELPARAM(iBitmap, 0));
@@ -155,14 +158,14 @@ void UpdateToolBarCompressorButton()
ti.hwnd = g_toolbar.hwnd;
ti.uId = (UINT)TBB_COMPRESSOR;
SendMessage(g_tip.tip, TTM_GETTOOLINFO, 0, (LPARAM) (LPTOOLINFO) &ti);
- ti.lpszText = (LPSTR)szBuffer;
+ ti.lpszText = (LPTSTR)szBuffer;
SendMessage(g_tip.tip, TTM_SETTOOLINFO, 0, (LPARAM) (LPTOOLINFO) &ti);
}
void AddToolBarButtonTooltip(int id, int iString)
{
TOOLINFO ti;
- char szBuffer[64];
+ TCHAR szBuffer[64];
RECT rect;
my_memset(&ti, 0, sizeof(TOOLINFO));
@@ -179,7 +182,7 @@ void AddToolBarButtonTooltip(int id, int iString)
iString,
szBuffer,
sizeof(szBuffer));
- ti.lpszText = (LPSTR) szBuffer;
+ ti.lpszText = (LPTSTR) szBuffer;
ti.rect.left =rect.left;
ti.rect.top = rect.top;
ti.rect.right = rect.right;
diff --git a/Contrib/Makensisw/toolbar.h b/Contrib/Makensisw/toolbar.h
index 568118a6..989fef61 100644
--- a/Contrib/Makensisw/toolbar.h
+++ b/Contrib/Makensisw/toolbar.h
@@ -18,6 +18,7 @@
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
+ Reviewed for Unicode support by Jim Park -- 08/20/2007
*/
#ifndef TOOLBAR_H
#define TOOLBAR_H
diff --git a/Contrib/Makensisw/update.cpp b/Contrib/Makensisw/update.cpp
index 9dcbc17a..f509d3b2 100644
--- a/Contrib/Makensisw/update.cpp
+++ b/Contrib/Makensisw/update.cpp
@@ -1,8 +1,11 @@
+// Unicode support by Jim Park -- 08/20/2007
+
#include "makensisw.h"
#include "update.h"
#include "noclib.h"
#include "jnetlib/httpget.h"
+#include "../ExDLL/nsis_tchar.h"
static BOOL update_initialized = FALSE;
@@ -28,12 +31,12 @@ void FinalizeUpdate() {
int getProxyInfo(char *out) {
DWORD v=0;
HKEY hKey;
- if (RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",0,KEY_READ,&hKey) == ERROR_SUCCESS) {
+ if (RegOpenKeyExA(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",0,KEY_READ,&hKey) == ERROR_SUCCESS) {
DWORD l = 4;
DWORD t;
- if (RegQueryValueEx(hKey,"ProxyEnable",NULL,&t,(unsigned char *)&v,&l) == ERROR_SUCCESS && t == REG_DWORD) {
+ if (RegQueryValueExA(hKey,"ProxyEnable",NULL,&t,(unsigned char *)&v,&l) == ERROR_SUCCESS && t == REG_DWORD) {
l=8192;
- if (RegQueryValueEx(hKey,"ProxyServer",NULL,&t,(unsigned char *)out,&l ) != ERROR_SUCCESS || t != REG_SZ) {
+ if (RegQueryValueExA(hKey,"ProxyServer",NULL,&t,(unsigned char *)out,&l ) != ERROR_SUCCESS || t != REG_SZ) {
v=0;
*out=0;
}
@@ -53,6 +56,7 @@ DWORD CALLBACK UpdateThread(LPVOID v) {
char url[300];
BOOL error = FALSE;
static char pbuf[8192];
+ static char ansiBuf[1024];
char *p=NULL;
*response = 0;
@@ -72,9 +76,16 @@ DWORD CALLBACK UpdateThread(LPVOID v) {
InitializeUpdate();
JNL_HTTPGet *get = new JNL_HTTPGet(g_dns,8192,(p&&p[0])?p:NULL);;
- lstrcpy(url,NSIS_UPDATE);
- lstrcat(url,g_sdata.brandingv);
- lstrcpy(response,"");
+ lstrcpyA(url,NSIS_UPDATE);
+
+#ifdef _UNICODE
+ WideCharToMultiByte(CP_ACP, 0, g_sdata.brandingv, -1, ansiBuf, sizeof(ansiBuf), NULL, NULL);
+ lstrcatA(url,ansiBuf);
+#else
+ lstrcatA(url,g_sdata.brandingv);
+#endif
+
+ lstrcpyA(response,"");
get->addheader("User-Agent: MakeNSISw (jnetlib)");
get->addheader("Accept:*/*");
get->connect(url);
@@ -85,10 +96,10 @@ DWORD CALLBACK UpdateThread(LPVOID v) {
while(len=get->bytes_available()) {
char b[RSZ];
if (len>RSZ) len=RSZ;
- if (lstrlen(response)+len>RSZ) break;
+ if (lstrlenA(response)+len>RSZ) break;
len=get->get_bytes(b,len);
b[len]=0;
- lstrcat(response,b);
+ lstrcatA(response,b);
}
}
if (st==1) break; //closed
@@ -100,26 +111,26 @@ DWORD CALLBACK UpdateThread(LPVOID v) {
}
if (error) {
char buf[1000];
- wsprintf(buf,"There was a problem checking for an update. Please try again later.\n\nError: %s",get->geterrorstr());
- MessageBox(g_sdata.hwnd,buf,"NSIS Update",MB_OK|MB_ICONINFORMATION);
+ wsprintfA(buf, "There was a problem checking for an update. Please try again later.\n\nError: %s",get->geterrorstr());
+ MessageBoxA(g_sdata.hwnd,buf,"NSIS Update",MB_OK|MB_ICONINFORMATION);
}
- else if (*response=='1'&&lstrlen(response)>2) {
+ else if (*response=='1'&&lstrlenA(response)>2) {
char buf[200];
response+=2;
- wsprintf(buf,"NSIS %s is now available. Would you like to download it now?",response);
- if (MessageBox(g_sdata.hwnd,buf,"NSIS Update",MB_YESNO|MB_ICONINFORMATION)==IDYES) {
- ShellExecute(g_sdata.hwnd,"open",NSIS_DL_URL,NULL,NULL,SW_SHOWNORMAL);
+ wsprintfA(buf, "NSIS %s is now available. Would you like to download it now?",response);
+ if (MessageBoxA(g_sdata.hwnd,buf,"NSIS Update",MB_YESNO|MB_ICONINFORMATION)==IDYES) {
+ ShellExecuteA(g_sdata.hwnd,"open",NSIS_DL_URL,NULL,NULL,SW_SHOWNORMAL);
}
}
- else if (*response=='2'&&lstrlen(response)>2) {
+ else if (*response=='2'&&lstrlenA(response)>2) {
char buf[200];
response+=2;
- wsprintf(buf,"NSIS %s is now available. Would you like to download this preview release now?",response);
- if (MessageBox(g_sdata.hwnd,buf,"NSIS Update",MB_YESNO|MB_ICONINFORMATION)==IDYES) {
- ShellExecute(g_sdata.hwnd,"open",NSIS_DL_URL,NULL,NULL,SW_SHOWNORMAL);
+ wsprintfA(buf,"NSIS %s is now available. Would you like to download this preview release now?",response);
+ if (MessageBoxA(g_sdata.hwnd,buf,"NSIS Update",MB_YESNO|MB_ICONINFORMATION)==IDYES) {
+ ShellExecuteA(g_sdata.hwnd,"open",NSIS_DL_URL,NULL,NULL,SW_SHOWNORMAL);
}
}
- else MessageBox(g_sdata.hwnd,"There is no update available for NSIS at this time.","NSIS Update",MB_OK|MB_ICONINFORMATION);
+ else MessageBoxA(g_sdata.hwnd,"There is no update available for NSIS at this time.","NSIS Update",MB_OK|MB_ICONINFORMATION);
GlobalFree(response);
delete get;
EnableMenuItem(g_sdata.menu,IDM_NSISUPDATE,MF_ENABLED);
@@ -129,9 +140,9 @@ DWORD CALLBACK UpdateThread(LPVOID v) {
void Update() {
DWORD dwThreadId;
- if (my_strstr(g_sdata.brandingv,"cvs"))
+ if (my_strstr(g_sdata.brandingv,_T("cvs")))
{
- MessageBox(g_sdata.hwnd,"Cannot check for new version of nightly builds. To update, download a new nightly build.","NSIS Update",MB_OK|MB_ICONSTOP);
+ MessageBox(g_sdata.hwnd,_T("Cannot check for new version of nightly builds. To update, download a new nightly build."),_T("NSIS Update"),MB_OK|MB_ICONSTOP);
return;
}
diff --git a/Contrib/Makensisw/update.h b/Contrib/Makensisw/update.h
index fa9c2bb3..942c7dbc 100644
--- a/Contrib/Makensisw/update.h
+++ b/Contrib/Makensisw/update.h
@@ -1,3 +1,5 @@
+/* Reviewed for Unicode support by Jim Park -- 08/18/2007
+
/* Initialize update objects. */
void InitializeUpdate();
diff --git a/Contrib/Makensisw/utils.cpp b/Contrib/Makensisw/utils.cpp
index 430f0e90..9a76d977 100644
--- a/Contrib/Makensisw/utils.cpp
+++ b/Contrib/Makensisw/utils.cpp
@@ -18,6 +18,8 @@
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
+ Unicode support by Jim Park -- 08/20/2007
+
*/
#include "makensisw.h"
@@ -28,46 +30,46 @@
NTOOLTIP g_tip;
LRESULT CALLBACK TipHookProc(int nCode, WPARAM wParam, LPARAM lParam);
-char g_mru_list[MRU_LIST_SIZE][MAX_PATH] = { "", "", "", "", "" };
+TCHAR g_mru_list[MRU_LIST_SIZE][MAX_PATH] = { _T(""), _T(""), _T(""), _T(""), _T("") };
extern NSCRIPTDATA g_sdata;
-extern char *compressor_names[];
+extern TCHAR *compressor_names[];
-int SetArgv(const char *cmdLine, int *argc, char ***argv)
+int SetArgv(const TCHAR *cmdLine, int *argc, TCHAR ***argv)
{
- const char *p;
- char *arg, *argSpace;
+ const TCHAR *p;
+ TCHAR *arg, *argSpace;
int size, argSpaceSize, inquote, copy, slashes;
size = 2;
- for (p = cmdLine; *p != '\0'; p++) {
- if ((*p == ' ') || (*p == '\t')) {
+ for (p = cmdLine; *p != _T('\0'); p++) {
+ if ((*p == _T(' ')) || (*p == _T('\t'))) {
size++;
- while ((*p == ' ') || (*p == '\t')) {
+ while ((*p == _T(' ')) || (*p == _T('\t'))) {
p++;
}
- if (*p == '\0') {
+ if (*p == _T('\0')) {
break;
}
}
}
- argSpaceSize = size * sizeof(char *) + lstrlen(cmdLine) + 1;
- argSpace = (char *) GlobalAlloc(GMEM_FIXED, argSpaceSize);
+ argSpaceSize = size * sizeof(TCHAR *) + lstrlen(cmdLine) + 1;
+ argSpace = (TCHAR *) GlobalAlloc(GMEM_FIXED, argSpaceSize);
if (!argSpace)
return 0;
- *argv = (char **) argSpace;
- argSpace += size * sizeof(char *);
+ *argv = (TCHAR **) argSpace;
+ argSpace += size * sizeof(TCHAR *);
size--;
p = cmdLine;
for (*argc = 0; *argc < size; (*argc)++) {
(*argv)[*argc] = arg = argSpace;
- while ((*p == ' ') || (*p == '\t')) {
+ while ((*p == _T(' ')) || (*p == _T('\t'))) {
p++;
}
- if (*p == '\0') {
+ if (*p == _T('\0')) {
break;
}
@@ -75,14 +77,14 @@ int SetArgv(const char *cmdLine, int *argc, char ***argv)
slashes = 0;
while (1) {
copy = 1;
- while (*p == '\\') {
+ while (*p == _T('\\')) {
slashes++;
p++;
}
- if (*p == '"') {
+ if (*p == _T('"')) {
if ((slashes & 1) == 0) {
copy = 0;
- if ((inquote) && (p[1] == '"')) {
+ if ((inquote) && (p[1] == _T('"'))) {
p++;
copy = 1;
}
@@ -94,12 +96,12 @@ int SetArgv(const char *cmdLine, int *argc, char ***argv)
}
while (slashes) {
- *arg = '\\';
+ *arg = _T('\\');
arg++;
slashes--;
}
- if ((*p == '\0') || (!inquote && ((*p == ' ') || (*p == '\t')))) {
+ if ((*p == _T('\0')) || (!inquote && ((*p == _T(' ')) || (*p == _T('\t'))))) {
break;
}
if (copy != 0) {
@@ -108,7 +110,7 @@ int SetArgv(const char *cmdLine, int *argc, char ***argv)
}
p++;
}
- *arg = '\0';
+ *arg = _T('\0');
argSpace = arg + 1;
}
(*argv)[*argc] = NULL;
@@ -116,10 +118,10 @@ int SetArgv(const char *cmdLine, int *argc, char ***argv)
return argSpaceSize;
}
-void SetTitle(HWND hwnd,char *substr) {
- char title[64];
- if (substr==NULL) wsprintf(title,"MakeNSISW");
- else wsprintf(title,"MakeNSISW - %s",substr);
+void SetTitle(HWND hwnd,TCHAR *substr) {
+ TCHAR title[64];
+ if (substr==NULL) wsprintf(title,_T("MakeNSISW"));
+ else wsprintf(title,_T("MakeNSISW - %s"),substr);
SetWindowText(hwnd,title);
}
@@ -130,9 +132,9 @@ void SetBranding(HWND hwnd) {
void CopyToClipboard(HWND hwnd) {
if (!hwnd||!OpenClipboard(hwnd)) return;
int len=SendDlgItemMessage(hwnd,IDC_LOGWIN,WM_GETTEXTLENGTH,0,0);
- HGLOBAL mem = GlobalAlloc(GMEM_MOVEABLE,len+1);
+ HGLOBAL mem = GlobalAlloc(GMEM_MOVEABLE,(len+1)*sizeof(TCHAR));
if (!mem) { CloseClipboard(); return; }
- char *existing_text = (char *)GlobalLock(mem);
+ TCHAR *existing_text = (TCHAR *)GlobalLock(mem);
if (!existing_text) { CloseClipboard(); return; }
EmptyClipboard();
existing_text[0]=0;
@@ -143,20 +145,20 @@ void CopyToClipboard(HWND hwnd) {
}
void ClearLog(HWND hwnd) {
- SetDlgItemText(hwnd, IDC_LOGWIN, "");
+ SetDlgItemText(hwnd, IDC_LOGWIN, _T(""));
}
-void LogMessage(HWND hwnd,const char *str) {
+void LogMessage(HWND hwnd,const TCHAR *str) {
SendDlgItemMessage(hwnd, IDC_LOGWIN, EM_SETSEL, g_sdata.logLength, g_sdata.logLength);
g_sdata.logLength += lstrlen(str);
- SendDlgItemMessage(hwnd, IDC_LOGWIN, EM_REPLACESEL, 0, (WPARAM)str);
+ SendDlgItemMessage(hwnd, IDC_LOGWIN, EM_REPLACESEL, 0, (LPARAM)str);
SendDlgItemMessage(hwnd, IDC_LOGWIN, EM_SCROLLCARET, 0, 0);
}
-void ErrorMessage(HWND hwnd,const char *str) {
+void ErrorMessage(HWND hwnd,const TCHAR *str) {
if (!str) return;
- char buf[1028];
- wsprintf(buf,"[Error] %s\r\n",str);
+ TCHAR buf[1028];
+ wsprintf(buf,_T("[Error] %s\r\n"),str);
LogMessage(hwnd,buf);
}
@@ -218,7 +220,7 @@ void Items(HWND hwnd, int on){
void SetCompressorStats()
{
DWORD line_count, i;
- char buf[1024];
+ TCHAR buf[1024];
bool found = false;
line_count = SendDlgItemMessage(g_sdata.hwnd, IDC_LOGWIN, EM_GETLINECOUNT, 0, 0);
@@ -237,7 +239,7 @@ void SetCompressorStats()
DWORD len = lstrlen(EXE_HEADER_COMPRESSOR_STAT);
if(!lstrncmp(buf,EXE_HEADER_COMPRESSOR_STAT,len)) {
found = true;
- lstrcpy(g_sdata.compressor_stats,"\n\n");
+ lstrcpy(g_sdata.compressor_stats,_T("\n\n"));
lstrcat(g_sdata.compressor_stats,buf);
}
}
@@ -245,7 +247,7 @@ void SetCompressorStats()
}
void CompileNSISScript() {
- static char *s;
+ static TCHAR *s;
DragAcceptFiles(g_sdata.hwnd,FALSE);
ClearLog(g_sdata.hwnd);
SetTitle(g_sdata.hwnd,NULL);
@@ -270,31 +272,31 @@ void CompileNSISScript() {
}
if (!g_sdata.compile_command) {
if (s) GlobalFree(s);
- char *symbols = BuildSymbols();
+ TCHAR *symbols = BuildSymbols();
- char compressor[40];
+ TCHAR compressor[40];
if(lstrlen(g_sdata.compressor_name)) {
- wsprintf(compressor,"/X\"SetCompressor /FINAL %s\"",g_sdata.compressor_name);
+ wsprintf(compressor,_T("/X\"SetCompressor /FINAL %s\""),g_sdata.compressor_name);
}
else {
- lstrcpy(compressor,"");
+ lstrcpy(compressor,_T(""));
}
- char *args = (char *) GlobalLock(g_sdata.script_cmd_args);
+ TCHAR *args = (TCHAR *) GlobalLock(g_sdata.script_cmd_args);
g_sdata.compile_command = (char *) GlobalAlloc(
GPTR,
- /* makensis.exe */ sizeof(EXENAME) + /* space */ 1 +
+ /* makensis.exe */ _countof(EXENAME) + /* space */ 1 +
/* script path */ lstrlen(g_sdata.script) + /* space */ 1 +
/* script cmd args */ lstrlen(args) + /* space */ 1 +
/* defines /Dblah=... */ lstrlen(symbols) + /* space */ 1 +
/* /XSetCompressor... */ lstrlen(compressor) + /* space */ 1 +
- /* /NOTTIFYHWND + HWND */ sizeof("/NOTIFYHWND -4294967295") + /* space */ 1
- );
+ /* /NOTTIFYHWND + HWND */ _countof(_T("/NOTIFYHWND -4294967295")) + /* space */ 1
+ );
wsprintf(
g_sdata.compile_command,
- "%s %s %s /NOTIFYHWND %d %s -- \"%s\"",
+ _T("%s %s %s /NOTIFYHWND %d %s -- \"%s\""),
EXENAME,
compressor,
symbols,
@@ -343,7 +345,7 @@ void RestoreWindowPos(HWND hwnd) {
if (OpenRegSettingsKey(hKey)) {
DWORD l = sizeof(p);
DWORD t;
- if ((RegQueryValueEx(hKey,REGLOC,NULL,&t,(unsigned char*)&p,&l)==ERROR_SUCCESS)&&(t == REG_BINARY)&&(l==sizeof(p))) {
+ if ((RegQueryValueEx(hKey,REGLOC,NULL,&t,(LPBYTE)&p,&l)==ERROR_SUCCESS)&&(t == REG_BINARY)&&(l==sizeof(p))) {
int width, height;
int windowWidth, windowHeight;
@@ -391,7 +393,7 @@ void SaveWindowPos(HWND hwnd) {
p.length = sizeof(p);
GetWindowPlacement(hwnd, &p);
if (OpenRegSettingsKey(hKey, true)) {
- RegSetValueEx(hKey,REGLOC,0,REG_BINARY,(unsigned char*)&p,sizeof(p));
+ RegSetValueEx(hKey,REGLOC,0,REG_BINARY,(LPBYTE)&p,sizeof(p));
RegCloseKey(hKey);
}
}
@@ -406,34 +408,34 @@ void SaveSymbols()
SaveSymbolSet(NULL, g_sdata.symbols);
}
-void DeleteSymbolSet(char *name)
+void DeleteSymbolSet(TCHAR *name)
{
if(name) {
HKEY hKey;
if (OpenRegSettingsKey(hKey)) {
- char subkey[1024];
- wsprintf(subkey,"%s\\%s",REGSYMSUBKEY,name);
+ TCHAR subkey[1024];
+ wsprintf(subkey,_T("%s\\%s"),REGSYMSUBKEY,name);
RegDeleteKey(hKey,subkey);
RegCloseKey(hKey);
}
}
}
-char** LoadSymbolSet(char *name)
+TCHAR** LoadSymbolSet(TCHAR *name)
{
HKEY hKey;
HKEY hSubKey;
- char **symbols = NULL;
+ TCHAR **symbols = NULL;
if (OpenRegSettingsKey(hKey)) {
- char subkey[1024];
+ TCHAR subkey[1024];
if(name) {
- wsprintf(subkey,"%s\\%s",REGSYMSUBKEY,name);
+ wsprintf(subkey,_T("%s\\%s"),REGSYMSUBKEY,name);
}
else {
lstrcpy(subkey,REGSYMSUBKEY);
}
if (RegCreateKey(hKey,subkey,&hSubKey) == ERROR_SUCCESS) {
- char buf[8];
+ TCHAR buf[8];
DWORD l;
DWORD t;
DWORD bufSize;
@@ -446,16 +448,16 @@ char** LoadSymbolSet(char *name)
if ((RegEnumValue(hSubKey,i, buf, &bufSize,NULL,&t,NULL,&l)==ERROR_SUCCESS)&&(t == REG_SZ)) {
if(symbols) {
GlobalUnlock(hMem);
- hMem = GlobalReAlloc(hMem, (i+2)*sizeof(char *), GMEM_MOVEABLE|GMEM_ZEROINIT);
- symbols = (char **)GlobalLock(hMem);
+ hMem = GlobalReAlloc(hMem, (i+2)*sizeof(TCHAR *), GMEM_MOVEABLE|GMEM_ZEROINIT);
+ symbols = (TCHAR **)GlobalLock(hMem);
}
else {
- hMem = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, (i+2)*sizeof(char *));
- symbols = (char **)GlobalLock(hMem);
+ hMem = GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT, (i+2)*sizeof(TCHAR *));
+ symbols = (TCHAR **)GlobalLock(hMem);
}
if(symbols) {
l++;
- symbols[i] = (char *)GlobalAlloc(GPTR, l*sizeof(char));
+ symbols[i] = (TCHAR *)GlobalAlloc(GPTR, l*sizeof(TCHAR));
if (symbols[i]) {
RegQueryValueEx(hSubKey,buf,NULL,&t,(unsigned char*)symbols[i],&l);
}
@@ -481,22 +483,22 @@ char** LoadSymbolSet(char *name)
return symbols;
}
-void SaveSymbolSet(char *name, char **symbols)
+void SaveSymbolSet(TCHAR *name, TCHAR **symbols)
{
HKEY hKey;
HKEY hSubKey;
int n = 0;
if (OpenRegSettingsKey(hKey, true)) {
- char subkey[1024];
+ TCHAR subkey[1024];
if(name) {
- wsprintf(subkey,"%s\\%s",REGSYMSUBKEY,name);
+ wsprintf(subkey,_T("%s\\%s"),REGSYMSUBKEY,name);
}
else {
lstrcpy(subkey,REGSYMSUBKEY);
}
if (RegOpenKey(hKey,subkey,&hSubKey) == ERROR_SUCCESS) {
- char buf[8];
+ TCHAR buf[8];
DWORD l;
while(TRUE) {
l = sizeof(buf);
@@ -511,11 +513,11 @@ void SaveSymbolSet(char *name, char **symbols)
}
if(symbols) {
if (RegCreateKey(hKey,subkey,&hSubKey) == ERROR_SUCCESS) {
- char buf[8];
+ TCHAR buf[8];
n = 0;
while(symbols[n]) {
- wsprintf(buf,"%d",n);
- RegSetValueEx(hSubKey,buf,0,REG_SZ,(CONST BYTE *)symbols[n],lstrlen(symbols[n])+1);
+ wsprintf(buf,_T("%d"),n);
+ RegSetValueEx(hSubKey,buf,0,REG_SZ,(CONST BYTE *)symbols[n],(lstrlen(symbols[n])+1)*sizeof(TCHAR));
n++;
}
RegCloseKey(hSubKey);
@@ -551,9 +553,9 @@ void ResetSymbols() {
}
int InitBranding() {
- char *s;
- s = (char *)GlobalAlloc(GPTR,lstrlen(EXENAME)+10);
- wsprintf(s,"%s /version",EXENAME);
+ TCHAR *s;
+ s = (TCHAR *)GlobalAlloc(GPTR,lstrlen(EXENAME)+10);
+ wsprintf(s,_T("%s /version"),EXENAME);
{
STARTUPINFO si={sizeof(si),};
SECURITY_ATTRIBUTES sa={sizeof(sa),};
@@ -583,7 +585,7 @@ int InitBranding() {
CloseHandle(read_stdout);
return 0;
}
- char szBuf[1024];
+ TCHAR szBuf[1024];
DWORD dwRead = 1;
if (WaitForSingleObject(pi.hProcess,10000)!=WAIT_OBJECT_0) {
return 0;
@@ -591,9 +593,9 @@ int InitBranding() {
ReadFile(read_stdout, szBuf, sizeof(szBuf)-1, &dwRead, NULL);
szBuf[dwRead] = 0;
if (lstrlen(szBuf)==0) return 0;
- g_sdata.branding = (char *)GlobalAlloc(GPTR,lstrlen(szBuf)+6);
- wsprintf(g_sdata.branding,"NSIS %s",szBuf);
- g_sdata.brandingv = (char *)GlobalAlloc(GPTR,lstrlen(szBuf)+1);
+ g_sdata.branding = (TCHAR *)GlobalAlloc(GPTR,(lstrlen(szBuf)+6)*sizeof(TCHAR));
+ wsprintf(g_sdata.branding,_T("NSIS %s"),szBuf);
+ g_sdata.brandingv = (TCHAR *)GlobalAlloc(GPTR,(lstrlen(szBuf)+1)*sizeof(TCHAR));
lstrcpy(g_sdata.brandingv,szBuf);
GlobalFree(s);
}
@@ -613,8 +615,8 @@ void InitTooltips(HWND h) {
g_tip.tip = CreateWindowEx(dwExStyle,TOOLTIPS_CLASS,NULL,dwStyle,0,0,0,0,h,NULL,GetModuleHandle(NULL),NULL);
if (!g_tip.tip) return;
g_tip.hook = SetWindowsHookEx(WH_GETMESSAGE,TipHookProc,NULL, GetCurrentThreadId());
- AddTip(GetDlgItem(h,IDCANCEL),TEXT("Close MakeNSISW"));
- AddTip(GetDlgItem(h,IDC_TEST),TEXT("Test the installer generated by MakeNSISW"));
+ AddTip(GetDlgItem(h,IDCANCEL),_T("Close MakeNSISW"));
+ AddTip(GetDlgItem(h,IDC_TEST),_T("Test the installer generated by MakeNSISW"));
AddToolBarTooltips();
}
@@ -622,7 +624,7 @@ void DestroyTooltips() {
UnhookWindowsHookEx(g_tip.hook);
}
-void AddTip(HWND hWnd,LPSTR lpszToolTip) {
+void AddTip(HWND hWnd,LPTSTR lpszToolTip) {
TOOLINFO ti;
ti.cbSize = sizeof(TOOLINFO);
ti.uFlags = TTF_IDISHWND;
@@ -646,44 +648,44 @@ LRESULT CALLBACK TipHookProc(int nCode, WPARAM wParam, LPARAM lParam) {
}
void ShowDocs() {
- char pathf[MAX_PATH],*path;
+ TCHAR pathf[MAX_PATH],*path;
GetModuleFileName(NULL,pathf,sizeof(pathf));
- path=my_strrchr(pathf,'\\');
+ path=my_strrchr(pathf,_T('\\'));
if(path!=NULL) *path=0;
lstrcat(pathf,LOCALDOCS);
- if ((int)ShellExecute(g_sdata.hwnd,"open",pathf,NULL,NULL,SW_SHOWNORMAL)<=32)
- ShellExecute(g_sdata.hwnd,"open",DOCPATH,NULL,NULL,SW_SHOWNORMAL);
+ if ((int)ShellExecute(g_sdata.hwnd,_T("open"),pathf,NULL,NULL,SW_SHOWNORMAL)<=32)
+ ShellExecuteA(g_sdata.hwnd,"open",DOCPATH,NULL,NULL,SW_SHOWNORMAL);
}
-char* BuildSymbols()
+TCHAR* BuildSymbols()
{
- char *buf = NULL;
+ TCHAR *buf = NULL;
if(g_sdata.symbols) {
int i=0;
while(g_sdata.symbols[i]) {
if(buf) {
- char *buf3 = (char *)GlobalAlloc(GPTR,(lstrlen(buf)+lstrlen(g_sdata.symbols[i])+6)*sizeof(char));
- wsprintf(buf3,"%s \"/D%s\"",buf,g_sdata.symbols[i]);
+ TCHAR *buf3 = (TCHAR *)GlobalAlloc(GPTR,(lstrlen(buf)+lstrlen(g_sdata.symbols[i])+6)*sizeof(TCHAR));
+ wsprintf(buf3,_T("%s \"/D%s\""),buf,g_sdata.symbols[i]);
GlobalFree(buf);
buf = buf3;
}
else {
- buf = (char *)GlobalAlloc(GPTR,(lstrlen(g_sdata.symbols[i])+5)*sizeof(char));
- wsprintf(buf,"\"/D%s\"",g_sdata.symbols[i]);
+ buf = (TCHAR *)GlobalAlloc(GPTR,(lstrlen(g_sdata.symbols[i])+5)*sizeof(TCHAR));
+ wsprintf(buf,_T("\"/D%s\""),g_sdata.symbols[i]);
}
i++;
}
}
else {
- buf = (char *)GlobalAlloc(GPTR, sizeof(char));
- buf[0] = '\0';
+ buf = (TCHAR *)GlobalAlloc(GPTR, sizeof(TCHAR));
+ buf[0] = _T('\0');
}
return buf;
}
-BOOL PopMRUFile(char* fname)
+BOOL PopMRUFile(TCHAR* fname)
{
int i;
@@ -698,7 +700,7 @@ BOOL PopMRUFile(char* fname)
for(j = i; j < MRU_LIST_SIZE-1; j++) {
lstrcpy(g_mru_list[j],g_mru_list[j+1]);
}
- g_mru_list[MRU_LIST_SIZE-1][0]='\0';
+ g_mru_list[MRU_LIST_SIZE-1][0]=_T('\0');
return TRUE;
}
else {
@@ -706,7 +708,7 @@ BOOL PopMRUFile(char* fname)
}
}
-BOOL IsValidFile(char *fname)
+BOOL IsValidFile(TCHAR *fname)
{
WIN32_FIND_DATA wfd;
HANDLE h;
@@ -719,19 +721,19 @@ BOOL IsValidFile(char *fname)
return false;
}
-void PushMRUFile(char* fname)
+void PushMRUFile(TCHAR* fname)
{
int i;
DWORD rv;
- char* file_part;
- char full_file_name[MAX_PATH+1];
+ TCHAR* file_part;
+ TCHAR full_file_name[MAX_PATH+1];
- if(!fname || fname[0] == '\0' || fname[0] == '/' || fname[0] == '-') {
+ if(!fname || fname[0] == _T('\0') || fname[0] == _T('/') || fname[0] == _T('-')) {
return;
}
my_memset(full_file_name,0,sizeof(full_file_name));
- rv = GetFullPathName(fname,sizeof(full_file_name),full_file_name,&file_part);
+ rv = GetFullPathName(fname,_countof(full_file_name),full_file_name,&file_part);
if (rv == 0) {
return;
}
@@ -751,9 +753,9 @@ void BuildMRUMenus()
HMENU hMenu = g_sdata.fileSubmenu;
int i;
MENUITEMINFO mii;
- char buf[MRU_DISPLAY_LENGTH + 5/*number*/ + 1/*null*/];
- char buf2[MRU_DISPLAY_LENGTH - 6];
- char buf3[MRU_DISPLAY_LENGTH + 1];
+ TCHAR buf[MRU_DISPLAY_LENGTH + 5/*number*/ + 1/*null*/];
+ TCHAR buf2[MRU_DISPLAY_LENGTH - 6];
+ TCHAR buf3[MRU_DISPLAY_LENGTH + 1];
int n;
for(i = 0; i < MRU_LIST_SIZE; i++) {
@@ -770,32 +772,32 @@ void BuildMRUMenus()
mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE;
mii.wID = IDM_MRU_FILE+i;
mii.fType = MFT_STRING;
- wsprintf(buf, "&%d ", i + 1);
+ wsprintf(buf, _T("&%d "), i + 1);
if(lstrlen(g_mru_list[i]) > MRU_DISPLAY_LENGTH) {
- char *p = my_strrchr(g_mru_list[i],'\\');
+ TCHAR *p = my_strrchr(g_mru_list[i],_T('\\'));
if(p) {
p++;
if(lstrlen(p) > MRU_DISPLAY_LENGTH - 7) {
my_memset(buf2,0,sizeof(buf2));
lstrcpyn(buf2,p,MRU_DISPLAY_LENGTH - 9);
- lstrcat(buf2,"...");
+ lstrcat(buf2,_T("..."));
lstrcpyn(buf3,g_mru_list[i],4);
lstrcat(buf,buf3);
- lstrcat(buf,"...\\");
+ lstrcat(buf,_T("...\\"));
lstrcat(buf,buf2);
}
else {
lstrcpyn(buf3,g_mru_list[i],(MRU_DISPLAY_LENGTH - lstrlen(p) - 3));
lstrcat(buf,buf3);
- lstrcat(buf,"...\\");
+ lstrcat(buf,_T("...\\"));
lstrcat(buf,p);
}
}
else {
lstrcpyn(buf3,g_mru_list[i],(MRU_DISPLAY_LENGTH-2));
lstrcat(buf,buf3);
- lstrcat(buf,"...");
+ lstrcat(buf,_T("..."));
}
}
else {
@@ -852,13 +854,13 @@ void RestoreMRUList()
int i;
if (OpenRegSettingsKey(hKey)) {
if (RegCreateKey(hKey,REGMRUSUBKEY,&hSubKey) == ERROR_SUCCESS) {
- char buf[8];
+ TCHAR buf[8];
DWORD l;
for(int i=0; i
#include // nsis plugin
#include "MyMath.h"
@@ -15,12 +17,12 @@ int UserVarsCount, UserFuncsCount;
UserVar UserVars[MAX_USER_VARS];
UserFunc UserFuncs[MAX_USER_FUNCS];
-void PrintTree(ExpressionItem *root, char *str);
-void ParseString(char *&sp, ExpressionItem* &itemplace);
+void PrintTree(ExpressionItem *root, TCHAR *str);
+void ParseString(TCHAR *&sp, ExpressionItem* &itemplace);
void CleanupItems(ExpressionItem* &itemplace);
-void PlaceVariable(char *&vb, ParseInfo *pi);
+void PlaceVariable(TCHAR *&vb, ParseInfo *pi);
-void PlaceNewItem(char *&vb, ParseInfo *pi, int precedence)
+void PlaceNewItem(TCHAR *&vb, ParseInfo *pi, int precedence)
{
ExpressionItem *newroot;
PlaceVariable(vb, pi);
@@ -56,12 +58,12 @@ void PlaceNewItem(char *&vb, ParseInfo *pi, int precedence)
#define NSIS_VARS_STACK 25
#define NSIS_VARS_NSTACK 26
-typedef char smallstr[2];
-const smallstr NSISVariablesNames[NSIS_VARS_COUNT] = {{'r','0'}, {'r','1'}, {'r','2'}, {'r','3'}, {'r','4'}, {'r','5'}, {'r','6'}, {'r','7'}, {'r','8'}, {'r','9'},
-{'R','0'}, {'R','1'}, {'R','2'}, {'R','3'}, {'R','4'}, {'R','5'}, {'R','6'}, {'R','7'}, {'R','8'}, {'R','9'},
-{'C','L'}, {'I','D'}, {'O','D'}, {'E','D'}, {'L','G'}, {'S',0}, {'N','S'}};
+typedef TCHAR smallstr[2];
+const smallstr NSISVariablesNames[NSIS_VARS_COUNT] = {{_T('r'),_T('0')}, {_T('r'),_T('1')}, {_T('r'),_T('2')}, {_T('r'),_T('3')}, {_T('r'),_T('4')}, {_T('r'),_T('5')}, {_T('r'),_T('6')}, {_T('r'),_T('7')}, {_T('r'),_T('8')}, {_T('r'),_T('9')},
+{_T('R'),_T('0')}, {_T('R'),_T('1')}, {_T('R'),_T('2')}, {_T('R'),_T('3')}, {_T('R'),_T('4')}, {_T('R'),_T('5')}, {_T('R'),_T('6')}, {_T('R'),_T('7')}, {_T('R'),_T('8')}, {_T('R'),_T('9')},
+{_T('C'),_T('L')}, {_T('I'),_T('D')}, {_T('O'),_T('D')}, {_T('E'),_T('D')}, {_T('L'),_T('G')}, {_T('S'),0}, {_T('N'),_T('S')}};
-ExpressionItem *FindVariable(char *varname)
+ExpressionItem *FindVariable(TCHAR *varname)
{
int i;
@@ -98,7 +100,7 @@ ExpressionItem *FindVariable(char *varname)
return item;
}
-void PlaceVariable(char *&vb, ParseInfo *pi)
+void PlaceVariable(TCHAR *&vb, ParseInfo *pi)
{
if (vb <= pi->valbuf) return;
*vb = 0;
@@ -112,43 +114,43 @@ typedef double (*math_di)(double, int*);
#define MATHFUNCNUM 29
const MathFunction MathFunctions[MATHFUNCNUM] = {
- {{'s','i','n'}, ITF_MATH1 >> 8, sin},
- {{'s','n','h'}, ITF_MATH1 >> 8, sinh},
- {{'a','s','n'}, ITF_MATH1 >> 8, asin},
- {{'c','o','s'}, ITF_MATH1 >> 8, cos},
- {{'c','s','h'}, ITF_MATH1 >> 8, cosh},
- {{'a','c','s'}, ITF_MATH1 >> 8, acos},
- {{'t','a','n'}, ITF_MATH1 >> 8, tan},
- {{'t','n','h'}, ITF_MATH1 >> 8, tanh},
- {{'a','t','n'}, ITF_MATH1 >> 8, atan},
- {{'a','b','s'}, ITF_MATH1 >> 8, fabs},
- {{'l','n',0}, ITF_MATH1 >> 8, log},
- {{'l','o','g'}, ITF_MATH1 >> 8, log10},
- {{'e','x','p'}, ITF_MATH1 >> 8, exp},
- {{'s','q','t'}, ITF_MATH1 >> 8, sqrt},
- {{'c','e','l'}, ITF_MATH1 >> 8, ceil},
- {{'f','l','r'}, ITF_MATH1 >> 8, floor},
+ {{_T('s'),_T('i'),_T('n')}, ITF_MATH1 >> 8, sin},
+ {{_T('s'),_T('n'),_T('h')}, ITF_MATH1 >> 8, sinh},
+ {{_T('a'),_T('s'),_T('n')}, ITF_MATH1 >> 8, asin},
+ {{_T('c'),_T('o'),_T('s')}, ITF_MATH1 >> 8, cos},
+ {{_T('c'),_T('s'),_T('h')}, ITF_MATH1 >> 8, cosh},
+ {{_T('a'),_T('c'),_T('s')}, ITF_MATH1 >> 8, acos},
+ {{_T('t'),_T('a'),_T('n')}, ITF_MATH1 >> 8, tan},
+ {{_T('t'),_T('n'),_T('h')}, ITF_MATH1 >> 8, tanh},
+ {{_T('a'),_T('t'),_T('n')}, ITF_MATH1 >> 8, atan},
+ {{_T('a'),_T('b'),_T('s')}, ITF_MATH1 >> 8, fabs},
+ {{_T('l'),_T('n'),0}, ITF_MATH1 >> 8, log},
+ {{_T('l'),_T('o'),_T('g')}, ITF_MATH1 >> 8, log10},
+ {{_T('e'),_T('x'),_T('p')}, ITF_MATH1 >> 8, exp},
+ {{_T('s'),_T('q'),_T('t')}, ITF_MATH1 >> 8, sqrt},
+ {{_T('c'),_T('e'),_T('l')}, ITF_MATH1 >> 8, ceil},
+ {{_T('f'),_T('l'),_T('r')}, ITF_MATH1 >> 8, floor},
- {{'a','t','2'}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_d2)atan2},
- {{'p','o','w'}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_d2)pow},
- {{'f','m','d'}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_d2)fmod},
+ {{_T('a'),_T('t'),_T('2')}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_d2)atan2},
+ {{_T('p'),_T('o'),_T('w')}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_d2)pow},
+ {{_T('f'),_T('m'),_T('d')}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_d2)fmod},
// type conversions
- {{'i',0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_INT},
- {{'s',0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_STRING},
- {{'f',0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_FLOAT},
- {{'a',0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_ARRAY},
+ {{_T('i'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_INT},
+ {{_T('s'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_STRING},
+ {{_T('f'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_FLOAT},
+ {{_T('a'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_ARRAY},
#define ITFT_CARRAY_ID 23
- {{'c','a',0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_ARRAY},
- {{'f','f',0}, ITF_TYPE >> 8, (Math1FuncPtr)FTT_FLOATF},
- {{'l',0,0}, ITF_TYPE >> 8, (Math1FuncPtr)FTT_LEN},
- {{'c',0,0}, ITF_TYPE >> 8, (Math1FuncPtr)FTT_CHAR},
+ {{_T('c'),_T('a'),0}, ITF_TYPE >> 8, (Math1FuncPtr)ITC_ARRAY},
+ {{_T('f'),_T('f'),0}, ITF_TYPE >> 8, (Math1FuncPtr)FTT_FLOATF},
+ {{_T('l'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)FTT_LEN},
+ {{_T('c'),0,0}, ITF_TYPE >> 8, (Math1FuncPtr)FTT_CHAR},
- {{'f','e','x'}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_di)frexp},
- {{'m','d','f'}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_ddp)modf},
+ {{_T('f'),_T('e'),_T('x')}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_di)frexp},
+ {{_T('m'),_T('d'),_T('f')}, ITF_MATH2 >> 8, (Math1FuncPtr)(math_ddp)modf},
};
-void PlaceFunction(char *&vb, char *&sp, ParseInfo *pi, int redefine)
+void PlaceFunction(TCHAR *&vb, TCHAR *&sp, ParseInfo *pi, int redefine)
{
int i;
ExpressionItem *item = pi->item = AllocItem();
@@ -163,7 +165,7 @@ void PlaceFunction(char *&vb, char *&sp, ParseInfo *pi, int redefine)
// get first argument
sp++;
ParseString(sp, *((ExpressionItem **)(&item->param1)));
- if (*sp == ',')
+ if (*sp == _T(','))
{
// get second argument
sp++;
@@ -185,7 +187,7 @@ void PlaceFunction(char *&vb, char *&sp, ParseInfo *pi, int redefine)
item->type = IT_FUNCTION | ITF_USER | i;
// get arguments list
ExpressionItem **newplace = ((ExpressionItem **)(&pi->item->param1));
- while (*sp != ')')
+ while (*sp != _T(')'))
{
*newplace = AllocItem();
(*newplace)->type = IT_EXPRESSION;
@@ -203,7 +205,7 @@ void PlaceFunction(char *&vb, char *&sp, ParseInfo *pi, int redefine)
// it's user function define
int flags = 0;
- char buffer[128], *buf = buffer;
+ TCHAR buffer[128], *buf = buffer;
// workaround for redefine flag - if the function already present,
// it will be cleared and redefined
@@ -219,10 +221,10 @@ void PlaceFunction(char *&vb, char *&sp, ParseInfo *pi, int redefine)
sp++;
switch (*sp)
{
- case ' ':
+ case _T(' '):
break;
- case ',':
- case ')':
+ case _T(','):
+ case _T(')'):
if (buf > buffer)
{
*buf = 0;
@@ -234,7 +236,7 @@ void PlaceFunction(char *&vb, char *&sp, ParseInfo *pi, int redefine)
flags <<= 1;
}
break;
- case '&':
+ case _T('&'):
flags |= 1;
break;
default:
@@ -242,7 +244,7 @@ void PlaceFunction(char *&vb, char *&sp, ParseInfo *pi, int redefine)
break;
}
}
- while (*sp != ')');
+ while (*sp != _T(')'));
// prepare flag for fast analisys
for (i = 0; i < f->varsnum; i++)
@@ -253,7 +255,7 @@ void PlaceFunction(char *&vb, char *&sp, ParseInfo *pi, int redefine)
}
// find nearest round bracket - function body
- while (*sp != '(' && *sp) sp++;
+ while (*sp != _T('(') && *sp) sp++;
if (!*sp)
return;
sp++;
@@ -265,17 +267,17 @@ void PlaceFunction(char *&vb, char *&sp, ParseInfo *pi, int redefine)
#ifdef _DEBUG
// dump function (in debug mode)
- char place[1024];
- wsprintf(place, "function %s(", f->name);
+ TCHAR place[1024];
+ wsprintf(place, _T("function %s("), f->name);
flags = f->varflags;
for (i = 0; i < f->varsnum; i++)
{
- if (flags&1) lstrcat(place, "&");
+ if (flags&1) lstrcat(place, _T("&"));
lstrcat(place, UserVars[f->vars[i]].name);
- if (i < f->varsnum-1) lstrcat(place, ", ");
+ if (i < f->varsnum-1) lstrcat(place, _T(", "));
flags >>= 1;
}
- lstrcat(place, ")");
+ lstrcat(place, _T(")"));
PrintTree(f->root, place);
#endif
}
@@ -290,7 +292,7 @@ void PlaceFunction(char *&vb, char *&sp, ParseInfo *pi, int redefine)
#define PO_USESPRE 0x40 // operator will use pre operand
#define PO_USESPOST 0x80 // operator will use post operan
-void PlaceOp(char *&vb, int type, int precedence, ParseInfo *pi)
+void PlaceOp(TCHAR *&vb, int type, int precedence, ParseInfo *pi)
{
PlaceVariable(vb, pi);
if ((type & PO_UNARYPRE) && (!pi->item))
@@ -332,54 +334,54 @@ void PlaceOp(char *&vb, int type, int precedence, ParseInfo *pi)
const OpStruct Operators[OPSNUM] =
{
// three byte ops
-{{'>','>','='}, 14, ITO_SHR | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
-{{'<','<','='}, 14, ITO_SHL | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
+{{_T('>'),_T('>'),_T('=')}, 14, ITO_SHR | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
+{{_T('<'),_T('<'),_T('=')}, 14, ITO_SHL | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
// two byte ops
// !!! don't forget to change Set Operator Precedence !!!
-{"-=", 14, ITO_MINUS | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
-{"+=", 14, ITO_PLUS | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
-{"/=", 14, ITO_DIV | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
-{"*=", 14, ITO_MUL | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
-{"|=", 14, ITO_OR | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
-{"&=", 14, ITO_AND | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
-{"^=", 14, ITO_XOR | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
-{"%=", 14, ITO_MOD | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
-{"--", 2, ITO_DEC | PO_POSTNONCONST | PO_PRENONCONST | PO_UNARYPRE | PO_UNARYPOST | PO_SET | PO_USESPRE | PO_USESPOST},
-{"++", 2, ITO_INC | PO_POSTNONCONST | PO_PRENONCONST | PO_UNARYPRE | PO_UNARYPOST | PO_SET | PO_USESPRE | PO_USESPOST},
-{">>", 6, ITO_SHR | PO_USESPRE | PO_USESPOST},
-{"<<", 6, ITO_SHL | PO_USESPRE | PO_USESPOST},
+{_T("-="), 14, ITO_MINUS | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
+{_T("+="), 14, ITO_PLUS | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
+{_T("/="), 14, ITO_DIV | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
+{_T("*="), 14, ITO_MUL | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
+{_T("|="), 14, ITO_OR | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
+{_T("&="), 14, ITO_AND | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
+{_T("^="), 14, ITO_XOR | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
+{_T("%="), 14, ITO_MOD | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPRE | PO_USESPOST},
+{_T("--"), 2, ITO_DEC | PO_POSTNONCONST | PO_PRENONCONST | PO_UNARYPRE | PO_UNARYPOST | PO_SET | PO_USESPRE | PO_USESPOST},
+{_T("++"), 2, ITO_INC | PO_POSTNONCONST | PO_PRENONCONST | PO_UNARYPRE | PO_UNARYPOST | PO_SET | PO_USESPRE | PO_USESPOST},
+{_T(">>"), 6, ITO_SHR | PO_USESPRE | PO_USESPOST},
+{_T("<<"), 6, ITO_SHL | PO_USESPRE | PO_USESPOST},
// logical
-{"&&", 12, ITO_LAND | PO_USESPRE | PO_USESPOST},
-{"||", 13, ITO_LOR | PO_USESPRE | PO_USESPOST},
+{_T("&&"), 12, ITO_LAND | PO_USESPRE | PO_USESPOST},
+{_T("||"), 13, ITO_LOR | PO_USESPRE | PO_USESPOST},
// comparisons
-{"<=", 7, ITO_LE | PO_USESPRE | PO_USESPOST},
-{"=<", 7, ITO_LE | PO_USESPRE | PO_USESPOST},
-{">=", 7, ITO_GE | PO_USESPRE | PO_USESPOST},
-{"=>", 7, ITO_GE | PO_USESPRE | PO_USESPOST},
-{"!=", 8, ITO_NE | PO_USESPRE | PO_USESPOST},
-{"==", 8, ITO_EQ | PO_USESPRE | PO_USESPOST},
+{_T("<="), 7, ITO_LE | PO_USESPRE | PO_USESPOST},
+{_T("=<"), 7, ITO_LE | PO_USESPRE | PO_USESPOST},
+{_T(">="), 7, ITO_GE | PO_USESPRE | PO_USESPOST},
+{_T("=>"), 7, ITO_GE | PO_USESPRE | PO_USESPOST},
+{_T("!="), 8, ITO_NE | PO_USESPRE | PO_USESPOST},
+{_T("=="), 8, ITO_EQ | PO_USESPRE | PO_USESPOST},
// single byte ops
// !!! don't forget to change Set Operator Precedence !!!
-{"=", 14, ITO_SET | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPOST},
-{"+", 5, ITO_PLUS | PO_USESPRE | PO_USESPOST},
-{"-", 5, ITO_MINUS | PO_USESPRE | PO_USESPOST | PO_UNARYPRE},
-{"*", 4, ITO_MUL | PO_USESPRE | PO_USESPOST | PO_UNARYPRE},
-{"/", 4, ITO_DIV | PO_USESPRE | PO_USESPOST},
-{"%", 4, ITO_MOD | PO_USESPRE | PO_USESPOST},
-{"<", 7, ITO_LS | PO_USESPRE | PO_USESPOST},
-{">", 7, ITO_GR | PO_USESPRE | PO_USESPOST},
-{"&", 9, ITO_AND | PO_USESPRE | PO_USESPOST | PO_UNARYPRE},
-{"|", 11, ITO_OR | PO_USESPRE | PO_USESPOST},
-{"^", 10, ITO_XOR | PO_USESPRE | PO_USESPOST},
-{"~", 3, ITO_NOT | PO_USESPOST | PO_UNARYPRE},
-{"!", 3, ITO_LNOT |PO_USESPOST | PO_UNARYPRE}
+{_T("="), 14, ITO_SET | PO_PRENONCONST | PO_LASTOP | PO_SET | PO_USESPOST},
+{_T("+"), 5, ITO_PLUS | PO_USESPRE | PO_USESPOST},
+{_T("-"), 5, ITO_MINUS | PO_USESPRE | PO_USESPOST | PO_UNARYPRE},
+{_T("*"), 4, ITO_MUL | PO_USESPRE | PO_USESPOST | PO_UNARYPRE},
+{_T("/"), 4, ITO_DIV | PO_USESPRE | PO_USESPOST},
+{_T("%"), 4, ITO_MOD | PO_USESPRE | PO_USESPOST},
+{_T("<"), 7, ITO_LS | PO_USESPRE | PO_USESPOST},
+{_T(">"), 7, ITO_GR | PO_USESPRE | PO_USESPOST},
+{_T("&"), 9, ITO_AND | PO_USESPRE | PO_USESPOST | PO_UNARYPRE},
+{_T("|"), 11, ITO_OR | PO_USESPRE | PO_USESPOST},
+{_T("^"), 10, ITO_XOR | PO_USESPRE | PO_USESPOST},
+{_T("~"), 3, ITO_NOT | PO_USESPOST | PO_UNARYPRE},
+{_T("!"), 3, ITO_LNOT |PO_USESPOST | PO_UNARYPRE}
};
-void CheckForOperator(char *&sp, char *&vb, ParseInfo *pi)
+void CheckForOperator(TCHAR *&sp, TCHAR *&vb, ParseInfo *pi)
{
for (int op = 0; op < OPSNUM; op++)
{
@@ -397,44 +399,44 @@ void CheckForOperator(char *&sp, char *&vb, ParseInfo *pi)
}
}
-void ParseString(char *&sp, ExpressionItem* &itemplace)
+void ParseString(TCHAR *&sp, ExpressionItem* &itemplace)
{
ParseInfo pi = {0, NULL, NULL, &itemplace, &itemplace};
int redefine = 0;
- char *vb = pi.valbuf;
+ TCHAR *vb = pi.valbuf;
// cycle until current expression end
- while ((*sp != 0) && (*sp != ')') && (*sp != '}') &&
- (*sp != ']') && (*sp != ','))
+ while ((*sp != 0) && (*sp != _T(')')) && (*sp != _T('}')) &&
+ (*sp != _T(']')) && (*sp != _T(',')))
{
int processed = 1;
switch (*sp)
{
- case ' ':
- case '\t':
+ case _T(' '):
+ case _T('\t'):
sp++;
break;
- case ';':
+ case _T(';'):
// expression delimeter
PlaceNewItem(vb, &pi, 255);
if (*pi.root) pi.SetupNewRoot = 1;
sp++;
break;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
+ case _T('0'): case _T('1'): case _T('2'): case _T('3'): case _T('4'):
+ case _T('5'): case _T('6'): case _T('7'): case _T('8'): case _T('9'):
// variable & function names could contain numbers as non first chars
if (vb > pi.valbuf)
{
processed = FALSE;
break;
}
- case '\'': case '\"': case '`':
+ case _T('\''): case _T('\"'): case _T('`'):
// constant meet
pi.item = AllocItem();
StringToItem(sp, pi.item, STI_STRING | STI_FLOAT | STI_INT);
break;
- case '(': // start of function or expression
+ case _T('('): // start of function or expression
if (vb > pi.valbuf)
{
// thats function
@@ -444,14 +446,14 @@ void ParseString(char *&sp, ExpressionItem* &itemplace)
// expression
sp++;
ParseString(sp, pi.item);
- if (*sp == ')') sp++;
+ if (*sp == _T(')')) sp++;
}
redefine = 0;
break;
- case '#': // start of one of logical expresions
+ case _T('#'): // start of one of logical expresions
sp++;
- if ((*sp != '[') && (*sp != '{'))
+ if ((*sp != _T('[')) && (*sp != _T('{')))
{
// function redefine flag
redefine = 1;
@@ -460,14 +462,14 @@ void ParseString(char *&sp, ExpressionItem* &itemplace)
{
pi.item = AllocItem();
// IF or WHILE
- pi.item->type = ((*sp == '[')?(IT_LOGIC | ITL_IF):(IT_LOGIC | ITL_WHILE));
+ pi.item->type = ((*sp == _T('['))?(IT_LOGIC | ITL_IF):(IT_LOGIC | ITL_WHILE));
// first expr - logic statement
sp++;
ParseString(sp, *((ExpressionItem **)(&pi.item->param1)));
// ok, second expr - then, third - else statement.. others???
ExpressionItem **newplace = ((ExpressionItem **)(&pi.item->param2));
- while (*sp == ',')
+ while (*sp == _T(','))
{
*newplace = AllocItem();
(*newplace)->type = IT_EXPRESSION;
@@ -479,14 +481,14 @@ void ParseString(char *&sp, ExpressionItem* &itemplace)
sp++;
break;
- case '[':
+ case _T('['):
{
// thats array access
PlaceOp(vb, IT_ARRAY | ITA_ACCESS | PO_UNARYPOST, 1, &pi);
sp++;
// item index
ParseString(sp, *(ExpressionItem **)&(pi.item->param2));
- if (*sp == ',')
+ if (*sp == _T(','))
{
// two indexes - string access
ExpressionItem *it = AllocItem();
@@ -502,7 +504,7 @@ void ParseString(char *&sp, ExpressionItem* &itemplace)
}
break;
- case '{': // start of array define
+ case _T('{'): // start of array define
{
// array define - constists of array copy operator and array define itself
@@ -516,7 +518,7 @@ void ParseString(char *&sp, ExpressionItem* &itemplace)
ArrayDesc *ad = *((ArrayDesc**)&(ai->param1));
// parse array initializers
- while (*sp != '}')
+ while (*sp != _T('}'))
{
sp++;
ParseString(sp, ad->array[ad->count]);
@@ -527,9 +529,9 @@ void ParseString(char *&sp, ExpressionItem* &itemplace)
sp++;
}
break;
- case '-': case '+': case '<': case '=': case '>':
- case '/': case '*': case '~': case '^': case '!':
- case '&': case '|': case '%':
+ case _T('-'): case _T('+'): case _T('<'): case _T('='): case _T('>'):
+ case _T('/'): case _T('*'): case _T('~'): case _T('^'): case _T('!'):
+ case _T('&'): case _T('|'): case _T('%'):
CheckForOperator(sp, vb, &pi);
break;
@@ -594,8 +596,8 @@ void CleanupItems(ExpressionItem* &itemplace)
#ifdef _DEBUG
HANDLE myfile;
-char *opsnames[] = {"", "-", "+", "<<", ">>", "*", "/", "=", "&&", "||", "++", "--",
-"=<", ">=", "!=", "==", "<", ">", "&", "%", "|", "^", "~", "!"};
+TCHAR *opsnames[] = {_T(""), _T("-"), _T("+"), _T("<<"), _T(">>"), _T("*"), _T("/"), _T("="), _T("&&"), _T("||"), _T("++"), _T("--"),
+_T("=<"), _T(">="), _T("!="), _T("=="), _T("<"), _T(">"), _T("&"), _T("%"), _T("|"), _T("^"), _T("~"), _T("!")};
void PrintNode(int index, int spaces, ExpressionItem* itemplace)
{
@@ -605,7 +607,7 @@ void PrintNode(int index, int spaces, ExpressionItem* itemplace)
do
{
DWORD wrote;
- char buffer[1024], *place = buffer;
+ TCHAR buffer[1024], *place = buffer;
for (int k = 0; k < spaces; k++)
*(place++) = 32;
*place = 0;
@@ -613,100 +615,100 @@ void PrintNode(int index, int spaces, ExpressionItem* itemplace)
switch (item->type & ITEMTYPE)
{
case IT_EXPRESSION:
- wsprintf(place, "Expression Place-Holder ");
+ wsprintf(place, _T("Expression Place-Holder "));
break;
case IT_CONST:
switch (item->type & ITEMSUBTYPE)
{
case ITC_STRING:
- wsprintf(place, "String: \"%s\"", (char *) item->param1);
+ wsprintf(place, _T("String: \"%s\""), (TCHAR *) item->param1);
break;
case ITC_INT:
- wsprintf(place, "Int: ");
+ wsprintf(place, _T("Int: "));
itoa64(*((__int64*)&(item->param1)), place+5);
break;
case ITC_FLOAT:
- wsprintf(place, "Float: ");
+ wsprintf(place, _T("Float: "));
FloatFormat(place+7, *((double*)&(item->param1)), 6);
break;
case ITC_ARRAY:
ArrayDesc *ad = (ArrayDesc*) item->param1;
- wsprintf(place, "Array, ptr %08X, size %d, count %d, references %d",
+ wsprintf(place, _T("Array, ptr %08X, size %d, count %d, references %d"),
ad->array, ad->size, ad->count, ad->references);
break;
}
- strcat(place, " ");
+ _tcscat(place, _T(" "));
break;
case IT_OPERATOR:
- wsprintf(place, "Op: %s%s ", opsnames[(item->type & ITEMSUBTYPE) >> 8], (item->type & PO_SET)?("(=)"):(""));
+ wsprintf(place, _T("Op: %s%s "), opsnames[(item->type & ITEMSUBTYPE) >> 8], (item->type & PO_SET)?(_T("(=)")):(_T("")));
break;
case IT_VARIABLE:
switch (item->type & ITEMSUBTYPE)
{
case ITV_NSIS:
{
- char buffer[128];
+ TCHAR buffer[128];
buffer[0] = NSISVariablesNames[item->type & ITEMOPTIONS][0];
buffer[1] = NSISVariablesNames[item->type & ITEMOPTIONS][1];
buffer[2] = 0;
- wsprintf(place, "Var: %s (%d) ",
+ wsprintf(place, _T("Var: %s (%d) "),
buffer,
item->type & ITEMOPTIONS);
}
break;
case ITV_USER:
- wsprintf(place, "Var: %s (%d) ", UserVars[item->type & ITEMOPTIONS].name, item->type & ITEMOPTIONS);
+ wsprintf(place, _T("Var: %s (%d) "), UserVars[item->type & ITEMOPTIONS].name, item->type & ITEMOPTIONS);
break;
case ITV_STACK:
- wsprintf(place, "Plugin Stack ");
+ wsprintf(place, _T("Plugin Stack "));
break;
case ITV_NSTACK:
- wsprintf(place, "NSIS Stack ");
+ wsprintf(place, _T("NSIS Stack "));
break;
}
break;
case IT_LOGIC:
if ((item->type & ITEMSUBTYPE) == ITL_IF)
- wsprintf(place, "IF ");
+ wsprintf(place, _T("IF "));
else
- wsprintf(place, "WHILE ");
+ wsprintf(place, _T("WHILE "));
break;
case IT_FUNCTION:
if (((item->type & ITEMSUBTYPE) == ITF_MATH1) ||
((item->type & ITEMSUBTYPE) == ITF_MATH2) ||
((item->type & ITEMSUBTYPE) == ITF_TYPE))
{
- char buffer[128];
+ TCHAR buffer[128];
buffer[0] = (MathFunctions[item->type &ITEMOPTIONS].name)[0];
buffer[1] = (MathFunctions[item->type &ITEMOPTIONS].name)[1];
buffer[2] = (MathFunctions[item->type &ITEMOPTIONS].name)[2];
buffer[3] = 0;
- wsprintf(place, "Built-In Function %s() [%d] ",
+ wsprintf(place, _T("Built-In Function %s() [%d] "),
buffer,
item->type &ITEMOPTIONS);
}
else
{
UserFunc *f = &(UserFuncs[item->type & ITEMOPTIONS]);
- wsprintf(place, "User Function: %s(", f->name);
+ wsprintf(place, _T("User Function: %s("), f->name);
int flags = f->varflags;
for (int i = 0; i < f->varsnum; i++)
{
- if (flags&1) lstrcat(place, "&");
+ if (flags&1) lstrcat(place, _T("&"));
lstrcat(place, UserVars[f->vars[i]].name);
- if (i < f->varsnum-1) lstrcat(place, ", ");
+ if (i < f->varsnum-1) lstrcat(place, _T(", "));
flags >>= 1;
}
- lstrcat(place, ") ");
+ lstrcat(place, _T(") "));
}
break;
case IT_ARRAY:
- wsprintf(place, "Array access [] ");
+ wsprintf(place, _T("Array access [] "));
break;
}
place += lstrlen(place);
- wsprintf(place, "Addr: %08X Type: %08X Next: %08X Param1: %08X Param2: %08X", item, item->type, item->next, item->param1, item->param2);
- lstrcat(place, "\n");
+ wsprintf(place, _T("Addr: %08X Type: %08X Next: %08X Param1: %08X Param2: %08X"), item, item->type, item->next, item->param1, item->param2);
+ lstrcat(place, _T("\n"));
WriteFile(myfile, buffer, lstrlen(buffer), &wrote, NULL);
if (((item->type & ITEMTYPE) != IT_CONST) && ((item->type & (ITEMTYPE|ITEMSUBTYPE)) != (IT_VARIABLE|ITV_ARRITEM)))
{
@@ -719,13 +721,13 @@ void PrintNode(int index, int spaces, ExpressionItem* itemplace)
show = 1;
if (show)
{
- wsprintf(place, "Sub1:\n");
+ wsprintf(place, _T("Sub1:\n"));
WriteFile(myfile, buffer, lstrlen(buffer), &wrote, NULL);
}
PrintNode(1, spaces + 4, *((ExpressionItem**) &item->param1));
if (show)
{
- wsprintf(place, "Sub2:\n");
+ wsprintf(place, _T("Sub2:\n"));
WriteFile(myfile, buffer, lstrlen(buffer), &wrote, NULL);
}
PrintNode(2, spaces + 4, *((ExpressionItem**) &item->param2));
@@ -743,12 +745,12 @@ void PrintNode(int index, int spaces, ExpressionItem* itemplace)
} while (item != NULL);
}
-void PrintTree(ExpressionItem *root, char *str)
+void PrintTree(ExpressionItem *root, TCHAR *str)
{
- myfile = CreateFile("d:\\math.debug", GENERIC_ALL, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, 0);
+ myfile = CreateFile(_T("d:\\math.debug"), GENERIC_ALL, FILE_SHARE_READ, NULL, OPEN_ALWAYS, 0, 0);
SetFilePointer(myfile, 0, NULL, FILE_END);
- char buffer[1024]; DWORD wrote;
- wsprintf(buffer, "New tree for \'%s\'\n", str);
+ TCHAR buffer[1024]; DWORD wrote;
+ wsprintf(buffer, _T("New tree for \'%s\'\n"), str);
WriteFile(myfile, buffer, lstrlen(buffer), &wrote, NULL);
PrintNode(0, 4, root);
@@ -776,7 +778,7 @@ void CopyArray(ExpressionItem *&item)
void ItemToType(ExpressionItem* &item, int type)
{
- char *buffer, *bp;
+ TCHAR *buffer, *bp;
if (item == NULL) return;
int itemt = item->type & ITEMTYPE, oldtype = item->type & ITEMSUBTYPE;
@@ -796,7 +798,7 @@ void ItemToType(ExpressionItem* &item, int type)
*((double *)&(item->param1)) = (double) *((__int64 *)&(item->param1));
else
{
- bp = buffer = (char*) item->param1;
+ bp = buffer = (TCHAR*) item->param1;
StringToItem(buffer, item, STI_FLOAT);
dbgGlobalFree(bp);
}
@@ -806,7 +808,7 @@ void ItemToType(ExpressionItem* &item, int type)
*((__int64 *)&(item->param1)) = (__int64) *((double *)&(item->param1));
else
{
- bp = buffer = (char*) item->param1;
+ bp = buffer = (TCHAR*) item->param1;
StringToItem(buffer, item, STI_INT);
dbgGlobalFree(bp);
}
@@ -814,7 +816,7 @@ void ItemToType(ExpressionItem* &item, int type)
case ITC_ARRAY:
if (oldtype == ITC_STRING)
{
- char *buf = (char*) item->param1;
+ TCHAR *buf = (TCHAR*) item->param1;
int len = lstrlen(buf)+1;
ExpressionItem *ni = AllocArray(lstrlen(buf)+1);
ArrayDesc *ad = (ArrayDesc*) ni->param1;
@@ -843,7 +845,7 @@ void SaveResult(ExpressionItem *var, ExpressionItem *result)
case ITV_NSIS:
{
// store string result direct to NSIS variable
- char *ptr = g_variables + varindex*g_stringsize;
+ TCHAR *ptr = g_variables + varindex*g_stringsize;
ItemToString(ptr, result);
}
break;
@@ -869,7 +871,7 @@ void SaveResult(ExpressionItem *var, ExpressionItem *result)
break;
case ITV_NSTACK:
{
- char *buf = AllocString();
+ TCHAR *buf = AllocString();
ItemToString(buf, result);
pushstring(buf);
dbgGlobalFree(buf);
@@ -912,7 +914,7 @@ void RunTree(ExpressionItem *from, ExpressionItem* &result, int options)
{
// nsis
result = AllocItem();
- char *variable = getuservariable(ioptions);
+ TCHAR *variable = getuservariable(ioptions);
StringToItem(variable, result, options);
}
break;
@@ -947,7 +949,7 @@ void RunTree(ExpressionItem *from, ExpressionItem* &result, int options)
case ITV_NSTACK:
{
// NSIS stack
- char buffer[1024], *buf = buffer;
+ TCHAR buffer[1024], *buf = buffer;
result = AllocItem();
popstring(buffer);
StringToItem(buf, result, options);
@@ -1111,8 +1113,8 @@ void RunTree(ExpressionItem *from, ExpressionItem* &result, int options)
case ITC_STRING:
{
int ir = -666;
- char *i1 = (item1)?((char*)item1->param1):(NULL);
- char *i2 = (item2)?((char*)item2->param1):(NULL);
+ TCHAR *i1 = (item1)?((TCHAR*)item1->param1):(NULL);
+ TCHAR *i2 = (item2)?((TCHAR*)item2->param1):(NULL);
int sc = (i1 && i2)?(lstrcmp(i1, i2)):((i1)?(1):((i2)?(-1):(0)));
switch (subtype)
@@ -1277,7 +1279,7 @@ void RunTree(ExpressionItem *from, ExpressionItem* &result, int options)
result = AllocItem();
result->type = IT_CONST | ITC_STRING;
result->param1 = (EIPARAM) AllocString();
- FloatFormat((char*) result->param1, value, format);
+ FloatFormat((TCHAR*) result->param1, value, format);
CleanupItems(arg1); CleanupItems(arg2);
} else if (newtype == FTT_LEN)
{
@@ -1297,7 +1299,7 @@ void RunTree(ExpressionItem *from, ExpressionItem* &result, int options)
if ((result->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_CONST|ITC_STRING))
{
// ok, that's string
- int len = lstrlen((char*)result->param1);
+ int len = lstrlen((TCHAR*)result->param1);
dbgGlobalFree((HGLOBAL) result->param1);
*((__int64*)&(result->param1)) = (__int64) len;
result->type = IT_CONST | ITC_INT;
@@ -1309,7 +1311,7 @@ void RunTree(ExpressionItem *from, ExpressionItem* &result, int options)
if ((result->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_CONST|ITC_STRING))
{
// ok, that's string - convert first char to int
- int chr = (*((char*)result->param1)) & 0xFF;
+ int chr = (*((TCHAR*)result->param1)) & 0xFF;
dbgGlobalFree((HGLOBAL) result->param1);
*((__int64*)&(result->param1)) = (__int64) chr;
result->type = IT_CONST | ITC_INT;
@@ -1320,8 +1322,8 @@ void RunTree(ExpressionItem *from, ExpressionItem* &result, int options)
// ok, that's int - convert to new string (char+0)
int chr = (int) (*((__int64*)&(result->param1))) & 0xFF;
result->param1 = (EIPARAM) AllocString();
- *((char*)result->param1) = (char) chr;
- *((char*)(result->param1+1)) = (char) 0;
+ *((TCHAR*)result->param1) = (TCHAR) chr;
+ *((TCHAR*)(result->param1+1)) = (TCHAR) 0;
result->type = IT_CONST | ITC_STRING;
break;
} else CleanupItems(result);
@@ -1380,7 +1382,7 @@ void RunTree(ExpressionItem *from, ExpressionItem* &result, int options)
if ((aritem->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_CONST | ITC_STRING))
{
// argument is string
- char *str = (char*)(aritem->param1);
+ TCHAR *str = (TCHAR*)(aritem->param1);
int len = lstrlen(str);
// have we two indexes or one?
if ((*((ExpressionItem **) &(item->param2)))->type != IT_EXPRESSION)
@@ -1428,7 +1430,7 @@ void RunTree(ExpressionItem *from, ExpressionItem* &result, int options)
if (pos2 >= len) pos2 = len-1;
// copy string part
- char* lpos = str + (pos2-pos1);
+ TCHAR* lpos = str + (pos2-pos1);
while (str <= lpos)
{
*str = *(str + pos1);
@@ -1490,11 +1492,11 @@ HINSTANCE g_hInstance;
extern "C"
void __declspec(dllexport) Script(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop,
+ TCHAR *variables, stack_t **stacktop,
extra_parameters *extra)
{
EXDLL_INIT();
- char *buffer = AllocString(), *buf = buffer;
+ TCHAR *buffer = AllocString(), *buf = buffer;
ExpressionItem *root = NULL; // root of current tree
// keep loaded to save user defined variables
@@ -1552,7 +1554,7 @@ void CleanAll(int init)
}
}
-extern "C" BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
+BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
g_hInstance = hInst;
CleanAll(ul_reason_for_call == DLL_PROCESS_ATTACH);
diff --git a/Contrib/Math/Source/Math.h b/Contrib/Math/Source/Math.h
index 1dad1801..60c4049c 100644
--- a/Contrib/Math/Source/Math.h
+++ b/Contrib/Math/Source/Math.h
@@ -1,3 +1,5 @@
+// Unicode support by Jim Park -- 08/22/2007
+
#pragma once
#include // nsis plugin
@@ -23,7 +25,7 @@ HGLOBAL watchGlobalAlloc(UINT Flags, UINT size);
#endif
-char *AllocString();
+TCHAR *AllocString();
ExpressionItem *AllocItem();
ExpressionItem *AllocArray(int size);
ExpressionItem *CopyItem(ExpressionItem *item, int NeedConst = 0);
diff --git a/Contrib/Math/Source/MyMath.c b/Contrib/Math/Source/MyMath.c
index eed587c5..3f8a843f 100644
--- a/Contrib/Math/Source/MyMath.c
+++ b/Contrib/Math/Source/MyMath.c
@@ -1,10 +1,12 @@
+// Unicode support by Jim Park -- 08/22/2007
+
#include
#include
#include "MyMath.h"
#include "Math.h"
// Converts String to Int (Dec, Hex) or Float value
-void StringToItem(char *&s, ExpressionItem *item, int options)
+void StringToItem(TCHAR *&s, ExpressionItem *item, int options)
{
item->type = IT_CONST | ITC_INT;
__int64 &v=*((__int64*)&(item->param1));
@@ -14,19 +16,19 @@ void StringToItem(char *&s, ExpressionItem *item, int options)
if (!s) return;
// String-value
- if ((((options & (STI_FLOAT | STI_INT)) == 0) || *s == '\'' || *s == '\"' || *s == '`' ||
- ((*s != '+') && (*s != '-') && ((*s < '0') || (*s > '9'))))
+ if ((((options & (STI_FLOAT | STI_INT)) == 0) || *s == _T('\'') || *s == _T('\"') || *s == _T('`') ||
+ ((*s != _T('+')) && (*s != _T('-')) && ((*s < _T('0')) || (*s > _T('9')))))
&& (options & STI_STRING))
{
// end of string char
- char eol = 0;
- if (*s == '\'' || *s == '\"' || *s == '`') eol = *s;
+ TCHAR eol = 0;
+ if (*s == _T('\'') || *s == _T('\"') || *s == _T('`')) eol = *s;
else s--;
item->type = IT_CONST | ITC_STRING;
// allocate memory buffer for string
- char *sp;
- sp = *((char**)&(item->param1)) = AllocString();
+ TCHAR *sp;
+ sp = *((TCHAR**)&(item->param1)) = AllocString();
while (*(++s) && (*s != eol))
{
*(sp++) = *s;
@@ -36,18 +38,18 @@ void StringToItem(char *&s, ExpressionItem *item, int options)
} else
{
// strip leading spaces and tabs
- while ((*s == ' ') || (*s == '\t')) s++;
+ while ((*s == _T(' ')) || (*s == _T('\t'))) s++;
// Hex-value
- if ((options & STI_INT) && *s == '0' && (s[1] == 'x' || s[1] == 'X'))
+ if ((options & STI_INT) && *s == _T('0') && (s[1] == _T('x') || s[1] == _T('X')))
{
s++;
- while (*(s+1) == '0') *s++;
+ while (*(s+1) == _T('0')) *s++;
for (;;)
{
int c=*(++s);
- if (c >= '0' && c <= '9') c-='0';
- else if (c >= 'a' && c <= 'f') c-='a'-10;
- else if (c >= 'A' && c <= 'F') c-='A'-10;
+ if (c >= _T('0') && c <= _T('9')) c-=_T('0');
+ else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10;
+ else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10;
else break;
v<<=4;
v+=c;
@@ -57,13 +59,13 @@ void StringToItem(char *&s, ExpressionItem *item, int options)
else
{
int sign=0, numsignif = 0;
- if (*s == '-') sign++; else s--;
- while (*(s+1) == '0') *s++;
+ if (*s == _T('-')) sign++; else s--;
+ while (*(s+1) == _T('0')) *s++;
for (;;)
{
- int c=*(++s) - '0'; numsignif++;
+ int c=*(++s) - _T('0'); numsignif++;
if ((options & STI_FLOAT) &&
- ((c == ('e'-'0')) || (c==('E'-'0')) || (c==('.'-'0'))
+ ((c == (_T('e')-_T('0'))) || (c==(_T('E')-_T('0'))) || (c==(_T('.')-_T('0')))
|| (numsignif > 18)))
{
// Switch to floating point conversion rountine
@@ -74,16 +76,16 @@ void StringToItem(char *&s, ExpressionItem *item, int options)
while ((c >= 0) && (c <= 9))
{
d = d*10.0 + (double) c;
- c=*(++s) - '0';
+ c=*(++s) - _T('0');
}
// sub-decimal part
- if (c == ('.'-'0'))
+ if (c == (_T('.')-_T('0')))
{
double pwr = 1.0, dec = 0.0;
for (;;)
{
- c=*(++s) - '0';
+ c=*(++s) - _T('0');
if ((c < 0) || (c > 9)) break;
dec = dec*10.0 + (double) c;
pwr *= 10.0;
@@ -91,19 +93,19 @@ void StringToItem(char *&s, ExpressionItem *item, int options)
d += dec/pwr;
}
// exponental part
- if ((c == ('E'-'0')) || (c == ('e'-'0')))
+ if ((c == (_T('E')-_T('0'))) || (c == (_T('e')-_T('0'))))
{
int expc = 0, esign = 0;
s++;
// detect exponential sign
- if ((*s == '+') || (*s == '-'))
- esign = (*s == '-');
+ if ((*s == _T('+')) || (*s == _T('-')))
+ esign = (*s == _T('-'));
else s--;
// detect exp value
for (;;)
{
- c=*(++s) - '0';
+ c=*(++s) - _T('0');
if ((c < 0) || (c > 9)) break;
expc = expc*10 + c;
}
@@ -139,7 +141,7 @@ void StringToItem(char *&s, ExpressionItem *item, int options)
}
}
-void ItemToString(char *sbuf, ExpressionItem *item)
+void ItemToString(TCHAR *sbuf, ExpressionItem *item)
{
if ((item == NULL) || ((item->type & ITEMTYPE) != IT_CONST))
{
@@ -151,7 +153,7 @@ void ItemToString(char *sbuf, ExpressionItem *item)
{
case ITC_STRING:
{
- char *ptr = *((char**)&(item->param1));
+ TCHAR *ptr = *((TCHAR**)&(item->param1));
while (*(sbuf++) = *(ptr++));
}
break;
@@ -161,7 +163,7 @@ void ItemToString(char *sbuf, ExpressionItem *item)
for (int index = 0; index < ad->count; index++)
if ((ad->array[index]) &&
((ad->array[index]->type & (ITEMTYPE|ITEMSUBTYPE)) == (IT_CONST | ITC_INT)))
- if ((*(sbuf++) = (char) *((__int64*)&(ad->array[index]->param1))) == 0)
+ if ((*(sbuf++) = (TCHAR) *((__int64*)&(ad->array[index]->param1))) == 0)
break;
}
break;
@@ -174,21 +176,21 @@ void ItemToString(char *sbuf, ExpressionItem *item)
}
}
-void itoa64(__int64 i, char *buffer)
+void itoa64(__int64 i, TCHAR *buffer)
{
- char buf[128], *b = buf;
+ TCHAR buf[128], *b = buf;
if (i < 0)
{
- *(buffer++) = '-';
+ *(buffer++) = _T('-');
i = -i;
}
- if (i == 0) *(buffer++) = '0';
+ if (i == 0) *(buffer++) = _T('0');
else
{
while (i > 0)
{
- *(b++) = '0' + ((char) (i%10));
+ *(b++) = _T('0') + ((TCHAR) (i%10));
i /= 10;
}
while (b > buf) *(buffer++) = *(--b);
@@ -196,12 +198,12 @@ void itoa64(__int64 i, char *buffer)
*buffer = 0;
}
-#define POS_INFINITY "#INF"
-#define NEG_INFINITY "-#INF"
+#define POS_INFINITY _T("#INF")
+#define NEG_INFINITY _T("-#INF")
-void FloatFormat(char *s, double value, int options)
+void FloatFormat(TCHAR *s, double value, int options)
{
- char format[128];
+ TCHAR format[128];
int prec = options & 0xF;
*s = 0;
@@ -217,25 +219,25 @@ void FloatFormat(char *s, double value, int options)
if (options & FF_NOEXP)
{
- sprintf(format, "%%.%df", prec);
+ _stprintf(format, _T("%%.%df"), prec);
}
else if (options & FF_EXP)
{
- sprintf(format, "%%.%de", prec);
+ _stprintf(format, _T("%%.%de"), prec);
}
else if (options & FF_LEXP)
{
- sprintf(format, "%%.%dE", prec);
+ _stprintf(format, _T("%%.%dE"), prec);
}
else
{
- sprintf(format, "%%.%dg", prec);
+ _stprintf(format, _T("%%.%dg"), prec);
}
- sprintf(s, format, value);
+ _stprintf(s, format, value);
}
-int lstrcmpn(char *s1, const char *s2, int chars)
+int lstrcmpn(TCHAR *s1, const TCHAR *s2, int chars)
{
while ((chars > 0) && (*s1) && (*s2) && (*(s1) == *(s2))) chars--, s1++, s2++;
if ((chars == 0) || (*s1 == *s2)) return 0;
diff --git a/Contrib/Math/Source/MyMath.h b/Contrib/Math/Source/MyMath.h
index 5ed44aa8..74936d0c 100644
--- a/Contrib/Math/Source/MyMath.h
+++ b/Contrib/Math/Source/MyMath.h
@@ -1,3 +1,5 @@
+// Unicode support by Jim Park -- 08/22/2007
+
#pragma once
#include
@@ -97,13 +99,13 @@ typedef struct __ParseInfo
ExpressionItem *OpsStack;
ExpressionItem **place;
ExpressionItem **root;
- char valbuf[108];
+ TCHAR valbuf[108];
} ParseInfo;
#define OPERATOR_SET_PRECEDENCE 14
typedef struct __OpStruct
{
- char name[3];
+ TCHAR name[3];
unsigned char precedence;
unsigned short int type;
} OpStruct;
@@ -111,16 +113,16 @@ typedef struct __OpStruct
#define MAX_USER_VARS 256
typedef struct __UserVar
{
- char name[28];
+ TCHAR name[28];
ExpressionItem *item;
} UserVar;
#define MAX_USER_FUNCS 256
typedef struct __UserFunc
{
- char name[20];
- unsigned char vars[31];
- unsigned char varsnum;
+ TCHAR name[20];
+ unsigned char vars[31]; // only used for indexing
+ unsigned char varsnum; // number of vars < 256
unsigned int varflags;
ExpressionItem *root;
} UserFunc;
@@ -140,7 +142,7 @@ typedef double (*Math2dFuncPtr)(double arg, double *arg2);
typedef struct __MathFunction
{
- char name[3];
+ TCHAR name[3];
unsigned char type;
Math1FuncPtr fptr;
} MathFunction;
@@ -159,8 +161,8 @@ typedef struct __MathFunction
#define RTO_PREFFEREDTYPE 0xFF00
void RunTree(ExpressionItem *from, ExpressionItem* &result, int type);
-void StringToItem(char *&sbuf, ExpressionItem *item, int options);
-void ItemToString(char *sbuf, ExpressionItem *item);
-void FloatFormat(char *sbuf, double value, int options);
-void itoa64(__int64 i, char *buffer);
-int lstrcmpn(char *s1, const char *s2, int chars);
+void StringToItem(TCHAR *&sbuf, ExpressionItem *item, int options);
+void ItemToString(TCHAR *sbuf, ExpressionItem *item);
+void FloatFormat(TCHAR *sbuf, double value, int options);
+void itoa64(__int64 i, TCHAR *buffer);
+int lstrcmpn(TCHAR *s1, const TCHAR *s2, int chars);
diff --git a/Contrib/Math/Source/plugin.c b/Contrib/Math/Source/plugin.c
index 11a44568..57ac7dc1 100644
--- a/Contrib/Math/Source/plugin.c
+++ b/Contrib/Math/Source/plugin.c
@@ -1,3 +1,5 @@
+// Unicode support by Jim Park -- 08/22/2007
+
#include
#include "MyMath.h"
#include "Math.h"
@@ -28,15 +30,15 @@ void watchGlobal()
for (int i = 0; i < blocksnum; i++)
if (blocks[i] != NULL)
{
- _RPT2(_CRT_WARN, "Memory leak %d at %8X\n", i, blocks[i]);
+ _RPT2(_CRT_WARN, _T("Memory leak %d at %8X\n"), i, blocks[i]);
}
}
#endif
-char *AllocString()
+TCHAR *AllocString()
{
- return (char*) dbgGlobalAlloc(GPTR,g_stringsize);
+ return (TCHAR*) dbgGlobalAlloc(GPTR,g_stringsize*sizeof(TCHAR));
}
ExpressionItem *AllocItem()
@@ -82,7 +84,7 @@ ExpressionItem *CopyItem(ExpressionItem *citem, int NeedConst)
if ((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_CONST | ITC_STRING))
{
item->param1 = (EIPARAM) AllocString();
- lstrcpy((LPSTR) item->param1, (LPSTR) citem->param1);
+ lstrcpy((LPTSTR) item->param1, (LPTSTR) citem->param1);
} else if (((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_CONST | ITC_ARRAY))
||
((item->type & (ITEMTYPE | ITEMSUBTYPE)) == (IT_VARIABLE | ITV_ARRITEM)))
diff --git a/Contrib/NSIS Menu/SConscript b/Contrib/NSIS Menu/SConscript
index 74f36269..05779745 100644
--- a/Contrib/NSIS Menu/SConscript
+++ b/Contrib/NSIS Menu/SConscript
@@ -1,38 +1,44 @@
target = "NSIS"
+Import('BuildUtil env')
files = Split("""
- nsismenu/nsismenu.cpp
- nsismenu/nslinks.cpp
+ nsismenu/nsismenu.cpp
+ nsismenu/nslinks.cpp
""")
resources = Split("""
- nsismenu/nsisicon.ico
+ nsismenu/nsisicon.ico
""")
rc = 'nsismenu/nsismenu.rc'
libs = Split("""
- advapi32
- comctl32
- gdi32
- shell32
- user32
- wxbase28
- wxmsw28_core
- wxmsw28_html
+ advapi32
+ comctl32
+ gdi32
+ shell32
+ user32
""")
+if env['UNICODE']:
+ libs.append(["wxbase28u", "wxmsw28u_core", "wxmsw28u_html"])
+else:
+ libs.append(["wxbase28", "wxmsw28_core", "wxmsw28_html"])
+
html = Split("""
- #Menu/index.html
+ #Menu/index.html
""")
images = Split("""
- #Menu/images/header.gif
- #Menu/images/line.gif
- #Menu/images/site.gif
+ #Menu/images/line.gif
+ #Menu/images/site.gif
""")
-Import('BuildUtil env')
+
+if env['UNICODE']:
+ images.append("#Menu/images/Unicode/header.gif")
+else:
+ images.append("#Menu/images/header.gif")
import os
from os.path import join
@@ -40,56 +46,60 @@ from os.path import join
if env['PLATFORM'] != 'win32' and WhereIs('wx-config') or \
env['PLATFORM'] == 'win32' and env.get('WXWIN'):
- # build
+ # build
- if env['PLATFORM'] != 'win32':
- rc = libs = []
+ if env['PLATFORM'] != 'win32':
+ rc = libs = []
- nsis_menu = BuildUtil(
- target,
- files,
- libs,
- res = rc,
- resources = resources,
- flags = ['$MSVCRT_FLAG', '$EXCEPTION_FLAG'],
- root_util = True,
- cross_platform = True
- )
+ nsis_menu = BuildUtil(
+ target,
+ files,
+ libs,
+ res = rc,
+ resources = resources,
+ flags = ['$MSVCRT_FLAG', '$EXCEPTION_FLAG'],
+ root_util = True,
+ cross_platform = True
+ )
- # manifest
+ # manifest
- if env.has_key('MSVS_VERSION'):
- if float(env['MSVS_VERSION'].replace('Exp','')) >= 8.0:
- manifest = env.SideEffect('%s.exe.manifest' % target, nsis_menu)
- env.DistributeBin(manifest, alias='install-utils')
+ if env.has_key('MSVS_VERSION'):
+ if float(env['MSVS_VERSION'].replace('Exp','')) >= 8.0:
+ manifest = env.SideEffect('%s.exe.manifest' % target, nsis_menu)
+ env.DistributeBin(manifest, alias='install-utils')
- # set directories
+ # set directories
- if nsis_menu[0].env['PLATFORM'] == 'win32':
- wxlib = [join(env['WXWIN'], 'lib', 'vc_libnsis')]
- wxinc = [
- join(env['WXWIN'], 'include'),
- join(env['WXWIN'], 'lib', 'vc_libnsis', 'msw')
- ]
- nsis_menu[0].env.Append(LIBPATH = wxlib)
- nsis_menu[0].env.Append(CPPPATH = wxinc)
- else:
- nsis_menu[0].env.ParseConfig('wx-config --cxxflags --libs')
+ if nsis_menu[0].env['PLATFORM'] == 'win32':
+ wxinc = [join(env['WXWIN'], 'include')]
- # install menu files
+ if env['UNICODE']:
+ wxlib = [join(os.environ['WXWIN'], 'lib', 'vc_libunsis')]
+ wxinc.append(join(os.environ['WXWIN'], 'lib', 'vc_libunsis', 'mswu'))
+ else:
+ wxlib = [join(os.environ['WXWIN'], 'lib', 'vc_libnsis')]
+ wxinc.append(join(os.environ['WXWIN'], 'lib', 'vc_libnsis', 'msw'))
- env.DistributeMenu(html, alias='install-utils')
- env.DistributeMenu(images, path='images', alias='install-utils')
+ nsis_menu[0].env.Append(LIBPATH = wxlib)
+ nsis_menu[0].env.Append(CPPPATH = wxinc)
+ else:
+ nsis_menu[0].env.ParseConfig('wx-config --cxxflags --libs')
+
+ # install menu files
+
+ env.DistributeMenu(html, alias='install-utils')
+ env.DistributeMenu(images, path='images', alias='install-utils')
else:
-
- # no wxWidgets
- def err(target, source, env):
- if env['PLATFORM'] == 'win32':
- print '*** error: WXWIN must be set to build NSIS Menu!'
- else:
- print '*** error: wx-config must be in the PATH to build NSIS Menu!'
- return 1
+
+ # no wxWidgets
+ def err(target, source, env):
+ if env['PLATFORM'] == 'win32':
+ print '*** error: WXWIN must be set to build NSIS Menu!'
+ else:
+ print '*** error: wx-config must be in the PATH to build NSIS Menu!'
+ return 1
- cmd = env.Command(target, files, Action(err, ''))
- env.Alias('NSIS Menu', cmd)
+ cmd = env.Command(target, files, Action(err, ''))
+ env.Alias('NSIS Menu', cmd)
diff --git a/Contrib/NSIS Menu/nsismenu/nsismenu.cpp b/Contrib/NSIS Menu/nsismenu/nsismenu.cpp
index d6b84ff2..9a5420ec 100644
--- a/Contrib/NSIS Menu/nsismenu/nsismenu.cpp
+++ b/Contrib/NSIS Menu/nsismenu/nsismenu.cpp
@@ -1,5 +1,8 @@
/////////////////////////////////////////////////////////////////////////////
// NSIS MENU
+//
+// Reviewed for Unicode support by Jim Park -- 08/23/2007
+// Basically, compiling wxWidgets as Unicode should do it.
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
@@ -100,7 +103,7 @@ private:
// Create the main application window
MyFrame *frame = new MyFrame(_("NSIS Menu"),
- wxPoint(50, 50), wxSize(600 + wxSystemSettings::GetMetric(wxSYS_FRAMESIZE_X), 355 + wxSystemSettings::GetMetric(wxSYS_FRAMESIZE_X)));
+ wxPoint(50, 50), wxSize(600 + wxSystemSettings::GetMetric(wxSYS_FRAMESIZE_X), 365 + wxSystemSettings::GetMetric(wxSYS_FRAMESIZE_X)));
// Show it and tell the application that it's our main window
@@ -154,10 +157,10 @@ void MyFrame::OnLink(wxHtmlLinkEvent& event)
if (e == NULL || e->LeftUp())
{
const wxString href = event.GetLinkInfo().GetHref();
- if (href.Left(3).IsSameAs((const wxChar*)"EX:", false))
+ if (href.Left(3).IsSameAs((const wxChar*) wxT("EX:"), false))
{
wxString url = href.Mid(3);
- if (url.Left(7).IsSameAs((const wxChar*)"http://", false) || url.Left(6).IsSameAs((const wxChar*)"irc://", false))
+ if (url.Left(7).IsSameAs((const wxChar*) wxT("http://"), false) || url.Left(6).IsSameAs((const wxChar*) wxT("irc://"), false))
{
::wxLaunchDefaultBrowser(url);
}
diff --git a/Contrib/NSIS Menu/nsismenu/nslinks.cpp b/Contrib/NSIS Menu/nsismenu/nslinks.cpp
index e5d3a067..3f17a0dc 100644
--- a/Contrib/NSIS Menu/nsismenu/nslinks.cpp
+++ b/Contrib/NSIS Menu/nsismenu/nslinks.cpp
@@ -2,9 +2,12 @@
// Name: src/html/m_links.cpp
// Purpose: wxHtml module for links & anchors
// Author: Vaclav Slavik
-// RCS-ID: $Id: nslinks.cpp,v 1.1 2007/02/24 18:57:09 kichik Exp $
+// RCS-ID: $Id: nslinks.cpp,v 1.2 2007/03/08 01:47:14 pabs3 Exp $
// Copyright: (c) 1999 Vaclav Slavik
// Licence: wxWindows licence
+//
+// Reviewed for Unicode support by Jim Park -- 08/23/2007
+// Basically, compiling wxWidgets as Unicode should do it.
/////////////////////////////////////////////////////////////////////////////
#include "wx/wxprec.h"
@@ -60,10 +63,10 @@ TAG_HANDLER_BEGIN(A, "A")
wxColour colour = m_WParser->GetLinkColor();
wxHtmlLinkInfo linkInfo(name, target);
- if (name.Left(3).IsSameAs((const wxChar*)"EX:", false))
+ if (name.Left(3).IsSameAs((const wxChar*) wxT("EX:"), false))
{
wxString url = name.Mid(3);
- if (!url.Left(7).IsSameAs((const wxChar*)"http://", false) && !url.Left(6).IsSameAs((const wxChar*)"irc://", false))
+ if (!url.Left(7).IsSameAs((const wxChar*) wxT("http://"), false) && !url.Left(6).IsSameAs((const wxChar*) wxT("irc://"), false))
{
wxString exePath = wxStandardPaths::Get().GetExecutablePath();
wxString path = ::wxPathOnly(exePath);
diff --git a/Contrib/NSIS Menu/wx/setup.h b/Contrib/NSIS Menu/wx/setup.h
index aa7f14de..af281272 100644
--- a/Contrib/NSIS Menu/wx/setup.h
+++ b/Contrib/NSIS Menu/wx/setup.h
@@ -7,6 +7,9 @@
// RCS-ID: $Id: setup0.h,v 1.246 2006/11/09 00:54:51 VZ Exp $
// Copyright: (c) Julian Smart
// Licence: wxWindows licence
+//
+// Reviewed for Unicode support by Jim Park -- 08/01/2007
+// (This one is the ANSI version.)
/////////////////////////////////////////////////////////////////////////////
#ifndef _WX_SETUP_H_
diff --git a/Contrib/NSIS Menu/wx/wxbuild.bat b/Contrib/NSIS Menu/wx/wxbuild.bat
index 0c29e84f..7651b041 100644
--- a/Contrib/NSIS Menu/wx/wxbuild.bat
+++ b/Contrib/NSIS Menu/wx/wxbuild.bat
@@ -1,12 +1,42 @@
+@echo off
if not exist setup.h goto setup_error
if not exist "%WXWIN%\build\msw\makefile.vc" goto error
set OLDCD=%CD%
cd /D "%WXWIN%\build\msw"
+rem Save the old setup.h as old_setup.h in the starting dir.
copy /y "%WXWIN%\include\wx\msw\setup.h" "%OLDCD%\old_setup.h"
-copy /y "%OLDCD%\setup.h" "%WXWIN%\include\wx\msw\setup.h"
+
+if "%1" == "unicode" goto unicode
+if "%1" == "ansi" goto ansi
+:ansi
+rem Ask if we want to delete this dir.
+echo Deleting...
rd /S ..\..\lib\vc_libnsis
+
+echo ### building ANSI version ###
+rem Copy the ANSI version of setup.h to WXWIN setup.
+copy /y "%OLDCD%\setup.h" "%WXWIN%\include\wx\msw\setup.h"
+echo Deleting...
rd /S vc_mswnsis
-nmake -f makefile.vc CFG=nsis BUILD=release RUNTIME_LIBS=dynamic SHARED=0 UNICODE=0 WXUNIV=0 USE_OPENGL=0 USE_ODBC=0 USE_HTML=1 USE_XRC=0
+nmake -f makefile.vc CFG=nsis BUILD=release RUNTIME_LIBS=static SHARED=0 UNICODE=0 WXUNIV=0 USE_OPENGL=0 USE_ODBC=0 USE_HTML=1 USE_XRC=0
+if "%1" == "" goto unicode
+if "%1" == "all" goto unicode
+goto finish
+
+:unicode
+rem Ask if we want to delete this dir.
+echo Deleting...
+rd /S ..\..\lib\vc_libunsis
+
+echo ### building UNICODE version ###
+rem Copy the UNICODE version of setup.h to WXWIN setup.
+copy /y "%OLDCD%\setup_unicode.h" "%WXWIN%\include\wx\msw\setup.h"
+echo Deleting...
+rd /S vc_mswunsis
+nmake -f makefile.vc CFG=unsis BUILD=release RUNTIME_LIBS=static SHARED=0 UNICODE=1 WXUNIV=0 USE_OPENGL=0 USE_ODBC=0 USE_HTML=1 USE_XRC=0
+
+:finish
+rem Restore the setup.h
copy /y "%OLDCD%\old_setup.h" "%WXWIN%\include\wx\msw\setup.h"
cd /D "%OLDCD%"
goto done
diff --git a/Contrib/NSISdl/asyncdns.cpp b/Contrib/NSISdl/asyncdns.cpp
index 1f75a17e..91218d45 100644
--- a/Contrib/NSISdl/asyncdns.cpp
+++ b/Contrib/NSISdl/asyncdns.cpp
@@ -4,8 +4,12 @@
** Author: Justin Frankel
** File: asyncdns.cpp - JNL portable asynchronous DNS implementation
** License: see License.txt
+**
+** Unicode support by Jim Park -- 08/24/2007
*/
+// Jim Park: For Unicode Support, all string functions must explicitly use
+// ANSI versions if UNICODE is defined.
#include "netinc.h"
#include "util.h"
@@ -47,7 +51,7 @@ int JNL_AsyncDNS::resolve(char *hostname, unsigned long *addr)
return 0;
}
- if (lstrcmpi(m_hostname,hostname)) m_addr=0;
+ if (lstrcmpiA(m_hostname,hostname)) m_addr=0;
else if (m_addr == INADDR_NONE)
{
wait_for_thread_death();
@@ -59,7 +63,7 @@ int JNL_AsyncDNS::resolve(char *hostname, unsigned long *addr)
wait_for_thread_death();
return 0;
}
- lstrcpy(m_hostname,hostname);
+ lstrcpyA(m_hostname,hostname);
if (!m_thread)
{
diff --git a/Contrib/NSISdl/asyncdns.h b/Contrib/NSISdl/asyncdns.h
index d6bf1be7..125f32bb 100644
--- a/Contrib/NSISdl/asyncdns.h
+++ b/Contrib/NSISdl/asyncdns.h
@@ -1,39 +1,43 @@
-/*
-** JNetLib
-** Copyright (C) 2000-2001 Nullsoft, Inc.
-** Author: Justin Frankel
-** File: asyncdns.h - JNL portable asynchronous DNS interface
-** License: see License.txt
-**
-** Usage:
-** 1. Create JNL_AsyncDNS object, optionally with the number of cache entries.
-** 2. call resolve() to resolve a hostname into an address. The return value of
-** resolve is 0 on success (host successfully resolved), 1 on wait (meaning
-** try calling resolve() with the same hostname in a few hundred milliseconds
-** or so), or -1 on error (i.e. the host can't resolve).
-** 4. enjoy.
-*/
-
-#ifndef _ASYNCDNS_H_
-#define _ASYNCDNS_H_
-
-class JNL_AsyncDNS
-{
-public:
- JNL_AsyncDNS();
- ~JNL_AsyncDNS();
-
- int resolve(char *hostname, unsigned long *addr); // return 0 on success, 1 on wait, -1 on unresolvable
-
-private:
- void wait_for_thread_death();
-
- char m_hostname[256];
- unsigned long m_addr;
-
- HANDLE m_thread;
- static unsigned long WINAPI _threadfunc(LPVOID _d);
-
-};
-
-#endif //_ASYNCDNS_H_
+/*
+** JNetLib
+** Copyright (C) 2000-2001 Nullsoft, Inc.
+** Author: Justin Frankel
+** File: asyncdns.h - JNL portable asynchronous DNS interface
+** License: see License.txt
+**
+** Usage:
+** 1. Create JNL_AsyncDNS object, optionally with the number of cache entries.
+** 2. call resolve() to resolve a hostname into an address. The return value of
+** resolve is 0 on success (host successfully resolved), 1 on wait (meaning
+** try calling resolve() with the same hostname in a few hundred milliseconds
+** or so), or -1 on error (i.e. the host can't resolve).
+** 4. enjoy.
+**
+** Unicode support by Jim Park -- 08/24/2007
+*/
+
+// Jim Park: Inet host name is strictly ANSI, no UNICODE for now.
+
+#ifndef _ASYNCDNS_H_
+#define _ASYNCDNS_H_
+
+class JNL_AsyncDNS
+{
+public:
+ JNL_AsyncDNS();
+ ~JNL_AsyncDNS();
+
+ int resolve(char *hostname, unsigned long *addr); // return 0 on success, 1 on wait, -1 on unresolvable
+
+private:
+ void wait_for_thread_death();
+
+ char m_hostname[256];
+ unsigned long m_addr;
+
+ HANDLE m_thread;
+ static unsigned long WINAPI _threadfunc(LPVOID _d);
+
+};
+
+#endif //_ASYNCDNS_H_
diff --git a/Contrib/NSISdl/connection.cpp b/Contrib/NSISdl/connection.cpp
index 55e16835..688072cc 100644
--- a/Contrib/NSISdl/connection.cpp
+++ b/Contrib/NSISdl/connection.cpp
@@ -4,6 +4,8 @@
** Author: Justin Frankel
** File: connection.cpp - JNL TCP connection implementation
** License: see License.txt
+**
+** Unicode support by Jim Park -- 08/24/2007
*/
#include "netinc.h"
diff --git a/Contrib/NSISdl/connection.h b/Contrib/NSISdl/connection.h
index e043e352..b2eb7f0c 100644
--- a/Contrib/NSISdl/connection.h
+++ b/Contrib/NSISdl/connection.h
@@ -50,6 +50,9 @@
** make the socket close after sending all the data sent.
**
** 8. delete ye' ol' object.
+**
+** Unicode support by Jim Park -- 08/24/2007
+** Keep all the stuff here strictly ANSI.
*/
#ifndef _CONNECTION_H_
diff --git a/Contrib/NSISdl/httpget.cpp b/Contrib/NSISdl/httpget.cpp
index 10a8a0a6..6e0ac0ff 100644
--- a/Contrib/NSISdl/httpget.cpp
+++ b/Contrib/NSISdl/httpget.cpp
@@ -4,6 +4,8 @@
** Author: Justin Frankel
** File: httpget.cpp - JNL HTTP GET implementation
** License: see License.txt
+**
+** Unicode support by Jim Park -- 08/24/2007
*/
#include "netinc.h"
@@ -179,14 +181,14 @@ void JNL_HTTPGet::connect(char *url)
if (!m_http_proxyhost || !m_http_proxyhost[0])
{
- wsprintf(str,"GET %s HTTP/1.0\r\n",m_http_request);
+ wsprintfA(str,"GET %s HTTP/1.0\r\n",m_http_request);
}
else
{
- wsprintf(str,"GET %s HTTP/1.0\r\n",m_http_url);
+ wsprintfA(str,"GET %s HTTP/1.0\r\n",m_http_url);
}
- wsprintf(str+strlen(str),"Host: %s\r\n",m_http_host);
+ wsprintfA(str+strlen(str),"Host: %s\r\n",m_http_host);
if (m_http_lpinfo&&m_http_lpinfo[0])
{
diff --git a/Contrib/NSISdl/httpget.h b/Contrib/NSISdl/httpget.h
index 02e168b8..4dea095d 100644
--- a/Contrib/NSISdl/httpget.h
+++ b/Contrib/NSISdl/httpget.h
@@ -1,109 +1,113 @@
-/*
-** JNetLib
-** Copyright (C) 2000-2001 Nullsoft, Inc.
-** Author: Justin Frankel
-** File: httpget.h - JNL interface for doing HTTP GETs.
-** License: see License.txt
-**
-** Usage:
-** 1. Create a JNL_HTTPGet object, optionally specifying a JNL_AsyncDNS
-** object to use (or NULL for none, or JNL_CONNECTION_AUTODNS for auto),
-** and the receive buffer size, and a string specifying proxy (or NULL
-** for none). See note on proxy string below.
-** 2. call addheader() to add whatever headers you want. It is recommended to
-** add at least the following two:
-** addheader("User-Agent:MyApp (Mozilla)");
-*/// addheader("Accept:*/*");
-/* ( the comment weirdness is there so I Can do the star-slash :)
-** 3. Call connect() with the URL you wish to GET (see URL string note below)
-** 4. Call run() once in a while, checking to see if it returns -1
-** (if it does return -1, call geterrorstr() to see what the error is).
-** (if it returns 1, no big deal, the connection has closed).
-** 5. While you're at it, you can call bytes_available() to see if any data
-** from the http stream is available, or getheader() to see if any headers
-** are available, or getreply() to see the HTTP reply, or getallheaders()
-** to get a double null terminated, null delimited list of headers returned.
-** 6. If you want to read from the stream, call get_bytes (which returns how much
-** was actually read).
-** 7. content_length() is a helper function that uses getheader() to check the
-** content-length header.
-** 8. Delete ye' ol' object when done.
-**
-** Proxy String:
-** should be in the format of host:port, or user@host:port, or
-** user:password@host:port. if port is not specified, 80 is assumed.
-** URL String:
-** should be in the format of http://user:pass@host:port/requestwhatever
-** note that user, pass, port, and /requestwhatever are all optional :)
-** note that also, http:// is really not important. if you do poo://
-** or even leave out the http:// altogether, it will still work.
-*/
-
-#ifndef _HTTPGET_H_
-#define _HTTPGET_H_
-
-#include "connection.h"
-
-class JNL_HTTPGet
-{
- public:
- JNL_HTTPGet(JNL_AsyncDNS *dns=JNL_CONNECTION_AUTODNS, int recvbufsize=16384, char *proxy=NULL);
- ~JNL_HTTPGet();
-
- void addheader(char *header);
-
- void connect(char *url);
-
- int run(); // returns: 0 if all is OK. -1 if error (call geterrorstr()). 1 if connection closed.
-
- int get_status(); // returns 0 if connecting, 1 if reading headers,
- // 2 if reading content, -1 if error.
-
- char *getallheaders(); // double null terminated, null delimited list
- char *getheader(char *headername);
- char *getreply() { return m_reply; }
- int getreplycode(); // returns 0 if none yet, otherwise returns http reply code.
-
- char *geterrorstr() { return m_errstr;}
-
- int bytes_available();
- int get_bytes(char *buf, int len);
- int peek_bytes(char *buf, int len);
-
- __int64 content_length();
-
- JNL_Connection *get_con() { return m_con; }
-
- public:
- void reinit();
- void deinit();
- void seterrstr(char *str) { if (m_errstr) free(m_errstr); m_errstr=(char*)malloc(strlen(str)+1); strcpy(m_errstr,str); }
-
- void do_parse_url(char *url, char **host, int *port, char **req, char **lp);
- void do_encode_mimestr(char *in, char *out);
-
- JNL_AsyncDNS *m_dns;
- JNL_Connection *m_con;
- int m_recvbufsize;
-
- int m_http_state;
-
- int m_http_port;
- char *m_http_url;
- char *m_http_host;
- char *m_http_lpinfo;
- char *m_http_request;
-
- char *m_http_proxylpinfo;
- char *m_http_proxyhost;
- int m_http_proxyport;
-
- char *m_sendheaders;
- char *m_recvheaders;
- int m_recvheaders_size;
- char *m_reply;
-
- char *m_errstr;
-};
-
-#endif // _HTTPGET_H_
+/*
+** JNetLib
+** Copyright (C) 2000-2001 Nullsoft, Inc.
+** Author: Justin Frankel
+** File: httpget.h - JNL interface for doing HTTP GETs.
+** License: see License.txt
+**
+** Usage:
+** 1. Create a JNL_HTTPGet object, optionally specifying a JNL_AsyncDNS
+** object to use (or NULL for none, or JNL_CONNECTION_AUTODNS for auto),
+** and the receive buffer size, and a string specifying proxy (or NULL
+** for none). See note on proxy string below.
+** 2. call addheader() to add whatever headers you want. It is recommended to
+** add at least the following two:
+** addheader("User-Agent:MyApp (Mozilla)");
+*/// addheader("Accept:*/*");
+/* ( the comment weirdness is there so I Can do the star-slash :)
+** 3. Call connect() with the URL you wish to GET (see URL string note below)
+** 4. Call run() once in a while, checking to see if it returns -1
+** (if it does return -1, call geterrorstr() to see what the error is).
+** (if it returns 1, no big deal, the connection has closed).
+** 5. While you're at it, you can call bytes_available() to see if any data
+** from the http stream is available, or getheader() to see if any headers
+** are available, or getreply() to see the HTTP reply, or getallheaders()
+** to get a double null terminated, null delimited list of headers returned.
+** 6. If you want to read from the stream, call get_bytes (which returns how much
+** was actually read).
+** 7. content_length() is a helper function that uses getheader() to check the
+** content-length header.
+** 8. Delete ye' ol' object when done.
+**
+** Proxy String:
+** should be in the format of host:port, or user@host:port, or
+** user:password@host:port. if port is not specified, 80 is assumed.
+** URL String:
+** should be in the format of http://user:pass@host:port/requestwhatever
+** note that user, pass, port, and /requestwhatever are all optional :)
+** note that also, http:// is really not important. if you do poo://
+** or even leave out the http:// altogether, it will still work.
+**
+** Reviewed for Unicode support by Jim Park -- 08/24/2004
+** Everything remains ANSI. Made sure all TCHAR style functions were
+** changed to strictly ANSI.
+*/
+
+#ifndef _HTTPGET_H_
+#define _HTTPGET_H_
+
+#include "connection.h"
+
+class JNL_HTTPGet
+{
+ public:
+ JNL_HTTPGet(JNL_AsyncDNS *dns=JNL_CONNECTION_AUTODNS, int recvbufsize=16384, char *proxy=NULL);
+ ~JNL_HTTPGet();
+
+ void addheader(char *header);
+
+ void connect(char *url);
+
+ int run(); // returns: 0 if all is OK. -1 if error (call geterrorstr()). 1 if connection closed.
+
+ int get_status(); // returns 0 if connecting, 1 if reading headers,
+ // 2 if reading content, -1 if error.
+
+ char *getallheaders(); // double null terminated, null delimited list
+ char *getheader(char *headername);
+ char *getreply() { return m_reply; }
+ int getreplycode(); // returns 0 if none yet, otherwise returns http reply code.
+
+ char *geterrorstr() { return m_errstr;}
+
+ int bytes_available();
+ int get_bytes(char *buf, int len);
+ int peek_bytes(char *buf, int len);
+
+ __int64 content_length();
+
+ JNL_Connection *get_con() { return m_con; }
+
+ public:
+ void reinit();
+ void deinit();
+ void seterrstr(char *str) { if (m_errstr) free(m_errstr); m_errstr=(char*)malloc(strlen(str)+1); strcpy(m_errstr,str); }
+
+ void do_parse_url(char *url, char **host, int *port, char **req, char **lp);
+ void do_encode_mimestr(char *in, char *out);
+
+ JNL_AsyncDNS *m_dns;
+ JNL_Connection *m_con;
+ int m_recvbufsize;
+
+ int m_http_state;
+
+ int m_http_port;
+ char *m_http_url;
+ char *m_http_host;
+ char *m_http_lpinfo;
+ char *m_http_request;
+
+ char *m_http_proxylpinfo;
+ char *m_http_proxyhost;
+ int m_http_proxyport;
+
+ char *m_sendheaders;
+ char *m_recvheaders;
+ int m_recvheaders_size;
+ char *m_reply;
+
+ char *m_errstr;
+};
+
+#endif // _HTTPGET_H_
diff --git a/Contrib/NSISdl/netinc.h b/Contrib/NSISdl/netinc.h
index 3eb2c863..db68efd0 100644
--- a/Contrib/NSISdl/netinc.h
+++ b/Contrib/NSISdl/netinc.h
@@ -1,42 +1,46 @@
-/*
-** JNetLib
-** Copyright (C) 2000-2001 Nullsoft, Inc.
-** Author: Justin Frankel
-** File: netinc.h - network includes and portability defines (used internally)
-** License: see License.txt
-*/
-
-#ifndef _NETINC_H_
-#define _NETINC_H_
-
-#include
-#include "util.h"
-
-#define strcasecmp(x,y) stricmp(x,y)
-#define ERRNO (WSAGetLastError())
-#define SET_SOCK_BLOCK(s,block) { unsigned long __i=block?0:1; ioctlsocket(s,FIONBIO,&__i); }
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#define EINPROGRESS WSAEWOULDBLOCK
-#define memset mini_memset
-#define memcpy mini_memcpy
-#define strcpy lstrcpy
-#define strncpy lstrcpyn
-#define strcat lstrcat
-#define strlen lstrlen
-#define malloc(x) (new char[x])
-#define free(x) {delete [] x;}
-typedef int socklen_t;
-
-#ifndef INADDR_NONE
-#define INADDR_NONE 0xffffffff
-#endif
-
-#ifndef INADDR_ANY
-#define INADDR_ANY 0
-#endif
-
-#ifndef SHUT_RDWR
-#define SHUT_RDWR 2
-#endif
-
-#endif //_NETINC_H_
+/*
+** JNetLib
+** Copyright (C) 2000-2001 Nullsoft, Inc.
+** Author: Justin Frankel
+** File: netinc.h - network includes and portability defines (used internally)
+** License: see License.txt
+**
+** Unicode support by Jim Park -- 08/24/2007
+*/
+
+#ifndef _NETINC_H_
+#define _NETINC_H_
+
+#include
+#include "util.h"
+
+#define strcasecmp(x,y) stricmp(x,y)
+#define ERRNO (WSAGetLastError())
+#define SET_SOCK_BLOCK(s,block) { unsigned long __i=block?0:1; ioctlsocket(s,FIONBIO,&__i); }
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#define EINPROGRESS WSAEWOULDBLOCK
+#define memset mini_memset
+#define memcpy mini_memcpy
+// Jim Park: For Unicode support, we need to distinguish whether we are working on
+// Unicode or ANSI.
+#define strcpy lstrcpyA
+#define strncpy lstrcpynA
+#define strcat lstrcatA
+#define strlen lstrlenA
+#define malloc(x) (new char[x])
+#define free(x) {delete [] x;}
+typedef int socklen_t;
+
+#ifndef INADDR_NONE
+#define INADDR_NONE 0xffffffff
+#endif
+
+#ifndef INADDR_ANY
+#define INADDR_ANY 0
+#endif
+
+#ifndef SHUT_RDWR
+#define SHUT_RDWR 2
+#endif
+
+#endif //_NETINC_H_
diff --git a/Contrib/NSISdl/nsisdl.cpp b/Contrib/NSISdl/nsisdl.cpp
index 7eaa246a..ba4112d3 100644
--- a/Contrib/NSISdl/nsisdl.cpp
+++ b/Contrib/NSISdl/nsisdl.cpp
@@ -1,597 +1,599 @@
-/*
- NSIS-DL 1.3 - http downloading DLL for NSIS
- Copyright (C) 2001-2002 Yaroslav Faybishenko & Justin Frankel
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-*/
-#include
-#include
-#include
-
-#include "netinc.h"
-#include "util.h"
-#include "httpget.h"
-
-#include // nsis plugin
-
-void *operator new( unsigned int num_bytes )
-{
- return GlobalAlloc(GPTR,num_bytes);
-}
-void operator delete( void *p ) { if (p) GlobalFree(p); }
-
-
-HMODULE hModule;
-HWND g_hwndProgressBar;
-HWND g_hwndStatic;
-static int g_cancelled;
-static void *lpWndProcOld;
-
-static UINT uMsgCreate;
-
-HWND childwnd;
-HWND hwndL;
-HWND hwndB;
-
-static LRESULT CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
-{
- if (uMsgCreate && message == uMsgCreate)
- {
- static HWND hwndPrevFocus;
- static BOOL fCancelDisabled;
-
- if (wParam)
- {
- childwnd = FindWindowEx((HWND) lParam, NULL, "#32770", NULL);
- hwndL = GetDlgItem(childwnd, 1016);
- hwndB = GetDlgItem(childwnd, 1027);
- HWND hwndP = GetDlgItem(childwnd, 1004);
- HWND hwndS = GetDlgItem(childwnd, 1006);
- if (childwnd && hwndP && hwndS)
- {
- // Where to restore focus to before we disable the cancel button
- hwndPrevFocus = GetFocus();
- if (!hwndPrevFocus)
- hwndPrevFocus = hwndP;
-
- if (IsWindowVisible(hwndL))
- ShowWindow(hwndL, SW_HIDE);
- else
- hwndL = NULL;
- if (IsWindowVisible(hwndB))
- ShowWindow(hwndB, SW_HIDE);
- else
- hwndB = NULL;
-
- RECT wndRect, ctlRect;
-
- GetClientRect(childwnd, &wndRect);
-
- GetWindowRect(hwndS, &ctlRect);
-
- HWND s = g_hwndStatic = CreateWindow(
- "STATIC",
- "",
- WS_CHILD | WS_CLIPSIBLINGS | SS_CENTER,
- 0,
- wndRect.bottom / 2 - (ctlRect.bottom - ctlRect.top) / 2,
- wndRect.right,
- ctlRect.bottom - ctlRect.top,
- childwnd,
- NULL,
- hModule,
- NULL
- );
-
- DWORD dwStyle = WS_CHILD | WS_CLIPSIBLINGS;
- dwStyle |= GetWindowLong(hwndP, GWL_STYLE) & PBS_SMOOTH;
-
- GetWindowRect(hwndP, &ctlRect);
-
- HWND pb = g_hwndProgressBar = CreateWindow(
- "msctls_progress32",
- "",
- dwStyle,
- 0,
- wndRect.bottom / 2 + (ctlRect.bottom - ctlRect.top) / 2,
- wndRect.right,
- ctlRect.bottom - ctlRect.top,
- childwnd,
- NULL,
- hModule,
- NULL
- );
-
- long c;
-
- c = SendMessage(hwndP, PBM_SETBARCOLOR, 0, 0);
- SendMessage(hwndP, PBM_SETBARCOLOR, 0, c);
- SendMessage(pb, PBM_SETBARCOLOR, 0, c);
-
- c = SendMessage(hwndP, PBM_SETBKCOLOR, 0, 0);
- SendMessage(hwndP, PBM_SETBKCOLOR, 0, c);
- SendMessage(pb, PBM_SETBKCOLOR, 0, c);
-
- // set font
- long hFont = SendMessage((HWND) lParam, WM_GETFONT, 0, 0);
- SendMessage(pb, WM_SETFONT, hFont, 0);
- SendMessage(s, WM_SETFONT, hFont, 0);
-
- ShowWindow(pb, SW_SHOWNA);
- ShowWindow(s, SW_SHOWNA);
-
- fCancelDisabled = EnableWindow(GetDlgItem(hwnd, IDCANCEL), TRUE);
- SendMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hwnd, IDCANCEL), TRUE);
- }
- else
- childwnd = NULL;
- }
- else if (childwnd)
- {
- if (hwndB)
- {
- ShowWindow(hwndB, SW_SHOWNA);
- hwndB = NULL;
- }
- if (hwndL)
- {
- ShowWindow(hwndL, SW_SHOWNA);
- hwndL = NULL;
- }
-
- // Prevent wierd stuff happening if the cancel button happens to be
- // pressed at the moment we are finishing and restore the previous focus
- // and cancel button states
- SendMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)hwndPrevFocus, TRUE);
- SendMessage(GetDlgItem(hwnd, IDCANCEL), BM_SETSTATE, FALSE, 0);
- if (fCancelDisabled)
- EnableWindow(GetDlgItem(hwnd, IDCANCEL), FALSE);
-
- if (g_hwndStatic)
- {
- DestroyWindow(g_hwndStatic);
- g_hwndStatic = NULL;
- }
- if (g_hwndProgressBar)
- {
- DestroyWindow(g_hwndProgressBar);
- g_hwndProgressBar = NULL;
- }
- childwnd = NULL;
- }
- }
- else if (message == WM_COMMAND && LOWORD(wParam) == IDCANCEL)
- {
- g_cancelled = 1;
- }
- else
- {
- return CallWindowProc(
- (WNDPROC) lpWndProcOld,
- hwnd,
- message,
- wParam,
- lParam
- );
- }
- return 0;
-}
-
-extern "C" BOOL APIENTRY DllMain(HINSTANCE _hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
-{
- hModule = _hModule;
- return TRUE;
-}
-
-#define INT32_MAX 0x7fffffff
-
-int MulDiv64(int nNumber, __int64 nNumerator, __int64 nDenominator)
-{
- // ok, a complete implementation would handle negatives too,
- // but this method is probably not generally useful.
- while (nNumerator > INT32_MAX || nDenominator > INT32_MAX)
- {
- nNumerator = Int64ShraMod32(nNumerator, 1);
- nDenominator = Int64ShraMod32(nDenominator, 1);
- }
- return MulDiv(nNumber, (int)nNumerator, (int)nDenominator);
-}
-
-
-static __int64 g_file_size;
-static DWORD g_dwLastTick = 0;
-void progress_callback(char *msg, __int64 read_bytes)
-{
- // flicker reduction by A. Schiffler
- DWORD dwLastTick = g_dwLastTick;
- DWORD dwThisTick = GetTickCount();
- if (childwnd)
- {
- if (dwThisTick - dwLastTick > 500)
- {
- SetWindowText(g_hwndStatic, msg);
- dwLastTick = dwThisTick;
- }
- if (g_file_size)
- SendMessage(g_hwndProgressBar, PBM_SETPOS, (WPARAM) MulDiv64(30000, read_bytes, g_file_size), 0);
- g_dwLastTick = dwLastTick;
- }
-}
-
-extern char *_strstr(char *i, char *s);
-#define strstr _strstr
-
-extern "C"
-{
-
-__declspec(dllexport) void download (HWND parent,
- int string_size,
- char *variables,
- stack_t **stacktop)
-{
- char buf[1024];
- char url[1024];
- char filename[1024];
- static char proxy[1024];
- BOOL bSuccess=FALSE;
- int timeout_ms=30000;
- int getieproxy=1;
- int manualproxy=0;
- int translation_version;
-
- char *error=NULL;
-
- // translation version 2 & 1
- static char szDownloading[1024]; // "Downloading %s"
- static char szConnecting[1024]; // "Connecting ..."
- static char szSecond[1024]; // " (1 second remaining)" for v2
- // "second" for v1
- static char szMinute[1024]; // " (1 minute remaining)" for v2
- // "minute" for v1
- static char szHour[1024]; // " (1 hour remaining)" for v2
- // "hour" for v1
- static char szProgress[1024]; // "%skB (%d%%) of %skB at %u.%01ukB/s" for v2
- // "%dkB (%d%%) of %dkB at %d.%01dkB/s" for v1
-
- // translation version 2 only
- static char szSeconds[1024]; // " (%u seconds remaining)"
- static char szMinutes[1024]; // " (%u minutes remaining)"
- static char szHours[1024]; // " (%u hours remaining)"
-
- // translation version 1 only
- static char szPlural[1024]; // "s";
- static char szRemaining[1024]; // " (%d %s%s remaining)";
-
- EXDLL_INIT();
-
- popstring(url);
- if (!lstrcmpi(url, "/TRANSLATE2")) {
- popstring(szDownloading);
- popstring(szConnecting);
- popstring(szSecond);
- popstring(szMinute);
- popstring(szHour);
- popstring(szSeconds);
- popstring(szMinutes);
- popstring(szHours);
- popstring(szProgress);
- popstring(url);
- translation_version=2;
- } else if (!lstrcmpi(url, "/TRANSLATE")) {
- popstring(szDownloading);
- popstring(szConnecting);
- popstring(szSecond);
- popstring(szMinute);
- popstring(szHour);
- popstring(szPlural);
- popstring(szProgress);
- popstring(szRemaining);
- popstring(url);
- translation_version=1;
- } else {
- lstrcpy(szDownloading, "Downloading %s");
- lstrcpy(szConnecting, "Connecting ...");
- lstrcpy(szSecond, " (1 second remaining)");
- lstrcpy(szMinute, " (1 minute remaining)");
- lstrcpy(szHour, " (1 hour remaining)");
- lstrcpy(szSeconds, " (%u seconds remaining)");
- lstrcpy(szMinutes, " (%u minutes remaining)");
- lstrcpy(szHours, " (%u hours remaining)");
- lstrcpy(szProgress, "%skB (%d%%) of %skB at %u.%01ukB/s");
- translation_version=2;
- }
- lstrcpyn(buf, url, 10);
- if (!lstrcmpi(buf, "/TIMEOUT=")) {
- timeout_ms=my_atoi(url+9);
- popstring(url);
- }
- if (!lstrcmpi(url, "/PROXY")) {
- getieproxy=0;
- manualproxy=1;
- popstring(proxy);
- popstring(url);
- }
- if (!lstrcmpi(url, "/NOIEPROXY")) {
- getieproxy=0;
- popstring(url);
- }
- popstring(filename);
-
- HANDLE hFile = CreateFile(filename,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,0,NULL);
-
- if (hFile == INVALID_HANDLE_VALUE)
- {
- wsprintf(buf, "Unable to open %s", filename);
- error = buf;
- }
- else
- {
- if (parent)
- {
- uMsgCreate = RegisterWindowMessage("nsisdl create");
-
- lpWndProcOld = (void *)SetWindowLong(parent,GWL_WNDPROC,(long)ParentWndProc);
-
- SendMessage(parent, uMsgCreate, TRUE, (LPARAM) parent);
-
- // set initial text
- char *p = filename;
- while (*p) p++;
- while (*p != '\\' && p != filename) p = CharPrev(filename, p);
- wsprintf(buf, szDownloading, p != filename ? p + 1 : p);
- SetDlgItemText(childwnd, 1006, buf);
- SetWindowText(g_hwndStatic, szConnecting);
- }
- {
- WSADATA wsaData;
- WSAStartup(MAKEWORD(1, 1), &wsaData);
-
- JNL_HTTPGet *get = 0;
-
- static char main_buf[8192];
- char *buf=main_buf;
- char *p=NULL;
-
- HKEY hKey;
- if (getieproxy && RegOpenKeyEx(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",0,KEY_READ,&hKey) == ERROR_SUCCESS)
- {
- DWORD l = 4;
- DWORD t;
- DWORD v;
- if (RegQueryValueEx(hKey,"ProxyEnable",NULL,&t,(unsigned char *)&v,&l) == ERROR_SUCCESS && t == REG_DWORD && v)
- {
- l=8192;
- if (RegQueryValueEx(hKey,"ProxyServer",NULL,&t,(unsigned char *)buf,&l ) == ERROR_SUCCESS && t == REG_SZ)
- {
- p=strstr(buf,"http=");
- if (!p) p=buf;
- else {
- p+=5;
- }
- char *tp=strstr(p,";");
- if (tp) *tp=0;
- char *p2=strstr(p,"=");
- if (p2) p=0; // we found the wrong proxy
- }
- }
- buf[8192-1]=0;
- RegCloseKey(hKey);
- }
- if (manualproxy == 1) {
- p = proxy;
- }
-
- DWORD start_time=GetTickCount();
- get=new JNL_HTTPGet(JNL_CONNECTION_AUTODNS,16384,(p&&p[0])?p:NULL);
- int st;
- int has_printed_headers = 0;
- __int64 cl = 0;
- int len;
- __int64 sofar = 0;
- DWORD last_recv_time=start_time;
-
- get->addheader ("User-Agent: NSISDL/1.2 (Mozilla)");
- get->addheader ("Accept: */*");
-
- get->connect (url);
-
- while (1) {
- if (g_cancelled)
- error = "cancel";
-
- if (error)
- {
- if (parent)
- {
- SendMessage(parent, uMsgCreate, FALSE, (LPARAM) parent);
- SetWindowLong(parent, GWL_WNDPROC, (long)lpWndProcOld);
- }
- break;
- }
-
- st = get->run ();
-
- if (st == -1) {
- lstrcpyn(url, get->geterrorstr(), sizeof(url));
- error = url;
- } else if (st == 1) {
- if (sofar < cl || get->get_status () != 2)
- error="download incomplete";
- else
- {
- bSuccess=TRUE;
- error = "success";
- }
- } else {
-
- if (get->get_status () == 0) {
- // progressFunc ("Connecting ...", 0);
- if (last_recv_time+timeout_ms < GetTickCount())
- error = "Timed out on connecting.";
- else
- Sleep(10); // don't busy-loop while connecting
-
- } else if (get->get_status () == 1) {
-
- progress_callback("Reading headers", 0);
- if (last_recv_time+timeout_ms < GetTickCount())
- error = "Timed out on getting headers.";
- else
- Sleep(10); // don't busy-loop while reading headers
-
- } else if (get->get_status () == 2) {
-
- if (! has_printed_headers) {
- has_printed_headers = 1;
- last_recv_time=GetTickCount();
-
- cl = get->content_length ();
- if (cl == 0)
- error = "Server did not specify content length.";
- else if (g_hwndProgressBar) {
- SendMessage(g_hwndProgressBar, PBM_SETRANGE, 0, MAKELPARAM(0, 30000));
- g_file_size = cl;
- }
- }
-
- int data_downloaded = 0;
- while ((len = get->bytes_available ()) > 0) {
- data_downloaded++;
- if (len > 8192)
- len = 8192;
- len = get->get_bytes (buf, len);
- if (len > 0) {
- last_recv_time=GetTickCount();
- DWORD dw;
- WriteFile(hFile,buf,len,&dw,NULL);
- sofar += len;
- int time_sofar=(GetTickCount()-start_time)/1000;
- int bps = (int)(sofar/(time_sofar?time_sofar:1));
- int remain = MulDiv64(time_sofar, cl, sofar) - time_sofar;
-
- if (translation_version == 2) {
- char *rtext=remain==1?szSecond:szSeconds;;
- if (remain >= 60)
- {
- remain/=60;
- rtext=remain==1?szMinute:szMinutes;
- if (remain >= 60)
- {
- remain/=60;
- rtext=remain==1?szHour:szHours;
- }
- }
-
- char sofar_str[128];
- char cl_str[128];
- myitoa64(sofar/1024, sofar_str);
- myitoa64(cl/1024, cl_str);
-
- wsprintf (buf,
- szProgress, //%skB (%d%%) of %skB @ %u.%01ukB/s
- sofar_str,
- MulDiv64(100, sofar, cl),
- cl_str,
- bps/1024,((bps*10)/1024)%10
- );
- if (remain) wsprintf(buf+lstrlen(buf),rtext,
- remain
- );
- } else if (translation_version == 1) {
- char *rtext=szSecond;
- if (remain >= 60)
- {
- remain/=60;
- rtext=szMinute;
- if (remain >= 60)
- {
- remain/=60;
- rtext=szHour;
- }
- }
-
- wsprintf (buf,
- szProgress, //%dkB (%d%%) of %dkB @ %d.%01dkB/s
- int(sofar/1024),
- MulDiv64(100, sofar, cl),
- int(cl/1024),
- bps/1024,((bps*10)/1024)%10
- );
- if (remain) wsprintf(buf+lstrlen(buf),szRemaining,
- remain,
- rtext,
- remain==1?"":szPlural
- );
- }
- progress_callback(buf, sofar);
- } else {
- if (sofar < cl)
- error = "Server aborted.";
- }
- }
- if (GetTickCount() > last_recv_time+timeout_ms)
- {
- if (sofar != cl)
- {
- error = "Downloading timed out.";
- }
- else
- {
- // workaround for bug #1713562
- // buggy servers that wait for the client to close the connection.
- // another solution would be manually stopping when cl == sofar,
- // but then buggy servers that return wrong content-length will fail.
- bSuccess = TRUE;
- error = "success";
- }
- }
- else if (!data_downloaded)
- Sleep(10);
-
- } else {
- error = "Bad response status.";
- }
- }
-
- }
-
- // Clean up the connection then release winsock
- if (get) delete get;
- WSACleanup();
- }
-
- CloseHandle(hFile);
- }
-
- if (g_cancelled || !bSuccess) {
- DeleteFile(filename);
- }
-
- pushstring(error);
-}
-
-
-__declspec(dllexport) void download_quiet(HWND parent,
- int stringsize,
- char *variables,
- stack_t **stacktop)
-{
- g_hwndProgressBar=0;
- download(NULL,stringsize,variables,stacktop);
-}
-
-} //extern "C"
+/*
+ NSIS-DL 1.3 - http downloading DLL for NSIS
+ Copyright (C) 2001-2002 Yaroslav Faybishenko & Justin Frankel
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Unicode support by Jim Park -- 08/24/2007
+*/
+#include
+#include
+#include
+
+#include "netinc.h"
+#include "util.h"
+#include "httpget.h"
+
+#include // nsis plugin
+
+void *operator new( unsigned int num_bytes )
+{
+ return GlobalAlloc(GPTR,num_bytes);
+}
+void operator delete( void *p ) { if (p) GlobalFree(p); }
+
+
+HMODULE hModule;
+HWND g_hwndProgressBar;
+HWND g_hwndStatic;
+static int g_cancelled;
+static void *lpWndProcOld;
+
+static UINT uMsgCreate;
+
+HWND childwnd;
+HWND hwndL;
+HWND hwndB;
+
+static LRESULT CALLBACK ParentWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ if (uMsgCreate && message == uMsgCreate)
+ {
+ static HWND hwndPrevFocus;
+ static BOOL fCancelDisabled;
+
+ if (wParam)
+ {
+ childwnd = FindWindowEx((HWND) lParam, NULL, _T("#32770"), NULL);
+ hwndL = GetDlgItem(childwnd, 1016);
+ hwndB = GetDlgItem(childwnd, 1027);
+ HWND hwndP = GetDlgItem(childwnd, 1004);
+ HWND hwndS = GetDlgItem(childwnd, 1006);
+ if (childwnd && hwndP && hwndS)
+ {
+ // Where to restore focus to before we disable the cancel button
+ hwndPrevFocus = GetFocus();
+ if (!hwndPrevFocus)
+ hwndPrevFocus = hwndP;
+
+ if (IsWindowVisible(hwndL))
+ ShowWindow(hwndL, SW_HIDE);
+ else
+ hwndL = NULL;
+ if (IsWindowVisible(hwndB))
+ ShowWindow(hwndB, SW_HIDE);
+ else
+ hwndB = NULL;
+
+ RECT wndRect, ctlRect;
+
+ GetClientRect(childwnd, &wndRect);
+
+ GetWindowRect(hwndS, &ctlRect);
+
+ HWND s = g_hwndStatic = CreateWindow(
+ _T("STATIC"),
+ _T(""),
+ WS_CHILD | WS_CLIPSIBLINGS | SS_CENTER,
+ 0,
+ wndRect.bottom / 2 - (ctlRect.bottom - ctlRect.top) / 2,
+ wndRect.right,
+ ctlRect.bottom - ctlRect.top,
+ childwnd,
+ NULL,
+ hModule,
+ NULL
+ );
+
+ DWORD dwStyle = WS_CHILD | WS_CLIPSIBLINGS;
+ dwStyle |= GetWindowLong(hwndP, GWL_STYLE) & PBS_SMOOTH;
+
+ GetWindowRect(hwndP, &ctlRect);
+
+ HWND pb = g_hwndProgressBar = CreateWindow(
+ _T("msctls_progress32"),
+ _T(""),
+ dwStyle,
+ 0,
+ wndRect.bottom / 2 + (ctlRect.bottom - ctlRect.top) / 2,
+ wndRect.right,
+ ctlRect.bottom - ctlRect.top,
+ childwnd,
+ NULL,
+ hModule,
+ NULL
+ );
+
+ long c;
+
+ c = SendMessage(hwndP, PBM_SETBARCOLOR, 0, 0);
+ SendMessage(hwndP, PBM_SETBARCOLOR, 0, c);
+ SendMessage(pb, PBM_SETBARCOLOR, 0, c);
+
+ c = SendMessage(hwndP, PBM_SETBKCOLOR, 0, 0);
+ SendMessage(hwndP, PBM_SETBKCOLOR, 0, c);
+ SendMessage(pb, PBM_SETBKCOLOR, 0, c);
+
+ // set font
+ long hFont = SendMessage((HWND) lParam, WM_GETFONT, 0, 0);
+ SendMessage(pb, WM_SETFONT, hFont, 0);
+ SendMessage(s, WM_SETFONT, hFont, 0);
+
+ ShowWindow(pb, SW_SHOWNA);
+ ShowWindow(s, SW_SHOWNA);
+
+ fCancelDisabled = EnableWindow(GetDlgItem(hwnd, IDCANCEL), TRUE);
+ SendMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)GetDlgItem(hwnd, IDCANCEL), TRUE);
+ }
+ else
+ childwnd = NULL;
+ }
+ else if (childwnd)
+ {
+ if (hwndB)
+ {
+ ShowWindow(hwndB, SW_SHOWNA);
+ hwndB = NULL;
+ }
+ if (hwndL)
+ {
+ ShowWindow(hwndL, SW_SHOWNA);
+ hwndL = NULL;
+ }
+
+ // Prevent wierd stuff happening if the cancel button happens to be
+ // pressed at the moment we are finishing and restore the previous focus
+ // and cancel button states
+ SendMessage(hwnd, WM_NEXTDLGCTL, (WPARAM)hwndPrevFocus, TRUE);
+ SendMessage(GetDlgItem(hwnd, IDCANCEL), BM_SETSTATE, FALSE, 0);
+ if (fCancelDisabled)
+ EnableWindow(GetDlgItem(hwnd, IDCANCEL), FALSE);
+
+ if (g_hwndStatic)
+ {
+ DestroyWindow(g_hwndStatic);
+ g_hwndStatic = NULL;
+ }
+ if (g_hwndProgressBar)
+ {
+ DestroyWindow(g_hwndProgressBar);
+ g_hwndProgressBar = NULL;
+ }
+ childwnd = NULL;
+ }
+ }
+ else if (message == WM_COMMAND && LOWORD(wParam) == IDCANCEL)
+ {
+ g_cancelled = 1;
+ }
+ else
+ {
+ return CallWindowProc(
+ (WNDPROC) lpWndProcOld,
+ hwnd,
+ message,
+ wParam,
+ lParam
+ );
+ }
+ return 0;
+}
+
+extern "C" BOOL APIENTRY DllMain(HINSTANCE _hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
+{
+ hModule = _hModule;
+ return TRUE;
+}
+
+#define INT32_MAX 0x7fffffff
+
+int MulDiv64(int nNumber, __int64 nNumerator, __int64 nDenominator)
+{
+ // ok, a complete implementation would handle negatives too,
+ // but this method is probably not generally useful.
+ while (nNumerator > INT32_MAX || nDenominator > INT32_MAX)
+ {
+ nNumerator = Int64ShraMod32(nNumerator, 1);
+ nDenominator = Int64ShraMod32(nDenominator, 1);
+ }
+ return MulDiv(nNumber, (int)nNumerator, (int)nDenominator);
+}
+
+
+static __int64 g_file_size;
+static DWORD g_dwLastTick = 0;
+void progress_callback(char *msg, __int64 read_bytes)
+{
+ // flicker reduction by A. Schiffler
+ DWORD dwLastTick = g_dwLastTick;
+ DWORD dwThisTick = GetTickCount();
+ if (childwnd)
+ {
+ if (dwThisTick - dwLastTick > 500)
+ {
+ SetWindowTextA(g_hwndStatic, msg);
+ dwLastTick = dwThisTick;
+ }
+ if (g_file_size)
+ SendMessage(g_hwndProgressBar, PBM_SETPOS, (WPARAM) MulDiv64(30000, read_bytes, g_file_size), 0);
+ g_dwLastTick = dwLastTick;
+ }
+}
+
+extern char *_strstr(char *i, char *s);
+#define strstr _strstr
+
+extern "C"
+{
+
+__declspec(dllexport) void download (HWND parent,
+ int string_size,
+ TCHAR *variables,
+ stack_t **stacktop)
+{
+ char buf[1024];
+ char url[1024];
+ char filename[1024];
+ static char proxy[1024];
+ BOOL bSuccess=FALSE;
+ int timeout_ms=30000;
+ int getieproxy=1;
+ int manualproxy=0;
+ int translation_version;
+
+ char *error=NULL;
+
+ // translation version 2 & 1
+ static char szDownloading[1024]; // "Downloading %s"
+ static char szConnecting[1024]; // "Connecting ..."
+ static char szSecond[1024]; // " (1 second remaining)" for v2
+ // "second" for v1
+ static char szMinute[1024]; // " (1 minute remaining)" for v2
+ // "minute" for v1
+ static char szHour[1024]; // " (1 hour remaining)" for v2
+ // "hour" for v1
+ static char szProgress[1024]; // "%skB (%d%%) of %skB at %u.%01ukB/s" for v2
+ // "%dkB (%d%%) of %dkB at %d.%01dkB/s" for v1
+
+ // translation version 2 only
+ static char szSeconds[1024]; // " (%u seconds remaining)"
+ static char szMinutes[1024]; // " (%u minutes remaining)"
+ static char szHours[1024]; // " (%u hours remaining)"
+
+ // translation version 1 only
+ static char szPlural[1024]; // "s";
+ static char szRemaining[1024]; // " (%d %s%s remaining)";
+
+ EXDLL_INIT();
+
+ PopStringA(url);
+ if (!lstrcmpiA(url, "/TRANSLATE2")) {
+ PopStringA(szDownloading);
+ PopStringA(szConnecting);
+ PopStringA(szSecond);
+ PopStringA(szMinute);
+ PopStringA(szHour);
+ PopStringA(szSeconds);
+ PopStringA(szMinutes);
+ PopStringA(szHours);
+ PopStringA(szProgress);
+ PopStringA(url);
+ translation_version=2;
+ } else if (!lstrcmpiA(url, "/TRANSLATE")) {
+ PopStringA(szDownloading);
+ PopStringA(szConnecting);
+ PopStringA(szSecond);
+ PopStringA(szMinute);
+ PopStringA(szHour);
+ PopStringA(szPlural);
+ PopStringA(szProgress);
+ PopStringA(szRemaining);
+ PopStringA(url);
+ translation_version=1;
+ } else {
+ lstrcpyA(szDownloading, "Downloading %s");
+ lstrcpyA(szConnecting, "Connecting ...");
+ lstrcpyA(szSecond, " (1 second remaining)");
+ lstrcpyA(szMinute, " (1 minute remaining)");
+ lstrcpyA(szHour, " (1 hour remaining)");
+ lstrcpyA(szSeconds, " (%u seconds remaining)");
+ lstrcpyA(szMinutes, " (%u minutes remaining)");
+ lstrcpyA(szHours, " (%u hours remaining)");
+ lstrcpyA(szProgress, "%skB (%d%%) of %skB at %u.%01ukB/s");
+ translation_version=2;
+ }
+ lstrcpynA(buf, url, 10);
+ if (!lstrcmpiA(buf, "/TIMEOUT=")) {
+ timeout_ms=my_atoi(url+9);
+ PopStringA(url);
+ }
+ if (!lstrcmpiA(url, "/PROXY")) {
+ getieproxy=0;
+ manualproxy=1;
+ PopStringA(proxy);
+ PopStringA(url);
+ }
+ if (!lstrcmpiA(url, "/NOIEPROXY")) {
+ getieproxy=0;
+ PopStringA(url);
+ }
+ PopStringA(filename);
+
+ HANDLE hFile = CreateFileA(filename,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,0,NULL);
+
+ if (hFile == INVALID_HANDLE_VALUE)
+ {
+ wsprintfA(buf, "Unable to open %s", filename);
+ error = buf;
+ }
+ else
+ {
+ if (parent)
+ {
+ uMsgCreate = RegisterWindowMessage(_T("nsisdl create"));
+
+ lpWndProcOld = (void *)SetWindowLong(parent,GWL_WNDPROC,(long)ParentWndProc);
+
+ SendMessage(parent, uMsgCreate, TRUE, (LPARAM) parent);
+
+ // set initial text
+ char *p = filename;
+ while (*p) p++;
+ while (*p !='\\' && p != filename) p = CharPrevA(filename, p);
+ wsprintfA(buf, szDownloading, p != filename ? p + 1 : p);
+ SetDlgItemTextA(childwnd, 1006, buf);
+ SetWindowTextA(g_hwndStatic, szConnecting);
+ }
+ {
+ WSADATA wsaData;
+ WSAStartup(MAKEWORD(1, 1), &wsaData);
+
+ JNL_HTTPGet *get = 0;
+
+ static char main_buf[8192];
+ char *buf=main_buf;
+ char *p=NULL;
+
+ HKEY hKey;
+ if (getieproxy && RegOpenKeyExA(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings",0,KEY_READ,&hKey) == ERROR_SUCCESS)
+ {
+ DWORD l = 4;
+ DWORD t;
+ DWORD v;
+ if (RegQueryValueExA(hKey,"ProxyEnable",NULL,&t,(unsigned char*)&v,&l) == ERROR_SUCCESS && t == REG_DWORD && v)
+ {
+ l=8192;
+ if (RegQueryValueExA(hKey,"ProxyServer",NULL,&t,(unsigned char *)buf,&l ) == ERROR_SUCCESS && t == REG_SZ)
+ {
+ p=strstr(buf,"http=");
+ if (!p) p=buf;
+ else {
+ p+=5;
+ }
+ char *tp=strstr(p,";");
+ if (tp) *tp=0;
+ char *p2=strstr(p,"=");
+ if (p2) p=0; // we found the wrong proxy
+ }
+ }
+ buf[8192-1]=0;
+ RegCloseKey(hKey);
+ }
+ if (manualproxy == 1) {
+ p = proxy;
+ }
+
+ DWORD start_time=GetTickCount();
+ get=new JNL_HTTPGet(JNL_CONNECTION_AUTODNS,16384,(p&&p[0])?p:NULL);
+ int st;
+ int has_printed_headers = 0;
+ __int64 cl = 0;
+ int len;
+ __int64 sofar = 0;
+ DWORD last_recv_time=start_time;
+
+ get->addheader ("User-Agent: NSISDL/1.2 (Mozilla)");
+ get->addheader ("Accept: */*");
+
+ get->connect (url);
+
+ while (1) {
+ if (g_cancelled)
+ error = "cancel";
+
+ if (error)
+ {
+ if (parent)
+ {
+ SendMessage(parent, uMsgCreate, FALSE, (LPARAM) parent);
+ SetWindowLong(parent, GWL_WNDPROC, (long)lpWndProcOld);
+ }
+ break;
+ }
+
+ st = get->run ();
+
+ if (st == -1) {
+ lstrcpynA(url, get->geterrorstr(), sizeof(url));
+ error = url;
+ } else if (st == 1) {
+ if (sofar < cl || get->get_status () != 2)
+ error="download incomplete";
+ else
+ {
+ bSuccess=TRUE;
+ error = "success";
+ }
+ } else {
+
+ if (get->get_status () == 0) {
+ // progressFunc ("Connecting ...", 0);
+ if (last_recv_time+timeout_ms < GetTickCount())
+ error = "Timed out on connecting.";
+ else
+ Sleep(10); // don't busy-loop while connecting
+
+ } else if (get->get_status () == 1) {
+
+ progress_callback("Reading headers", 0);
+ if (last_recv_time+timeout_ms < GetTickCount())
+ error = "Timed out on getting headers.";
+ else
+ Sleep(10); // don't busy-loop while reading headers
+
+ } else if (get->get_status () == 2) {
+
+ if (! has_printed_headers) {
+ has_printed_headers = 1;
+ last_recv_time=GetTickCount();
+
+ cl = get->content_length ();
+ if (cl == 0)
+ error = "Server did not specify content length.";
+ else if (g_hwndProgressBar) {
+ SendMessage(g_hwndProgressBar, PBM_SETRANGE, 0, MAKELPARAM(0, 30000));
+ g_file_size = cl;
+ }
+ }
+
+ int data_downloaded = 0;
+ while ((len = get->bytes_available ()) > 0) {
+ data_downloaded++;
+ if (len > 8192)
+ len = 8192;
+ len = get->get_bytes (buf, len);
+ if (len > 0) {
+ last_recv_time=GetTickCount();
+ DWORD dw;
+ WriteFile(hFile,buf,len,&dw,NULL);
+ sofar += len;
+ int time_sofar=(GetTickCount()-start_time)/1000;
+ int bps = (int)(sofar/(time_sofar?time_sofar:1));
+ int remain = MulDiv64(time_sofar, cl, sofar) - time_sofar;
+
+ if (translation_version == 2) {
+ char *rtext=remain==1?szSecond:szSeconds;;
+ if (remain >= 60)
+ {
+ remain/=60;
+ rtext=remain==1?szMinute:szMinutes;
+ if (remain >= 60)
+ {
+ remain/=60;
+ rtext=remain==1?szHour:szHours;
+ }
+ }
+
+ char sofar_str[128];
+ char cl_str[128];
+ myitoa64(sofar/1024, sofar_str);
+ myitoa64(cl/1024, cl_str);
+
+ wsprintfA (buf,
+ szProgress, //%skB (%d%%) of %skB @ %u.%01ukB/s
+ sofar_str,
+ MulDiv64(100, sofar, cl),
+ cl_str,
+ bps/1024,((bps*10)/1024)%10
+ );
+ if (remain) wsprintfA(buf+lstrlenA(buf),rtext,
+ remain
+ );
+ } else if (translation_version == 1) {
+ char *rtext=szSecond;
+ if (remain >= 60)
+ {
+ remain/=60;
+ rtext=szMinute;
+ if (remain >= 60)
+ {
+ remain/=60;
+ rtext=szHour;
+ }
+ }
+
+ wsprintfA (buf,
+ szProgress, //%dkB (%d%%) of %dkB @ %d.%01dkB/s
+ int(sofar/1024),
+ MulDiv64(100, sofar, cl),
+ int(cl/1024),
+ bps/1024,((bps*10)/1024)%10
+ );
+ if (remain) wsprintfA(buf+lstrlenA(buf),szRemaining,
+ remain,
+ rtext,
+ remain==1?"":szPlural
+ );
+ }
+ progress_callback(buf, sofar);
+ } else {
+ if (sofar < cl)
+ error = "Server aborted.";
+ }
+ }
+ if (GetTickCount() > last_recv_time+timeout_ms)
+ {
+ if (sofar != cl)
+ {
+ error = "Downloading timed out.";
+ }
+ else
+ {
+ // workaround for bug #1713562
+ // buggy servers that wait for the client to close the connection.
+ // another solution would be manually stopping when cl == sofar,
+ // but then buggy servers that return wrong content-length will fail.
+ bSuccess = TRUE;
+ error = "success";
+ }
+ }
+ else if (!data_downloaded)
+ Sleep(10);
+
+ } else {
+ error = "Bad response status.";
+ }
+ }
+
+ }
+
+ // Clean up the connection then release winsock
+ if (get) delete get;
+ WSACleanup();
+ }
+
+ CloseHandle(hFile);
+ }
+
+ if (g_cancelled || !bSuccess) {
+ DeleteFileA(filename);
+ }
+
+ PushStringA(error);
+}
+
+
+__declspec(dllexport) void download_quiet(HWND parent,
+ int stringsize,
+ TCHAR *variables,
+ stack_t **stacktop)
+{
+ g_hwndProgressBar=0;
+ download(NULL,stringsize,variables,stacktop);
+}
+
+} //extern "C"
diff --git a/Contrib/NSISdl/util.cpp b/Contrib/NSISdl/util.cpp
index 70c329f2..114f4b82 100644
--- a/Contrib/NSISdl/util.cpp
+++ b/Contrib/NSISdl/util.cpp
@@ -1,85 +1,88 @@
-/*
-** JNetLib
-** Copyright (C) 2000-2001 Nullsoft, Inc.
-** Author: Justin Frankel
-** File: util.cpp - JNL implementation of basic network utilities
-** License: see License.txt
-*/
-
-#include "netinc.h"
-
-#include "util.h"
-
-int my_atoi(char *s)
-{
- int sign=0;
- int v=0;
- if (*s == '-') { s++; sign++; }
- for (;;)
- {
- int c=*s++ - '0';
- if (c < 0 || c > 9) break;
- v*=10;
- v+=c;
- }
- if (sign) return -(int) v;
- return (int)v;
-}
-
-__int64 myatoi64(char *s)
-{
- __int64 v=0;
- int sign=0;
-
- if (*s == '-')
- sign++;
- else
- s--;
-
- for (;;)
- {
- int c=*(++s) - '0';
- if (c < 0 || c > 9) break;
- v*=10;
- v+=c;
- }
-
- if (sign)
- v = -v;
-
- return v;
-}
-
-void myitoa64(__int64 i, char *buffer)
-{
- char buf[128], *b = buf;
-
- if (i < 0)
- {
- *(buffer++) = '-';
- i = -i;
- }
- if (i == 0) *(buffer++) = '0';
- else
- {
- while (i > 0)
- {
- *(b++) = '0' + ((char) (i%10));
- i /= 10;
- }
- while (b > buf) *(buffer++) = *(--b);
- }
- *buffer = 0;
-}
-
-void mini_memset(void *o,char i,int l)
-{
- char *oo=(char*)o;
- while (l-- > 0) *oo++=i;
-}
-void mini_memcpy(void *o,void*i,int l)
-{
- char *oo=(char*)o;
- char *ii=(char*)i;
- while (l-- > 0) *oo++=*ii++;
-}
+/*
+** JNetLib
+** Copyright (C) 2000-2001 Nullsoft, Inc.
+** Author: Justin Frankel
+** File: util.cpp - JNL implementation of basic network utilities
+** License: see License.txt
+**
+** Unicode support by Jim Park -- 08/24/2007
+** Keep everything here strictly ANSI. No TCHAR style stuff.
+*/
+
+#include "netinc.h"
+
+#include "util.h"
+
+int my_atoi(char *s)
+{
+ int sign=0;
+ int v=0;
+ if (*s == '-') { s++; sign++; }
+ for (;;)
+ {
+ int c=*s++ - '0';
+ if (c < 0 || c > 9) break;
+ v*=10;
+ v+=c;
+ }
+ if (sign) return -(int) v;
+ return (int)v;
+}
+
+__int64 myatoi64(char *s)
+{
+ __int64 v=0;
+ int sign=0;
+
+ if (*s == '-')
+ sign++;
+ else
+ s--;
+
+ for (;;)
+ {
+ int c=*(++s) - '0';
+ if (c < 0 || c > 9) break;
+ v*=10;
+ v+=c;
+ }
+
+ if (sign)
+ v = -v;
+
+ return v;
+}
+
+void myitoa64(__int64 i, char *buffer)
+{
+ char buf[128], *b = buf;
+
+ if (i < 0)
+ {
+ *(buffer++) = '-';
+ i = -i;
+ }
+ if (i == 0) *(buffer++) = '0';
+ else
+ {
+ while (i > 0)
+ {
+ *(b++) = '0' + ((char) (i%10));
+ i /= 10;
+ }
+ while (b > buf) *(buffer++) = *(--b);
+ }
+ *buffer = 0;
+}
+
+void mini_memset(void *o,char i,int l)
+{
+ char *oo=(char*)o;
+ while (l-- > 0) *oo++=i;
+}
+void mini_memcpy(void *o,void*i,int l)
+{
+ char *oo=(char*)o;
+ char *ii=(char*)i;
+ while (l-- > 0) *oo++=*ii++;
+}
diff --git a/Contrib/NSISdl/util.h b/Contrib/NSISdl/util.h
index 962c591f..e42ff81e 100644
--- a/Contrib/NSISdl/util.h
+++ b/Contrib/NSISdl/util.h
@@ -19,9 +19,11 @@
** gives you the integer representation of a ip address in dotted
** decimal form.
**
-** JNL::addr_to_ipstr(unsigned long addr, char *host, int maxhostlen);
+** JNL::addr_to_ipstr(unsigned long addr, char *host, int maxhostlen);
** gives you the dotted decimal notation of an integer ip address.
**
+** Reviewed for Unicode support by Jim Park -- 08/24/2007
+** Keep the functions here strictly ANSI.
*/
#ifndef _UTIL_H_
diff --git a/Contrib/Splash/splash.c b/Contrib/Splash/splash.c
index efc36fc9..8c175e71 100644
--- a/Contrib/Splash/splash.c
+++ b/Contrib/Splash/splash.c
@@ -13,7 +13,7 @@ static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPar
{
BITMAP bm;
RECT vp;
- GetObject(g_hbm, sizeof(bm), (LPSTR)&bm);
+ GetObject(g_hbm, sizeof(bm), (LPTSTR)&bm);
SystemParametersInfo(SPI_GETWORKAREA, 0, &vp, 0);
SetWindowLong(hwnd,GWL_STYLE,0);
SetWindowPos(hwnd,NULL,
@@ -55,11 +55,11 @@ BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
return TRUE;
}
-void __declspec(dllexport) show(HWND hwndParent, int string_size, char *variables, stack_t **stacktop)
+void __declspec(dllexport) show(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop)
{
- char fn[MAX_PATH];
- char temp[64];
- char *sleep=temp;
+ TCHAR fn[MAX_PATH];
+ TCHAR temp[64];
+ TCHAR *sleep=temp;
EXDLL_INIT();
@@ -68,16 +68,16 @@ void __declspec(dllexport) show(HWND hwndParent, int string_size, char *variable
popstring(fn);
sleep_val=0;
- while (*sleep >= '0' && *sleep <= '9')
+ while (*sleep >= _T('0') && *sleep <= _T('9'))
{
sleep_val*=10;
- sleep_val+=*sleep++-'0';
+ sleep_val+=*sleep++-_T('0');
}
if (fn[0] && sleep_val>0)
{
MSG msg;
- char classname[4]="_sp";
+ TCHAR classname[4]=_T("_sp");
static WNDCLASS wc;
wc.lpfnWndProc = WndProc;
wc.hInstance = g_hInstance;
@@ -85,10 +85,10 @@ void __declspec(dllexport) show(HWND hwndParent, int string_size, char *variable
wc.lpszClassName = classname;
if (RegisterClass(&wc))
{
- char fn2[MAX_PATH];
+ TCHAR fn2[MAX_PATH];
lstrcpy(fn2,fn);
- lstrcat(fn,".bmp");
- lstrcat(fn2,".wav");
+ lstrcat(fn,_T(".bmp"));
+ lstrcat(fn2,_T(".wav"));
g_hbm=LoadImage(NULL,fn,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
if (g_hbm)
{
@@ -114,6 +114,6 @@ void __declspec(dllexport) show(HWND hwndParent, int string_size, char *variable
}
}
}
- wsprintf(temp,"%d",g_rv);
+ wsprintf(temp,_T("%d"),g_rv);
pushstring(temp);
}
diff --git a/Contrib/StartMenu/StartMenu.c b/Contrib/StartMenu/StartMenu.c
index 11290adf..6dc11f78 100644
--- a/Contrib/StartMenu/StartMenu.c
+++ b/Contrib/StartMenu/StartMenu.c
@@ -10,11 +10,11 @@ HWND hwChild;
HWND g_hwStartMenuSelect;
HWND g_hwDirList;
-char buf[1024];
-char text[1024];
-char progname[1024];
-char lastused[1024];
-char checkbox[1024];
+TCHAR buf[1024];
+TCHAR text[1024];
+TCHAR progname[1024];
+TCHAR lastused[1024];
+TCHAR checkbox[1024];
int autoadd;
int g_done;
@@ -23,7 +23,7 @@ int rtl;
void *lpWndProcOld;
-void (__stdcall *validate_filename)(char *);
+void (__stdcall *validate_filename)(TCHAR *);
BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
static BOOL CALLBACK ParentWndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
@@ -34,7 +34,7 @@ static UINT_PTR PluginCallback(enum NSPIM msg)
return 0;
}
-void __declspec(dllexport) Init(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) Init(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
HWND hwStartMenuSelect;
@@ -62,35 +62,35 @@ void __declspec(dllexport) Init(HWND hwndParent, int string_size, char *variable
hwChild = GetDlgItem(hwndParent, 1018);
if (!hwChild)
{
- pushstring("error finding childwnd");
+ pushstring(_T("error finding childwnd"));
return;
}
popstring(buf);
- while (buf[0] == '/')
+ while (buf[0] == _T('/'))
{
- if (!lstrcmpi(buf+1, "noicon"))
+ if (!lstrcmpi(buf+1, _T("noicon")))
{
noicon = 1;
}
- else if (!lstrcmpi(buf+1, "rtl"))
+ else if (!lstrcmpi(buf+1, _T("rtl")))
{
rtl = 1;
}
- else if (!lstrcmpi(buf+1, "text"))
+ else if (!lstrcmpi(buf+1, _T("text")))
{
popstring(text);
}
- else if (!lstrcmpi(buf+1, "autoadd"))
+ else if (!lstrcmpi(buf+1, _T("autoadd")))
{
autoadd = 1;
}
- else if (!lstrcmpi(buf+1, "lastused"))
+ else if (!lstrcmpi(buf+1, _T("lastused")))
{
popstring(lastused);
}
- else if (!lstrcmpi(buf+1, "checknoshortcuts"))
+ else if (!lstrcmpi(buf+1, _T("checknoshortcuts")))
{
popstring(checkbox);
}
@@ -107,7 +107,7 @@ void __declspec(dllexport) Init(HWND hwndParent, int string_size, char *variable
}
else
{
- pushstring("error reading parameters");
+ pushstring(_T("error reading parameters"));
return;
}
@@ -115,19 +115,19 @@ void __declspec(dllexport) Init(HWND hwndParent, int string_size, char *variable
g_hwStartMenuSelect = hwStartMenuSelect;
if (!hwStartMenuSelect)
{
- pushstring("error creating dialog");
+ pushstring(_T("error creating dialog"));
return;
}
else
{
lpWndProcOld = (void *) SetWindowLong(hwndParent, DWL_DLGPROC, (long) ParentWndProc);
- wsprintf(buf, "%u", hwStartMenuSelect);
+ wsprintf(buf, _T("%u"), hwStartMenuSelect);
pushstring(buf);
}
}
}
-void __declspec(dllexport) Show(HWND hwndParent, int string_size, char *variables, stack_t **stacktop)
+void __declspec(dllexport) Show(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop)
{
HWND hwStartMenuSelect = g_hwStartMenuSelect;
@@ -148,7 +148,7 @@ void __declspec(dllexport) Show(HWND hwndParent, int string_size, char *variable
SetWindowLong(hwndParent, DWL_DLGPROC, (long) lpWndProcOld);
}
-void __declspec(dllexport) Select(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) Select(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
Init(hwndParent, string_size, variables, stacktop, extra);
if (g_hwStartMenuSelect)
@@ -312,7 +312,7 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
);
}
- SetWindowText(hwText, *text ? text : "Select the Start Menu folder in which you would like to create the program's shortcuts:");
+ SetWindowText(hwText, *text ? text : _T("Select the Start Menu folder in which you would like to create the program's shortcuts:"));
ProgressiveSetWindowPos(
hwLocation,
@@ -321,7 +321,7 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
MulDiv(12, baseUnitY, 8)
);
- if (*lastused == '>')
+ if (*lastused == _T('>'))
{
CheckDlgButton(hwndDlg, IDC_CHECK, BST_CHECKED);
lstrcpy(lastused, lstrcpy(buf, lastused) + 1);
@@ -373,7 +373,7 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
SendMessage(hwDirList, LB_GETTEXT, selection, (WPARAM)buf);
if (autoadd)
- lstrcat(lstrcat(buf, "\\"), progname);
+ lstrcat(lstrcat(buf, _T("\\")), progname);
SetWindowText(hwLocation, buf);
}
}
@@ -384,7 +384,7 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
EnableWindow(hwLocation, bEnable);
if (bEnable)
goto ValidateLocation;
- *buf = '!'; //This only needs to be != 0, actual value does not matter
+ *buf = _T('!'); //This only needs to be != 0, actual value does not matter
goto SetOkBtn;
}
else if (LOWORD(wParam) == IDC_LOCATION && HIWORD(wParam) == EN_CHANGE)
@@ -393,27 +393,27 @@ BOOL CALLBACK dlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
GetWindowText(hwLocation, buf, MAX_PATH);
validate_filename(buf);
SetOkBtn:
- EnableWindow(GetDlgItem(hwParent, IDOK), *buf != '\0');
+ EnableWindow(GetDlgItem(hwParent, IDOK), *buf != _T('\0'));
}
break;
case WM_USER+666:
g_done = 1;
if (wParam == NOTIFY_BYE_BYE)
- pushstring("cancel");
+ pushstring(_T("cancel"));
else
{
GetWindowText(hwLocation, buf + 1, MAX_PATH);
validate_filename(buf);
if (IsDlgButtonChecked(hwndDlg, IDC_CHECK) == BST_CHECKED)
{
- buf[0] = '>';
+ buf[0] = _T('>');
pushstring(buf);
}
else
{
pushstring(buf + 1);
}
- pushstring("success");
+ pushstring(_T("success"));
}
case WM_CTLCOLORSTATIC:
case WM_CTLCOLOREDIT:
@@ -450,7 +450,7 @@ void AddFolderFromReg(int nFolder)
if (!buf[0])
return;
- lstrcat(buf, "\\*.*");
+ lstrcat(buf, _T("\\*.*"));
hSearch = FindFirstFile(buf, &FileData);
if (hSearch != INVALID_HANDLE_VALUE)
{
@@ -458,9 +458,9 @@ void AddFolderFromReg(int nFolder)
{
if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
- if (*(WORD*)FileData.cFileName != *(WORD*)".")
+ if (*(WORD*)FileData.cFileName != *(WORD*)_T("."))
{
- if (*(WORD*)FileData.cFileName != *(WORD*)".." || FileData.cFileName[2])
+ if (*(WORD*)FileData.cFileName != *(WORD*)_T("..") || FileData.cFileName[2])
{
if (SendMessage(g_hwDirList, LB_FINDSTRINGEXACT, (WPARAM) -1, (LPARAM)FileData.cFileName) == LB_ERR)
SendMessage(g_hwDirList, LB_ADDSTRING, 0, (LPARAM)FileData.cFileName);
diff --git a/Contrib/System/Source/Buffers.c b/Contrib/System/Source/Buffers.c
index fc9ea664..fbcddda1 100644
--- a/Contrib/System/Source/Buffers.c
+++ b/Contrib/System/Source/Buffers.c
@@ -7,7 +7,7 @@ typedef struct tagTempStack TempStack;
struct tagTempStack
{
TempStack *Next;
- char Data[0];
+ TCHAR Data[0];
};
TempStack *tempstack = NULL;
@@ -27,12 +27,12 @@ PLUGINFUNCTIONSHORT(Copy)
{
int size = 0;
HANDLE source, dest;
- char *str;
+ TCHAR *str;
// Get the string
if ((str = system_popstring()) == NULL) return;
// Check for size option
- if (str[0] == '/')
+ if (str[0] == _T('/'))
{
size = (int) myatoi64(str+1);
dest = (HANDLE) popint64();
@@ -59,15 +59,15 @@ PLUGINFUNCTIONEND
PLUGINFUNCTION(Store)
{
TempStack *tmp;
- int size = ((INST_R9+1)*g_stringsize);
+ int size = ((INST_R9+1)*g_stringsize*sizeof(TCHAR));
- char *command, *cmd = command = system_popstring();
+ TCHAR *command, *cmd = command = system_popstring();
while (*cmd != 0)
{
switch (*(cmd++))
{
- case 's':
- case 'S':
+ case _T('s'):
+ case _T('S'):
// Store the whole variables range
tmp = (TempStack*) GlobalAlloc(GPTR, sizeof(TempStack)+size);
tmp->Next = tempstack;
@@ -76,8 +76,8 @@ PLUGINFUNCTION(Store)
// Fill with data
copymem(tempstack->Data, g_variables, size);
break;
- case 'l':
- case 'L':
+ case _T('l'):
+ case _T('L'):
if (tempstack == NULL) break;
// Fill with data
@@ -88,15 +88,15 @@ PLUGINFUNCTION(Store)
GlobalFree((HANDLE) tempstack);
tempstack = tmp;
break;
- case 'P':
+ case _T('P'):
*cmd += 10;
- case 'p':
- GlobalFree((HANDLE) system_pushstring(system_getuservariable(*(cmd++)-'0')));
+ case _T('p'):
+ GlobalFree((HANDLE) system_pushstring(system_getuservariable(*(cmd++)-_T('0'))));
break;
- case 'R':
+ case _T('R'):
*cmd += 10;
- case 'r':
- GlobalFree((HANDLE) system_setuservariable(*(cmd++)-'0', system_popstring()));
+ case _T('r'):
+ GlobalFree((HANDLE) system_setuservariable(*(cmd++)-_T('0'), system_popstring()));
break;
}
}
diff --git a/Contrib/System/Source/Plugin.c b/Contrib/System/Source/Plugin.c
index 84913e04..e46992bf 100644
--- a/Contrib/System/Source/Plugin.c
+++ b/Contrib/System/Source/Plugin.c
@@ -1,3 +1,5 @@
+// Unicode support by Jim Park -- 08/23/2007
+
#include "stdafx.h"
#include "Plugin.h"
#include "Buffers.h"
@@ -5,19 +7,19 @@
HWND g_hwndParent;
-char *AllocString()
+TCHAR *AllocString()
{
- return (char*) GlobalAlloc(GPTR,g_stringsize);
+ return (TCHAR*) GlobalAlloc(GPTR,g_stringsize*sizeof(TCHAR));
}
-char *AllocStr(char *str)
+TCHAR *AllocStr(TCHAR *str)
{
return lstrcpy(AllocString(), str);
}
-char* system_popstring()
+TCHAR* system_popstring()
{
- char *str;
+ TCHAR *str;
stack_t *th;
if (!g_stacktop || !*g_stacktop) return NULL;
@@ -31,24 +33,24 @@ char* system_popstring()
return str;
}
-char *system_pushstring(char *str)
+TCHAR *system_pushstring(TCHAR *str)
{
stack_t *th;
if (!g_stacktop) return str;
- th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+g_stringsize);
+ th=(stack_t*)GlobalAlloc(GPTR,sizeof(stack_t)+(g_stringsize*sizeof(TCHAR)));
lstrcpyn(th->text,str,g_stringsize);
th->next=*g_stacktop;
*g_stacktop=th;
return str;
}
-char *system_getuservariable(int varnum)
+TCHAR *system_getuservariable(int varnum)
{
if (varnum < 0 || varnum >= __INST_LAST) return AllocString();
return AllocStr(g_variables+varnum*g_stringsize);
}
-char *system_setuservariable(int varnum, char *var)
+TCHAR *system_setuservariable(int varnum, TCHAR *var)
{
if (var != NULL && varnum >= 0 && varnum < __INST_LAST) {
lstrcpy (g_variables + varnum*g_stringsize, var);
@@ -57,31 +59,31 @@ char *system_setuservariable(int varnum, char *var)
}
// Updated for int64 and simple bitwise operations
-__int64 myatoi64(char *s)
+__int64 myatoi64(TCHAR *s)
{
__int64 v=0;
// Check for right input
if (!s) return 0;
- if (*s == '0' && (s[1] == 'x' || s[1] == 'X'))
+ if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X')))
{
s++;
for (;;)
{
int c=*(++s);
- if (c >= '0' && c <= '9') c-='0';
- else if (c >= 'a' && c <= 'f') c-='a'-10;
- else if (c >= 'A' && c <= 'F') c-='A'-10;
+ if (c >= _T('0') && c <= _T('9')) c-=_T('0');
+ else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10;
+ else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10;
else break;
v<<=4;
v+=c;
}
}
- else if (*s == '0' && s[1] <= '7' && s[1] >= '0')
+ else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0'))
{
for (;;)
{
int c=*(++s);
- if (c >= '0' && c <= '7') c-='0';
+ if (c >= _T('0') && c <= _T('7')) c-=_T('0');
else break;
v<<=3;
v+=c;
@@ -90,10 +92,10 @@ __int64 myatoi64(char *s)
else
{
int sign=0;
- if (*s == '-') sign++; else s--;
+ if (*s == _T('-')) sign++; else s--;
for (;;)
{
- int c=*(++s) - '0';
+ int c=*(++s) - _T('0');
if (c < 0 || c > 9) break;
v*=10;
v+=c;
@@ -102,7 +104,7 @@ __int64 myatoi64(char *s)
}
// Support for simple ORed expressions
- if (*s == '|')
+ if (*s == _T('|'))
{
v |= myatoi64(s+1);
}
@@ -110,21 +112,21 @@ __int64 myatoi64(char *s)
return v;
}
-void myitoa64(__int64 i, char *buffer)
+void myitoa64(__int64 i, TCHAR *buffer)
{
- char buf[128], *b = buf;
+ TCHAR buf[128], *b = buf;
if (i < 0)
{
- *(buffer++) = '-';
+ *(buffer++) = _T('-');
i = -i;
}
- if (i == 0) *(buffer++) = '0';
+ if (i == 0) *(buffer++) = _T('0');
else
{
while (i > 0)
{
- *(b++) = '0' + ((char) (i%10));
+ *(b++) = _T('0') + ((TCHAR) (i%10));
i /= 10;
}
while (b > buf) *(buffer++) = *(--b);
@@ -135,7 +137,7 @@ void myitoa64(__int64 i, char *buffer)
int popint64()
{
int value;
- char *str;
+ TCHAR *str;
if ((str = system_popstring()) == NULL) return -1;
value = (int) myatoi64(str);
GlobalFree(str);
@@ -144,14 +146,14 @@ int popint64()
void system_pushint(int value)
{
- char buffer[1024];
- wsprintf(buffer, "%d", value);
+ TCHAR buffer[1024];
+ wsprintf(buffer, _T("%d"), value);
system_pushstring(buffer);
}
-char *copymem(char *output, char *input, int size)
+TCHAR *copymem(TCHAR *output, TCHAR *input, int size)
{
- char *out = output;
+ TCHAR *out = output;
if ((input != NULL) && (output != NULL))
while (size-- > 0) *(out++) = *(input++);
return output;
diff --git a/Contrib/System/Source/Plugin.h b/Contrib/System/Source/Plugin.h
index a448ab89..6400f469 100644
--- a/Contrib/System/Source/Plugin.h
+++ b/Contrib/System/Source/Plugin.h
@@ -5,29 +5,29 @@
#define PLUGINFUNCTION(name) \
void __declspec(dllexport) name( \
- HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra) { \
+ HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra) { \
/*g_hwndParent=hwndParent;*/ \
EXDLL_INIT(); \
extra->RegisterPluginCallback(g_hInstance, NSISCallback);
#define PLUGINFUNCTIONEND }
-#define PLUGINFUNCTIONSHORT(name) void __declspec(dllexport) name(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) { \
+#define PLUGINFUNCTIONSHORT(name) void __declspec(dllexport) name(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) { \
g_stringsize=string_size; \
g_stacktop=stacktop;
-extern char *AllocStr(char *str);
-extern void myitoa64(__int64 i, char *buffer);
-extern char *AllocString();
-extern char *system_getuservariable(int varnum);
-extern char *system_setuservariable(int varnum, char *var);
-extern char* system_popstring(); // NULL - stack empty
-extern char* system_pushstring(char *str);
-extern __int64 myatoi64(char *s);
+extern TCHAR *AllocStr(TCHAR *str);
+extern void myitoa64(__int64 i, TCHAR *buffer);
+extern TCHAR *AllocString();
+extern TCHAR *system_getuservariable(int varnum);
+extern TCHAR *system_setuservariable(int varnum, TCHAR *var);
+extern TCHAR* system_popstring(); // NULL - stack empty
+extern TCHAR* system_pushstring(TCHAR *str);
+extern __int64 myatoi64(TCHAR *s);
extern int popint64(); // -1 -> stack empty
extern void system_pushint(int value);
extern HANDLE GlobalCopy(HANDLE Old);
-extern char *copymem(char *output, char *input, int size);
+extern TCHAR *copymem(TCHAR *output, TCHAR *input, int size);
extern UINT_PTR NSISCallback(enum NSPIM);
diff --git a/Contrib/System/Source/System.c b/Contrib/System/Source/System.c
index 8fb1146d..916b6b5f 100644
--- a/Contrib/System/Source/System.c
+++ b/Contrib/System/Source/System.c
@@ -46,15 +46,15 @@ CallbackThunk* CallbackThunkListHead;
HINSTANCE g_hInstance;
// Return to callback caller with stack restore
-char retexpr[4];
+TCHAR retexpr[4];
HANDLE retaddr;
-char *GetResultStr(SystemProc *proc)
+TCHAR *GetResultStr(SystemProc *proc)
{
- char *buf = AllocString();
- if (proc->ProcResult == PR_OK) lstrcpy(buf, "ok");
- else if (proc->ProcResult == PR_ERROR) lstrcpy(buf, "error");
- else if (proc->ProcResult == PR_CALLBACK) wsprintf(buf, "callback%d", proc->CallbackIndex);
+ TCHAR *buf = AllocString();
+ if (proc->ProcResult == PR_OK) lstrcpy(buf, _T("ok"));
+ else if (proc->ProcResult == PR_ERROR) lstrcpy(buf, _T("error"));
+ else if (proc->ProcResult == PR_CALLBACK) wsprintf(buf, _T("callback%d"), proc->CallbackIndex);
return buf;
}
@@ -62,16 +62,16 @@ char *GetResultStr(SystemProc *proc)
// System log debugging turned on
#define SYSTEM_LOG_ADD(a) { register int _len = lstrlen(syslogbuf); lstrcpyn(syslogbuf + _len, a, sizeof(syslogbuf) - _len); }
-#define SYSTEM_LOG_POST { SYSTEM_LOG_ADD("\n"); WriteToLog(syslogbuf); *syslogbuf = 0; }
+#define SYSTEM_LOG_POST { SYSTEM_LOG_ADD(_T("\n")); WriteToLog(syslogbuf); *syslogbuf = 0; }
HANDLE logfile = NULL;
-char syslogbuf[4096] = "";
+TCHAR syslogbuf[4096] = _T("");
int logop = 0;
-void WriteToLog(char *buffer)
+void WriteToLog(TCHAR *buffer)
{
DWORD written;
- char timebuffer[128];
+ TCHAR timebuffer[128];
GetTickCount();
@@ -79,7 +79,7 @@ void WriteToLog(char *buffer)
SetFilePointer(logfile, 0, 0, FILE_END);
- wsprintf(timebuffer, "%04d %04d.%03d ", (++logop)%10000, (GetTickCount() / 1000) % 10000,
+ wsprintf(timebuffer, _T("%04d %04d.%03d "), (++logop)%10000, (GetTickCount() / 1000) % 10000,
GetTickCount() % 1000);
_RPT0(_CRT_WARN, timebuffer);
@@ -92,14 +92,14 @@ void WriteToLog(char *buffer)
PLUGINFUNCTION(Debug)
{
- char *o1;
+ TCHAR *o1;
o1 = system_popstring();
if (logfile == NULL)
if (lstrlen(o1) > 0)
{
SYSTEMTIME t;
- char buffer[1024], buftime[1024], bufdate[1024];
+ TCHAR buffer[1024], buftime[1024], bufdate[1024];
// Init debugging
logfile = CreateFile(o1, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
@@ -111,7 +111,7 @@ PLUGINFUNCTION(Debug)
GetLocalTime(&t);
GetTimeFormat(LOCALE_SYSTEM_DEFAULT, LOCALE_NOUSEROVERRIDE, &t, NULL, buftime, 1024);
GetDateFormat(LOCALE_SYSTEM_DEFAULT, LOCALE_NOUSEROVERRIDE, &t, NULL, bufdate, 1024);
- wsprintf(buffer, "System, %s %s [build "__TIME__" "__DATE__"]\n", buftime, bufdate);
+ wsprintf(buffer, _T("System, %s %s [build "__TIME__" ")__DATE___T("]\n"), buftime, bufdate);
WriteToLog(buffer);
} else ;
else
@@ -122,7 +122,7 @@ PLUGINFUNCTION(Debug)
} else
{
// Stop debugging
- WriteToLog("Debug stopped.\n\n\n");
+ WriteToLog(_T("Debug stopped.\n\n\n"));
CloseHandle(logfile);
logfile = NULL;
}
@@ -172,15 +172,15 @@ PLUGINFUNCTION(Get)
SystemProc *proc = PrepareProc(FALSE);
if (proc == NULL)
{
- system_pushstring("error");
+ system_pushstring(_T("error"));
return;
}
- SYSTEM_LOG_ADD("Get ");
+ SYSTEM_LOG_ADD(_T("Get "));
SYSTEM_LOG_ADD(proc->DllName);
- SYSTEM_LOG_ADD("::");
+ SYSTEM_LOG_ADD(_T("::"));
SYSTEM_LOG_ADD(proc->ProcName);
- SYSTEM_LOG_ADD("\n");
+ SYSTEM_LOG_ADD(_T("\n"));
SYSTEM_LOG_POST;
if ((proc->Options & POPT_ALWRETURN) != 0)
{
@@ -209,11 +209,11 @@ PLUGINFUNCTION(Call)
if (proc == NULL)
return;
- SYSTEM_LOG_ADD("Call ");
+ SYSTEM_LOG_ADD(_T("Call "));
SYSTEM_LOG_ADD(proc->DllName);
- SYSTEM_LOG_ADD("::");
+ SYSTEM_LOG_ADD(_T("::"));
SYSTEM_LOG_ADD(proc->ProcName);
- SYSTEM_LOG_ADD("\n");
+ SYSTEM_LOG_ADD(_T("\n"));
if (proc->ProcResult != PR_CALLBACK)
ParamAllocate(proc);
ParamsIn(proc);
@@ -284,13 +284,13 @@ PLUGINFUNCTION(Call)
PLUGINFUNCTIONSHORT(Int64Op)
{
__int64 i1, i2 = 0, i3, i4;
- char *op, *o1, *o2;
- char buf[128];
+ TCHAR *op, *o1, *o2;
+ TCHAR buf[128];
// Get strings
o1 = system_popstring(); op = system_popstring();
i1 = myatoi64(o1); // convert first arg to int64
- if ((*op != '~') && (*op != '!'))
+ if ((*op != _T('~')) && (*op != _T('!')))
{
// get second arg, convert it, free it
o2 = system_popstring();
@@ -301,25 +301,25 @@ PLUGINFUNCTIONSHORT(Int64Op)
// operation
switch (*op)
{
- case '+': i1 += i2; break;
- case '-': i1 -= i2; break;
- case '*': i1 *= i2; break;
- case '/':
- case '%':
+ case _T('+'): i1 += i2; break;
+ case _T('-'): i1 -= i2; break;
+ case _T('*'): i1 *= i2; break;
+ case _T('/'):
+ case _T('%'):
// It's unclear, but in this case compiler will use DivMod rountine
// instead of two separate Div and Mod rountines.
if (i2 == 0) { i3 = 0; i4 = i1; }
else {i3 = i1 / i2; i4 = i1 % i2; }
- if (*op == '/') i1 = i3; else i1 = i4;
+ if (*op == _T('/')) i1 = i3; else i1 = i4;
break;
- case '|': if (op[1] == '|') i1 = i1 || i2; else i1 |= i2; break;
- case '&': if (op[1] == '&') i1 = i1 && i2; else i1 &= i2; break;
- case '^': i1 ^= i2; break;
- case '~': i1 = ~i1; break;
- case '!': i1 = !i1; break;
- case '<': if (op[1] == '<') i1 = i1 << i2; else i1 = i1 < i2; break;
- case '>': if (op[1] == '>') i1 = i1 >> i2; else i1 = i1 > i2; break;
- case '=': i1 = (i1 == i2); break;
+ case _T('|'): if (op[1] == _T('|')) i1 = i1 || i2; else i1 |= i2; break;
+ case _T('&'): if (op[1] == _T('&')) i1 = i1 && i2; else i1 &= i2; break;
+ case _T('^'): i1 ^= i2; break;
+ case _T('~'): i1 = ~i1; break;
+ case _T('!'): i1 = !i1; break;
+ case _T('<'): if (op[1] == _T('<')) i1 = i1 << i2; else i1 = i1 < i2; break;
+ case _T('>'): if (op[1] == _T('>')) i1 = i1 >> i2; else i1 = i1 > i2; break;
+ case _T('='): i1 = (i1 == i2); break;
}
// Output and freedom
@@ -328,11 +328,11 @@ PLUGINFUNCTIONSHORT(Int64Op)
GlobalFree(o1); GlobalFree(op);
} PLUGINFUNCTIONEND
-__int64 GetIntFromString(char **p)
+__int64 GetIntFromString(TCHAR **p)
{
- char buffer[128], *b = buffer;
+ TCHAR buffer[128], *b = buffer;
(*p)++; // First character should be skipped
- while (((**p >= 'a') && (**p <= 'f')) || ((**p >= 'A') && (**p <= 'F')) || ((**p >= '0') && (**p <= '9')) || (**p == 'X') || (**p == '-') || (**p == 'x') || (**p == '|')) *(b++) = *((*p)++);
+ while (((**p >= _T('a')) && (**p <= _T('f'))) || ((**p >= _T('A')) && (**p <= _T('F'))) || ((**p >= _T('0')) && (**p <= _T('9'))) || (**p == _T('X')) || (**p == _T('-')) || (**p == _T('x')) || (**p == _T('|'))) *(b++) = *((*p)++);
*b = 0;
(*p)--; // We should point at last digit
return myatoi64(buffer);
@@ -347,7 +347,7 @@ SystemProc *PrepareProc(BOOL NeedForCall)
temp = 0, temp2, temp3, temp4;
BOOL param_defined = FALSE;
SystemProc *proc = NULL;
- char *ibuf, *ib, *sbuf, *cbuf, *cb;
+ TCHAR *ibuf, *ib, *sbuf, *cbuf, *cb;
// Retrieve proc specs
cb = (cbuf = AllocString()); // Current String buffer
@@ -370,16 +370,16 @@ SystemProc *PrepareProc(BOOL NeedForCall)
switch (*ib)
{
case 0x0: SectionType = -1; break;
- case '#': SectionType = PST_PROC; ProcType = PT_NOTHING; break;
- case '(':
+ case _T('#'): SectionType = PST_PROC; ProcType = PT_NOTHING; break;
+ case _T('('):
SectionType = PST_PARAMS;
// fake-real parameter: for COM interfaces first param is Interface Pointer
ParamIndex = ((ProcType == PT_VTABLEPROC)?(2):(1));
temp3 = temp = 0;
param_defined = FALSE;
break;
- case ')': SectionType = PST_RETURN; temp3 = temp = 0; break;
- case '?': SectionType = PST_OPTIONS; temp = 1; break;
+ case _T(')'): SectionType = PST_RETURN; temp3 = temp = 0; break;
+ case _T('?'): SectionType = PST_OPTIONS; temp = 1; break;
default:
changed = FALSE;
}
@@ -468,15 +468,15 @@ SystemProc *PrepareProc(BOOL NeedForCall)
case PST_PROC:
switch (*ib)
{
- case ':':
- case '-':
+ case _T(':'):
+ case _T('-'):
// Is it '::'
- if ((*(ib) == '-') && (*(ib+1) == '>'))
+ if ((*(ib) == _T('-')) && (*(ib+1) == _T('>')))
{
ProcType = PT_VTABLEPROC;
} else
{
- if ((*(ib+1) != ':') || (*(ib) == '-')) break;
+ if ((*(ib+1) != _T(':')) || (*(ib) == _T('-'))) break;
ProcType = PT_PROC;
}
ib++; // Skip next ':'
@@ -490,7 +490,7 @@ SystemProc *PrepareProc(BOOL NeedForCall)
// Ok
ChangesDone = PCD_DONE;
break;
- case '*':
+ case _T('*'):
// Structure defenition
ProcType = PT_STRUCT;
ChangesDone = PCD_DONE;
@@ -505,9 +505,9 @@ SystemProc *PrepareProc(BOOL NeedForCall)
temp2 = -1; temp4 = 0; // Our type placeholder
switch (*ib)
{
- case ' ':
+ case _T(' '):
break;
- case '_': // No param cutting specifier
+ case _T('_'): // No param cutting specifier
if (proc->ParamCount > ParamIndex) ParamIndex = proc->ParamCount;
temp3 = temp = 0; // Clear parameter options
if (proc->ParamCount != ((ProcType == PT_VTABLEPROC) ? 1 : 0))
@@ -519,65 +519,65 @@ SystemProc *PrepareProc(BOOL NeedForCall)
param_defined = TRUE;
}
break;
- case ',': // Next param
+ case _T(','): // Next param
temp3 = temp = 0; // Clear parameter options
ParamIndex++;
param_defined = TRUE;
break;
- case '&':
+ case _T('&'):
temp = 1; break; // Special parameter option
- case '*':
+ case _T('*'):
temp = -1; break; // Pointer parameter option
// Types
- case 'v':
- case 'V': temp2 = PAT_VOID; break;
+ case _T('v'):
+ case _T('V'): temp2 = PAT_VOID; break;
#if !defined(SYSTEM_X86)
#error "TODO: handle p"
#else
- case 'p':
+ case _T('p'):
#endif
- case 'i':
- case 'I': temp2 = PAT_INT; break;
- case 'l':
- case 'L': temp2 = PAT_LONG; break;
- case 'm':
- case 'M':
- case 't':
- case 'T': temp2 = PAT_STRING; break;
- case 'g':
- case 'G': temp2 = PAT_GUID; break;
- case 'w':
- case 'W': temp2 = PAT_WSTRING; break;
- case 'k':
- case 'K': temp2 = PAT_CALLBACK; break;
+ case _T('i'):
+ case _T('I'): temp2 = PAT_INT; break;
+ case _T('l'):
+ case _T('L'): temp2 = PAT_LONG; break;
+ case _T('m'):
+ case _T('M'):
+ case _T('t'):
+ case _T('T'): temp2 = PAT_STRING; break;
+ case _T('g'):
+ case _T('G'): temp2 = PAT_GUID; break;
+ case _T('w'):
+ case _T('W'): temp2 = PAT_WSTRING; break;
+ case _T('k'):
+ case _T('K'): temp2 = PAT_CALLBACK; break;
// Input output specifiers
- case '.': temp3++; break; // skip specifier
+ case _T('.'): temp3++; break; // skip specifier
- case 'R':
+ case _T('R'):
temp4 = ((int) GetIntFromString(&ib))+1;
if (temp4 < 11) temp4 += 10;
break;
- case 'r': temp4 = ((int) GetIntFromString(&ib))+1; break; // Register
+ case _T('r'): temp4 = ((int) GetIntFromString(&ib))+1; break; // Register
- case '-':
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
+ case _T('-'):
+ case _T('0'): case _T('1'): case _T('2'): case _T('3'): case _T('4'):
+ case _T('5'): case _T('6'): case _T('7'): case _T('8'): case _T('9'):
// Numeric inline
if (temp3 == 0)
{
ib--;
// It's stupid, I know, but I'm too laze to do another thing
- myitoa64(GetIntFromString(&(ib)),(char *)(temp4 = (int) AllocString()));
+ myitoa64(GetIntFromString(&(ib)),(TCHAR *)(temp4 = (int) AllocString()));
}
break;
- case '\"': case '\'': case '`':
+ case _T('\"'): case _T('\''): case _T('`'):
// Character inline
{
- char start = *ib;
+ TCHAR start = *ib;
cb = cbuf;
// copy inline
while (!((*(++ib) == start) && (*(ib+1) != start)) && (*ib))
@@ -591,18 +591,18 @@ SystemProc *PrepareProc(BOOL NeedForCall)
}
break;
- case 's':
- case 'S': temp4 = -1; break; // Stack
- case 'c':
- case 'C': temp4 = INST_CMDLINE+1; break;
- case 'd':
- case 'D': temp4 = INST_INSTDIR+1; break;
- case 'o':
- case 'O': temp4 = INST_OUTDIR+1; break;
- case 'e':
- case 'E': temp4 = INST_EXEDIR+1; break;
- case 'a':
- case 'A': temp4 = INST_LANG+1; break;
+ case _T('s'):
+ case _T('S'): temp4 = -1; break; // Stack
+ case _T('c'):
+ case _T('C'): temp4 = INST_CMDLINE+1; break;
+ case _T('d'):
+ case _T('D'): temp4 = INST_INSTDIR+1; break;
+ case _T('o'):
+ case _T('O'): temp4 = INST_OUTDIR+1; break;
+ case _T('e'):
+ case _T('E'): temp4 = INST_EXEDIR+1; break;
+ case _T('a'):
+ case _T('A'): temp4 = INST_LANG+1; break;
}
// Param type changed?
@@ -645,25 +645,25 @@ SystemProc *PrepareProc(BOOL NeedForCall)
temp2 = 0;
switch (*ib)
{
- case ' ':
+ case _T(' '):
break;
- case '!': temp = -temp; break;
- case 'c':
+ case _T('!'): temp = -temp; break;
+ case _T('c'):
temp2 = POPT_CDECL;
break;
- case 'r':
+ case _T('r'):
temp2 = POPT_ALWRETURN;
break;
- case 'n':
+ case _T('n'):
temp2 = POPT_NEVERREDEF;
break;
- case 's':
+ case _T('s'):
temp2 = POPT_GENSTACK;
break;
- case 'e':
+ case _T('e'):
temp2 = POPT_ERROR;
break;
- case 'u':
+ case _T('u'):
temp2 = POPT_UNLOAD;
break;
}
@@ -750,7 +750,7 @@ SystemProc *PrepareProc(BOOL NeedForCall)
if ((proc->Proc = GetProcAddress(proc->Dll, proc->ProcName)) == NULL)
{
// automatic A discover
- lstrcat(proc->ProcName, "A");
+ lstrcat(proc->ProcName, _T("A"));
if ((proc->Proc = GetProcAddress(proc->Dll, proc->ProcName)) == NULL)
proc->ProcResult = PR_ERROR;
}
@@ -779,7 +779,7 @@ void ParamAllocate(SystemProc *proc)
void ParamsIn(SystemProc *proc)
{
int i, *place;
- char *realbuf;
+ TCHAR *realbuf;
LPWSTR wstr;
i = (proc->ParamCount > 0)?(1):(0);
@@ -788,14 +788,14 @@ void ParamsIn(SystemProc *proc)
ProcParameter *par = &proc->Params[i];
// Step 1: retrive value
if ((par->Input == IOT_NONE) || (par->Input == IOT_INLINE))
- realbuf = AllocStr("");
+ realbuf = AllocStr(_T(""));
else if (par->Input == IOT_STACK) realbuf = system_popstring();
else if ((par->Input > 0) && (par->Input <= __INST_LAST))
realbuf = system_getuservariable(par->Input - 1);
else
{
// Inline input, will be freed as realbuf
- realbuf = (char*) par->Input;
+ realbuf = (TCHAR*) par->Input;
par->Input = IOT_INLINE;
}
@@ -846,8 +846,8 @@ void ParamsIn(SystemProc *proc)
#ifdef SYSTEM_LOG_DEBUG
{
- char buf[1024];
- wsprintf(buf, "\t\t\tParam In %d: type %d value 0x%08X value2 0x%08X\n", i,
+ TCHAR buf[1024];
+ wsprintf(buf, _T("\t\t\tParam In %d: type %d value 0x%08X value2 0x%08X\n"), i,
par->Type, par->Value, par->_value);
SYSTEM_LOG_ADD(buf);
}
@@ -874,7 +874,7 @@ void ParamsDeAllocate(SystemProc *proc)
void ParamsOut(SystemProc *proc)
{
int i, *place;
- char *realbuf;
+ TCHAR *realbuf;
LPWSTR wstr;
i = proc->ParamCount;
@@ -890,19 +890,19 @@ void ParamsOut(SystemProc *proc)
switch (proc->Params[i].Type)
{
case PAT_VOID:
- lstrcpy(realbuf,"");
+ lstrcpy(realbuf,_T(""));
break;
case PAT_INT:
- wsprintf(realbuf, "%d", *((int*) place));
+ wsprintf(realbuf, _T("%d"), *((int*) place));
break;
case PAT_LONG:
myitoa64(*((__int64*) place), realbuf);
break;
case PAT_STRING:
{
- unsigned num = lstrlen(*((char**) place));
+ unsigned num = lstrlen(*((TCHAR**) place));
if (num >= g_stringsize) num = g_stringsize-1;
- lstrcpyn(realbuf,*((char**) place), num+1);
+ lstrcpyn(realbuf,*((TCHAR**) place), num+1);
realbuf[num] = 0;
}
break;
@@ -917,7 +917,7 @@ void ParamsOut(SystemProc *proc)
WideCharToMultiByte(CP_ACP, 0, wstr, g_stringsize, realbuf, g_stringsize, NULL, NULL);
break;
case PAT_CALLBACK:
- wsprintf(realbuf, "%d", proc->Params[i].Value);
+ wsprintf(realbuf, _T("%d"), proc->Params[i].Value);
break;
}
@@ -942,6 +942,7 @@ HANDLE CreateCallback(SystemProc *cbproc)
{
char *mem;
+
if (cbproc->Proc == NULL)
{
// Set callback index
@@ -974,9 +975,9 @@ void CallStruct(SystemProc *proc)
{
BOOL ssflag;
int i, structsize = 0, size = 0;
- char *st, *ptr;
+ TCHAR *st, *ptr;
- SYSTEM_LOG_ADD("\t\tStruct...");
+ SYSTEM_LOG_ADD(_T("\t\tStruct..."));
// Calculate the structure size
for (i = 1; i <= proc->ParamCount; i++)
@@ -993,7 +994,7 @@ void CallStruct(SystemProc *proc)
if (structsize == 0) structsize = (int) GlobalSize((HANDLE) proc->Proc);
// Pointer to current data
- st = (char*) proc->Proc;
+ st = (TCHAR*) proc->Proc;
for (i = 1; i <= proc->ParamCount; i++)
{
@@ -1004,7 +1005,7 @@ void CallStruct(SystemProc *proc)
{
// Normal
size = proc->Params[i].Size*4;
- ptr = (char*) &(proc->Params[i].Value);
+ ptr = (TCHAR*) &(proc->Params[i].Value);
}
else
{
@@ -1025,13 +1026,13 @@ void CallStruct(SystemProc *proc)
// clear unused value bits
proc->Params[i].Value &= intmask[((size >= 0) && (size < 4))?(size):(0)];
// pointer
- ptr = (char*) &(proc->Params[i].Value);
+ ptr = (TCHAR*) &(proc->Params[i].Value);
break;
case PAT_STRING:
case PAT_GUID:
case PAT_WSTRING:
- ptr = (char*) proc->Params[i].Value; break;
+ ptr = (TCHAR*) proc->Params[i].Value; break;
}
}
@@ -1083,6 +1084,7 @@ BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
LastError = 0;
LastProc = NULL;
CallbackIndex = 0;
+ retexpr[0] = (char) 0xC2;
CallbackThunkListHead = NULL;
retexpr[0] = (char) 0xC2;
retexpr[2] = 0x00;
diff --git a/Contrib/System/Source/System.h b/Contrib/System/Source/System.h
index d0711f33..ac21c72d 100644
--- a/Contrib/System/Source/System.h
+++ b/Contrib/System/Source/System.h
@@ -85,8 +85,8 @@ struct tag_SystemProc
{
int ProcType;
int ProcResult;
- char DllName[1024];
- char ProcName[1024];
+ TCHAR DllName[1024];
+ TCHAR ProcName[1024];
HANDLE Dll;
HANDLE Proc;
int Options;
diff --git a/Contrib/System/System.nsh b/Contrib/System/System.nsh
index b550d19f..2fb789c1 100644
--- a/Contrib/System/System.nsh
+++ b/Contrib/System/System.nsh
@@ -109,6 +109,7 @@
; UINT_PTR SetTimer(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);
!define sysSetTimer "user32::SetTimer(i, i, i, k) i"
+; DWORD GetLogicalDriveStrings(DWORD nBufferLength, LPTSTR LpBuffer);
!define sysGetLogicalDriveStrings 'kernel32::GetLogicalDriveStringsA(i, i) i'
!define sysGetDiskFreeSpaceEx 'kernel32::GetDiskFreeSpaceExA(t, *l, *l, *l) i'
diff --git a/Contrib/UIs/default.rc b/Contrib/UIs/default.rc
index 37cf5a25..234f04b4 100644
--- a/Contrib/UIs/default.rc
+++ b/Contrib/UIs/default.rc
@@ -8,7 +8,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
ICON IDI_ICON2,IDC_ULICON,0,0,22,20
LTEXT "",IDC_INTROTEXT,25,0,241,23
- CONTROL "",IDC_EDIT1,"RichEdit20A",WS_BORDER | WS_VSCROLL |
+ CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL |
WS_TABSTOP | 0x804,0,24,266,105
END
@@ -18,7 +18,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
ICON IDI_ICON2,IDC_ULICON,0,0,22,20
LTEXT "",IDC_INTROTEXT,25,0,241,23
- CONTROL "",IDC_EDIT1,"RichEdit20A",WS_BORDER | WS_VSCROLL |
+ CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL |
WS_TABSTOP | 0x804,0,24,266,85
CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTORADIOBUTTON |
WS_TABSTOP,0,110,266,9
@@ -32,7 +32,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
ICON IDI_ICON2,IDC_ULICON,0,0,22,20
LTEXT "",IDC_INTROTEXT,25,0,241,23
- CONTROL "",IDC_EDIT1,"RichEdit20A",WS_BORDER | WS_VSCROLL |
+ CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL |
WS_TABSTOP | 0x804,0,24,266,95
CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,0,120,266,9
diff --git a/Contrib/UIs/modern.rc b/Contrib/UIs/modern.rc
index 0c760d09..e1258ad4 100644
--- a/Contrib/UIs/modern.rc
+++ b/Contrib/UIs/modern.rc
@@ -7,7 +7,7 @@ STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CAPTION
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
LTEXT "",1040,0,0,300,15,NOT WS_GROUP
- CONTROL "",IDC_EDIT1,"RichEdit20A",WS_BORDER | WS_VSCROLL |
+ CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL |
WS_TABSTOP | 0x804,0,15,300,93
LTEXT "",IDC_INTROTEXT,0,113,300,26,NOT WS_GROUP
END
@@ -98,7 +98,7 @@ STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CAPTION
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
LTEXT "",1040,0,0,300,15,NOT WS_GROUP
- CONTROL "",IDC_EDIT1,"RichEdit20A",WS_BORDER | WS_VSCROLL |
+ CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL |
WS_TABSTOP | 0x804,0,15,300,73
LTEXT "",IDC_INTROTEXT,0,93,300,26,NOT WS_GROUP
CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTORADIOBUTTON |
@@ -112,7 +112,7 @@ STYLE DS_FIXEDSYS | DS_CONTROL | WS_CHILD | WS_CAPTION
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
LTEXT "",1040,0,0,300,15,NOT WS_GROUP
- CONTROL "",IDC_EDIT1,"RichEdit20A",WS_BORDER | WS_VSCROLL |
+ CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL |
WS_TABSTOP | 0x804,0,15,300,83
LTEXT "",IDC_INTROTEXT,0,103,300,26,NOT WS_GROUP
CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTOCHECKBOX |
diff --git a/Contrib/UIs/resource.h b/Contrib/UIs/resource.h
index baeee936..46fb1672 100644
--- a/Contrib/UIs/resource.h
+++ b/Contrib/UIs/resource.h
@@ -1,4 +1,5 @@
#include
+#include
#ifndef IDC_STATIC
#define IDC_STATIC (-1)
diff --git a/Contrib/UIs/sdbarker_tiny.rc b/Contrib/UIs/sdbarker_tiny.rc
index 9952e716..893f2ae7 100644
--- a/Contrib/UIs/sdbarker_tiny.rc
+++ b/Contrib/UIs/sdbarker_tiny.rc
@@ -8,7 +8,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
ICON 103,IDC_ULICON,0,0,20,20
LTEXT "",IDC_INTROTEXT,25,0,241,23,NOT WS_GROUP
- CONTROL "",IDC_EDIT1,"RichEdit20A",WS_BORDER | WS_VSCROLL |
+ CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL |
WS_TABSTOP | 0x804,0,24,266,47
END
@@ -91,7 +91,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
ICON 103,IDC_ULICON,0,0,20,20
LTEXT "",IDC_INTROTEXT,25,0,241,23,NOT WS_GROUP
- CONTROL "",IDC_EDIT1,"RichEdit20A",WS_BORDER | WS_VSCROLL |
+ CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL |
WS_TABSTOP | 0x804,0,24,266,27
CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTORADIOBUTTON |
WS_TABSTOP,0,50,266,9
@@ -105,7 +105,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
ICON 103,IDC_ULICON,0,0,20,20
LTEXT "",IDC_INTROTEXT,25,0,241,23,NOT WS_GROUP
- CONTROL "",IDC_EDIT1,"RichEdit20A",WS_BORDER | WS_VSCROLL |
+ CONTROL "",IDC_EDIT1,RICHEDIT_CLASS,WS_BORDER | WS_VSCROLL |
WS_TABSTOP | 0x804,0,24,266,37
CONTROL "",IDC_LICENSEAGREE,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,0,60,266,9
diff --git a/Contrib/UIs/ui.c b/Contrib/UIs/ui.c
index 91a7c7ba..4efaf9e0 100644
--- a/Contrib/UIs/ui.c
+++ b/Contrib/UIs/ui.c
@@ -1,14 +1,16 @@
// ui.cpp : Defines the entry point for the application.
//
+// Unicode support by Jim Park -- 08/10/2007
#include
#include
+#include "../ExDLL/nsis_tchar.h"
#include "resource.h"
HINSTANCE g_hInstance;
HWND m_curwnd;
-char* windows[] = {
+TCHAR* windows[] = {
MAKEINTRESOURCE(IDD_LICENSE),
MAKEINTRESOURCE(IDD_SELCOM),
MAKEINTRESOURCE(IDD_DIR),
@@ -34,11 +36,11 @@ BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) {
static int i = -1;
switch (uMsg) {
case WM_INITDIALOG:
- SetWindowText(hwndDlg, "NSIS User Interface - Testing");
- SetWindowText(GetDlgItem(hwndDlg, IDC_VERSTR), "NSIS version");
- SetWindowText(GetDlgItem(hwndDlg, IDC_BACK), "< Back");
- SetWindowText(GetDlgItem(hwndDlg, IDOK), "Next >");
- SetWindowText(GetDlgItem(hwndDlg, IDCANCEL), "Cancel");
+ SetWindowText(hwndDlg, _T("NSIS User Interface - Testing"));
+ SetWindowText(GetDlgItem(hwndDlg, IDC_VERSTR), _T("NSIS version"));
+ SetWindowText(GetDlgItem(hwndDlg, IDC_BACK), _T("< Back"));
+ SetWindowText(GetDlgItem(hwndDlg, IDOK), _T("Next >"));
+ SetWindowText(GetDlgItem(hwndDlg, IDCANCEL), _T("Cancel"));
ShowWindow(GetDlgItem(hwndDlg, IDC_BACK), SW_SHOW);
ShowWindow(GetDlgItem(hwndDlg, IDC_CHILDRECT), SW_SHOW);
SendMessage(hwndDlg, WM_COMMAND, MAKEWORD(IDOK, 0), 0);
@@ -53,7 +55,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) {
i++;
break;
}
- if (i >= (int)sizeof(windows)/sizeof(char*)) {
+ if (i >= (int)sizeof(windows)/sizeof(TCHAR*)) {
i--;
break;
}
@@ -78,14 +80,14 @@ BOOL CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) {
return 0;
}
-int APIENTRY WinMain(HINSTANCE hInstance,
+int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
+ LPTSTR lpCmdLine,
int nCmdShow)
{
InitCommonControls();
- LoadLibrary("RichEd32.dll");
+ LoadLibrary(_T("RichEd32.dll"));
g_hInstance = GetModuleHandle(0);
diff --git a/Contrib/UserInfo/UserInfo.c b/Contrib/UserInfo/UserInfo.c
index 1706d766..f5d4b65d 100644
--- a/Contrib/UserInfo/UserInfo.c
+++ b/Contrib/UserInfo/UserInfo.c
@@ -1,10 +1,12 @@
+// Unicode support by Jim Park -- 08/23/2007
+
#include
#include // nsis plugin
typedef BOOL (WINAPI*CHECKTOKENMEMBERSHIP)(HANDLE TokenHandle,PSID SidToCheck,PBOOL IsMember);
CHECKTOKENMEMBERSHIP _CheckTokenMembership=NULL;
void __declspec(dllexport) GetName(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop)
+ TCHAR *variables, stack_t **stacktop)
{
EXDLL_INIT();
@@ -12,35 +14,35 @@ void __declspec(dllexport) GetName(HWND hwndParent, int string_size,
DWORD dwStringSize = g_stringsize;
stack_t *th;
if (!g_stacktop) return;
- th = (stack_t*) GlobalAlloc(GPTR, sizeof(stack_t) + g_stringsize);
+ th = (stack_t*) GlobalAlloc(GPTR, sizeof(stack_t) + g_stringsize*sizeof(TCHAR));
GetUserName(th->text, &dwStringSize);
th->next = *g_stacktop;
*g_stacktop = th;
}
}
-char* GetAccountTypeHelper(BOOL CheckTokenForGroupDeny)
+TCHAR* GetAccountTypeHelper(BOOL CheckTokenForGroupDeny)
{
- char *group = NULL;
+ TCHAR *group = NULL;
HANDLE hToken = NULL;
- struct group
- {
- DWORD auth_id;
- char *name;
- };
+struct group
+{
+ DWORD auth_id;
+ TCHAR *name;
+};
- struct group groups[] =
- {
- {DOMAIN_ALIAS_RID_USERS, "User"},
- // every user belongs to the users group, hence users come before guests
- {DOMAIN_ALIAS_RID_GUESTS, "Guest"},
- {DOMAIN_ALIAS_RID_POWER_USERS, "Power"},
- {DOMAIN_ALIAS_RID_ADMINS, "Admin"}
- };
+struct group groups[] =
+{
+ {DOMAIN_ALIAS_RID_USERS, _T("User")},
+ // every user belongs to the users group, hence users come before guests
+ {DOMAIN_ALIAS_RID_GUESTS, _T("Guest")},
+ {DOMAIN_ALIAS_RID_POWER_USERS, _T("Power")},
+ {DOMAIN_ALIAS_RID_ADMINS, _T("Admin")}
+};
if (GetVersion() & 0x80000000) // Not NT
{
- return "Admin";
+ return _T("Admin");
}
// First we must open a handle to the access token for this thread.
@@ -58,7 +60,7 @@ char* GetAccountTypeHelper(BOOL CheckTokenForGroupDeny)
// GetUserName is in advapi32.dll so we can avoid Load/Freelibrary
_CheckTokenMembership=
(CHECKTOKENMEMBERSHIP) GetProcAddress(
- GetModuleHandle("ADVAPI32"), "CheckTokenMembership");
+ GetModuleHandle(_T("ADVAPI32")), "CheckTokenMembership");
// Use "old school" membership check?
if (!CheckTokenForGroupDeny || _CheckTokenMembership == NULL)
@@ -121,18 +123,18 @@ char* GetAccountTypeHelper(BOOL CheckTokenForGroupDeny)
return group;
}
- return "";
+ return _T("");
}
void __declspec(dllexport) GetAccountType(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop)
+ TCHAR *variables, stack_t **stacktop)
{
EXDLL_INIT();
pushstring(GetAccountTypeHelper(TRUE));
}
void __declspec(dllexport) GetOriginalAccountType(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop)
+ TCHAR *variables, stack_t **stacktop)
{
EXDLL_INIT();
pushstring(GetAccountTypeHelper(FALSE));
diff --git a/Contrib/VPatch/Source/GenPat/Checksums.cpp b/Contrib/VPatch/Source/GenPat/Checksums.cpp
index 387e4b9e..b3b2e513 100644
--- a/Contrib/VPatch/Source/GenPat/Checksums.cpp
+++ b/Contrib/VPatch/Source/GenPat/Checksums.cpp
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Unicode support by Jim Park -- 08/29/2007
#include "Checksums.h"
@@ -82,7 +84,8 @@ void streamMD5(bistream& data, md5_byte_t digest[16]) {
md5_finish(&state, digest);
}
-TChecksum::TChecksum(std::string& fileName) : mode(MD5) {
+// Jim Park: string -> tstring.
+TChecksum::TChecksum(tstring& fileName) : mode(MD5) {
bifstream data;
data.open(fileName.c_str(), ios::binary | ios::in);
data.seekg(0, ios::beg);
diff --git a/Contrib/VPatch/Source/GenPat/Checksums.h b/Contrib/VPatch/Source/GenPat/Checksums.h
index d0196398..7d404049 100644
--- a/Contrib/VPatch/Source/GenPat/Checksums.h
+++ b/Contrib/VPatch/Source/GenPat/Checksums.h
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Unicode support by Jim Park -- 08/29/2007
#if !defined(Checksums_H)
#define Checksums_H
@@ -29,6 +31,7 @@
#include "md5.h"
#include
#include "GlobalTypes.h"
+ #include "tchar.h"
typedef uint32_t crc32_t;
@@ -39,7 +42,7 @@
enum { CRC32, MD5 } mode;
TChecksum() : mode(MD5) { }
- TChecksum(std::string& fileName);
+ TChecksum(tstring& fileName);
void loadMD5(md5_byte_t newdigest[16]);
void loadCRC32(crc32_t newcrc);
diff --git a/Contrib/VPatch/Source/GenPat/ChunkedFile.cpp b/Contrib/VPatch/Source/GenPat/ChunkedFile.cpp
index 29f99168..9717802a 100644
--- a/Contrib/VPatch/Source/GenPat/ChunkedFile.cpp
+++ b/Contrib/VPatch/Source/GenPat/ChunkedFile.cpp
@@ -22,9 +22,12 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Unicode support by Jim Park -- 08/29/2007
#include "ChunkedFile.h"
+#include "tchar.h"
using namespace std;
@@ -32,15 +35,15 @@ using namespace std;
chunks(NULL) {
chunkCount = fSize / chunkSize;
- cout << "[ChunkedFile] Filesize of " << static_cast(fSize) << " gives " << static_cast(chunkCount) << " chunks.\n";
+ tout << _T("[ChunkedFile] Filesize of ") << static_cast(fSize) << _T(" gives ") << static_cast(chunkCount) << _T(" chunks.\n");
- cout << "[ChunkedFile] Memory to be used by those chunks: " << sizeof(FileChunk) * chunkCount << " bytes...";
+ tout << _T("[ChunkedFile] Memory to be used by those chunks: ") << sizeof(FileChunk) * chunkCount << _T(" bytes...");
if(chunkCount == 0) {
chunks = NULL;
return;
}
chunks = new FileChunk[chunkCount];
- cout << " allocated.\n";
+ tout << _T(" allocated.\n");
unsigned char* data = new unsigned char[chunkSize];
for(TFileOffset i = 0; i < chunkCount; i++) {
@@ -50,9 +53,9 @@ using namespace std;
}
delete[] data;
- cout << "[ChunkedFile] Sorting chunks... ";
+ tout << _T("[ChunkedFile] Sorting chunks... ");
std::sort(chunks,chunks + chunkCount);
- cout << "done.\n";
+ tout << _T("done.\n");
}
diff --git a/Contrib/VPatch/Source/GenPat/ChunkedFile.h b/Contrib/VPatch/Source/GenPat/ChunkedFile.h
index 4c617fcf..2a7045f0 100644
--- a/Contrib/VPatch/Source/GenPat/ChunkedFile.h
+++ b/Contrib/VPatch/Source/GenPat/ChunkedFile.h
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Reviewed for Unicode support by Jim Park -- 08/29/2007
#if !defined(ChunkedFile_H)
#define ChunkedFile_H
diff --git a/Contrib/VPatch/Source/GenPat/FileFormat1.cpp b/Contrib/VPatch/Source/GenPat/FileFormat1.cpp
index 8e85b7bd..6e715d9e 100644
--- a/Contrib/VPatch/Source/GenPat/FileFormat1.cpp
+++ b/Contrib/VPatch/Source/GenPat/FileFormat1.cpp
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Reviewed for Unicode support by Jim Park -- 08/29/2007
#include "FileFormat1.h"
#include "GlobalTypes.h"
@@ -126,7 +128,7 @@ namespace FileFormat1 {
TFileOffset endOffset = in.tellg();
if(sourceChecksum == *removeCRC) {
if(existanceIsError) {
- throw "Source file with the exact same contents already exists in patch!\nUse /R option (replace) to replace it with this patch!";
+ throw _T("Source file with the exact same contents already exists in patch!\nUse /R option (replace) to replace it with this patch!");
}
fileCount--;
} else {
@@ -192,7 +194,7 @@ namespace FileFormat1 {
// calculate area inbetween this block and the next
TFileOffset notFoundStart = current->targetOffset+current->size;
if(notFoundStart > next->targetOffset) {
- throw "makeBinaryPatch input problem: there was overlap";
+ throw _T("makeBinaryPatch input problem: there was overlap");
}
TFileOffset notFoundSize = next->targetOffset - notFoundStart;
if(notFoundSize > 0) {
diff --git a/Contrib/VPatch/Source/GenPat/FileFormat1.h b/Contrib/VPatch/Source/GenPat/FileFormat1.h
index b8d791f9..42cf66b8 100644
--- a/Contrib/VPatch/Source/GenPat/FileFormat1.h
+++ b/Contrib/VPatch/Source/GenPat/FileFormat1.h
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Reviewed for Unicode support by Jim Park -- 08/29/2007
#if !defined(FileFormat1_H)
#define FileFormat1_H
diff --git a/Contrib/VPatch/Source/GenPat/GlobalTypes.cpp b/Contrib/VPatch/Source/GenPat/GlobalTypes.cpp
index 99e1b771..7ab7d537 100644
--- a/Contrib/VPatch/Source/GenPat/GlobalTypes.cpp
+++ b/Contrib/VPatch/Source/GenPat/GlobalTypes.cpp
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Reviewed for Unicode support by Jim Park -- 08/29/2007
#include "GlobalTypes.h"
diff --git a/Contrib/VPatch/Source/GenPat/GlobalTypes.h b/Contrib/VPatch/Source/GenPat/GlobalTypes.h
index aafb1c55..034b45ff 100644
--- a/Contrib/VPatch/Source/GenPat/GlobalTypes.h
+++ b/Contrib/VPatch/Source/GenPat/GlobalTypes.h
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Reviewed for Unicode support by Jim Park -- 08/29/2007
#if !defined(GlobalTypes_H)
#define GlobalTypes_H
diff --git a/Contrib/VPatch/Source/GenPat/POSIXUtil.cpp b/Contrib/VPatch/Source/GenPat/POSIXUtil.cpp
index 111a87e1..5746aa75 100644
--- a/Contrib/VPatch/Source/GenPat/POSIXUtil.cpp
+++ b/Contrib/VPatch/Source/GenPat/POSIXUtil.cpp
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Unicode support by Jim Park -- 08/29/2007
#include "POSIXUtil.h"
@@ -54,13 +56,13 @@ namespace POSIX {
#ifdef __WIN32__
/* do it the old way on Win32, because POSIX does not get timezone stuff right */
- ALT_FILETIME getFileTime(const char* sFileName) {
+ ALT_FILETIME getFileTime(const TCHAR* sFileName) {
FILETIME temp;
GetSystemTimeAsFileTime(&temp);
HANDLE h = CreateFile(sFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (h == INVALID_HANDLE_VALUE) {
- cerr << "Cannot read file time of " << sFileName << "\n";
+ terr << _T("Cannot read file time of ") << sFileName << _T("\n");
} else {
GetFileTime(h, NULL, NULL, &temp);
CloseHandle(h);
@@ -77,7 +79,7 @@ namespace POSIX {
time_t currentTime = time(NULL);
if(stat(sFileName, &buf)) {
- cerr << "Cannot read file time of " << sFileName << "\n";
+ terr << _T("Cannot read file time of ") << sFileName << _T("\n");
} else {
/* get the time from the file */
currentTime = buf.st_mtime;
@@ -88,11 +90,11 @@ namespace POSIX {
}
#endif
- uint32_t getFileSize(const char* sFileName) {
+ uint32_t getFileSize(const TCHAR* sFileName) {
std::ifstream f;
f.open(sFileName, std::ios_base::binary | std::ios_base::in);
if (!f.good() || f.eof() || !f.is_open()) {
- throw "File could not be read (getFileSize)";
+ throw _T("File could not be read (getFileSize)");
}
f.seekg(0, std::ios_base::beg);
std::ifstream::pos_type begin_pos = f.tellg();
@@ -101,29 +103,29 @@ namespace POSIX {
}
#ifdef __WIN32__
- string getTempFile() {
- char buffer[MAX_PATH];
- if(GetTempFileName(".","vpatch",0,buffer) == 0) {
- cerr << "Cannot create temporary filename";
+ tstring getTempFile() {
+ TCHAR buffer[MAX_PATH];
+ if(GetTempFileName(_T("."),_T("vpatch"),0,buffer) == 0) {
+ terr << _T("Cannot create temporary filename");
}
- return string(buffer);
+ return tstring(buffer);
}
#else
- string getTempFile() {
- char t[] = "/tmp/genpatXXXXXX";
+ tstring getTempFile() {
+ TCHAR t[] = _T("/tmp/genpatXXXXXX");
mode_t old_umask = umask(0077);
int fd = mkstemp(t);
if (fd == -1) {
- cerr << "Cannot create temporary filename";
- return "";
+ terr << _T("Cannot create temporary filename");
+ return _T("");
}
close(fd);
umask(old_umask);
- return string(t);
+ return tstring(t);
}
#endif
diff --git a/Contrib/VPatch/Source/GenPat/POSIXUtil.h b/Contrib/VPatch/Source/GenPat/POSIXUtil.h
index 20529f10..e14361d3 100644
--- a/Contrib/VPatch/Source/GenPat/POSIXUtil.h
+++ b/Contrib/VPatch/Source/GenPat/POSIXUtil.h
@@ -22,11 +22,14 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Unicode support by Jim Park -- 08/29/2007
#if !defined(POSIXUtil_H)
#define POSIXUtil_H
#include "GlobalTypes.h"
#include
+ #include "tchar.h"
using namespace std;
@@ -36,9 +39,9 @@
uint32_t dwHighDateTime;
} ALT_FILETIME;
- ALT_FILETIME getFileTime(const char* sFileName);
- uint32_t getFileSize(const char* sFileName);
- string getTempFile();
+ ALT_FILETIME getFileTime(const TCHAR* sFileName);
+ uint32_t getFileSize(const TCHAR* sFileName);
+ tstring getTempFile();
}
#endif // POSIXUtil_H
diff --git a/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp b/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp
index 445f2e5b..172c96e8 100644
--- a/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp
+++ b/Contrib/VPatch/Source/GenPat/PatchGenerator.cpp
@@ -22,7 +22,10 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Unicode support by Jim Park -- 08/29/2007
+#include "tchar.h"
#include "PatchGenerator.h"
#include
@@ -85,12 +88,12 @@ void PatchGenerator::execute(vector& sameBlocks) {
}
// we need to update the memory cache of target
- cout << "[CacheReload] File position = " << static_cast(targetCDataBaseOffset) << "\n";
+ tout << _T("[CacheReload] File position = ") << static_cast(targetCDataBaseOffset) << _T("\n");
target.seekg(targetCDataBaseOffset,ios::beg);
target.read(reinterpret_cast(targetCData),targetCDataSize);
}
- //cout << currentOffset << " ";
+ //tout << currentOffset << _T(" ");
SameBlock* currentSameBlock = findBlock(sourceTree,currentOffset);
@@ -108,9 +111,9 @@ void PatchGenerator::execute(vector& sameBlocks) {
// debug info
if(beVerbose) {
- cout << "Block found: " << static_cast(currentSameBlock->targetOffset)
- << " " << static_cast(currentSameBlock->size)
- << " (source offset=" << static_cast(currentSameBlock->sourceOffset) << ")\n";
+ tout << _T("Block found: ") << static_cast(currentSameBlock->targetOffset)
+ << _T(" ") << static_cast(currentSameBlock->size)
+ << _T(" (source offset=") << static_cast(currentSameBlock->sourceOffset) << _T(")\n");
}
currentOffset = currentSameBlock->targetOffset + currentSameBlock->size;
@@ -172,8 +175,8 @@ SameBlock* PatchGenerator::findBlock(ChunkedFile* sourceTree,
if(beVerbose) {
if(maxMatches != 0) {
if(matchCount == maxMatches) {
- cout << "[FindBlock] Abort due to >" << static_cast(maxMatches)
- << " matches; file position = " << static_cast(targetFileStartOffset) << "\n";
+ tout << _T("[FindBlock] Abort due to >") << static_cast(maxMatches)
+ << _T(" matches; file position = ") << static_cast(targetFileStartOffset) << _T("\n");
}
}
}
diff --git a/Contrib/VPatch/Source/GenPat/PatchGenerator.h b/Contrib/VPatch/Source/GenPat/PatchGenerator.h
index 03df9f4c..919d0e0d 100644
--- a/Contrib/VPatch/Source/GenPat/PatchGenerator.h
+++ b/Contrib/VPatch/Source/GenPat/PatchGenerator.h
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Reviewed for Unicode support by Jim Park -- 08/29/2007
#if !defined(PatchGenerator_H)
#define PatchGenerator_H
diff --git a/Contrib/VPatch/Source/GenPat/adler32.cpp b/Contrib/VPatch/Source/GenPat/adler32.cpp
index 2a36705b..74747334 100644
--- a/Contrib/VPatch/Source/GenPat/adler32.cpp
+++ b/Contrib/VPatch/Source/GenPat/adler32.cpp
@@ -21,6 +21,8 @@
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
+ Reviewed for Unicode support by Jim Park -- 08/29/2007
+ (nothing changed.)
*/
#include "adler32.h"
diff --git a/Contrib/VPatch/Source/GenPat/adler32.h b/Contrib/VPatch/Source/GenPat/adler32.h
index d5c25074..4f6e4729 100644
--- a/Contrib/VPatch/Source/GenPat/adler32.h
+++ b/Contrib/VPatch/Source/GenPat/adler32.h
@@ -1,6 +1,8 @@
//---------------------------------------------------------------------------
// Adler32
//---------------------------------------------------------------------------
+//
+// Reviewed for Unicode support by Jim Park -- 08/29/2007
#if !defined(Adler32_H)
#define Adler32_H
diff --git a/Contrib/VPatch/Source/GenPat/main.cpp b/Contrib/VPatch/Source/GenPat/main.cpp
index a62ccf04..1eea88e9 100644
--- a/Contrib/VPatch/Source/GenPat/main.cpp
+++ b/Contrib/VPatch/Source/GenPat/main.cpp
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Unicode support by Jim Park -- 08/29/2007
#ifdef __BORLANDC__
#pragma argsused
@@ -31,10 +33,12 @@
#include
#endif
+#include "tchar.h"
+
#ifdef __WIN32__
- #define OPT_CHAR '/'
+ #define OPT_CHAR _T('/')
#else
- #define OPT_CHAR '-'
+ #define OPT_CHAR _T('-')
#endif
#include "GlobalTypes.h"
@@ -46,14 +50,14 @@
#include
#include
-int main( int argc, char * argv[] ) {
- cout << "GenPat v3.1\n";
- cout << "===========\n\n(c) 2001-2005 Van de Sande Productions\n";
- cout << "Website: http://www.tibed.net/vpatch\n\n";
+int _tmain( int argc, TCHAR * argv[] ) {
+ tout << _T("GenPat v3.1\n");
+ tout << _T("===========\n\n(c) 2001-2005 Van de Sande Productions\n");
+ tout << _T("Website: http://www.tibed.net/vpatch\n\n");
- string sourceFileName;
- string targetFileName;
- string patchFileName;
+ tstring sourceFileName;
+ tstring targetFileName;
+ tstring patchFileName;
bool showHelp = true;
@@ -65,30 +69,30 @@ int main( int argc, char * argv[] ) {
int fileNameArgument = 0;
if(argc > 1) {
for(int i = 1; i < argc; i++) {
- string s(argv[i]);
+ tstring s(argv[i]);
if(s.size() > 0) {
if(s[0] == OPT_CHAR) {
if(s.size() > 1) {
- if((s[1] == 'v') || (s[1] == 'V')) {
+ if((s[1] == _T('v')) || (s[1] == _T('V'))) {
beVerbose = true;
}
- if((s[1] == 'o') || (s[1] == 'O')) {
+ if((s[1] == _T('o')) || (s[1] == _T('O'))) {
beOptimal = true;
}
- if((s[1] == 'r') || (s[1] == 'R')) {
+ if((s[1] == _T('r')) || (s[1] == _T('R'))) {
existanceIsError = false;
}
}
if(s.size() > 2) {
- if((s[1] == 'b') || (s[1] == 'B')) {
- if(s[2] == '=') {
- istringstream ss(s.substr(3));
+ if((s[1] == _T('b')) || (s[1] == _T('B'))) {
+ if(s[2] == _T('=')) {
+ tistringstream ss(s.substr(3));
ss >> blockSize;
}
}
- if((s[1] == 'a') || (s[1] == 'A')) {
- if(s[2] == '=') {
- istringstream ss(s.substr(3));
+ if((s[1] == _T('a')) || (s[1] == _T('A'))) {
+ if(s[2] == _T('=')) {
+ tistringstream ss(s.substr(3));
ss >> maxMatches;
}
}
@@ -106,7 +110,7 @@ int main( int argc, char * argv[] ) {
showHelp = false;
break;
default:
- cerr << "WARNING: extra filename argument not used: " << s << "\n";
+ terr << _T("WARNING: extra filename argument not used: ") << s << _T("\n");
}
fileNameArgument++;
}
@@ -117,45 +121,45 @@ int main( int argc, char * argv[] ) {
maxMatches = 0;
}
if(showHelp) {
- cout << "This program will take (sourcefile) as input and create a (patchfile).\n";
- cout << "With this patchfile, you can convert a (sourcefile) into (targetfile).\n\n";
- cout << "Command line info:\n";
- cout << " GENPAT (sourcefile) (targetfile) (patchfile)\n\n";
+ tout << _T("This program will take (sourcefile) as input and create a (patchfile).\n");
+ tout << _T("With this patchfile, you can convert a (sourcefile) into (targetfile).\n\n");
+ tout << _T("Command line info:\n");
+ tout << _T(" GENPAT (sourcefile) (targetfile) (patchfile)\n\n");
- cout << "Command line option (optional):\n";
- cout << OPT_CHAR << "R Replace a patch with same contents as source silently if it\n already exists.\n";
- cout << OPT_CHAR << "B=64 Set blocksize (default=64), multiple of 2 is required.\n";
- cout << OPT_CHAR << "V More verbose information during patch creation.\n";
- cout << OPT_CHAR << "O Deactivate match limit of the " << OPT_CHAR << "A switch (sometimes smaller patches).\n";
- cout << OPT_CHAR << "A=500 Maximum number of block matches per block (improves performance).\n";
- cout << " Default is 500, larger is slower. Use " << OPT_CHAR << "V to see the cut-off aborts.\n\n";
- cout << "Note: filenames should never start with " << OPT_CHAR << " character!\n\n";
- cout << "Possible exit codes:\n";
- cout << " 0 Success\n";
- cout << " 1 Arguments missing\n";
- cout << " 2 Other error\n";
- cout << " 3 Source file already has a patch in specified patch file (=error)\n";
+ tout << _T("Command line option (optional):\n");
+ tout << OPT_CHAR << _T("R Replace a patch with same contents as source silently if it\n already exists.\n");
+ tout << OPT_CHAR << _T("B=64 Set blocksize (default=64), multiple of 2 is required.\n");
+ tout << OPT_CHAR << _T("V More verbose information during patch creation.\n");
+ tout << OPT_CHAR << _T("O Deactivate match limit of the ") << OPT_CHAR << _T("A switch (sometimes smaller patches).\n");
+ tout << OPT_CHAR << _T("A=500 Maximum number of block matches per block (improves performance).\n");
+ tout << _T(" Default is 500, larger is slower. Use ") << OPT_CHAR << _T("V to see the cut-off aborts.\n\n");
+ tout << _T("Note: filenames should never start with ") << OPT_CHAR << _T(" character!\n\n");
+ tout << _T("Possible exit codes:\n");
+ tout << _T(" 0 Success\n");
+ tout << _T(" 1 Arguments missing\n");
+ tout << _T(" 2 Other error\n");
+ tout << _T(" 3 Source file already has a patch in specified patch file (=error)\n");
return 1;
}
- cout << "[Source] " << sourceFileName.c_str() << "\n";
- cout << "[Target] " << targetFileName.c_str() << "\n[PatchFile] " << patchFileName.c_str() << "\n";
+ tout << _T("[Source] ") << sourceFileName.c_str() << _T("\n");
+ tout << _T("[Target] ") << targetFileName.c_str() << _T("\n[PatchFile] ") << patchFileName.c_str() << _T("\n");
// get the file sizes
TFileOffset sourceSize = 0;
try {
sourceSize = POSIX::getFileSize(sourceFileName.c_str());
}
- catch(char* s) {
- cerr << "Source file size reading failed: " << s << "\n";
+ catch(TCHAR* s) {
+ terr << _T("Source file size reading failed: ") << s << _T("\n");
return 2;
}
TFileOffset targetSize;
try {
targetSize = POSIX::getFileSize(targetFileName.c_str());
}
- catch(const char* s) {
- cerr << "Target file size reading failed: " << s << "\n";
+ catch(const TCHAR* s) {
+ terr << _T("Target file size reading failed: ") << s << _T("\n");
return 2;
}
@@ -165,8 +169,8 @@ int main( int argc, char * argv[] ) {
TChecksum* targetCRC = new TChecksum(targetFileName);
targetCRC->mode = TChecksum::MD5; // default
- string tempFileName = POSIX::getTempFile();
- if (tempFileName == "")
+ tstring tempFileName = POSIX::getTempFile();
+ if (tempFileName == _T(""))
return 2;
// open the files
@@ -183,8 +187,8 @@ int main( int argc, char * argv[] ) {
TFileOffset previousPatchSize = 0;
try {
previousPatchSize = POSIX::getFileSize(patchFileName.c_str());
- } catch(const char* s) {
- cout << "Patch file does not yet exist: " << s << ", it will be created.\n";
+ } catch(const TCHAR* s) {
+ tout << _T("Patch file does not yet exist: ") << s << _T(", it will be created.\n");
std::ofstream newfile;
newfile.open(patchFileName.c_str(), std::ios_base::binary | std::ios_base::out);
newfile.close();
@@ -195,8 +199,8 @@ int main( int argc, char * argv[] ) {
try {
// this will copy the contents of previousPatch to patch, but without sourceCRC
fileCount = FileFormat1::removeExistingPatch(previousPatch,previousPatchSize,patch,sourceCRC,existanceIsError);
- } catch(const char* s) {
- cerr << "ERROR: " << s << "\n";
+ } catch(const TCHAR* s) {
+ terr << _T("ERROR: ") << s << _T("\n");
patch.close();
unlink(tempFileName.c_str());
return 3;
@@ -204,9 +208,9 @@ int main( int argc, char * argv[] ) {
// set them to the same checksum mode
targetCRC->mode = sourceCRC->mode;
- cout << "[Checksum] Kind of checksums used: ";
- if(targetCRC->mode == TChecksum::MD5) cout << "MD5\n";
- if(targetCRC->mode == TChecksum::CRC32) cout << "CRC32\n";
+ tout << _T("[Checksum] Kind of checksums used: ");
+ if(targetCRC->mode == TChecksum::MD5) tout << _T("MD5\n");
+ if(targetCRC->mode == TChecksum::CRC32) tout << _T("CRC32\n");
break;
}
@@ -227,26 +231,26 @@ int main( int argc, char * argv[] ) {
}
if((blockSize >> 1) == orgBlockSize) blockSize = orgBlockSize;
if(blockSize != orgBlockSize) {
- cout << "[BlockSizeFix] Your blocksize had to be fixed since it is not a multiple of 2\n";
+ tout << _T("[BlockSizeFix] Your blocksize had to be fixed since it is not a multiple of 2\n");
}
if(blockSize < 16) {
blockSize = 16;
- cout << "[BlockSizeFix] Your blocksize had to be fixed since it is smaller than 16\n";
+ tout << _T("[BlockSizeFix] Your blocksize had to be fixed since it is smaller than 16\n");
}
gen->blockSize = blockSize;
- cout << "[BlockSize] " << static_cast(gen->blockSize) << " bytes\n";
+ tout << _T("[BlockSize] ") << static_cast(gen->blockSize) << _T(" bytes\n");
gen->maxMatches = maxMatches;
if(gen->maxMatches == 0) {
- cout << "[FindBlockMatchLimit] Unlimited matches\n";
+ tout << _T("[FindBlockMatchLimit] Unlimited matches\n");
} else {
- cout << "[FindBlockMatchLimit] " << gen->maxMatches << " matches\n";
+ tout << _T("[FindBlockMatchLimit] ") << gen->maxMatches << _T(" matches\n");
}
gen->beVerbose = beVerbose;
if(beVerbose) {
- cout << "[Debug] Verbose output during patch generation activated.\n";
+ tout << _T("[Debug] Verbose output during patch generation activated.\n");
}
// create sameBlock storage
@@ -279,20 +283,20 @@ int main( int argc, char * argv[] ) {
std::ofstream clearF;
clearF.open(tempFileName.c_str(), std::ios_base::binary | std::ios_base::out);
}
- catch(string s) {
- cerr << "Error thrown: " << s.c_str();
+ catch(tstring s) {
+ terr << _T("Error thrown: ") << s.c_str();
return 2;
}
- catch(const char* s) {
- cerr << "Error thrown: " << s;
+ catch(const TCHAR* s) {
+ terr << _T("Error thrown: ") << s;
return 2;
}
} else {
- cerr << "There was a problem opening the files.\n";
+ terr << _T("There was a problem opening the files.\n");
return 2;
}
if(*sourceCRC == *targetCRC)
- cerr << "WARNING: source and target file have equal CRCs!";
+ terr << _T("WARNING: source and target file have equal CRCs!");
delete sourceCRC;
delete targetCRC;
unlink(tempFileName.c_str());
diff --git a/Contrib/VPatch/Source/GenPat/md5.c b/Contrib/VPatch/Source/GenPat/md5.c
index 0ededbf3..8f21e7cf 100644
--- a/Contrib/VPatch/Source/GenPat/md5.c
+++ b/Contrib/VPatch/Source/GenPat/md5.c
@@ -20,8 +20,9 @@
L. Peter Deutsch
ghost@aladdin.com
+ Reviewed for Unicode support by Jim Park -- 08/29/2007
*/
-/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */
+/* $Id: md5.c,v 1.1 2005/09/17 09:25:44 kichik Exp $ */
/*
Independent implementation of MD5 (RFC 1321).
diff --git a/Contrib/VPatch/Source/GenPat/md5.h b/Contrib/VPatch/Source/GenPat/md5.h
index 698c995d..487652cc 100644
--- a/Contrib/VPatch/Source/GenPat/md5.h
+++ b/Contrib/VPatch/Source/GenPat/md5.h
@@ -20,8 +20,9 @@
L. Peter Deutsch
ghost@aladdin.com
+ Reviewed for Unicode support by Jim Park -- 08/29/2007
*/
-/* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */
+/* $Id: md5.h,v 1.1 2005/09/17 09:25:44 kichik Exp $ */
/*
Independent implementation of MD5 (RFC 1321).
diff --git a/Contrib/VPatch/Source/GenPat/tchar.h b/Contrib/VPatch/Source/GenPat/tchar.h
new file mode 100644
index 00000000..24e16bd2
--- /dev/null
+++ b/Contrib/VPatch/Source/GenPat/tchar.h
@@ -0,0 +1,28 @@
+// Added for Unicode support by Jim Park -- 08/29/2007
+#pragma once
+#include
+#include
+
+#ifdef _UNICODE
+# define tout wcout
+# define terr wcerr
+# define __T(x) L ## x
+# define _T(x) __T(x)
+# define _tmain wmain
+# define _tunlink _wunlink
+
+ typedef std::wstring tstring;
+ typedef std::wistringstream tistringstream;
+
+ typedef wchar_t TCHAR;
+#else
+# define tout cout
+# define terr cerr
+# define _T(x) x
+# define _tmain main
+# define _tunlink _unlink
+
+ typedef std::string tstring;
+ typedef std::istringstream tistringstream;
+ typedef char TCHAR;
+#endif
diff --git a/Contrib/VPatch/Source/Plugin/apply_patch.c b/Contrib/VPatch/Source/Plugin/apply_patch.c
index 1384dcdd..d0e00258 100644
--- a/Contrib/VPatch/Source/Plugin/apply_patch.c
+++ b/Contrib/VPatch/Source/Plugin/apply_patch.c
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Reviewed for Unicode support by Jim Park -- 08/29/2007
#include "apply_patch.h"
#include "checksum.h"
diff --git a/Contrib/VPatch/Source/Plugin/apply_patch.h b/Contrib/VPatch/Source/Plugin/apply_patch.h
index 7716175b..76853aba 100644
--- a/Contrib/VPatch/Source/Plugin/apply_patch.h
+++ b/Contrib/VPatch/Source/Plugin/apply_patch.h
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Reviewed for Unicode support by Jim Park -- 08/29/2007
#ifndef apply_patch_INCLUDED
#define apply_patch_INCLUDED
diff --git a/Contrib/VPatch/Source/Plugin/checksum.c b/Contrib/VPatch/Source/Plugin/checksum.c
index 81b1d27e..e16ec666 100644
--- a/Contrib/VPatch/Source/Plugin/checksum.c
+++ b/Contrib/VPatch/Source/Plugin/checksum.c
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Reviewed for Unicode support by Jim Park -- 08/29/2007
#include "checksum.h"
diff --git a/Contrib/VPatch/Source/Plugin/checksum.h b/Contrib/VPatch/Source/Plugin/checksum.h
index 4817f5f6..d1fe1abc 100644
--- a/Contrib/VPatch/Source/Plugin/checksum.h
+++ b/Contrib/VPatch/Source/Plugin/checksum.h
@@ -22,6 +22,10 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Reviewed for Unicode support by Jim Park -- 08/29/2007
+// The functions return ANSI strings so we use PushStringA to push it on
+// to the return stack correctly.
#ifndef checksum_INCLUDED
#define checksum_INCLUDED
diff --git a/Contrib/VPatch/Source/Plugin/md5.c b/Contrib/VPatch/Source/Plugin/md5.c
index 0c9f7ce1..447c3b2a 100644
--- a/Contrib/VPatch/Source/Plugin/md5.c
+++ b/Contrib/VPatch/Source/Plugin/md5.c
@@ -20,8 +20,9 @@
L. Peter Deutsch
ghost@aladdin.com
+ Reviewed for Unicode support by Jim Park -- 08/29/2007
*/
-/* $Id: md5.c,v 1.1 2005/09/17 09:25:44 kichik Exp $ */
+/* $Id: md5.c,v 1.2 2005/09/20 17:42:28 kichik Exp $ */
/*
Independent implementation of MD5 (RFC 1321).
diff --git a/Contrib/VPatch/Source/Plugin/md5.h b/Contrib/VPatch/Source/Plugin/md5.h
index 698c995d..935f7bdf 100644
--- a/Contrib/VPatch/Source/Plugin/md5.h
+++ b/Contrib/VPatch/Source/Plugin/md5.h
@@ -20,8 +20,10 @@
L. Peter Deutsch
ghost@aladdin.com
+ Reviewed for Unicode support by Jim Park -- 08/29/2007
+
*/
-/* $Id: md5.h,v 1.4 2002/04/13 19:20:28 lpd Exp $ */
+/* $Id: md5.h,v 1.1 2005/09/17 09:25:44 kichik Exp $ */
/*
Independent implementation of MD5 (RFC 1321).
diff --git a/Contrib/VPatch/Source/Plugin/vpatchdll.c b/Contrib/VPatch/Source/Plugin/vpatchdll.c
index df6ca613..ec0e25c1 100644
--- a/Contrib/VPatch/Source/Plugin/vpatchdll.c
+++ b/Contrib/VPatch/Source/Plugin/vpatchdll.c
@@ -22,6 +22,8 @@
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
+//
+// Unicode support by Jim Park -- 08/29/2007
#define WIN32_LEAN_AND_MEAN
#include
@@ -36,15 +38,15 @@ HINSTANCE g_hInstance;
HWND g_hwndParent;
void __declspec(dllexport) vpatchfile(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop) {
+ TCHAR *variables, stack_t **stacktop) {
g_hwndParent=hwndParent;
EXDLL_INIT();
{
- char source[MAX_PATH];
- char dest[MAX_PATH];
- char exename[MAX_PATH];
+ TCHAR source[MAX_PATH];
+ TCHAR dest[MAX_PATH];
+ TCHAR exename[MAX_PATH];
HANDLE hPatch, hSource, hDest;
int result;
@@ -55,7 +57,7 @@ void __declspec(dllexport) vpatchfile(HWND hwndParent, int string_size,
hPatch = CreateFile(exename, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hPatch == INVALID_HANDLE_VALUE) {
- pushstring("Unable to open patch file");
+ pushstring(_T("Unable to open patch file"));
return;
}
@@ -63,7 +65,7 @@ void __declspec(dllexport) vpatchfile(HWND hwndParent, int string_size,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hSource == INVALID_HANDLE_VALUE) {
CloseHandle(hPatch);
- pushstring("Unable to open source file");
+ pushstring(_T("Unable to open source file"));
return;
}
@@ -72,7 +74,7 @@ void __declspec(dllexport) vpatchfile(HWND hwndParent, int string_size,
if (hDest == INVALID_HANDLE_VALUE) {
CloseHandle(hPatch);
CloseHandle(hSource);
- pushstring("Unable to open output file");
+ pushstring(_T("Unable to open output file"));
return;
}
@@ -84,16 +86,16 @@ void __declspec(dllexport) vpatchfile(HWND hwndParent, int string_size,
if ((result != PATCH_SUCCESS)) {
if (result == PATCH_ERROR)
- pushstring("An error occured while patching");
+ pushstring(_T("An error occured while patching"));
else if (result == PATCH_CORRUPT)
- pushstring("Patch data is invalid or corrupt");
+ pushstring(_T("Patch data is invalid or corrupt"));
else if (result == PATCH_NOMATCH)
- pushstring("No suitable patches were found");
+ pushstring(_T("No suitable patches were found"));
else if (result == PATCH_UPTODATE)
- pushstring("OK, new version already installed");
+ pushstring(_T("OK, new version already installed"));
DeleteFile(dest);
} else {
- pushstring("OK");
+ pushstring(_T("OK"));
}
return;
@@ -102,13 +104,13 @@ void __declspec(dllexport) vpatchfile(HWND hwndParent, int string_size,
#ifdef DLL_CHECKSUMS
void __declspec(dllexport) GetFileCRC32(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop) {
+ TCHAR *variables, stack_t **stacktop) {
g_hwndParent=hwndParent;
EXDLL_INIT();
{
- char filename[MAX_PATH];
+ TCHAR filename[MAX_PATH];
char crc_string[9];
HANDLE hFile;
unsigned long crc;
@@ -119,17 +121,17 @@ void __declspec(dllexport) GetFileCRC32(HWND hwndParent, int string_size,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE) {
//pushstring("ERROR: Unable to open file for CRC32 calculation");
- pushstring("");
+ pushstring(_T(""));
return;
}
if (!FileCRC(hFile, &crc)) {
//pushstring("ERROR: Unable to calculate CRC32");
- pushstring("");
+ pushstring(_T(""));
} else {
crc_string[8] = '\0';
CRC32ToString(crc_string,crc);
- pushstring(crc_string);
+ PushStringA(crc_string);
}
CloseHandle(hFile);
@@ -137,13 +139,13 @@ void __declspec(dllexport) GetFileCRC32(HWND hwndParent, int string_size,
}
void __declspec(dllexport) GetFileMD5(HWND hwndParent, int string_size,
- char *variables, stack_t **stacktop) {
+ TCHAR *variables, stack_t **stacktop) {
g_hwndParent=hwndParent;
EXDLL_INIT();
{
- char filename[MAX_PATH];
+ TCHAR filename[MAX_PATH];
char md5_string[33];
HANDLE hFile;
md5_byte_t digest[16];
@@ -154,17 +156,17 @@ void __declspec(dllexport) GetFileMD5(HWND hwndParent, int string_size,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile == INVALID_HANDLE_VALUE) {
//pushstring("ERROR: Unable to open file for MD5 calculation");
- pushstring("");
+ pushstring(_T(""));
return;
}
if (!FileMD5(hFile, digest)) {
//pushstring("ERROR: Unable to calculate MD5");
- pushstring("");
+ pushstring(_T(""));
} else {
md5_string[32] = '\0';
MD5ToString(md5_string,digest);
- pushstring(md5_string);
+ PushStringA(md5_string);
}
CloseHandle(hFile);
diff --git a/Contrib/nsDialogs/browse.c b/Contrib/nsDialogs/browse.c
index 9a7d637b..6c823491 100644
--- a/Contrib/nsDialogs/browse.c
+++ b/Contrib/nsDialogs/browse.c
@@ -1,7 +1,10 @@
+// Unicode support by Jim Park -- 08/10/2007
+
#include
#include
#include // nsis plugin
+#include
#include "defs.h"
@@ -12,26 +15,26 @@ int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData) {
return 0;
}
-void __declspec(dllexport) SelectFolderDialog(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) SelectFolderDialog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
BROWSEINFO bi;
- char result[MAX_PATH];
- char initial[MAX_PATH];
- char title[1024];
+ TCHAR result[MAX_PATH];
+ TCHAR initial[MAX_PATH];
+ TCHAR title[1024];
LPITEMIDLIST resultPIDL;
EXDLL_INIT();
- if (popstringn(title, sizeof(initial)))
+ if (popstringn(title, _countof(initial)))
{
- pushstring("error");
+ pushstring(_T("error"));
return;
}
- if (popstringn(initial, sizeof(title)))
+ if (popstringn(initial, _countof(title)))
{
- pushstring("error");
+ pushstring(_T("error"));
return;
}
@@ -64,7 +67,7 @@ void __declspec(dllexport) SelectFolderDialog(HWND hwndParent, int string_size,
resultPIDL = SHBrowseForFolder(&bi);
if (!resultPIDL)
{
- pushstring("error");
+ pushstring(_T("error"));
return;
}
@@ -74,21 +77,21 @@ void __declspec(dllexport) SelectFolderDialog(HWND hwndParent, int string_size,
}
else
{
- pushstring("error");
+ pushstring(_T("error"));
}
CoTaskMemFree(resultPIDL);
}
-void __declspec(dllexport) SelectFileDialog(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) SelectFileDialog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
OPENFILENAME ofn={0,}; // XXX WTF
int save;
- char type[5];
- static char path[1024];
- static char filter[1024];
- static char currentDirectory[1024];
- static char initialDir[1024];
+ TCHAR type[5];
+ static TCHAR path[1024];
+ static TCHAR filter[1024];
+ static TCHAR currentDirectory[1024];
+ static TCHAR initialDir[1024];
DWORD gfa;
EXDLL_INIT();
@@ -105,7 +108,7 @@ void __declspec(dllexport) SelectFileDialog(HWND hwndParent, int string_size, ch
popstringn(path, sizeof(path));
popstringn(filter, sizeof(filter));
- save = !lstrcmpi(type, "save");
+ save = !lstrcmpi(type, _T("save"));
// Check if the path given is a folder. If it is we initialize the
// ofn.lpstrInitialDir parameter
@@ -114,21 +117,21 @@ void __declspec(dllexport) SelectFileDialog(HWND hwndParent, int string_size, ch
{
lstrcpy(initialDir, path);
ofn.lpstrInitialDir = initialDir;
- path[0] = '\0'; // disable initial file selection as path is actually a directory
+ path[0] = _T('\0'); // disable initial file selection as path is actually a directory
}
if (!filter[0])
{
- lstrcpy(filter, "All Files|*.*");
+ lstrcpy(filter, _T("All Files|*.*"));
}
{
// Convert the filter to the format required by Windows: NULL after each
// item followed by a terminating NULL
- char *p = filter;
+ TCHAR *p = filter;
while (*p) // XXX take care for 1024
{
- if (*p == '|')
+ if (*p == _T('|'))
{
*p++ = 0;
}
@@ -149,19 +152,19 @@ void __declspec(dllexport) SelectFileDialog(HWND hwndParent, int string_size, ch
}
else if (CommDlgExtendedError() == FNERR_INVALIDFILENAME)
{
- *path = '\0';
+ *path = _T('\0');
if ((save ? GetSaveFileName(&ofn) : GetOpenFileName(&ofn)))
{
pushstring(path);
}
else
{
- pushstring("");
+ pushstring(_T(""));
}
}
else
{
- pushstring("");
+ pushstring(_T(""));
}
// restore working dir
diff --git a/Contrib/nsDialogs/defs.h b/Contrib/nsDialogs/defs.h
index 4de614c0..b765f22d 100644
--- a/Contrib/nsDialogs/defs.h
+++ b/Contrib/nsDialogs/defs.h
@@ -1,3 +1,5 @@
+// Unicode support by Jim Park -- 08/24/2007
+
#ifndef __NS_DIALOGS__DEFS_H__
#define __NS_DIALOGS__DEFS_H__
@@ -43,7 +45,7 @@ struct nsControl
{
HWND window;
enum nsControlType type;
- char userData[USERDATA_SIZE];
+ TCHAR userData[USERDATA_SIZE];
struct nsControlCallbacks callbacks;
WNDPROC oldWndProc;
};
@@ -64,6 +66,6 @@ struct nsDialog
struct nsControl* controls;
};
-#define NSCONTROL_ID_PROP "NSIS: nsControl pointer property"
+#define NSCONTROL_ID_PROP _T("NSIS: nsControl pointer property")
#endif//__NS_DIALOGS__DEFS_H__
diff --git a/Contrib/nsDialogs/input.c b/Contrib/nsDialogs/input.c
index cf869f82..ead2a455 100644
--- a/Contrib/nsDialogs/input.c
+++ b/Contrib/nsDialogs/input.c
@@ -1,3 +1,5 @@
+// Unicode support by Jim Park -- 08/24/2007
+
#include
#include // nsis plugin
@@ -8,12 +10,12 @@
extern struct nsDialog g_dialog;
-static int NSDFUNC ConvertPlacement(char *str, int total, int height)
+static int NSDFUNC ConvertPlacement(TCHAR *str, int total, int height)
{
- char unit = *CharPrev(str, str + lstrlen(str));
+ TCHAR unit = *CharPrev(str, str + lstrlen(str));
int x = myatoi(str);
- if (unit == '%')
+ if (unit == _T('%'))
{
if (x < 0)
{
@@ -22,7 +24,7 @@ static int NSDFUNC ConvertPlacement(char *str, int total, int height)
return MulDiv(total, x, 100);
}
- else if (unit == 'u')
+ else if (unit == _T('u'))
{
RECT r;
@@ -50,7 +52,7 @@ int NSDFUNC PopPlacement(int *x, int *y, int *width, int *height)
RECT dialogRect;
int dialogWidth;
int dialogHeight;
- char buf[1024];
+ TCHAR buf[1024];
GetClientRect(g_dialog.hwDialog, &dialogRect);
dialogWidth = dialogRect.right;
diff --git a/Contrib/nsDialogs/input.h b/Contrib/nsDialogs/input.h
index d37d8097..f0434bd3 100644
--- a/Contrib/nsDialogs/input.h
+++ b/Contrib/nsDialogs/input.h
@@ -1,3 +1,5 @@
+// Reviewed for Unicode support by Jim Park -- 08/24/2007
+
#ifndef __NS_DIALOGS__INPUT_H__
#define __NS_DIALOGS__INPUT_H__
diff --git a/Contrib/nsDialogs/nsDialogs.c b/Contrib/nsDialogs/nsDialogs.c
index 850a8e51..dd799292 100644
--- a/Contrib/nsDialogs/nsDialogs.c
+++ b/Contrib/nsDialogs/nsDialogs.c
@@ -1,3 +1,5 @@
+// Unicode support by Jim Park -- 08/10/2007
+
#include
#include // nsis plugin
@@ -99,34 +101,34 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if (ctl->callbacks.onChange)
{
- pushint((int) hwCtl);
- g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onChange - 1, 0);
- }
+ pushint((int) hwCtl);
+ g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onChange - 1, 0);
+ }
}
else if (HIWORD(wParam) == LBN_SELCHANGE && ctl->type == NSCTL_LISTBOX)
{
if (ctl->callbacks.onChange)
{
- pushint((int) hwCtl);
- g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onChange - 1, 0);
- }
+ pushint((int) hwCtl);
+ g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onChange - 1, 0);
+ }
}
else if ((HIWORD(wParam) == CBN_EDITUPDATE || HIWORD(wParam) == CBN_SELCHANGE)
&& ctl->type == NSCTL_COMBOBOX)
{
if (ctl->callbacks.onChange)
{
- pushint((int) hwCtl);
- g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onChange - 1, 0);
- }
+ pushint((int) hwCtl);
+ g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onChange - 1, 0);
+ }
}
else if (HIWORD(wParam) == STN_CLICKED && ctl->type == NSCTL_STATIC)
{
if (ctl->callbacks.onClick)
{
- pushint((int) hwCtl);
- g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onClick - 1, 0);
- }
+ pushint((int) hwCtl);
+ g_pluginParms->ExecuteCodeSegment(ctl->callbacks.onClick - 1, 0);
+ }
}
break;
@@ -154,7 +156,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
DRAWITEMSTRUCT* lpdis = (DRAWITEMSTRUCT*)lParam;
RECT rc;
- char text[1024];
+ TCHAR text[1024];
// http://blogs.msdn.com/oldnewthing/archive/2005/05/03/414317.aspx#414357
// says we should call SystemParametersInfo(SPI_GETKEYBOARDCUES,...) to make
@@ -171,7 +173,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
rc = lpdis->rcItem;
// Get button's text
- text[0] = '\0';
+ text[0] = _T('\0');
GetWindowText(lpdis->hwndItem, text, 1024);
// Calculate needed size of the control
@@ -242,7 +244,7 @@ static UINT_PTR PluginCallback(enum NSPIM msg)
return 0;
}
-void __declspec(dllexport) Create(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) Create(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
HWND hwPlacementRect;
RECT rcPlacement;
@@ -262,7 +264,7 @@ void __declspec(dllexport) Create(HWND hwndParent, int string_size, char *variab
if (g_dialog.hwDialog == NULL)
{
- pushstring("error");
+ pushstring(_T("error"));
return;
}
@@ -288,10 +290,10 @@ void __declspec(dllexport) Create(HWND hwndParent, int string_size, char *variab
pushint((int) g_dialog.hwDialog);
}
-void __declspec(dllexport) CreateControl(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) CreateControl(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
- char *className;
- char *text;
+ TCHAR *className;
+ TCHAR *text;
HWND hwItem;
int x, y, width, height;
@@ -300,18 +302,18 @@ void __declspec(dllexport) CreateControl(HWND hwndParent, int string_size, char
// get info from stack
- className = (char *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, g_stringsize * 2);
+ className = (TCHAR *) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, (g_stringsize * 2)*sizeof(TCHAR));
text = &className[g_stringsize];
if (!className)
{
- pushstring("error");
+ pushstring(_T("error"));
return;
}
if (popstringn(className, 0))
{
- pushstring("error");
+ pushstring(_T("error"));
HeapFree(GetProcessHeap(), 0, className);
return;
}
@@ -323,7 +325,7 @@ void __declspec(dllexport) CreateControl(HWND hwndParent, int string_size, char
if (popstringn(text, 0))
{
- pushstring("error");
+ pushstring(_T("error"));
HeapFree(GetProcessHeap(), 0, className);
return;
}
@@ -338,21 +340,21 @@ void __declspec(dllexport) CreateControl(HWND hwndParent, int string_size, char
g_dialog.controls,
g_dialog.controlCount * sizeof(struct nsControl));
- if (!lstrcmpi(className, "BUTTON"))
+ if (!lstrcmpi(className, _T("BUTTON")))
g_dialog.controls[id].type = NSCTL_BUTTON;
- else if (!lstrcmpi(className, "EDIT"))
+ else if (!lstrcmpi(className, _T("EDIT")))
g_dialog.controls[id].type = NSCTL_EDIT;
- else if (!lstrcmpi(className, "COMBOBOX"))
+ else if (!lstrcmpi(className, _T("COMBOBOX")))
g_dialog.controls[id].type = NSCTL_COMBOBOX;
- else if (!lstrcmpi(className, "LISTBOX"))
+ else if (!lstrcmpi(className, _T("LISTBOX")))
g_dialog.controls[id].type = NSCTL_LISTBOX;
- else if (!lstrcmpi(className, "RichEdit"))
+ else if (!lstrcmpi(className, _T("RichEdit")))
g_dialog.controls[id].type = NSCTL_RICHEDIT;
- else if (!lstrcmpi(className, "RICHEDIT_CLASS"))
+ else if (!lstrcmpi(className, _T("RICHEDIT_CLASS")))
g_dialog.controls[id].type = NSCTL_RICHEDIT2;
- else if (!lstrcmpi(className, "STATIC"))
+ else if (!lstrcmpi(className, _T("STATIC")))
g_dialog.controls[id].type = NSCTL_STATIC;
- else if (!lstrcmpi(className, "LINK"))
+ else if (!lstrcmpi(className, _T("LINK")))
g_dialog.controls[id].type = NSCTL_LINK;
else
g_dialog.controls[id].type = NSCTL_UNKNOWN;
@@ -365,7 +367,7 @@ void __declspec(dllexport) CreateControl(HWND hwndParent, int string_size, char
hwItem = CreateWindowEx(
exStyle,
- lstrcmpi(className, "LINK") ? className : "BUTTON",
+ lstrcmpi(className, _T("LINK")) ? className : _T("BUTTON"),
text,
style,
x, y, width, height,
@@ -399,12 +401,12 @@ void __declspec(dllexport) CreateControl(HWND hwndParent, int string_size, char
}
// for backward compatibility (2.29 had CreateItem)
-void __declspec(dllexport) CreateItem(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) CreateItem(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
CreateControl(hwndParent, string_size, variables, stacktop, extra);
}
-void __declspec(dllexport) SetUserData(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) SetUserData(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
HWND hwCtl;
struct nsControl* ctl;
@@ -431,7 +433,7 @@ void __declspec(dllexport) SetUserData(HWND hwndParent, int string_size, char *v
popstringn(ctl->userData, USERDATA_SIZE);
}
-void __declspec(dllexport) GetUserData(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) GetUserData(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
HWND hwCtl;
struct nsControl* ctl;
@@ -442,7 +444,7 @@ void __declspec(dllexport) GetUserData(HWND hwndParent, int string_size, char *v
if (!IsWindow(hwCtl))
{
- pushstring("");
+ pushstring(_T(""));
return;
}
@@ -452,7 +454,7 @@ void __declspec(dllexport) GetUserData(HWND hwndParent, int string_size, char *v
if (ctl == NULL)
{
- pushstring("");
+ pushstring(_T(""));
return;
}
@@ -467,7 +469,7 @@ void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
g_pluginParms->ExecuteCodeSegment(idEvent - 1, 0);
}
-void __declspec(dllexport) CreateTimer(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) CreateTimer(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
UINT callback;
UINT interval;
@@ -489,7 +491,7 @@ void __declspec(dllexport) CreateTimer(HWND hwndParent, int string_size, char *v
TimerProc);
}
-void nsdKillTimer(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void nsdKillTimer(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
UINT id;
@@ -546,27 +548,27 @@ void NSDFUNC SetDialogCallback(size_t callbackIdx)
}
-void __declspec(dllexport) OnClick(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) OnClick(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
SetControlCallback(CTL_CALLBACK_IDX(onClick));
}
-void __declspec(dllexport) OnChange(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) OnChange(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
SetControlCallback(CTL_CALLBACK_IDX(onChange));
}
-void __declspec(dllexport) OnNotify(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) OnNotify(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
SetControlCallback(CTL_CALLBACK_IDX(onNotify));
}
-void __declspec(dllexport) OnBack(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) OnBack(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
SetDialogCallback(DLG_CALLBACK_IDX(onBack));
}
-void __declspec(dllexport) Show(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) Show(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
// tell NSIS to remove old inner dialog and pass handle of the new inner dialog
diff --git a/Contrib/nsDialogs/rtl.c b/Contrib/nsDialogs/rtl.c
index 72f9a07d..2de27c67 100644
--- a/Contrib/nsDialogs/rtl.c
+++ b/Contrib/nsDialogs/rtl.c
@@ -23,7 +23,7 @@
extern struct nsDialog g_dialog;
-void __declspec(dllexport) SetRTL(HWND hwndParent, int string_size, char *variables, stack_t **stacktop, extra_parameters *extra)
+void __declspec(dllexport) SetRTL(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop, extra_parameters *extra)
{
g_dialog.rtl = (BOOL) popint();
}
diff --git a/Contrib/nsExec/nsexec.c b/Contrib/nsExec/nsexec.c
index a3d784fe..837ae25d 100644
--- a/Contrib/nsExec/nsexec.c
+++ b/Contrib/nsExec/nsexec.c
@@ -17,6 +17,8 @@ freely, subject to the following restrictions:
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
+Unicode support by Jim Park -- 08/24/2007
+
*/
#include
#include
@@ -35,11 +37,12 @@ HWND g_hwndParent;
HWND g_hwndList;
void ExecScript(BOOL log);
-void LogMessage(const char *pStr, BOOL bOEM);
-char *my_strstr(char *a, char *b);
-unsigned int my_atoi(char *s);
+void LogMessage(const TCHAR *pStr, BOOL bOEM);
+TCHAR *my_strstr(TCHAR *a, TCHAR *b);
+unsigned int my_atoi(TCHAR *s);
+int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow);
-void __declspec(dllexport) Exec(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) {
+void __declspec(dllexport) Exec(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) {
g_hwndParent=hwndParent;
EXDLL_INIT();
{
@@ -47,7 +50,7 @@ void __declspec(dllexport) Exec(HWND hwndParent, int string_size, char *variable
}
}
-void __declspec(dllexport) ExecToLog(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) {
+void __declspec(dllexport) ExecToLog(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) {
g_hwndParent=hwndParent;
EXDLL_INIT();
{
@@ -55,7 +58,7 @@ void __declspec(dllexport) ExecToLog(HWND hwndParent, int string_size, char *var
}
}
-void __declspec(dllexport) ExecToStack(HWND hwndParent, int string_size, char *variables, stack_t **stacktop) {
+void __declspec(dllexport) ExecToStack(HWND hwndParent, int string_size, TCHAR *variables, stack_t **stacktop) {
g_hwndParent=hwndParent;
EXDLL_INIT();
{
@@ -69,7 +72,7 @@ BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved) {
return TRUE;
}
-#define TAB_REPLACE " "
+#define TAB_REPLACE _T(" ")
#define TAB_REPLACE_SIZE (sizeof(TAB_REPLACE)-1)
// Turn a pair of chars into a word
@@ -88,7 +91,7 @@ BOOL IsWOW64() {
LPFN_ISWOW64PROCESS fnIsWow64Process;
fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
- GetModuleHandle("kernel32"), "IsWow64Process");
+ GetModuleHandle(_T("kernel32")), "IsWow64Process");
if (fnIsWow64Process != NULL) {
if (fnIsWow64Process(GetCurrentProcess(), &wow64)) {
@@ -100,27 +103,28 @@ BOOL IsWOW64() {
}
void ExecScript(int log) {
- char szRet[128] = "";
- char meDLLPath[MAX_PATH];
- char *executor;
- char *g_exec;
- char *pExec;
+ TCHAR szRet[128] = _T("");
+ TCHAR meDLLPath[MAX_PATH];
+ TCHAR *executor;
+ TCHAR *g_exec;
+ TCHAR *pExec;
unsigned int g_to;
BOOL bOEM;
if (!IsWOW64()) {
- char *p;
+ TCHAR* p;
int nComSpecSize;
nComSpecSize = GetModuleFileName(g_hInst, meDLLPath, MAX_PATH) + 2; // 2 chars for quotes
- g_exec = (char *)GlobalAlloc(GPTR, sizeof(char)*g_stringsize+nComSpecSize+2); // 1 for space, 1 for null
+ g_exec = (TCHAR *)GlobalAlloc(GPTR, sizeof(TCHAR)*(g_stringsize+nComSpecSize+2)); // 1 for space, 1 for null
p = meDLLPath + nComSpecSize - 2; // point p at null char of meDLLPath
- *g_exec = '"';
+ *g_exec = _T('"');
executor = g_exec + 1;
+ // Look for the last '\' in path.
do
{
- if (*p == '\\')
+ if (*p == _T('\\'))
break;
p = CharPrev(meDLLPath, p);
}
@@ -128,15 +132,15 @@ void ExecScript(int log) {
if (p == meDLLPath)
{
// bad path
- pushstring("error");
+ pushstring(_T("error"));
GlobalFree(g_exec);
return;
}
*p = 0;
- GetTempFileName(meDLLPath, "ns", 0, executor);
- *p = '\\';
- if (CopyFile(meDLLPath, executor, FALSE))
+ GetTempFileName(meDLLPath, _T("ns"), 0, executor); // executor = new temp file name in module path.
+ *p = _T('\\');
+ if (CopyFile(meDLLPath, executor, FALSE)) // copy current DLL to temp file in module path.
{
HANDLE hFile, hMapping;
LPBYTE pMapView;
@@ -147,25 +151,27 @@ void ExecScript(int log) {
if (pMapView)
{
pNTHeaders = (PIMAGE_NT_HEADERS)(pMapView + ((PIMAGE_DOS_HEADER)pMapView)->e_lfanew);
+ // Turning the copied DLL into a stripped down executable.
pNTHeaders->FileHeader.Characteristics = IMAGE_FILE_32BIT_MACHINE | IMAGE_FILE_LOCAL_SYMS_STRIPPED |
IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_EXECUTABLE_IMAGE;
+ // Windows character-mode user interface (CUI) subsystem.
pNTHeaders->OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI;
- pNTHeaders->OptionalHeader.AddressOfEntryPoint = (DWORD)WinMain - (DWORD)g_hInst;
+ pNTHeaders->OptionalHeader.AddressOfEntryPoint = (DWORD)_tWinMain - (DWORD)g_hInst;
UnmapViewOfFile(pMapView);
}
CloseHandle(hMapping);
CloseHandle(hFile);
}
- lstrcat(g_exec, "\"");
+ lstrcat(g_exec, _T("\""));
// add space
pExec = g_exec + lstrlen(g_exec);
- *pExec = ' ';
+ *pExec = _T(' ');
pExec++;
} else {
executor = NULL;
- g_exec = (char *)GlobalAlloc(GPTR, sizeof(char)*g_stringsize+1); // 1 for null
+ g_exec = (TCHAR *)GlobalAlloc(GPTR, sizeof(TCHAR)*(g_stringsize+1)); // 1 for NULL
pExec = g_exec;
}
@@ -173,18 +179,24 @@ void ExecScript(int log) {
bOEM = FALSE; // default is no OEM->ANSI conversion
g_hwndList = NULL;
- if (g_hwndParent)
- g_hwndList = FindWindowEx(FindWindowEx(g_hwndParent,NULL,"#32770",NULL),NULL,"SysListView32",NULL);
+
+ // g_hwndParent = the caller, usually NSIS installer.
+ if (g_hwndParent) // The window class name for dialog boxes is "#32770"
+ g_hwndList = FindWindowEx(FindWindowEx(g_hwndParent,NULL,_T("#32770"),NULL),NULL,_T("SysListView32"),NULL);
+
+ // g_exec is the complete command to run: It has the copy of this DLL turned
+ // into an executable right now.
params:
+ // Get the command I need to run from the NSIS stack.
popstring(pExec);
- if (my_strstr(pExec, "/TIMEOUT=") == pExec) {
- char *szTimeout = pExec + 9;
+ if (my_strstr(pExec, _T("/TIMEOUT=")) == pExec) {
+ TCHAR *szTimeout = pExec + 9;
g_to = my_atoi(szTimeout);
*pExec = 0;
goto params;
}
- if (!lstrcmpi(pExec, "/OEM")) {
+ if (!lstrcmpi(pExec, _T("/OEM"))) {
bOEM = TRUE;
*pExec = 0;
goto params;
@@ -192,12 +204,14 @@ params:
if (!pExec[0])
{
- pushstring("error");
- *(pExec-2) = '\0'; // skip space and quote
+ pushstring(_T("error"));
+ *(pExec-2) = _T('\0'); // skip space and quote
if (executor) DeleteFile(executor);
GlobalFree(g_exec);
return;
}
+
+ // Got all the params off the stack.
{
STARTUPINFO si={sizeof(si),};
@@ -211,20 +225,20 @@ params:
DWORD dwExit = 0;
DWORD dwWait = WAIT_TIMEOUT;
DWORD dwLastOutput;
- static char szBuf[1024];
+ static TCHAR szBuf[1024];
HGLOBAL hUnusedBuf = NULL;
- char *szUnusedBuf = 0;
+ TCHAR *szUnusedBuf = 0;
if (log) {
- hUnusedBuf = GlobalAlloc(GHND, log & 2 ? g_stringsize : sizeof(szBuf)*4);
+ hUnusedBuf = GlobalAlloc(GHND, log & 2 ? (g_stringsize*sizeof(TCHAR)) : sizeof(szBuf)*4);
if (!hUnusedBuf) {
- lstrcpy(szRet, "error");
+ lstrcpy(szRet, _T("error"));
goto done;
}
- szUnusedBuf = (char *)GlobalLock(hUnusedBuf);
+ szUnusedBuf = (TCHAR *)GlobalLock(hUnusedBuf);
}
- GetVersionEx(&osv);
+ GetVersionEx(&osv); // Get OS info
if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT) {
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd,true,NULL,false);
@@ -234,11 +248,11 @@ params:
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = true;
if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) {
- lstrcpy(szRet, "error");
+ lstrcpy(szRet, _T("error"));
goto done;
}
if (!CreatePipe(&read_stdin,&newstdin,&sa,0)) {
- lstrcpy(szRet, "error");
+ lstrcpy(szRet, _T("error"));
goto done;
}
@@ -249,12 +263,13 @@ params:
si.hStdOutput = newstdout;
si.hStdError = newstdout;
if (!CreateProcess(NULL,g_exec,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi)) {
- lstrcpy(szRet, "error");
+ lstrcpy(szRet, _T("error"));
goto done;
}
dwLastOutput = GetTickCount();
+ // Now I'm talking with an executable copy of myself.
while (dwWait != WAIT_OBJECT_0 || dwRead) {
PeekNamedPipe(read_stdout, 0, 0, 0, &dwRead, NULL);
if (dwRead) {
@@ -262,16 +277,16 @@ params:
ReadFile(read_stdout, szBuf, sizeof(szBuf)-1, &dwRead, NULL);
szBuf[dwRead] = 0;
if (log) {
- char *p, *p2;
+ TCHAR *p, *p2;
SIZE_T iReqLen = lstrlen(szBuf) + lstrlen(szUnusedBuf);
if (GlobalSize(hUnusedBuf) < iReqLen && (iReqLen < g_stringsize || !(log & 2))) {
GlobalUnlock(hUnusedBuf);
hUnusedBuf = GlobalReAlloc(hUnusedBuf, iReqLen+sizeof(szBuf), GHND);
if (!hUnusedBuf) {
- lstrcpy(szRet, "error");
+ lstrcpy(szRet, _T("error"));
break;
}
- szUnusedBuf = (char *)GlobalLock(hUnusedBuf);
+ szUnusedBuf = (TCHAR *)GlobalLock(hUnusedBuf);
}
p = szUnusedBuf; // get the old left overs
if (iReqLen < g_stringsize || !(log & 2)) lstrcat(p, szBuf);
@@ -280,33 +295,33 @@ params:
}
if (!(log & 2)) {
- while ((p = my_strstr(p, "\t"))) {
+ while ((p = my_strstr(p, _T("\t")))) {
if ((int)(p - szUnusedBuf) > (int)(GlobalSize(hUnusedBuf) - TAB_REPLACE_SIZE - 1))
{
- *p++ = ' ';
+ *p++ = _T(' ');
}
else
{
int len = lstrlen(p);
- char *c_out=(char*)p+TAB_REPLACE_SIZE+len;
- char *c_in=(char *)p+len;
+ TCHAR *c_out=(TCHAR*)p+TAB_REPLACE_SIZE+len;
+ TCHAR *c_in=(TCHAR *)p+len;
while (len-- > 0) {
*c_out--=*c_in--;
}
lstrcpy(p, TAB_REPLACE);
p += TAB_REPLACE_SIZE;
- *p = ' ';
+ *p = _T(' ');
}
}
p = szUnusedBuf; // get the old left overs
for (p2 = p; *p2;) {
- if (*p2 == '\r') {
+ if (*p2 == _T('\r')) {
*p2++ = 0;
continue;
}
- if (*p2 == '\n') {
+ if (*p2 == _T('\n')) {
*p2 = 0;
while (!*p && p != p2) p++;
LogMessage(p, bOEM);
@@ -318,7 +333,7 @@ params:
// If data was taken out from the unused buffer, move p contents to the start of szUnusedBuf
if (p != szUnusedBuf) {
- char *p2 = szUnusedBuf;
+ TCHAR *p2 = szUnusedBuf;
while (*p) *p2++ = *p++;
*p2 = 0;
}
@@ -328,7 +343,7 @@ params:
else {
if (g_to && GetTickCount() > dwLastOutput+g_to) {
TerminateProcess(pi.hProcess, -1);
- lstrcpy(szRet, "timeout");
+ lstrcpy(szRet, _T("timeout"));
}
else Sleep(LOOPTIMEOUT);
}
@@ -341,8 +356,8 @@ done:
if (log & 2) pushstring(szUnusedBuf);
if (log & 1 && *szUnusedBuf) LogMessage(szUnusedBuf, bOEM);
if ( dwExit == STATUS_ILLEGAL_INSTRUCTION )
- lstrcpy(szRet, "error");
- if (!szRet[0]) wsprintf(szRet,"%d",dwExit);
+ lstrcpy(szRet, _T("error"));
+ if (!szRet[0]) wsprintf(szRet,_T("%d"),dwExit);
pushstring(szRet);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
@@ -350,7 +365,7 @@ done:
CloseHandle(read_stdout);
CloseHandle(newstdin);
CloseHandle(read_stdin);
- *(pExec-2) = '\0'; // skip space and quote
+ *(pExec-2) = _T('\0'); // skip space and quote
if (executor) DeleteFile(executor);
GlobalFree(g_exec);
if (log) {
@@ -361,27 +376,27 @@ done:
}
// Tim Kosse's LogMessage
-void LogMessage(const char *pStr, BOOL bOEM) {
+void LogMessage(const TCHAR *pStr, BOOL bOEM) {
LVITEM item={0};
int nItemCount;
if (!g_hwndList) return;
//if (!lstrlen(pStr)) return;
- if (bOEM == TRUE) OemToCharBuff(pStr, (char *)pStr, lstrlen(pStr));
+ if (bOEM == TRUE) OemToCharBuff(pStr, (TCHAR *)pStr, lstrlen(pStr));
nItemCount=SendMessage(g_hwndList, LVM_GETITEMCOUNT, 0, 0);
item.mask=LVIF_TEXT;
- item.pszText=(char *)pStr;
+ item.pszText=(TCHAR *)pStr;
item.cchTextMax=0;
item.iItem=nItemCount;
ListView_InsertItem(g_hwndList, &item);
ListView_EnsureVisible(g_hwndList, item.iItem, 0);
}
-char *my_strstr(char *a, char *b)
+TCHAR *my_strstr(TCHAR *a, TCHAR *b)
{
int l = lstrlen(b);
while (lstrlen(a) >= l)
{
- char c = a[l];
+ TCHAR c = a[l];
a[l] = 0;
if (!lstrcmpi(a, b))
{
@@ -394,25 +409,25 @@ char *my_strstr(char *a, char *b)
return NULL;
}
-unsigned int my_atoi(char *s) {
+unsigned int my_atoi(TCHAR *s) {
unsigned int v=0;
- if (*s == '0' && (s[1] == 'x' || s[1] == 'X')) {
+ if (*s == _T('0') && (s[1] == _T('x') || s[1] == _T('X'))) {
s+=2;
for (;;) {
int c=*s++;
- if (c >= '0' && c <= '9') c-='0';
- else if (c >= 'a' && c <= 'f') c-='a'-10;
- else if (c >= 'A' && c <= 'F') c-='A'-10;
+ if (c >= _T('0') && c <= _T('9')) c-=_T('0');
+ else if (c >= _T('a') && c <= _T('f')) c-=_T('a')-10;
+ else if (c >= _T('A') && c <= _T('F')) c-=_T('A')-10;
else break;
v<<=4;
v+=c;
}
}
- else if (*s == '0' && s[1] <= '7' && s[1] >= '0') {
+ else if (*s == _T('0') && s[1] <= _T('7') && s[1] >= _T('0')) {
s++;
for (;;) {
int c=*s++;
- if (c >= '0' && c <= '7') c-='0';
+ if (c >= _T('0') && c <= _T('7')) c-=_T('0');
else break;
v<<=3;
v+=c;
@@ -420,7 +435,7 @@ unsigned int my_atoi(char *s) {
}
else {
for (;;) {
- int c=*s++ - '0';
+ int c=*s++ - _T('0');
if (c < 0 || c > 9) break;
v*=10;
v+=c;
@@ -429,14 +444,14 @@ unsigned int my_atoi(char *s) {
return (int)v;
}
-int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
+int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
DWORD Ret;
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
- char command_line[1024];
- char seekchar=' ';
- char *cmdline;
+ TCHAR command_line[1024];
+ TCHAR seekchar=_T(' ');
+ TCHAR *cmdline;
si.cb = sizeof(si);
// Make child process use this app's standard files. Not needed because the handles
@@ -448,12 +463,12 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine
lstrcpyn(command_line, GetCommandLine(), 1024);
cmdline = command_line;
- if (*cmdline == '\"') seekchar = *cmdline++;
+ if (*cmdline == _T('\"')) seekchar = *cmdline++;
while (*cmdline && *cmdline != seekchar) cmdline=CharNext(cmdline);
cmdline=CharNext(cmdline);
// skip any spaces before the arguments
- while (*cmdline && *cmdline == ' ') cmdline++;
+ while (*cmdline && *cmdline == _T(' ')) cmdline++;
Ret = CreateProcess (NULL, cmdline,
NULL, NULL,
diff --git a/Contrib/zip2exe/main.cpp b/Contrib/zip2exe/main.cpp
index eb0ad140..c85e8a7b 100644
--- a/Contrib/zip2exe/main.cpp
+++ b/Contrib/zip2exe/main.cpp
@@ -2,8 +2,14 @@
#include
#include
#include
+#include "..\ExDLL\nsis_tchar.h"
/*
+version 0.36
+* Unicode support by Jim Park -- 08/27/2007
+* This support allow Unicode *ZIP file* names but does NOT allow the archive
+* to store Unicode files inside it. That's a ZLIB limitation that I can't
+* do much about.
version 0.35
* drag & drop support
@@ -38,50 +44,50 @@ extern "C"
};
#include "resource.h"
-const char *g_errcaption="Zip2Exe Error";
+const TCHAR *g_errcaption=_T("Zip2Exe Error");
HINSTANCE g_hInstance;
HWND g_hwnd;
HANDLE g_hThread;
-char g_cmdline[1024];
+TCHAR g_cmdline[1024];
int g_extracting;
int g_compressor;
int g_compressor_solid;
int g_mui;
int g_zipfile_size;
-char *g_options="";//"/V3";
+TCHAR *g_options=_T("");//_T("/V3");
static BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
-int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,
- LPSTR lpszCmdParam, int nCmdShow)
+int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,
+ LPTSTR lpszCmdParam, int nCmdShow)
{
g_hInstance=hInstance;
InitCommonControls();
return DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),GetDesktopWindow(),DlgProc);
}
-char tempzip_path[1024];
+TCHAR tempzip_path[1024];
int made;
-static void doRMDir(char *buf)
+static void doRMDir(TCHAR *buf)
{
HANDLE h;
WIN32_FIND_DATA fd;
- char *p=buf;
+ TCHAR *p=buf;
while (*p) p++;
- lstrcpy(p,"\\*.*");
+ lstrcpy(p,_T("\\*.*"));
h = FindFirstFile(buf,&fd);
if (h != INVALID_HANDLE_VALUE)
{
do
{
- if (fd.cFileName[0] != '.' ||
- (fd.cFileName[1] != '.' && fd.cFileName[1]))
+ if (fd.cFileName[0] != _T('.') ||
+ (fd.cFileName[1] != _T('.') && fd.cFileName[1]))
{
lstrcpy(p+1,fd.cFileName);
if (fd.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
@@ -99,22 +105,22 @@ static void doRMDir(char *buf)
RemoveDirectory(buf);
}
-static void doMKDir(char *directory)
+static void doMKDir(TCHAR *directory)
{
- char *p, *p2;
- char buf[MAX_PATH];
+ TCHAR *p, *p2;
+ TCHAR buf[MAX_PATH];
if (!*directory) return;
lstrcpy(buf,directory);
p=buf; while (*p) p++;
- while (p >= buf && *p != '\\') p--;
+ while (p >= buf && *p != _T('\\')) p--;
p2 = buf;
- if (p2[1] == ':') p2+=4;
- else if (p2[0] == '\\' && p2[1] == '\\')
+ if (p2[1] == _T(':')) p2+=4;
+ else if (p2[0] == _T('\\') && p2[1] == _T('\\'))
{
p2+=2;
- while (*p2 && *p2 != '\\') p2++;
+ while (*p2 && *p2 != _T('\\')) p2++;
if (*p2) p2++;
- while (*p2 && *p2 != '\\') p2++;
+ while (*p2 && *p2 != _T('\\')) p2++;
if (*p2) p2++;
}
if (p >= p2)
@@ -135,29 +141,29 @@ void tempzip_cleanup(HWND hwndDlg, int err)
{
SendDlgItemMessage(hwndDlg,IDC_ZIPINFO_FILES,LB_RESETCONTENT,0,0);
EnableWindow(GetDlgItem(hwndDlg,IDOK),0);
- SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,"");
- SetDlgItemText(hwndDlg,IDC_ZIPFILE,"");
- SetDlgItemText(hwndDlg,IDC_OUTFILE,"");
+ SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,_T(""));
+ SetDlgItemText(hwndDlg,IDC_ZIPFILE,_T(""));
+ SetDlgItemText(hwndDlg,IDC_OUTFILE,_T(""));
}
}
-int tempzip_make(HWND hwndDlg, char *fn)
+int tempzip_make(HWND hwndDlg, TCHAR *fn)
{
- char buf[MAX_PATH];
+ TCHAR buf[MAX_PATH];
GetTempPath(MAX_PATH,buf);
- GetTempFileName(buf,"z2e",GetTickCount(),tempzip_path);
+ GetTempFileName(buf,_T("z2e"),GetTickCount(),tempzip_path);
if (!CreateDirectory(tempzip_path,NULL))
{
GetTempPath(MAX_PATH,tempzip_path);
- strcat(tempzip_path,"\\nsi");
+ _tcscat(tempzip_path,_T("\\nsi"));
if (!CreateDirectory(tempzip_path,NULL))
{
tempzip_path[0]=0;
- MessageBox(hwndDlg,"Error creating temporary directory",g_errcaption,MB_OK|MB_ICONSTOP);
+ MessageBox(hwndDlg,_T("Error creating temporary directory"),g_errcaption,MB_OK|MB_ICONSTOP);
return 1;
}
}
- FILE *fp=fopen(fn,"rb");
+ FILE *fp=_tfopen(fn,_T("rb"));
if (fp)
{
fseek(fp,0,SEEK_END);
@@ -170,14 +176,14 @@ int tempzip_make(HWND hwndDlg, char *fn)
if (!f || unzGoToFirstFile(f) != UNZ_OK)
{
if (f) unzClose(f);
- MessageBox(hwndDlg,"Error opening ZIP file",g_errcaption,MB_OK|MB_ICONSTOP);
+ MessageBox(hwndDlg,_T("Error opening ZIP file"),g_errcaption,MB_OK|MB_ICONSTOP);
return 1;
}
int nf=0, nkb=0;
g_extracting=1;
do {
- char filename[MAX_PATH];
+ TCHAR filename[MAX_PATH];
unz_file_info info;
unzGetCurrentFileInfo(f,&info,filename,sizeof(filename),NULL,0,NULL,0);
@@ -189,29 +195,29 @@ int tempzip_make(HWND hwndDlg, char *fn)
}
if (filename[0] &&
- filename[strlen(filename)-1] != '\\' &&
- filename[strlen(filename)-1] != '/')
+ filename[_tcsclen(filename)-1] != _T('\\') &&
+ filename[_tcsclen(filename)-1] != _T('/'))
{
- char *pfn=filename;
+ TCHAR *pfn=filename;
while (*pfn)
{
- if (*pfn == '/') *pfn='\\';
+ if (*pfn == _T('/')) *pfn=_T('\\');
pfn++;
}
pfn=filename;
- if (pfn[1] == ':' && pfn[2] == '\\') pfn+=3;
- while (*pfn == '\\') pfn++;
+ if (pfn[1] == _T(':') && pfn[2] == _T('\\')) pfn+=3;
+ while (*pfn == _T('\\')) pfn++;
- char out_filename[1024];
+ TCHAR out_filename[1024];
lstrcpy(out_filename,tempzip_path);
- lstrcat(out_filename,"\\");
+ lstrcat(out_filename,_T("\\"));
lstrcat(out_filename,pfn);
- if (strstr(pfn,"\\"))
+ if (_tcsstr(pfn,_T("\\")))
{
- char buf[1024];
+ TCHAR buf[1024];
lstrcpy(buf,out_filename);
- char *p=buf+strlen(buf);
- while (p > buf && *p != '\\') p--;
+ TCHAR *p=buf+_tcsclen(buf);
+ while (p > buf && *p != _T('\\')) p--;
*p=0;
if (buf[0]) doMKDir(buf);
}
@@ -221,11 +227,12 @@ int tempzip_make(HWND hwndDlg, char *fn)
SendDlgItemMessage(hwndDlg,IDC_ZIPINFO_FILES,LB_ADDSTRING,0,(LPARAM)pfn);
FILE *fp;
int l;
- fp = fopen(out_filename,"wb");
+ fp = _tfopen(out_filename,_T("wb"));
if (fp)
{
do
{
+ // Jim Park: Local buf, no need to TCHAR
char buf[1024];
l=unzReadCurrentFile(f,buf,sizeof(buf));
if (l > 0)
@@ -234,7 +241,7 @@ int tempzip_make(HWND hwndDlg, char *fn)
{
unzClose(f);
fclose(fp);
- MessageBox(hwndDlg,"Error writing output file(s)",g_errcaption,MB_OK|MB_ICONSTOP);
+ MessageBox(hwndDlg,_T("Error writing output file(s)"),g_errcaption,MB_OK|MB_ICONSTOP);
g_extracting=0;
return 1;
}
@@ -260,12 +267,12 @@ int tempzip_make(HWND hwndDlg, char *fn)
else
{
unzClose(f);
- MessageBox(hwndDlg,"Error opening output file(s)",g_errcaption,MB_OK|MB_ICONSTOP);
+ MessageBox(hwndDlg,_T("Error opening output file(s)"),g_errcaption,MB_OK|MB_ICONSTOP);
g_extracting=0;
return 1;
}
nf++;
- wsprintf(buf,"Extracting: %d files, %dKB",nf,nkb);
+ wsprintf(buf,_T("Extracting: %d files, %dKB"),nf,nkb);
SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,buf);
MSG msg;
int quit=0;
@@ -285,7 +292,7 @@ int tempzip_make(HWND hwndDlg, char *fn)
else
{
unzClose(f);
- MessageBox(hwndDlg,"Error extracting from ZIP file",g_errcaption,MB_OK|MB_ICONSTOP);
+ MessageBox(hwndDlg,_T("Error extracting from ZIP file"),g_errcaption,MB_OK|MB_ICONSTOP);
g_extracting=0;
return 1;
}
@@ -293,45 +300,45 @@ int tempzip_make(HWND hwndDlg, char *fn)
} while (unzGoToNextFile(f) == UNZ_OK);
g_extracting=0;
- wsprintf(buf,"Extracted: %d files, %dKB",nf,nkb);
+ wsprintf(buf,_T("Extracted: %d files, %dKB"),nf,nkb);
SetDlgItemText(hwndDlg,IDC_ZIPINFO_SUMMARY,buf);
unzClose(f);
return 0;
}
-char *gp_winamp = "(WINAMP DIRECTORY)";
-char *gp_winamp_plugins = "(WINAMP PLUG-INS DIRECTORY)";
-char *gp_winamp_vis = "(WINAMP VIS PLUG-INS DIRECTORY)";
-char *gp_winamp_dsp = "(WINAMP DSP PLUG-INS DIRECTORY)";
-char *gp_winamp_skins = "(WINAMP SKINS DIRECTORY)";
-char *gp_poi = "(PATH OF INSTALLER)";
+TCHAR *gp_winamp = _T("(WINAMP DIRECTORY)");
+TCHAR *gp_winamp_plugins = _T("(WINAMP PLUG-INS DIRECTORY)");
+TCHAR *gp_winamp_vis = _T("(WINAMP VIS PLUG-INS DIRECTORY)");
+TCHAR *gp_winamp_dsp = _T("(WINAMP DSP PLUG-INS DIRECTORY)");
+TCHAR *gp_winamp_skins = _T("(WINAMP SKINS DIRECTORY)");
+TCHAR *gp_poi = _T("(PATH OF INSTALLER)");
-void wnd_printf(const char *str)
+void wnd_printf(const TCHAR *str)
{
if (!*str) return;
- char existing_text[32000];
+ TCHAR existing_text[32000];
existing_text[0]=0;
UINT l=GetDlgItemText(g_hwnd, IDC_OUTPUTTEXT, existing_text, 32000);
- l+=strlen(str);
+ l+=_tcsclen(str);
- char *p=existing_text;
+ TCHAR *p=existing_text;
existing_text[31000]=0;
while (l > 31000 && *p)
{
- while (*p != '\r' && *p != '\n' && *p)
+ while (*p != _T('\r') && *p != _T('\n') && *p)
{
p++;
l--;
}
- while (*p == '\r' || *p == '\n')
+ while (*p == _T('\r') || *p == _T('\n'))
{
p++;
l--;
}
}
- char buf[31000];
+ TCHAR buf[31000];
lstrcpy(buf,p);
lstrcpy(existing_text,buf);
lstrcat(existing_text,str);
@@ -341,7 +348,7 @@ void wnd_printf(const char *str)
}
-void ErrorMessage(char *str) //display detailed error info
+void ErrorMessage(TCHAR *str) //display detailed error info
{
LPVOID msg;
FormatMessage(
@@ -354,14 +361,14 @@ void ErrorMessage(char *str) //display detailed error info
NULL
);
wnd_printf(str);
- wnd_printf(": ");
- wnd_printf((char*)msg);
+ wnd_printf(_T(": "));
+ wnd_printf((TCHAR*)msg);
LocalFree(msg);
}
-DWORD WINAPI ThreadProc(LPVOID p) // thread that will start & monitor wwwinamp
+DWORD WINAPI ThreadProc(LPVOID p) // thread that will start & monitor makensis
{
- char buf[1024]; //i/o buffer
+ TCHAR buf[1024]; //i/o buffer
STARTUPINFO si={sizeof(si),};
SECURITY_ATTRIBUTES sa={sizeof(sa),};
SECURITY_DESCRIPTOR sd={0,}; //security information for pipes
@@ -381,7 +388,7 @@ DWORD WINAPI ThreadProc(LPVOID p) // thread that will start & monitor wwwinamp
if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //create stdout pipe
{
- ErrorMessage("CreatePipe");
+ ErrorMessage(_T("CreatePipe"));
PostMessage(g_hwnd,WM_USER+1203,0,1);
return 1;
}
@@ -404,8 +411,8 @@ DWORD WINAPI ThreadProc(LPVOID p) // thread that will start & monitor wwwinamp
if (!CreateProcess(NULL,g_cmdline,NULL,NULL,TRUE,CREATE_NEW_CONSOLE,
NULL,tempzip_path,&si,&pi))
{
- ErrorMessage("CreateProcess");
- wnd_printf("\r\nPlease make sure the path to makensis.exe is correct.");
+ ErrorMessage(_T("CreateProcess"));
+ wnd_printf(_T("\r\nPlease make sure the path to makensis.exe is correct."));
CloseHandle(newstdout);
CloseHandle(read_stdout);
PostMessage(g_hwnd,WM_USER+1203,0,1);
@@ -416,26 +423,30 @@ DWORD WINAPI ThreadProc(LPVOID p) // thread that will start & monitor wwwinamp
DWORD bread; //bytes read
DWORD avail; //bytes available
+ // Number of bytes available in the buffer.
+ const int bufBytesAvail = sizeof(buf)-sizeof(TCHAR);
+
memset(buf,0,sizeof(buf));
while (1) //main program loop
{
- PeekNamedPipe(read_stdout,buf,1023,&bread,&avail,NULL);
+ PeekNamedPipe(read_stdout,buf,bufBytesAvail,&bread,&avail,NULL);
+
//check to see if there is any data to read from stdout
if (bread != 0)
{
memset(buf,0,sizeof(buf));
- if (avail > 1023)
+ if (avail > bufBytesAvail)
{
- while (bread >= 1023)
+ while (bread >= bufBytesAvail)
{
- ReadFile(read_stdout,buf,1023,&bread,NULL); //read the stdout pipe
+ ReadFile(read_stdout,buf,bufBytesAvail,&bread,NULL); //read the stdout pipe
wnd_printf(buf);
memset(buf,0,sizeof(buf));
}
}
else
{
- ReadFile(read_stdout,buf,1023,&bread,NULL);
+ ReadFile(read_stdout,buf,bufBytesAvail,&bread,NULL);
wnd_printf(buf);
}
}
@@ -452,7 +463,7 @@ DWORD WINAPI ThreadProc(LPVOID p) // thread that will start & monitor wwwinamp
CloseHandle(read_stdout);
- wsprintf(buf,"(source ZIP size was %d bytes)\r\n",g_zipfile_size);
+ wsprintf(buf,_T("(source ZIP size was %d bytes)\r\n"),g_zipfile_size);
wnd_printf(buf);
PostMessage(g_hwnd,WM_USER+1203,0,0);
@@ -460,107 +471,107 @@ DWORD WINAPI ThreadProc(LPVOID p) // thread that will start & monitor wwwinamp
}
-char nsifilename[MAX_PATH];
+TCHAR nsifilename[MAX_PATH];
void makeEXE(HWND hwndDlg)
{
- char buf[2048];
+ TCHAR buf[2048];
GetTempPath(MAX_PATH,buf);
- GetTempFileName(buf,"zne",0,nsifilename);
- FILE *fp=fopen(nsifilename,"w");
+ GetTempFileName(buf,_T("zne"),0,nsifilename);
+ FILE *fp=fopen(nsifilename,_T("w"));
if (!fp)
{
- MessageBox(hwndDlg,"Error writing .NSI file",g_errcaption,MB_OK|MB_ICONSTOP);
+ MessageBox(hwndDlg,_T("Error writing .NSI file"),g_errcaption,MB_OK|MB_ICONSTOP);
PostMessage(g_hwnd,WM_USER+1203,0,0);
return;
}
GetDlgItemText(hwndDlg,IDC_INSTNAME,buf,sizeof(buf));
- fprintf(fp,"!define ZIP2EXE_NAME `%s`\n",buf);
+ _ftprintf(fp,_T("!define ZIP2EXE_NAME `%s`\n"),buf);
GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf));
- fprintf(fp,"!define ZIP2EXE_OUTFILE `%s`\n",buf);
+ _ftprintf(fp,_T("!define ZIP2EXE_OUTFILE `%s`\n"),buf);
if (g_compressor == 1)
- fprintf(fp,"!define ZIP2EXE_COMPRESSOR_ZLIB\n");
+ _ftprintf(fp,_T("!define ZIP2EXE_COMPRESSOR_ZLIB\n"));
if (g_compressor == 2)
- fprintf(fp,"!define ZIP2EXE_COMPRESSOR_BZIP2\n");
+ _ftprintf(fp,_T("!define ZIP2EXE_COMPRESSOR_BZIP2\n"));
if (g_compressor == 3)
- fprintf(fp,"!define ZIP2EXE_COMPRESSOR_LZMA\n");
+ _ftprintf(fp,_T("!define ZIP2EXE_COMPRESSOR_LZMA\n"));
if (g_compressor_solid == 1)
- fprintf(fp,"!define ZIP2EXE_COMPRESSOR_SOLID\n");
+ _ftprintf(fp,_T("!define ZIP2EXE_COMPRESSOR_SOLID\n"));
GetDlgItemText(hwndDlg,IDC_INSTPATH,buf,sizeof(buf));
int iswinamp=0;
- char *iswinampmode=NULL;
- if (!strcmp(buf,gp_poi)) lstrcpy(buf,"$EXEDIR");
+ TCHAR *iswinampmode=NULL;
+ if (!_tcscmp(buf,gp_poi)) lstrcpy(buf,_T("$EXEDIR"));
- if (!strcmp(buf,gp_winamp))
+ if (!_tcscmp(buf,gp_winamp))
{
iswinamp=1;
}
- if (!strcmp(buf,gp_winamp_plugins))
+ if (!_tcscmp(buf,gp_winamp_plugins))
{
iswinamp=1;
- fprintf(fp,"!define ZIP2EXE_INSTALLDIR_PLUGINS\n");
+ _ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_PLUGINS\n"));
}
- if (!strcmp(buf,gp_winamp_vis))
+ if (!_tcscmp(buf,gp_winamp_vis))
{
iswinamp=1;
- iswinampmode="VisDir";
+ iswinampmode=_T("VisDir");
}
- if (!strcmp(buf,gp_winamp_dsp))
+ if (!_tcscmp(buf,gp_winamp_dsp))
{
iswinamp=1;
- iswinampmode="DSPDir";
+ iswinampmode=_T("DSPDir");
}
- if (!strcmp(buf,gp_winamp_skins))
+ if (!_tcscmp(buf,gp_winamp_skins))
{
iswinamp=1;
- iswinampmode="SkinDir";
- fprintf(fp,"!define ZIP2EXE_INSTALLDIR_SKINS\n");
+ iswinampmode=_T("SkinDir");
+ _ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_SKINS\n"));
}
if (iswinamp)
{
- fprintf(fp,"!define ZIP2EXE_INSTALLDIR_WINAMP\n");
+ _ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_WINAMP\n"));
if (iswinampmode)
{
- fprintf(fp,"!define ZIP2EXE_INSTALLDIR_WINAMPMODE `%s`\n",iswinampmode);
+ _ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR_WINAMPMODE `%s`\n"),iswinampmode);
}
}
else // set out path to $INSTDIR
{
- fprintf(fp,"!define ZIP2EXE_INSTALLDIR `%s`\n",buf);
+ _ftprintf(fp,_T("!define ZIP2EXE_INSTALLDIR `%s`\n"),buf);
}
- fprintf(fp,"!include `${NSISDIR}\\Contrib\\zip2exe\\Base.nsh`\n");
- fprintf(fp,"!include `${NSISDIR}\\Contrib\\zip2exe\\%s.nsh`\n",g_mui?"Modern":"Classic");
+ _ftprintf(fp,_T("!include `${NSISDIR}\\Contrib\\zip2exe\\Base.nsh`\n"));
+ _ftprintf(fp,_T("!include `${NSISDIR}\\Contrib\\zip2exe\\%s.nsh`\n"),g_mui?_T("Modern"):_T("Classic"));
- fprintf(fp,"!insertmacro SECTION_BEGIN\n");
- fprintf(fp,"File /r `%s\\*.*`\n",tempzip_path);
- fprintf(fp,"!insertmacro SECTION_END\n");
+ _ftprintf(fp,_T("!insertmacro SECTION_BEGIN\n"));
+ _ftprintf(fp,_T("File /r `%s\\*.*`\n"),tempzip_path);
+ _ftprintf(fp,_T("!insertmacro SECTION_END\n"));
fclose(fp);
- char g_makensis_path[MAX_PATH];
- char *p=g_makensis_path;
+ TCHAR g_makensis_path[MAX_PATH];
+ TCHAR *p=g_makensis_path;
GetModuleFileName(g_hInstance,g_makensis_path,sizeof(g_makensis_path));
while (*p) p++;
- while (p >= g_makensis_path && *p != '\\') p--;
- strcpy(p+1,"makensis.exe");
+ while (p >= g_makensis_path && *p != _T('\\')) p--;
+ _tcscpy(p+1,_T("makensis.exe"));
WIN32_FIND_DATA fd;
HANDLE h=FindFirstFile(g_makensis_path,&fd);
if (h==INVALID_HANDLE_VALUE)
{
- if ((p-g_makensis_path>4)&&(tolower(*(p-1))=='n')&&(tolower(*(p-2))=='i')&&(tolower(*(p-3))=='b')&&(*(p-4)=='\\'))
+ if ((p-g_makensis_path>4)&&(_totlower(*(p-1))==_T('n'))&&(_totlower(*(p-2))==_T('i'))&&(_totlower(*(p-3))==_T('b'))&&(*(p-4)==_T('\\')))
{
p -= 4;
- strcpy(p+1,"makensis.exe");
+ _tcscpy(p+1,_T("makensis.exe"));
h=FindFirstFile(g_makensis_path,&fd);
if (h==INVALID_HANDLE_VALUE)
{
- MessageBox(hwndDlg,"Error finding makensis.exe.",g_errcaption,MB_OK|MB_ICONSTOP);
+ MessageBox(hwndDlg,_T("Error finding makensis.exe."),g_errcaption,MB_OK|MB_ICONSTOP);
PostMessage(g_hwnd,WM_USER+1203,0,0);
return;
}
@@ -570,29 +581,28 @@ void makeEXE(HWND hwndDlg)
- wsprintf(g_cmdline,"\"%s\" %s \"%s\"",g_makensis_path,g_options,nsifilename);
-
+ wsprintf(g_cmdline,_T("\"%s\" %s \"%s\""),g_makensis_path,g_options,nsifilename);
DWORD id;
g_hThread=CreateThread(NULL,0,ThreadProc,0,0,&id);
}
-void SetZip(HWND hwndDlg, char *path)
+void SetZip(HWND hwndDlg, TCHAR *path)
{
- char buf2[1024];
+ TCHAR buf2[1024];
lstrcpy(buf2,path);
tempzip_cleanup(hwndDlg,1);
SetDlgItemText(hwndDlg,IDC_ZIPFILE,path);
- char *t=path+lstrlen(path);
- while (t > path && *t != '\\' && *t != '.') t--;
+ TCHAR *t=path+lstrlen(path);
+ while (t > path && *t != _T('\\') && *t != _T('.')) t--;
{
- char *p=t;
- while (p >= path && *p != '\\') p--;
+ TCHAR *p=t;
+ while (p >= path && *p != _T('\\')) p--;
p++;
*t=0;
- SetDlgItemText(hwndDlg,IDC_INSTNAME,p[0]?p:"Stuff");
+ SetDlgItemText(hwndDlg,IDC_INSTNAME,p[0]?p:_T("Stuff"));
}
- strcpy(t,".exe");
+ _tcscpy(t,_T(".exe"));
SetDlgItemText(hwndDlg,IDC_OUTFILE,path);
if (tempzip_make(hwndDlg,buf2)) tempzip_cleanup(hwndDlg,1);
else
@@ -615,14 +625,14 @@ BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
CheckDlgButton(hwndDlg,IDC_LZMA,BST_CHECKED);
CheckDlgButton(hwndDlg,IDC_MODERNUI,BST_CHECKED);
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_poi);
- SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$TEMP");
- SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$SYSDIR");
- SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$WINDIR");
- SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$DESKTOP");
- SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$DESKTOP\\YourNameHere");
- SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$PROGRAMFILES\\YourNameHere");
- SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$STARTMENU");
- SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)"$SMPROGRAMS");
+ SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$TEMP"));
+ SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$SYSDIR"));
+ SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$WINDIR"));
+ SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$DESKTOP"));
+ SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$DESKTOP\\YourNameHere"));
+ SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$PROGRAMFILES\\YourNameHere"));
+ SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$STARTMENU"));
+ SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)_T("$SMPROGRAMS"));
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp);
SendDlgItemMessage(hwndDlg,IDC_INSTPATH,CB_ADDSTRING,0,(LPARAM)gp_winamp_plugins);
@@ -638,7 +648,7 @@ BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
hFont=CreateFont(15,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,
OUT_CHARACTER_PRECIS,
CLIP_DEFAULT_PRECIS,
- DEFAULT_QUALITY,FIXED_PITCH|FF_DONTCARE,"Courier New");
+ DEFAULT_QUALITY,FIXED_PITCH|FF_DONTCARE,_T("Courier New"));
SendDlgItemMessage(hwndDlg,IDC_OUTPUTTEXT,WM_SETFONT,(WPARAM)hFont,0);
DragAcceptFiles(hwndDlg,TRUE);
@@ -666,7 +676,7 @@ BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
break;
case WM_DROPFILES:
{
- char dropped_file[MAX_PATH]="";
+ TCHAR dropped_file[MAX_PATH]=_T("");
if (DragQueryFile((HDROP)wParam,(UINT)-1,NULL,0)==1)
{
DragQueryFile((HDROP)wParam,0,dropped_file,MAX_PATH);
@@ -677,7 +687,7 @@ BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
}
else
{
- MessageBox(hwndDlg,"Dropping more than one zip file at a time is not supported",g_errcaption,MB_OK|MB_ICONSTOP);
+ MessageBox(hwndDlg,_T("Dropping more than one zip file at a time is not supported"),g_errcaption,MB_OK|MB_ICONSTOP);
}
DragFinish((HDROP)wParam);
return TRUE;
@@ -688,13 +698,13 @@ BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
case IDC_BROWSE:
if (!g_extracting) {
OPENFILENAME l={sizeof(l),};
- char buf[1024];
+ TCHAR buf[1024];
l.hwndOwner = hwndDlg;
- l.lpstrFilter = "ZIP Files\0*.zip\0All Files\0*.*\0";
+ l.lpstrFilter = _T("ZIP Files\0*.zip\0All Files\0*.*\0");
l.lpstrFile = buf;
l.nMaxFile = 1023;
- l.lpstrTitle = "Open ZIP File";
- l.lpstrDefExt = "zip";
+ l.lpstrTitle = _T("Open ZIP File");
+ l.lpstrDefExt = _T("zip");
l.lpstrInitialDir = NULL;
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST;
buf[0]=0;
@@ -707,13 +717,13 @@ BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
case IDC_BROWSE2:
{
OPENFILENAME l={sizeof(l),};
- char buf[1024];
+ TCHAR buf[1024];
l.hwndOwner = hwndDlg;
- l.lpstrFilter = "Executables\0*.exe\0All Files\0*.*\0";
+ l.lpstrFilter = _T("Executables\0*.exe\0All Files\0*.*\0");
l.lpstrFile = buf;
l.nMaxFile = 1023;
- l.lpstrTitle = "Select Output EXE File";
- l.lpstrDefExt = "exe";
+ l.lpstrTitle = _T("Select Output EXE File");
+ l.lpstrDefExt = _T("exe");
l.lpstrInitialDir = NULL;
l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER;
GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf));
@@ -733,16 +743,16 @@ BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
for (size_t x = 0; x < sizeof(ids)/sizeof(ids[0]); x ++)
ShowWindow(GetDlgItem(hwndDlg,ids[x]),SW_SHOWNA);
- SetDlgItemText(hwndDlg,IDOK,"&Generate");
+ SetDlgItemText(hwndDlg,IDOK,_T("&Generate"));
EnableWindow(GetDlgItem(hwndDlg,IDOK),1);
}
}
break;
case IDC_TEST:
if (!g_hThread) {
- char buf[1024];
- GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,sizeof(buf));
- ShellExecute(hwndDlg,"open",buf,"","",SW_SHOW);
+ TCHAR buf[1024];
+ GetDlgItemText(hwndDlg,IDC_OUTFILE,buf,_countof(buf));
+ ShellExecute(hwndDlg,_T("open"),buf,_T(""),_T(""),SW_SHOW);
}
break;
case IDOK:
@@ -761,11 +771,11 @@ BOOL CALLBACK DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
else
g_compressor_solid = 0;
g_mui=!IsDlgButtonChecked(hwndDlg,IDC_CLASSICUI);
- SetDlgItemText(g_hwnd, IDC_OUTPUTTEXT, "");
+ SetDlgItemText(g_hwnd, IDC_OUTPUTTEXT, _T(""));
for (size_t x = 0; x < sizeof(ids)/sizeof(ids[0]); x ++)
ShowWindow(GetDlgItem(hwndDlg,ids[x]),SW_HIDE);
ShowWindow(GetDlgItem(hwndDlg,IDC_OUTPUTTEXT),SW_SHOWNA);
- SetDlgItemText(hwndDlg,IDOK,"&Close");
+ SetDlgItemText(hwndDlg,IDOK,_T("&Close"));
EnableWindow(GetDlgItem(hwndDlg,IDOK),0);
makeEXE(hwndDlg);
diff --git a/Contrib/zip2exe/zlib/ioapi.c b/Contrib/zip2exe/zlib/ioapi.c
index 05b5ef15..4a21f2e7 100644
--- a/Contrib/zip2exe/zlib/ioapi.c
+++ b/Contrib/zip2exe/zlib/ioapi.c
@@ -4,6 +4,7 @@
Version 1.01e, February 12th, 2005
Copyright (C) 1998-2005 Gilles Vollant
+ Unicode support by Jim Park -- 08/28/2007
*/
#include
@@ -31,7 +32,7 @@
voidpf ZCALLBACK fopen_file_func OF((
voidpf opaque,
- const char* filename,
+ const TCHAR* filename,
int mode));
uLong ZCALLBACK fread_file_func OF((
@@ -67,22 +68,22 @@ int ZCALLBACK ferror_file_func OF((
voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
voidpf opaque;
- const char* filename;
+ const TCHAR* filename;
int mode;
{
FILE* file = NULL;
- const char* mode_fopen = NULL;
+ const TCHAR* mode_fopen = NULL;
if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
- mode_fopen = "rb";
+ mode_fopen = _T("rb");
else
if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
- mode_fopen = "r+b";
+ mode_fopen = _T("r+b");
else
if (mode & ZLIB_FILEFUNC_MODE_CREATE)
- mode_fopen = "wb";
+ mode_fopen = _T("wb");
if ((filename!=NULL) && (mode_fopen != NULL))
- file = fopen(filename, mode_fopen);
+ file = _tfopen(filename, mode_fopen);
return file;
}
diff --git a/Contrib/zip2exe/zlib/ioapi.h b/Contrib/zip2exe/zlib/ioapi.h
index 7d457baa..351d230e 100644
--- a/Contrib/zip2exe/zlib/ioapi.h
+++ b/Contrib/zip2exe/zlib/ioapi.h
@@ -4,11 +4,15 @@
Version 1.01e, February 12th, 2005
Copyright (C) 1998-2005 Gilles Vollant
+
+ Unicode support by Jim Park -- 08/28/2007
*/
#ifndef _ZLIBIOAPI_H
#define _ZLIBIOAPI_H
+#include "../../ExDLL/nsis_tchar.h"
+
#define ZLIB_FILEFUNC_SEEK_CUR (1)
#define ZLIB_FILEFUNC_SEEK_END (2)
@@ -35,7 +39,7 @@
extern "C" {
#endif
-typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
+typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const TCHAR* filename, int mode));
typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
diff --git a/Contrib/zip2exe/zlib/unzip.c b/Contrib/zip2exe/zlib/unzip.c
index 473b665c..e9c798ac 100644
--- a/Contrib/zip2exe/zlib/unzip.c
+++ b/Contrib/zip2exe/zlib/unzip.c
@@ -4,6 +4,9 @@
Copyright (C) 1998-2005 Gilles Vollant
Read unzip.h for more info
+
+ Unicode support by Jim Park -- 08/28/2007
+ (Unicode ZIP file name, but not the files in the archive itself.)
*/
/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
@@ -395,7 +398,7 @@ local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream)
of this unzip package.
*/
extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def)
- const char *path;
+ const TCHAR *path;
zlib_filefunc_def* pzlib_filefunc_def;
{
unz_s us;
@@ -498,7 +501,7 @@ extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def)
extern unzFile ZEXPORT unzOpen (path)
- const char *path;
+ const TCHAR *path;
{
return unzOpen2(path, NULL);
}
diff --git a/Contrib/zip2exe/zlib/unzip.h b/Contrib/zip2exe/zlib/unzip.h
index 5bb6a696..64203da3 100644
--- a/Contrib/zip2exe/zlib/unzip.h
+++ b/Contrib/zip2exe/zlib/unzip.h
@@ -32,6 +32,10 @@
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
+ Unicode support by Jim Park -- 08/28/2007
+ (Support of the archive file name being Unicode but not the files in
+ the archive itself. That requires modifying the ZLIB lib not just
+ here but the user's zlib-based tool.)
*/
@@ -132,7 +136,7 @@ extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
*/
-extern unzFile ZEXPORT unzOpen OF((const char *path));
+extern unzFile ZEXPORT unzOpen OF((const TCHAR *path));
/*
Open a Zip file. path contain the full pathname (by example,
on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
@@ -143,7 +147,7 @@ extern unzFile ZEXPORT unzOpen OF((const char *path));
of this unzip package.
*/
-extern unzFile ZEXPORT unzOpen2 OF((const char *path,
+extern unzFile ZEXPORT unzOpen2 OF((const TCHAR *path,
zlib_filefunc_def* pzlib_filefunc_def));
/*
Open a Zip file, like unzOpen, but provide a set of file low level API
diff --git a/Docs/src/credits.but b/Docs/src/credits.but
index e63130f7..4d170402 100644
--- a/Docs/src/credits.but
+++ b/Docs/src/credits.but
@@ -66,6 +66,12 @@
\b InstallOptions improvements
+\e{Jim Park}
+
+\b Unicode support
+
+\e{Olivier Marcoux}
+
\e{nnop@newmail.ru}
\e{Ryan Geiss}
diff --git a/Include/FileFunc.nsh b/Include/FileFunc.nsh
index 87195b8c..8bd86433 100644
--- a/Include/FileFunc.nsh
+++ b/Include/FileFunc.nsh
@@ -910,7 +910,7 @@ RefreshShellIcons
StrCpy $6 1073741824
FileFunc_DriveSpace_getspace:
- System::Call 'kernel32::GetDiskFreeSpaceExA(t, *l, *l, *l)i(r0,.r2,.r3,.)'
+ System::Call 'kernel32::GetDiskFreeSpaceEx(t, *l, *l, *l)i(r0,.r2,.r3,.)'
StrCmp $5 T 0 +3
StrCpy $0 $3
@@ -970,7 +970,7 @@ RefreshShellIcons
System::Alloc 1024
Pop $2
- System::Call 'kernel32::GetLogicalDriveStringsA(i,i) i(1024, r2)'
+ System::Call 'kernel32::GetLogicalDriveStrings(i,i) i(1024, r2)'
StrCmp $0 ALL FileFunc_GetDrives_drivestring
StrCmp $0 '' 0 FileFunc_GetDrives_typeset
@@ -1007,10 +1007,10 @@ RefreshShellIcons
StrCpy $3 $2
FileFunc_GetDrives_enumok:
- System::Call 'kernel32::lstrlenA(t) i(i r3) .r4'
+ System::Call 'kernel32::lstrlen(t) i(i r3) .r4'
StrCmp $4$0 '0ALL' FileFunc_GetDrives_enumex
StrCmp $4 0 FileFunc_GetDrives_typeset
- System::Call 'kernel32::GetDriveTypeA(t) i(i r3) .r5'
+ System::Call 'kernel32::GetDriveType(t) i(i r3) .r5'
StrCmp $0 ALL +2
StrCmp $5 $6 FileFunc_GetDrives_letter FileFunc_GetDrives_enumnext
@@ -1111,7 +1111,7 @@ RefreshShellIcons
FileFunc_GetTime_getfile:
IfFileExists $0 0 FileFunc_GetTime_error
System::Call '*(i,l,l,l,i,i,i,i,&t260,&t14) i .r6'
- System::Call 'kernel32::FindFirstFileA(t,i)i(r0,r6) .r2'
+ System::Call 'kernel32::FindFirstFile(t,i)i(r0,r6) .r2'
System::Call 'kernel32::FindClose(i)i(r2)'
FileFunc_GetTime_gettime:
@@ -1401,8 +1401,8 @@ RefreshShellIcons
Push $0
Push $1
Push $2
- System::Call 'kernel32::GetModuleFileNameA(i 0, t .r0, i 1024)'
- System::Call 'kernel32::GetLongPathNameA(t r0, t .r1, i 1024)i .r2'
+ System::Call 'kernel32::GetModuleFileName(i 0, t .r0, i 1024)'
+ System::Call 'kernel32::GetLongPathName(t r0, t .r1, i 1024)i .r2'
StrCmp $2 error +2
StrCpy $0 $1
Pop $2
@@ -1429,7 +1429,7 @@ RefreshShellIcons
Push $1
Push $2
StrCpy $0 $EXEDIR
- System::Call 'kernel32::GetLongPathNameA(t r0, t .r1, i 1024)i .r2'
+ System::Call 'kernel32::GetLongPathName(t r0, t .r1, i 1024)i .r2'
StrCmp $2 error +2
StrCpy $0 $1
Pop $2
diff --git a/Include/LogicLib.nsh b/Include/LogicLib.nsh
index 9e78e425..9a39a489 100644
--- a/Include/LogicLib.nsh
+++ b/Include/LogicLib.nsh
@@ -155,7 +155,7 @@
; Extra string tests (cannot do these case-sensitively - I tried and lstrcmp still ignored the case)
!macro _StrCmpI _a _b _e _l _m
!insertmacro _LOGICLIB_TEMP
- System::Call `kernel32::lstrcmpiA(ts, ts) i.s` `${_a}` `${_b}`
+ System::Call `kernel32::lstrcmpi(ts, ts) i.s` `${_a}` `${_b}`
Pop $_LOGICLIB_TEMP
IntCmp $_LOGICLIB_TEMP 0 `${_e}` `${_l}` `${_m}`
!macroend
diff --git a/Include/StrFunc.nsh b/Include/StrFunc.nsh
index f6c4b3e4..1b0cb18c 100644
--- a/Include/StrFunc.nsh
+++ b/Include/StrFunc.nsh
@@ -411,7 +411,7 @@ o-----------------------------------------------------------------------------o
System::Call 'kernel32::GlobalLock(i r2) i.r3'
;Step 4: Copy the text to locked clipboard buffer
- System::Call 'kernel32::lstrcpyA(i r3, t r0)'
+ System::Call 'kernel32::lstrcpy(i r3, t r0)'
;Step 5: Unlock the handle again
System::Call 'kernel32::GlobalUnlock(i r2)'
@@ -455,7 +455,7 @@ o-----------------------------------------------------------------------------o
System::Call 'kernel32::GlobalLock(i r2) i.r3'
;Step 7: Copy the text to locked clipboard buffer
- System::Call 'kernel32::lstrcpyA(i r3, t r0)'
+ System::Call 'kernel32::lstrcpy(i r3, t r0)'
;Step 8: Unlock the handle again
System::Call 'kernel32::GlobalUnlock(i r2)'
@@ -1192,7 +1192,7 @@ o-----------------------------------------------------------------------------o
; variable because it won't be used anymore
${If} $6 == 1
- System::Call `kernel32::lstrcmpA(ts, ts) i.s` `$R3` `$1`
+ System::Call `kernel32::lstrcmp(ts, ts) i.s` `$R3` `$1`
Pop $R3
${If} $R3 = 0
StrCpy $R3 1 ; Continue
diff --git a/Include/WinVer.nsh b/Include/WinVer.nsh
index cc860c1e..7c562575 100644
--- a/Include/WinVer.nsh
+++ b/Include/WinVer.nsh
@@ -151,8 +151,13 @@
# some definitions from header files
-!define OSVERSIONINFOA_SIZE 148
-!define OSVERSIONINFOEXA_SIZE 156
+!ifdef NSIS_UNICODE
+!define OSVERSIONINFO_SIZE 276 ; OSVERSIONINFOW
+!define OSVERSIONINFOEX_SIZE 284 ; OSVERSIONINFOEXW
+!else
+!define OSVERSIONINFO_SIZE 148 ; OSVERSIONINFOA
+!define OSVERSIONINFOEX_SIZE 156 ; OSVERSIONINFOEXA
+!endif
!define VER_PLATFORM_WIN32_NT 2
!define VER_NT_WORKSTATION 1
@@ -206,15 +211,15 @@
Push $R0 ;temp
# allocate memory
- System::Alloc ${OSVERSIONINFOEXA_SIZE}
+ System::Alloc ${OSVERSIONINFOEX_SIZE}
Pop $0
# use OSVERSIONINFOEX
- !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFOEXA_SIZE}
+ !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFOEX_SIZE}
IntCmp $3 0 "" _winver_ex _winver_ex
# OSVERSIONINFOEX not allowed (Win9x or NT4 w/SP < 6), use OSVERSIONINFO
- !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFOA_SIZE}
+ !insertmacro __WinVer_Call_GetVersionEx ${OSVERSIONINFO_SIZE}
_winver_ex:
# get results from struct
@@ -266,7 +271,7 @@
_winver_nt: # nt
- IntCmp $R0 ${OSVERSIONINFOEXA_SIZE} "" _winver_sp_noex _winver_sp_noex
+ IntCmp $R0 ${OSVERSIONINFOEX_SIZE} "" _winver_sp_noex _winver_sp_noex
# discard szCSDVersion
Pop $0
diff --git a/Menu/index.html b/Menu/index.html
index 10539482..ed58ed7b 100644
--- a/Menu/index.html
+++ b/Menu/index.html
@@ -17,7 +17,7 @@
Developer Center
- Many more examples, tutorials, plug-ins and NSIS-releted software are available
+ Many more examples, tutorials, plug-ins and NSIS-related software are available
at the on-line Developer Center.
diff --git a/SCons/Config/ms b/SCons/Config/ms
index 3386b17c..87b24aa5 100644
--- a/SCons/Config/ms
+++ b/SCons/Config/ms
@@ -17,7 +17,7 @@ defenv['STDCALL'] = '__stdcall'
if float(defenv['MSVS_VERSION'].replace('Exp','')) >= 8.0:
defenv['EXCEPTION_FLAG'] = '/EHsc'
defenv.Append(CCFLAGS = ['/GS-'])
- defenv.Append(CPPDEFINES = ['_CRT_SECURE_NO_WARNINGS', '_CRT_NONSTDC_NO_WARNINGS'])
+ defenv.Append(CPPDEFINES = ['_CRT_SECURE_NO_WARNINGS', '_CRT_NONSTDC_NO_WARNINGS', '_CRT_SECURE_NO_DEPRECATE', '_CRT_NON_CONFORMING_SWPRINTFS'])
else:
defenv['EXCEPTION_FLAG'] = '/GX'
@@ -36,6 +36,10 @@ if defenv['DEBUG']:
defenv.Append(CCFLAGS = ['/Fd${TARGET.dir}\\${TARGET.dir.file}.pdb'])
defenv.Append(LINKFLAGS = ['/debug'])
+### unicode
+if defenv['UNICODE']:
+ defenv.Append(CPPDEFINES = ['_UNICODE', 'UNICODE'])
+
### workarounds
# Some Platform SDK version includes a bad version of libcp.lib.
@@ -45,38 +49,42 @@ if defenv['DEBUG']:
confenv = defenv.Clone()
conf = confenv.Configure()
-libcptest = """
-#include
-int main() {
- // %s
- std::ofstream header("test", std::ofstream::out);
- return 0;
-}
-"""
+# For VS 2005 and up, the single threaded version of C runtime
+# need not be explicitly linked.
+if float(defenv['MSVS_VERSION'].replace('Exp','')) < 8.0:
+ libcptest = """
+ #include
+ int main() {
+ // %s
+ std::ofstream header("test", std::ofstream::out);
+ return 0;
+ }
+ """
-conf.env.PrependENVPath('LIB', Dir('#/.sconf_temp').abspath)
-conf.env.Append(CCFLAGS = ['$EXCEPTION_FLAG'])
+ conf.env.PrependENVPath('LIB', Dir('#/.sconf_temp').abspath)
+ conf.env.Append(CCFLAGS = ['$EXCEPTION_FLAG'])
-if not conf.TryLink(libcptest % 'no change', '.cpp'):
- import os, shutil
+ if not conf.TryLink(libcptest % 'no change', '.cpp'):
+ import os, shutil
- libdirs = defenv['ENV']['LIB'].split(os.pathsep)
+ libdirs = defenv['ENV']['LIB'].split(os.pathsep)
- for libdir in libdirs:
- try:
- libcp = r'%s\libcp.lib' % libdir
- shutil.copy(libcp, Dir('#/.sconf_temp').abspath)
- if conf.TryLink(libcptest % (r'using %s' % libcp), '.cpp'):
- defenv.PrependENVPath('LIB', Dir('#/.sconf_temp').abspath)
- break
- except IOError:
- continue
- else:
- print "*** Couldn't find a good version of libcp.lib"
- Exit(2)
+ for libdir in libdirs:
+ try:
+ libcp = r'%s\libcp.lib' % libdir
+ shutil.copy(libcp, Dir('#/.sconf_temp').abspath)
+ if conf.TryLink(libcptest % (r'using %s' % libcp), '.cpp'):
+ defenv.PrependENVPath('LIB', Dir('#/.sconf_temp').abspath)
+ break
+ except IOError:
+ continue
+ else:
+ print "*** Couldn't find a good version of libcp.lib"
+ Exit(2)
conf.Finish()
+
### stub environment
stub_env = defenv.Clone()
@@ -88,7 +96,12 @@ if not defenv['DEBUG']:
stub_env.Append(CCFLAGS = ['/W3']) # level 3 warnings
stub_env.Append(LINKFLAGS = ['/opt:nowin98']) # 512 bytes align
-stub_env.Append(LINKFLAGS = ['/entry:WinMain']) # entry point
+
+if defenv['UNICODE']:
+ stub_env.Append(LINKFLAGS = ['/entry:wWinMain']) # Unicode entry point
+else:
+ stub_env.Append(LINKFLAGS = ['/entry:WinMain']) # ANSI entry point
+
stub_env.Append(LINKFLAGS = ['$NODEFLIBS_FLAG']) # no default libraries
stub_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file
stub_env.Append(CCFLAGS = ['/FAcs']) # full listing files
@@ -104,6 +117,8 @@ if not defenv['DEBUG']:
makensis_env.Append(CCFLAGS = ['/O2']) # optimize for speed
makensis_env.Append(CCFLAGS = ['$EXCEPTION_FLAG']) # enable exceptions
makensis_env.Append(CCFLAGS = ['/W3']) # level 3 warnings
+makensis_env.Append(CCFLAGS = ['/FAcs']) # full listing files
+makensis_env.Append(CCFLAGS = ['/Fa${TARGET}.lst']) # listing file name
makensis_env.Append(LINKFLAGS = ['/opt:nowin98']) # 512 bytes align
makensis_env.Append(LINKFLAGS = ['$MAP_FLAG']) # generate map file
@@ -200,13 +215,22 @@ def add_file(file):
conf = stub_env.Configure()
-int64test = """
-#include
-int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam, int nCmdShow) {
- ULARGE_INTEGER *i = 0;
- return (int)(i->QuadPart >> 10);
-}
-"""
+if defenv['UNICODE']:
+ int64test = """
+ #include
+ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPTSTR lpszCmdParam, int nCmdShow) {
+ ULARGE_INTEGER *i = 0;
+ return (int)(i->QuadPart >> 10);
+ }
+ """
+else:
+ int64test = """
+ #include
+ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInst,LPSTR lpszCmdParam, int nCmdShow) {
+ ULARGE_INTEGER *i = 0;
+ return (int)(i->QuadPart >> 10);
+ }
+ """
if not conf.TryLink(int64test, '.c'):
stub_env.Append(CPPDEFINES = ['_NSIS_NO_INT64_SHR'])
diff --git a/SCons/Tools/mstoolkit.py b/SCons/Tools/mstoolkit.py
index c2c92766..1b7eaa5f 100644
--- a/SCons/Tools/mstoolkit.py
+++ b/SCons/Tools/mstoolkit.py
@@ -338,7 +338,7 @@ def generate(env):
env['REGSVRFLAGS'] = '/s '
env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS $TARGET'
- env['MSVS_VERSION'] = '7.1'
+ env['MSVS_VERSION'] = '8.0'
def exists(env):
diff --git a/SCons/config.py b/SCons/config.py
index a344456e..8dc7b333 100644
--- a/SCons/config.py
+++ b/SCons/config.py
@@ -7,7 +7,7 @@ cfg = Variables()
cfg.Add(
(
'NSIS_MAX_STRLEN',
- 'defines the maximum string length for internal variables and stack entries. 1024 should be plenty, but if you are doing crazy registry shit, you might want to bump it up. Generally it adds about 16-32x the memory, so setting this to 4096 from 1024 will add around 64k of memory usage (not really a big deal, but not usually needed).',
+ 'defines the maximum string length for internal variables and stack entries. 1024 should be plenty, but if you are doing crazy registry stuff, you might want to bump it up. Generally it adds about 16-32x the memory, so setting this to 4096 from 1024 will add around 64k of memory usage (not really a big deal, but not usually needed).',
1024
)
)
diff --git a/SConstruct b/SConstruct
index 3b925e11..77625085 100644
--- a/SConstruct
+++ b/SConstruct
@@ -159,6 +159,7 @@ opts.Add(('APPEND_LINKFLAGS', 'Additional linker flags'))
opts.Add(PathVariable('WXWIN', 'Path to wxWindows library folder (e.g. C:\\Dev\\wxWidgets-2.8.10)', os.environ.get('WXWIN')))
opts.Add(PathVariable('ZLIB_W32', 'Path to Win32 zlib library folder (e.g. C:\\Dev\\zlib-1.2.3)', os.environ.get('ZLIB_W32')))
# build options
+opts.Add(BoolVariable('UNICODE', 'Build the Unicode version of the executable', 'no'))
opts.Add(BoolVariable('DEBUG', 'Build executables with debugging information', 'no'))
opts.Add(PathVariable('CODESIGNER', 'A program used to sign executables', None))
opts.Add(BoolVariable('STRIP', 'Strips executables of any unrequired data such as symbols', 'yes'))
@@ -182,10 +183,17 @@ if 'NSIS_CONFIG_CONST_DATA_PATH' in defenv['NSIS_CPPDEFINES']:
defenv.Append(NSIS_CPPDEFINES = [('PREFIX_DATA', '"%s"' % defenv.subst('$PREFIX_DATA'))])
# Need this early for the config header files to be placed in
-if defenv['DEBUG']:
- defenv.Replace(BUILD_PREFIX = 'build/debug')
+
+if defenv['UNICODE']:
+ if defenv['DEBUG']:
+ defenv.Replace(BUILD_PREFIX = 'build/udebug')
+ else:
+ defenv.Replace(BUILD_PREFIX = 'build/urelease')
else:
- defenv.Replace(BUILD_PREFIX = 'build/release')
+ if defenv['DEBUG']:
+ defenv.Replace(BUILD_PREFIX = 'build/debug')
+ else:
+ defenv.Replace(BUILD_PREFIX = 'build/release')
defenv.Replace(BUILD_CONFIG = defenv.subst('$BUILD_PREFIX/config'))
@@ -203,19 +211,32 @@ for i in defenv['NSIS_CPPDEFINES']:
if type(i) is not str:
sconf_h.write('#define %s %s\n' % (i[0], i[1]))
if str(i[1])[0] != '"':
- defines_h.write('definedlist.add("%s", "%s");\n' % (i[0], i[1]))
+ defines_h.write('definedlist.add(_T("%s"), _T("%s"));\n' % (i[0], i[1]))
else:
- defines_h.write('definedlist.add("%s", %s);\n' % (i[0], i[1]))
+ defines_h.write('definedlist.add(_T("%s"), _T(%s));\n' % (i[0], i[1]))
else:
sconf_h.write('#define %s\n' % (i))
- defines_h.write('definedlist.add("%s");\n' % (i))
+ defines_h.write('definedlist.add(_T("%s"));\n' % (i))
sconf_h.close()
defines_h.close()
# write version into version.h
f = open(defenv.File('#$BUILD_CONFIG/nsis-version.h').abspath, 'w')
f.write('// This file is automatically generated by SCons\n// DO NOT EDIT THIS FILE\n')
-f.write('#define NSIS_VERSION "v%s"\n' % defenv['VERSION'])
+f.write('#include "tchar.h"\n')
+
+if defenv.has_key('VER_MAJOR'):
+ defenv['VERSION'] = defenv['VER_MAJOR']
+ if defenv.has_key('VER_MINOR'):
+ defenv['VERSION'] += '.' + defenv['VER_MINOR']
+ if defenv.has_key('VER_REVISION'):
+ defenv['VERSION'] += '.' + defenv['VER_REVISION']
+
+if defenv['UNICODE']:
+ defenv['VERSION'] += "-Unicode"
+
+f.write('#define NSIS_VERSION _T("v%s")\n' % defenv['VERSION'])
+
f.close()
######################################################################
@@ -413,6 +434,8 @@ def build_installer(target, source, env):
cmdline = FindMakeNSIS(env, str(env['INSTDISTDIR'])) + ' %sDOUTFILE=%s %s' % (optchar, target[0].abspath, env['INSTVER'])
cmd = env.Command(None, source, cmdline + ' $SOURCE')
AlwaysBuild(cmd)
+ # Comment out the following if you want to see the installation directory
+ # after the build is finished.
AlwaysBuild(env.AddPostAction(cmd, Delete('$INSTDISTDIR')))
env.Alias('dist-installer', cmd)
@@ -433,9 +456,15 @@ defenv.Alias('dist', ['dist-zip', 'dist-installer'])
for d in doc:
if d in defenv['SKIPDOC']:
continue
- defenv.DistributeDoc(d)
+ if defenv['UNICODE']:
+ defenv.DistributeDoc('Unicode/' + d)
+ else:
+ defenv.DistributeDoc(d)
-defenv.DistributeConf('nsisconf.nsh')
+if defenv['UNICODE']:
+ defenv.DistributeConf('Unicode/nsisconf.nsh')
+else:
+ defenv.DistributeConf('nsisconf.nsh')
######################################################################
####### Stubs ###
diff --git a/Source/7zip/7zGuids.cpp b/Source/7zip/7zGuids.cpp
index 1ca1ac12..08276c91 100644
--- a/Source/7zip/7zGuids.cpp
+++ b/Source/7zip/7zGuids.cpp
@@ -13,6 +13,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
+ *
+ * Reviewed for Unicode support by Jim Park -- 08/24/2007
*/
// DLLExports.cpp
diff --git a/Source/7zip/Common/Alloc.cpp b/Source/7zip/Common/Alloc.cpp
index 9ac1946b..2dd73bb1 100644
--- a/Source/7zip/Common/Alloc.cpp
+++ b/Source/7zip/Common/Alloc.cpp
@@ -13,6 +13,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
+ *
+ * Unicode support by Jim Park -- 08/28/2007
*/
#include "StdAfx.h"
@@ -21,6 +23,7 @@
#include "MyWindows.h"
#else
#include
+#include "../../tchar.h"
#endif
#include "Alloc.h"
@@ -39,7 +42,7 @@ void *MyAlloc(size_t size) throw()
if (size == 0)
return 0;
#ifdef _SZ_ALLOC_DEBUG
- fprintf(stderr, "\nAlloc %10d bytes; count = %10d", size, g_allocCount++);
+ _ftprintf(stderr, _T("\nAlloc %10d bytes; count = %10d"), size, g_allocCount++);
#endif
return ::malloc(size);
}
@@ -48,7 +51,7 @@ void MyFree(void *address) throw()
{
#ifdef _SZ_ALLOC_DEBUG
if (address != 0)
- fprintf(stderr, "\nFree; count = %10d", --g_allocCount);
+ _ftprintf(stderr, _T("\nFree; count = %10d"), --g_allocCount);
#endif
::free(address);
@@ -61,7 +64,7 @@ void *MidAlloc(size_t size) throw()
if (size == 0)
return 0;
#ifdef _SZ_ALLOC_DEBUG
- fprintf(stderr, "\nAlloc_Mid %10d bytes; count = %10d", size, g_allocCountMid++);
+ _ftprintf(stderr, _T("\nAlloc_Mid %10d bytes; count = %10d"), size, g_allocCountMid++);
#endif
return ::VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
}
@@ -70,7 +73,7 @@ void MidFree(void *address) throw()
{
#ifdef _SZ_ALLOC_DEBUG
if (address != 0)
- fprintf(stderr, "\nFree_Mid; count = %10d", --g_allocCountMid);
+ _ftprintf(stderr, _T("\nFree_Mid; count = %10d"), --g_allocCountMid);
#endif
if (address == 0)
return;
@@ -89,7 +92,7 @@ typedef SIZE_T (WINAPI *GetLargePageMinimumP)();
bool SetLargePageSize()
{
GetLargePageMinimumP largePageMinimum = (GetLargePageMinimumP)
- ::GetProcAddress(::GetModuleHandle(TEXT("kernel32.dll")), "GetLargePageMinimum");
+ ::GetProcAddress(::GetModuleHandle(_T("kernel32.dll")), "GetLargePageMinimum");
if (largePageMinimum == 0)
return false;
SIZE_T size = largePageMinimum();
@@ -105,7 +108,7 @@ void *BigAlloc(size_t size) throw()
if (size == 0)
return 0;
#ifdef _SZ_ALLOC_DEBUG
- fprintf(stderr, "\nAlloc_Big %10d bytes; count = %10d", size, g_allocCountBig++);
+ _ftprintf(stderr, _T("\nAlloc_Big %10d bytes; count = %10d"), size, g_allocCountBig++);
#endif
if (size >= (1 << 18))
@@ -122,7 +125,7 @@ void BigFree(void *address) throw()
{
#ifdef _SZ_ALLOC_DEBUG
if (address != 0)
- fprintf(stderr, "\nFree_Big; count = %10d", --g_allocCountBig);
+ _ftprintf(stderr, _T("\nFree_Big; count = %10d"), --g_allocCountBig);
#endif
if (address == 0)
diff --git a/Source/7zip/Common/Alloc.h b/Source/7zip/Common/Alloc.h
index 5916ef06..aaa2749e 100644
--- a/Source/7zip/Common/Alloc.h
+++ b/Source/7zip/Common/Alloc.h
@@ -13,6 +13,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
+ *
+ * Reviewed for Unicode support by Jim Park -- 08/28/2007
*/
#ifndef __COMMON_ALLOC_H
diff --git a/Source/7zip/Common/CRC.cpp b/Source/7zip/Common/CRC.cpp
index dad64326..4a2d1a2f 100644
--- a/Source/7zip/Common/CRC.cpp
+++ b/Source/7zip/Common/CRC.cpp
@@ -13,6 +13,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
+ *
+ * Reviewed for Unicode support by Jim Park -- 08/28/2007
*/
#include "StdAfx.h"
diff --git a/Source/7zip/Common/CRC.h b/Source/7zip/Common/CRC.h
index 72cb518f..b1fc6b87 100644
--- a/Source/7zip/Common/CRC.h
+++ b/Source/7zip/Common/CRC.h
@@ -13,6 +13,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
+ *
+ * Reviewed for Unicode support by Jim Park -- 08/28/2007
*/
#ifndef __COMMON_CRC_H
diff --git a/Source/7zip/LZMADecode.c b/Source/7zip/LZMADecode.c
index 0635b013..0522bfef 100644
--- a/Source/7zip/LZMADecode.c
+++ b/Source/7zip/LZMADecode.c
@@ -13,6 +13,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
+ *
+ * Reviewed for Unicode support by Jim Park -- 08/24/2007
*/
#include
diff --git a/Source/7zip/LZMADecode.h b/Source/7zip/LZMADecode.h
index 68c78655..e6aec0c1 100644
--- a/Source/7zip/LZMADecode.h
+++ b/Source/7zip/LZMADecode.h
@@ -13,6 +13,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
+ *
+ * Reviewed for Unicode support by Jim Park -- 08/24/2007
*/
#ifndef __LZMADECODE_H
diff --git a/Source/DialogTemplate.cpp b/Source/DialogTemplate.cpp
index 109a1d79..e0d336fc 100644
--- a/Source/DialogTemplate.cpp
+++ b/Source/DialogTemplate.cpp
@@ -280,8 +280,8 @@ int CDialogTemplate::RemoveItem(WORD wId) {
}
// Sets the font of the dialog
-void CDialogTemplate::SetFont(char* szFaceName, WORD wFontSize) {
- if (strcmp(szFaceName, "MS Shell Dlg")) {
+void CDialogTemplate::SetFont(TCHAR* szFaceName, WORD wFontSize) {
+ if (_tcscmp(szFaceName, _T("MS Shell Dlg"))) {
// not MS Shell Dlg
m_dwStyle &= ~DS_SHELLFONT;
}
@@ -364,7 +364,7 @@ void CDialogTemplate::DlgUnitsToPixels(short& x, short& y) {
}
// Returns the size of a string in the dialog (in dialog units)
-SIZE CDialogTemplate::GetStringSize(WORD id, char *str) {
+SIZE CDialogTemplate::GetStringSize(WORD id, TCHAR *str) {
HWND hDlg = CreateDummyDialog();
LOGFONT f;
@@ -375,7 +375,7 @@ SIZE CDialogTemplate::GetStringSize(WORD id, char *str) {
SelectObject(memDC, font);
SIZE size;
- GetTextExtentPoint32(memDC, str, strlen(str), &size);
+ GetTextExtentPoint32(memDC, str, _tcsclen(str), &size);
DestroyWindow(hDlg);
DeleteObject(font);
@@ -387,7 +387,7 @@ SIZE CDialogTemplate::GetStringSize(WORD id, char *str) {
}
// Trims the right margins of a control to fit a given text string size.
-void CDialogTemplate::RTrimToString(WORD id, char *str, int margins) {
+void CDialogTemplate::RTrimToString(WORD id, TCHAR *str, int margins) {
DialogItemTemplate* item = GetItem(id);
if (!item) return;
@@ -401,7 +401,7 @@ void CDialogTemplate::RTrimToString(WORD id, char *str, int margins) {
}
// Trims the left margins of a control to fit a given text string size.
-void CDialogTemplate::LTrimToString(WORD id, char *str, int margins) {
+void CDialogTemplate::LTrimToString(WORD id, TCHAR *str, int margins) {
DialogItemTemplate* item = GetItem(id);
if (!item) return;
@@ -416,7 +416,7 @@ void CDialogTemplate::LTrimToString(WORD id, char *str, int margins) {
}
// Trims the left and right margins of a control to fit a given text string size.
-void CDialogTemplate::CTrimToString(WORD id, char *str, int margins) {
+void CDialogTemplate::CTrimToString(WORD id, TCHAR *str, int margins) {
DialogItemTemplate* item = GetItem(id);
if (!item) return;
diff --git a/Source/DialogTemplate.h b/Source/DialogTemplate.h
index 918ca23c..00c072ea 100644
--- a/Source/DialogTemplate.h
+++ b/Source/DialogTemplate.h
@@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
+ *
+ * Reviewed for Unicode support by Jim Park -- 08/21/2007
*/
#if !defined(AFX_DIALOGTEMPLATE_H__C5A973AF_0F56_4BEC_814A_79318E2EB4AC__INCLUDED_)
@@ -113,7 +115,7 @@ public:
DialogItemTemplate* GetItem(WORD wId);
DialogItemTemplate* GetItemByIdx(DWORD i);
int RemoveItem(WORD wId);
- void SetFont(char* szFaceName, WORD wFontSize);
+ void SetFont(TCHAR* szFaceName, WORD wFontSize);
void AddItem(DialogItemTemplate item);
#ifdef _WIN32
HWND CreateDummyDialog();
@@ -123,10 +125,10 @@ public:
#ifdef _WIN32
void PixelsToDlgUnits(short& x, short& y);
void DlgUnitsToPixels(short& x, short& y);
- SIZE GetStringSize(WORD id, char *str);
- void RTrimToString(WORD id, char *str, int margins);
- void LTrimToString(WORD id, char *str, int margins);
- void CTrimToString(WORD id, char *str, int margins);
+ SIZE GetStringSize(WORD id, TCHAR *str);
+ void RTrimToString(WORD id, TCHAR *str, int margins);
+ void LTrimToString(WORD id, TCHAR *str, int margins);
+ void CTrimToString(WORD id, TCHAR *str, int margins);
#endif
void ConvertToRTL();
BYTE* Save(DWORD& dwSize);
diff --git a/Source/Platform.h b/Source/Platform.h
index 52eb9bcb..b4aaf2cb 100644
--- a/Source/Platform.h
+++ b/Source/Platform.h
@@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
+ *
+ * Unicode support by Jim Park -- 08/13/2007
*/
#ifndef ___PLATFORM__H___
@@ -22,9 +24,10 @@
// includes
#ifdef _WIN32
-# include
-# include
-# include
+#include
+#include
+#include
+#include "tchar.h"
#else
# ifndef EXEHEAD
# include
@@ -109,22 +112,22 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG;
// script path separator
-# define PATH_SEPARATOR_STR "\\"
-# define PATH_SEPARATOR_C '\\'
+# define PATH_SEPARATOR_STR _T("\\")
+# define PATH_SEPARATOR_C _T('\\')
// system specific characters
#ifdef _WIN32
-# define PLATFORM_PATH_SEPARATOR_STR "\\"
-# define PLATFORM_PATH_SEPARATOR_C '\\'
-# define OPT_STR "/"
-# define OPT_C '/'
-# define IS_OPT(a) (a[0]==OPT_C||a[0]=='-')
+# define PLATFORM_PATH_SEPARATOR_STR _T("\\")
+# define PLATFORM_PATH_SEPARATOR_C _T('\\')
+# define OPT_STR _T("/")
+# define OPT_C _T('/')
+# define IS_OPT(a) (a[0]==OPT_C||a[0]==_T('-'))
#else
-# define PLATFORM_PATH_SEPARATOR_STR "/"
-# define PLATFORM_PATH_SEPARATOR_C '/'
-# define OPT_STR "-"
-# define OPT_C '-'
+# define PLATFORM_PATH_SEPARATOR_STR _T("/")
+# define PLATFORM_PATH_SEPARATOR_C _T('/')
+# define OPT_STR _T("-")
+# define OPT_C _T('-')
# define IS_OPT(a) (a[0]==OPT_C)
#endif
@@ -183,6 +186,8 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG;
// functions
+// Jim Park: These str functions will probably never be encountered with all my
+// Unicode changes. And if they were used, these would probably be wrong.
#ifndef _WIN32
# define stricmp strcasecmp
# define strcmpi strcasecmp
@@ -227,10 +232,10 @@ typedef DWORDLONG ULONGLONG,*PULONGLONG;
#ifndef EXEHEAD
# ifndef SF_TEXT
-# define SF_TEXT 1
+# define SF_TEXT 0x0001
# endif
# ifndef SF_RTF
-# define SF_RTF 2
+# define SF_RTF 0x0002
# endif
#endif
@@ -683,7 +688,7 @@ typedef struct _LOGFONT {
BYTE lfClipPrecision;
BYTE lfQuality;
BYTE lfPitchAndFamily;
- CHAR lfFaceName[LF_FACESIZE];
+ TCHAR lfFaceName[LF_FACESIZE];
} LOGFONT;
# pragma pack(2)
typedef struct _IMAGE_DOS_HEADER {
diff --git a/Source/Plugins.cpp b/Source/Plugins.cpp
index 6872b281..2fdc5239 100644
--- a/Source/Plugins.cpp
+++ b/Source/Plugins.cpp
@@ -18,7 +18,7 @@
#ifdef NSIS_CONFIG_PLUGIN_SUPPORT
#include