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:
parent
4e48722b63
commit
752d7d239a
209 changed files with 9698 additions and 7658 deletions
|
@ -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;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue