Jim Park's Unicode NSIS merging - Step 1 : switch to TCHARs where relevant.

Compiler output is identical before & after this step

git-svn-id: https://svn.code.sf.net/p/nsis/code/NSIS/branches/wizou@6036 212acab6-be3b-0410-9dea-997c60f758d6
This commit is contained in:
wizou 2010-03-24 17:22:56 +00:00
parent 4e48722b63
commit 752d7d239a
209 changed files with 9698 additions and 7658 deletions

View file

@ -12,6 +12,8 @@
*
* This software is provided 'as-is', without any express or implied
* warranty.
*
* Unicode support by Jim Park -- 08/11/2007
*/
#include "../Platform.h"
@ -24,10 +26,11 @@
#include "exec.h"
#include "ui.h"
#include "resource.h"
#include "../tchar.h"
#ifdef NSIS_CONFIG_LOG
#if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT)
char g_log_file[1024];
TCHAR g_log_file[1024];
#endif
#endif
@ -50,7 +53,7 @@ NSIS_STRING g_usrvars[1] __attribute__((section (NSIS_VARS_SECTION)));
# endif
#endif
HANDLE NSISCALL myCreateProcess(char *cmd)
HANDLE NSISCALL myCreateProcess(TCHAR *cmd)
{
PROCESS_INFORMATION ProcInfo;
static STARTUPINFO StartUp;
@ -61,25 +64,25 @@ HANDLE NSISCALL myCreateProcess(char *cmd)
return ProcInfo.hProcess;
}
/*BOOL NSISCALL my_SetWindowText(HWND hWnd, const char *val)
/*BOOL NSISCALL my_SetWindowText(HWND hWnd, const TCHAR *val)
{
return SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)val);
}*/
BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const char *val)
BOOL NSISCALL my_SetDialogItemText(HWND dlg, UINT idx, const TCHAR *val)
{
return SetDlgItemText(dlg,idx,val);
// return my_SetWindowText(GetDlgItem(dlg, idx), val);
}
int NSISCALL my_GetDialogItemText(UINT idx, char *val)
int NSISCALL my_GetDialogItemText(UINT idx, TCHAR *val)
{
extern HWND m_curwnd;
return GetDlgItemText(m_curwnd, idx, val, NSIS_MAX_STRLEN);
// return my_GetWindowText(GetDlgItem(m_curwnd, idx), val, NSIS_MAX_STRLEN);
}
int NSISCALL my_MessageBox(const char *text, UINT type) {
int NSISCALL my_MessageBox(const TCHAR *text, UINT type) {
int _type = type & 0x001FFFFF;
static MSGBOXPARAMS mbp = {
sizeof(MSGBOXPARAMS),
@ -112,13 +115,13 @@ int NSISCALL my_MessageBox(const char *text, UINT type) {
return MessageBoxIndirect(&mbp);
}
void NSISCALL myDelete(char *buf, int flags)
void NSISCALL myDelete(TCHAR *buf, int flags)
{
static char lbuf[NSIS_MAX_STRLEN];
static TCHAR lbuf[NSIS_MAX_STRLEN];
HANDLE h;
WIN32_FIND_DATA fd;
char *fn;
TCHAR *fn;
int valid_dir=is_valid_instpath(buf);
if ((flags & DEL_SIMPLE))
@ -134,14 +137,14 @@ void NSISCALL myDelete(char *buf, int flags)
mystrcpy(lbuf,buf);
#ifdef NSIS_SUPPORT_RMDIR
if (flags & DEL_DIR)
mystrcat(lbuf,"\\*.*");
mystrcat(lbuf,_T("\\*.*"));
else
#endif//NSIS_SUPPORT_RMDIR
trimslashtoend(buf);
// only append backslash if the path isn't relative to the working directory [bug #1851273]
if (*buf || *lbuf == '\\')
mystrcat(buf,"\\");
if (*buf || *lbuf == _T('\\'))
mystrcat(buf,_T("\\"));
fn=buf+mystrlen(buf);
@ -150,14 +153,14 @@ void NSISCALL myDelete(char *buf, int flags)
{
do
{
char *fdfn = fd.cFileName;
if (*findchar(fdfn, '?') && *fd.cAlternateFileName)
TCHAR *fdfn = fd.cFileName;
if (*findchar(fdfn, _T('?')) && *fd.cAlternateFileName)
// name contains unicode, use short name
fdfn = fd.cAlternateFileName;
#ifdef NSIS_SUPPORT_RMDIR
if (fdfn[0] == '.' && !fdfn[1]) continue;
if (fdfn[0] == '.' && fdfn[1] == '.' && !fdfn[2]) continue;
if (fdfn[0] == _T('.') && !fdfn[1]) continue;
if (fdfn[0] == _T('.') && fdfn[1] == _T('.') && !fdfn[2]) continue;
#endif//NSIS_SUPPORT_RMDIR
{
mystrcpy(fn,fdfn);
@ -172,21 +175,21 @@ void NSISCALL myDelete(char *buf, int flags)
}
else
{
log_printf2("Delete: DeleteFile(\"%s\")",buf);
log_printf2(_T("Delete: DeleteFile(\"%s\")"),buf);
remove_ro_attr(buf);
if (!DeleteFile(buf))
{
#ifdef NSIS_SUPPORT_MOVEONREBOOT
if (flags & DEL_REBOOT)
{
log_printf2("Delete: DeleteFile on Reboot(\"%s\")",buf);
log_printf2(_T("Delete: DeleteFile on Reboot(\"%s\")"),buf);
update_status_text(LANG_DELETEONREBOOT,buf);
MoveFileOnReboot(buf,NULL);
}
else
#endif//NSIS_SUPPORT_MOVEONREBOOT
{
log_printf2("Delete: DeleteFile failed(\"%s\")",buf);
log_printf2(_T("Delete: DeleteFile failed(\"%s\")"),buf);
g_exec_flags.exec_error++;
}
}
@ -209,27 +212,27 @@ void NSISCALL myDelete(char *buf, int flags)
{
if (!valid_dir)
{
log_printf2("RMDir: RemoveDirectory invalid input(\"%s\")",buf);
log_printf2(_T("RMDir: RemoveDirectory invalid input(\"%s\")"),buf);
g_exec_flags.exec_error++;
}
else if (file_exists(buf))
{
addtrailingslash(buf);
log_printf2("RMDir: RemoveDirectory(\"%s\")",buf);
log_printf2(_T("RMDir: RemoveDirectory(\"%s\")"),buf);
remove_ro_attr(buf);
if (!RemoveDirectory(buf))
{
#ifdef NSIS_SUPPORT_MOVEONREBOOT
if (flags & DEL_REBOOT)
{
log_printf2("RMDir: RemoveDirectory on Reboot(\"%s\")",buf);
log_printf2(_T("RMDir: RemoveDirectory on Reboot(\"%s\")"),buf);
update_status_text(LANG_DELETEONREBOOT,buf);
MoveFileOnReboot(buf,NULL);
}
else
#endif//NSIS_SUPPORT_MOVEONREBOOT
{
log_printf2("RMDir: RemoveDirectory failed(\"%s\")",buf);
log_printf2(_T("RMDir: RemoveDirectory failed(\"%s\")"),buf);
g_exec_flags.exec_error++;
}
}
@ -242,9 +245,9 @@ void NSISCALL myDelete(char *buf, int flags)
#endif//NSIS_SUPPORT_RMDIR
}
char *NSISCALL addtrailingslash(char *str)
TCHAR *NSISCALL addtrailingslash(TCHAR *str)
{
if (lastchar(str)!='\\') mystrcat(str,"\\");
if (lastchar(str)!=_T('\\')) mystrcat(str,_T("\\"));
return str;
}
@ -253,7 +256,7 @@ char *NSISCALL addtrailingslash(char *str)
return *CharPrev(str,str+mystrlen(str));
}*/
char * NSISCALL findchar(char *str, char c)
TCHAR * NSISCALL findchar(TCHAR *str, TCHAR c)
{
while (*str && *str != c)
{
@ -262,12 +265,14 @@ char * NSISCALL findchar(char *str, char c)
return str;
}
char * NSISCALL trimslashtoend(char *buf)
// Separates a full path to the directory portion and file name portion
// and returns the pointer to the filename portion.
TCHAR * NSISCALL trimslashtoend(TCHAR *buf)
{
char *p = buf + mystrlen(buf);
TCHAR *p = buf + mystrlen(buf);
do
{
if (*p == '\\')
if (*p == _T('\\'))
break;
p = CharPrev(buf, p);
} while (p > buf);
@ -277,28 +282,28 @@ char * NSISCALL trimslashtoend(char *buf)
return p + 1;
}
int NSISCALL validpathspec(char *ubuf)
int NSISCALL validpathspec(TCHAR *ubuf)
{
char dl = ubuf[0] | 0x20; // convert alleged drive letter to lower case
return ((*(WORD*)ubuf==CHAR2_TO_WORD('\\','\\')) || (dl >= 'a' && dl <= 'z' && ubuf[1]==':'));
TCHAR dl = ubuf[0] | 0x20; // convert alleged drive letter to lower case
return ((*(WORD*)ubuf==CHAR2_TO_WORD(_T('\\'),_T('\\'))) || (dl >= _T('a') && dl <= _T('z') && ubuf[1]==_T(':')));
}
char * NSISCALL skip_root(char *path)
TCHAR * NSISCALL skip_root(TCHAR *path)
{
char *p = CharNext(path);
char *p2 = CharNext(p);
TCHAR *p = CharNext(path);
TCHAR *p2 = CharNext(p);
if (*path && *(WORD*)p == CHAR2_TO_WORD(':', '\\'))
if (*path && *(WORD*)p == CHAR2_TO_WORD(_T(':'), _T('\\')))
{
return CharNext(p2);
}
else if (*(WORD*)path == CHAR2_TO_WORD('\\','\\'))
else if (*(WORD*)path == CHAR2_TO_WORD(_T('\\'),_T('\\')))
{
// skip host and share name
int x = 2;
while (x--)
{
p2 = findchar(p2, '\\');
p2 = findchar(p2, _T('\\'));
if (!*p2)
return NULL;
p2++; // skip backslash
@ -310,10 +315,10 @@ char * NSISCALL skip_root(char *path)
return NULL;
}
int NSISCALL is_valid_instpath(char *s)
int NSISCALL is_valid_instpath(TCHAR *s)
{
static char tmp[NSIS_MAX_STRLEN];
char *root;
static TCHAR tmp[NSIS_MAX_STRLEN];
TCHAR *root;
mystrcpy(tmp, s);
@ -330,7 +335,7 @@ int NSISCALL is_valid_instpath(char *s)
// not pass as a valid non-root directory.
validate_filename(root);
if ((g_flags & CH_FLAGS_NO_ROOT_DIR) && (!*root || *root == '\\'))
if ((g_flags & CH_FLAGS_NO_ROOT_DIR) && (!*root || *root == _T('\\')))
return 0;
while (mystrlen(tmp) > root - tmp)
@ -352,12 +357,12 @@ int NSISCALL is_valid_instpath(char *s)
return 1;
}
char * NSISCALL mystrstri(char *a, const char *b)
TCHAR * NSISCALL mystrstri(TCHAR *a, const TCHAR *b)
{
int l = mystrlen(b);
while (mystrlen(a) >= l)
{
char c = a[l];
TCHAR c = a[l];
a[l] = 0;
if (!lstrcmpi(a, b))
{
@ -370,6 +375,8 @@ char * NSISCALL mystrstri(char *a, const char *b)
return NULL;
}
// mini_memcpy takes the number of bytes to copy.
void NSISCALL mini_memcpy(void *out, const void *in, int len)
{
char *c_out=(char*)out;
@ -380,14 +387,14 @@ void NSISCALL mini_memcpy(void *out, const void *in, int len)
}
}
void NSISCALL remove_ro_attr(char *file)
void NSISCALL remove_ro_attr(TCHAR *file)
{
int attr = GetFileAttributes(file);
if (attr != INVALID_FILE_ATTRIBUTES)
SetFileAttributes(file,attr&(~FILE_ATTRIBUTE_READONLY));
}
HANDLE NSISCALL myOpenFile(const char *fn, DWORD da, DWORD cd)
HANDLE NSISCALL myOpenFile(const TCHAR *fn, DWORD da, DWORD cd)
{
int attr = GetFileAttributes(fn);
return CreateFile(
@ -401,14 +408,14 @@ HANDLE NSISCALL myOpenFile(const char *fn, DWORD da, DWORD cd)
);
}
char * NSISCALL my_GetTempFileName(char *buf, const char *dir)
TCHAR * NSISCALL my_GetTempFileName(TCHAR *buf, const TCHAR *dir)
{
int n = 100;
while (n--)
{
char prefix[4];
*(LPDWORD)prefix = CHAR4_TO_DWORD('n', 's', 'a', 0);
prefix[2] += (char)(GetTickCount() % 26);
TCHAR prefix[4];
*(LPDWORD)prefix = CHAR4_TO_DWORD(_T('n'), _T('s'), _T('a'), 0);
prefix[2] += (TCHAR)(GetTickCount() % 26);
if (GetTempFileName(dir, prefix, 0, buf))
return buf;
}
@ -420,9 +427,9 @@ char * NSISCALL my_GetTempFileName(char *buf, const char *dir)
void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
{
BOOL fOk = 0;
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) myGetProcAddress(MGA_MoveFileExA);
mfea=(mfea_t) myGetProcAddress(MGA_MoveFileEx);
if (mfea)
{
fOk=mfea(pszExisting, pszNew, MOVEFILE_DELAY_UNTIL_REBOOT|MOVEFILE_REPLACE_EXISTING);
@ -430,20 +437,20 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
if (!fOk)
{
static char szRenameLine[1024];
static char wininit[1024];
static char tmpbuf[1024];
static TCHAR szRenameLine[1024];
static TCHAR wininit[1024];
static TCHAR tmpbuf[1024];
int cchRenameLine;
static const char szRenameSec[] = "[Rename]\r\n";
static const TCHAR szRenameSec[] = _T("[Rename]\r\n");
HANDLE hfile;
DWORD dwFileSize;
DWORD dwBytes;
DWORD dwRenameLinePos;
char *pszWinInit;
TCHAR *pszWinInit;
int spn;
*(DWORD*)tmpbuf = CHAR4_TO_DWORD('N', 'U', 'L', 0);
*(DWORD*)tmpbuf = CHAR4_TO_DWORD(_T('N'), _T('U'), _T('L'), 0);
if (pszNew) {
// create the file if it's not already there to prevent GetShortPathName from failing
@ -456,7 +463,7 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
spn = GetShortPathName(pszExisting,wininit,1024);
if (!spn || spn > 1024)
return;
cchRenameLine = wsprintf(szRenameLine,"%s=%s\r\n",tmpbuf,wininit);
cchRenameLine = wsprintf(szRenameLine,_T("%s=%s\r\n"),tmpbuf,wininit);
GetNSISString(wininit, g_header->str_wininit);
hfile = myOpenFile(wininit, GENERIC_READ | GENERIC_WRITE, OPEN_ALWAYS);
@ -470,7 +477,7 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
{
if (ReadFile(hfile, pszWinInit, dwFileSize, &dwBytes, NULL) && dwFileSize == dwBytes)
{
LPSTR pszRenameSecInFile = mystrstri(pszWinInit, szRenameSec);
LPTSTR pszRenameSecInFile = mystrstri(pszWinInit, szRenameSec);
if (pszRenameSecInFile == NULL)
{
mystrcpy(pszWinInit+dwFileSize, szRenameSec);
@ -479,11 +486,11 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
}
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++;
@ -515,48 +522,52 @@ void NSISCALL MoveFileOnReboot(LPCTSTR pszExisting, LPCTSTR pszNew)
}
#endif
void NSISCALL myRegGetStr(HKEY root, const char *sub, const char *name, char *out, int x64)
// The value of registry->sub->name is stored in out. If failure, then out becomes
// an empty string "".
void NSISCALL myRegGetStr(HKEY root, const TCHAR *sub, const TCHAR *name, TCHAR *out, int x64)
{
HKEY hKey;
*out=0;
if (RegOpenKeyEx(root,sub,0,KEY_READ|(x64?KEY_WOW64_64KEY:0),&hKey) == ERROR_SUCCESS)
{
DWORD l = NSIS_MAX_STRLEN;
DWORD l = NSIS_MAX_STRLEN*sizeof(TCHAR);
DWORD t;
if (RegQueryValueEx(hKey,name,NULL,&t,out,&l ) != ERROR_SUCCESS || (t != REG_SZ && t != REG_EXPAND_SZ)) *out=0;
// Note that RegQueryValueEx returns Unicode strings if _UNICODE is defined for the
// REG_SZ type.
if (RegQueryValueEx(hKey,name,NULL,&t,(LPBYTE)out,&l ) != ERROR_SUCCESS || (t != REG_SZ && t != REG_EXPAND_SZ)) *out=0;
out[NSIS_MAX_STRLEN-1]=0;
RegCloseKey(hKey);
}
}
void NSISCALL myitoa(char *s, int d)
void NSISCALL myitoa(TCHAR *s, int d)
{
static const char c[] = "%d";
static const TCHAR c[] = _T("%d");
wsprintf(s,c,d);
}
int NSISCALL myatoi(char *s)
int NSISCALL myatoi(TCHAR *s)
{
unsigned int v=0;
int sign=1; // sign of positive
char m=10; // base of 10
char t='9'; // cap top of numbers at 9
TCHAR m=10; // base of 10
TCHAR t=_T('9'); // cap top of numbers at 9
if (*s == '-')
if (*s == _T('-'))
{
s++; //skip over -
sign=-1; // sign flip
}
if (*s == '0')
if (*s == _T('0'))
{
s++; // skip over 0
if (s[0] >= '0' && s[0] <= '7')
if (s[0] >= _T('0') && s[0] <= _T('7'))
{
m=8; // base of 8
t='7'; // cap top at 7
t=_T('7'); // cap top at 7
}
if ((s[0] & ~0x20) == 'X')
if ((s[0] & ~0x20) == _T('X'))
{
m=16; // base of 16
s++; // advance over 'x'
@ -566,8 +577,9 @@ int NSISCALL myatoi(char *s)
for (;;)
{
int c=*s++;
if (c >= '0' && c <= t) c-='0';
else if (m==16 && (c & ~0x20) >= 'A' && (c & ~0x20) <= 'F') c = (c & 7) + 9;
if (c >= _T('0') && c <= t) c-=_T('0');
// clever little trick to do both upper and lowercase A-F.
else if (m==16 && (c & ~0x20) >= _T('A') && (c & ~0x20) <= _T('F')) c = (c & 7) + 9;
else break;
v*=m;
v+=c;
@ -578,34 +590,38 @@ int NSISCALL myatoi(char *s)
// Straight copies of selected shell functions. Calling local functions
// requires less code than DLL functions. For the savings to outweigh the cost
// of a new function there should be about a couple of dozen or so calls.
char * NSISCALL mystrcpy(char *out, const char *in)
TCHAR * NSISCALL mystrcpy(TCHAR *out, const TCHAR *in)
{
return lstrcpyn(out, in, NSIS_MAX_STRLEN);
}
int NSISCALL mystrlen(const char *in)
int NSISCALL mystrlen(const TCHAR *in)
{
return lstrlen(in);
}
char * NSISCALL mystrcat(char *out, const char *concat)
TCHAR * NSISCALL mystrcat(TCHAR *out, const TCHAR *concat)
{
return lstrcat(out, concat);
}
char ps_tmpbuf[NSIS_MAX_STRLEN*2];
TCHAR ps_tmpbuf[NSIS_MAX_STRLEN*2];
const char SYSREGKEY[] = "Software\\Microsoft\\Windows\\CurrentVersion";
const char QUICKLAUNCH[] = "\\Microsoft\\Internet Explorer\\Quick Launch";
const TCHAR SYSREGKEY[] = _T("Software\\Microsoft\\Windows\\CurrentVersion");
const TCHAR QUICKLAUNCH[] = _T("\\Microsoft\\Internet Explorer\\Quick Launch");
typedef HRESULT (__stdcall * PFNSHGETFOLDERPATHA)(HWND, int, HANDLE, DWORD, LPSTR);
typedef HRESULT (__stdcall * PFNSHGETFOLDERPATH)(HWND, int, HANDLE, DWORD, LPTSTR);
extern void *g_SHGetFolderPath;
// Based on Dave Laundon's simplified process_string
char * NSISCALL GetNSISString(char *outbuf, int strtab)
// The string actually has a lot of different data encoded into it. This
// function extracts the special data out and puts it into outbuf.
TCHAR * NSISCALL GetNSISString(TCHAR *outbuf, int strtab)
{
char *in = (char*)GetNSISStringNP(GetNSISTab(strtab));
char *out = ps_tmpbuf;
// This looks at the g_block (copied from header->blocks) and
// indexes into the language
TCHAR *in = (TCHAR*)GetNSISStringNP(GetNSISTab(strtab));
TCHAR *out = ps_tmpbuf;
if ((unsigned int) (outbuf - ps_tmpbuf) < sizeof(ps_tmpbuf))
{
out = outbuf;
@ -613,7 +629,7 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
}
while (*in && out - ps_tmpbuf < NSIS_MAX_STRLEN)
{
unsigned char nVarIdx = (unsigned char)*in++;
_TUCHAR nVarIdx = (_TUCHAR)*in++;
int nData;
int fldrs[4];
if (nVarIdx > NS_CODES_START)
@ -623,7 +639,7 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
fldrs[1] = in[0];
fldrs[2] = in[1] | CSIDL_FLAG_CREATE; // all users
fldrs[3] = in[1];
in += 2;
in += sizeof(SHORT)/sizeof(TCHAR);
if (nVarIdx == NS_SHELL_CODE)
{
@ -689,7 +705,7 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
{
if (g_SHGetFolderPath && use_shfolder)
{
PFNSHGETFOLDERPATHA SHGetFolderPathFunc = (PFNSHGETFOLDERPATHA) g_SHGetFolderPath;
PFNSHGETFOLDERPATH SHGetFolderPathFunc = (PFNSHGETFOLDERPATH) g_SHGetFolderPath;
if (!SHGetFolderPathFunc(g_hwnd, fldrs[x], NULL, SHGFP_TYPE_CURRENT, out))
{
break;
@ -751,15 +767,15 @@ char * NSISCALL GetNSISString(char *outbuf, int strtab)
return ps_tmpbuf;
}
void NSISCALL validate_filename(char *in) {
char *nono = "*?|<>/\":";
char *out;
char *out_save;
void NSISCALL validate_filename(TCHAR *in) {
TCHAR *nono = _T("*?|<>/\":");
TCHAR *out;
TCHAR *out_save;
// ignoring spaces is wrong, " C:\blah" is invalid
//while (*in == ' ') in = CharNext(in);
// ignoring spaces is wrong, _T(" C:\blah") is invalid
//while (*in == _T(' ')) in = CharNext(in);
if (in[0] == '\\' && in[1] == '\\' && in[2] == '?' && in[3] == '\\')
if (in[0] == _T('\\') && in[1] == _T('\\') && in[2] == _T('?') && in[3] == _T('\\'))
{
// at least four bytes
in += 4;
@ -772,7 +788,7 @@ void NSISCALL validate_filename(char *in) {
out = out_save = in;
while (*in)
{
if ((unsigned char)*in > 31 && !*findchar(nono, *in))
if ((_TUCHAR)*in > 31 && !*findchar(nono, *in))
{
mini_memcpy(out, in, CharNext(in) - in);
out = CharNext(out);
@ -783,7 +799,7 @@ void NSISCALL validate_filename(char *in) {
do
{
out = CharPrev(out_save, out);
if (*out == ' ' || *out == '\\')
if (*out == _T(' ') || *out == _T('\\'))
*out = 0;
else
break;
@ -792,7 +808,7 @@ void NSISCALL validate_filename(char *in) {
#ifdef NSIS_CONFIG_LOG
int log_dolog;
char log_text[2048]; // 1024 for each wsprintf
TCHAR log_text[2048]; // 1024 for each wsprintf
#if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT)
void NSISCALL log_write(int close)
@ -818,36 +834,36 @@ void NSISCALL log_write(int close)
if (fp!=INVALID_HANDLE_VALUE)
{
DWORD d;
mystrcat(log_text,"\r\n");
WriteFile(fp,log_text,mystrlen(log_text),&d,NULL);
mystrcat(log_text,_T("\r\n"));
WriteFile(fp,log_text,mystrlen(log_text)*sizeof(TCHAR),&d,NULL);
}
}
}
#endif//!NSIS_CONFIG_LOG_ODS && !NSIS_CONFIG_LOG_STDOUT
const char * _RegKeyHandleToName(HKEY hKey)
const TCHAR * _RegKeyHandleToName(HKEY hKey)
{
if (hKey == HKEY_CLASSES_ROOT)
return "HKEY_CLASSES_ROOT";
return _T("HKEY_CLASSES_ROOT");
else if (hKey == HKEY_CURRENT_USER)
return "HKEY_CURRENT_USER";
return _T("HKEY_CURRENT_USER");
else if (hKey == HKEY_LOCAL_MACHINE)
return "HKEY_LOCAL_MACHINE";
return _T("HKEY_LOCAL_MACHINE");
else if (hKey == HKEY_USERS)
return "HKEY_USERS";
return _T("HKEY_USERS");
else if (hKey == HKEY_PERFORMANCE_DATA)
return "HKEY_PERFORMANCE_DATA";
return _T("HKEY_PERFORMANCE_DATA");
else if (hKey == HKEY_CURRENT_CONFIG)
return "HKEY_CURRENT_CONFIG";
return _T("HKEY_CURRENT_CONFIG");
else if (hKey == HKEY_DYN_DATA)
return "HKEY_DYN_DATA";
return _T("HKEY_DYN_DATA");
else
return "invalid registry key";
return _T("invalid registry key");
}
void _LogData2Hex(char *buf, size_t buflen, unsigned char *data, size_t datalen)
void _LogData2Hex(TCHAR *buf, size_t buflen, BYTE *data, size_t datalen)
{
char *p = buf;
TCHAR *p = buf;
size_t i;
@ -864,31 +880,31 @@ void _LogData2Hex(char *buf, size_t buflen, unsigned char *data, size_t datalen)
for (i = 0; i < bufbytes; i++)
{
wsprintf(p, "%02x%c", data[i], (i == bufbytes - 1) ? '\0' : ' ');
wsprintf(p, _T("%02x%c"), data[i], (i == bufbytes - 1) ? _T('\0') : _T(' '));
p += 3;
}
if (dots)
mystrcat(buf, "...");
mystrcat(buf, _T("..."));
}
#ifdef NSIS_CONFIG_LOG_TIMESTAMP
void log_timestamp(char *buf)
void log_timestamp(TCHAR *buf)
{
SYSTEMTIME st;
GetLocalTime(&st);
wsprintf(buf,"[%04hu/%02hu/%02hu %02hu:%02hu:%02hu] ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
wsprintf(buf,_T("[%04hu/%02hu/%02hu %02hu:%02hu:%02hu] "), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
}
#else
# define log_timestamp(x)
#endif//NSIS_CONFIG_LOG_TIMESTAMP
void log_printf(char *format, ...)
void log_printf(TCHAR *format, ...)
{
va_list val;
va_start(val,format);
log_text[0] = '\0';
log_text[0] = _T('\0');
log_timestamp(log_text);
wvsprintf(log_text+mystrlen(log_text),format,val);
@ -902,7 +918,7 @@ void log_printf(char *format, ...)
{
DWORD dwBytes;
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), log_text, lstrlen(log_text), &dwBytes, NULL);
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), "\n", 1, &dwBytes, NULL);
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE), _T("\n"), 1, &dwBytes, NULL);
}
#endif
#if !defined(NSIS_CONFIG_LOG_ODS) && !defined(NSIS_CONFIG_LOG_STDOUT)
@ -911,7 +927,8 @@ void log_printf(char *format, ...)
}
#endif//NSIS_CONFIG_LOG
WIN32_FIND_DATA * NSISCALL file_exists(char *buf)
// Jim Park: This function is non-reentrant because of the static.
WIN32_FIND_DATA * NSISCALL file_exists(TCHAR *buf)
{
HANDLE h;
static WIN32_FIND_DATA fd;
@ -924,6 +941,8 @@ WIN32_FIND_DATA * NSISCALL file_exists(char *buf)
return NULL;
}
// Jim Park: Keep these as chars since there's only ANSI version of
// GetProcAddress.
struct MGA_FUNC
{
const char *dll;
@ -942,12 +961,20 @@ struct MGA_FUNC MGA_FUNCS[] = {
{"SHFOLDER", "SHGetFolderPathA"}
};
/**
* Given a function enum, it will load the appropriate DLL and get the
* process address of the function and return the pointer. It's up to
* the caller to know how to call that function, however.
*
* @param func Enum value that indexes the MGA_FUNCS array.
* @return Pointer to the function identified by the enum value.
*/
void * NSISCALL myGetProcAddress(const enum myGetProcAddressFunctions func)
{
const char *dll = MGA_FUNCS[func].dll;
HMODULE hModule = GetModuleHandle(dll);
HMODULE hModule = GetModuleHandleA(dll);
if (!hModule)
hModule = LoadLibrary(dll);
hModule = LoadLibraryA(dll);
if (!hModule)
return NULL;