1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/other-licenses/nsis/Contrib/ExDLL/exdllutil.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,131 @@ 1.4 +// Unicode support by Jim Park -- 08/23/2007 1.5 + 1.6 +#include <windows.h> 1.7 +#include "exdllutil.h" 1.8 + 1.9 +// utility functions (not required but often useful) 1.10 +static int __stdcall popstring(TCHAR *str) 1.11 +{ 1.12 + stack_t *th; 1.13 + if (!g_stacktop || !*g_stacktop) return 1; 1.14 + th=(*g_stacktop); 1.15 + lstrcpy(str,th->text); 1.16 + *g_stacktop = th->next; 1.17 + GlobalFree((HGLOBAL)th); 1.18 + return 0; 1.19 +} 1.20 + 1.21 +static void __stdcall pushstring(const TCHAR *str) 1.22 +{ 1.23 + stack_t *th; 1.24 + if (!g_stacktop) return; 1.25 + th=(stack_t*)GlobalAlloc(GPTR,(sizeof(stack_t)+(g_stringsize)*sizeof(TCHAR))); 1.26 + lstrcpyn(th->text,str,g_stringsize); 1.27 + th->next=*g_stacktop; 1.28 + *g_stacktop=th; 1.29 +} 1.30 + 1.31 +static TCHAR * __stdcall getuservariable(const int varnum) 1.32 +{ 1.33 + if (varnum < 0 || varnum >= __INST_LAST) return NULL; 1.34 + return g_variables+varnum*g_stringsize; 1.35 +} 1.36 + 1.37 +static void __stdcall setuservariable(const int varnum, const TCHAR *var) 1.38 +{ 1.39 + if (var != NULL && varnum >= 0 && varnum < __INST_LAST) 1.40 + lstrcpy(g_variables + varnum*g_stringsize, var); 1.41 +} 1.42 + 1.43 +#ifdef _UNICODE 1.44 +static int __stdcall PopStringA(char* ansiStr) 1.45 +{ 1.46 + wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t)); 1.47 + int rval = popstring(wideStr); 1.48 + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); 1.49 + GlobalFree((HGLOBAL)wideStr); 1.50 + return rval; 1.51 +} 1.52 + 1.53 +static void __stdcall PushStringA(const char* ansiStr) 1.54 +{ 1.55 + wchar_t* wideStr = (wchar_t*) GlobalAlloc(GPTR, g_stringsize*sizeof(wchar_t)); 1.56 + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); 1.57 + pushtring(wideStr); 1.58 + GlobalFree((HGLOBAL)wideStr); 1.59 + return; 1.60 +} 1.61 + 1.62 +static void __stdcall GetUserVariableW(const int varnum, wchar_t* wideStr) 1.63 +{ 1.64 + lstrcpyW(wideStr, getuservariable(varnum)); 1.65 +} 1.66 + 1.67 +static void __stdcall GetUserVariableA(const int varnum, char* ansiStr) 1.68 +{ 1.69 + wchar_t* wideStr = getuservariable(varnum); 1.70 + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); 1.71 +} 1.72 + 1.73 +static void __stdcall SetUserVariableA(const int varnum, const char* ansiStr) 1.74 +{ 1.75 + if (ansiStr != NULL && varnum >= 0 && varnum < __INST_LAST) 1.76 + { 1.77 + wchar_t* wideStr = g_variables + varnum * g_stringsize; 1.78 + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); 1.79 + } 1.80 +} 1.81 + 1.82 +#else 1.83 +// ANSI defs 1.84 +static int __stdcall PopStringW(wchar_t* wideStr) 1.85 +{ 1.86 + char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize); 1.87 + int rval = popstring(ansiStr); 1.88 + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); 1.89 + GlobalFree((HGLOBAL)ansiStr); 1.90 + return rval; 1.91 +} 1.92 + 1.93 +static void __stdcall PushStringW(wchar_t* wideStr) 1.94 +{ 1.95 + char* ansiStr = (char*) GlobalAlloc(GPTR, g_stringsize); 1.96 + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); 1.97 + pushstring(ansiStr); 1.98 + GlobalFree((HGLOBAL)ansiStr); 1.99 +} 1.100 + 1.101 +static void __stdcall GetUserVariableW(const int varnum, wchar_t* wideStr) 1.102 +{ 1.103 + char* ansiStr = getuservariable(varnum); 1.104 + MultiByteToWideChar(CP_ACP, 0, ansiStr, -1, wideStr, g_stringsize); 1.105 +} 1.106 + 1.107 +static void __stdcall GetUserVariableA(const int varnum, char* ansiStr) 1.108 +{ 1.109 + lstrcpyA(ansiStr, getuservariable(varnum)); 1.110 +} 1.111 + 1.112 +static void __stdcall SetUserVariableW(const int varnum, const wchar_t* wideStr) 1.113 +{ 1.114 + if (wideStr != NULL && varnum >= 0 && varnum < __INST_LAST) 1.115 + { 1.116 + char* ansiStr = g_variables + varnum * g_stringsize; 1.117 + WideCharToMultiByte(CP_ACP, 0, wideStr, -1, ansiStr, g_stringsize, NULL, NULL); 1.118 + } 1.119 +} 1.120 +#endif 1.121 + 1.122 +static BOOL __stdcall IsUnicode(void) 1.123 +{ 1.124 +#ifdef _UNICODE 1.125 + return TRUE; 1.126 +#else 1.127 + return FALSE; 1.128 +#endif 1.129 +} 1.130 + 1.131 +static TCHAR* __stdcall AllocString() 1.132 +{ 1.133 + return (TCHAR*) GlobalAlloc(GPTR, g_stringsize*sizeof(TCHAR)); 1.134 +}