diff --git a/Contrib/Makensisw/makensisw.cpp b/Contrib/Makensisw/makensisw.cpp index 45f10de4..16e25c68 100644 --- a/Contrib/Makensisw/makensisw.cpp +++ b/Contrib/Makensisw/makensisw.cpp @@ -43,7 +43,6 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmd my_memset(&g_resize,0,sizeof(NRESIZEDATA)); my_memset(&g_find,0,sizeof(NFINDREPLACE)); g_sdata.hInstance=GetModuleHandle(0); - g_sdata.script_alloced=false; g_sdata.symbols = NULL; g_sdata.sigint_event = CreateEvent(NULL, FALSE, FALSE, "makensis win32 signint event"); RestoreSymbols(); @@ -70,34 +69,98 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, char *cmdParam, int cmd } } } - if (g_sdata.script_alloced) GlobalFree(g_sdata.script); + if (g_sdata.script) GlobalFree(g_sdata.script); if (g_sdata.sigint_event) CloseHandle(g_sdata.sigint_event); FinalizeUpdate(); ExitProcess(msg.wParam); return msg.wParam; } +void SetScript(const char *script) +{ + if (g_sdata.script) + { + GlobalFree(g_sdata.script); + } + + g_sdata.script = (char *) GlobalAlloc(GPTR, lstrlen(script) + 1); + lstrcpy(g_sdata.script, script); +} + +void AddScriptCmdArgs(const char *arg) +{ + g_sdata.script_cmd_args = (char *) GlobalReAlloc(g_sdata.script_cmd_args, + GlobalSize(g_sdata.script_cmd_args) + 2 /* quotes */ + 1 /* space */, + 0); + + lstrcat(g_sdata.script_cmd_args, " \""); + lstrcat(g_sdata.script_cmd_args, arg); + lstrcat(g_sdata.script_cmd_args, "\""); +} + void ResetInputScript() { if(g_sdata.input_script) { - g_sdata.script_alloced = true; - g_sdata.script = (char *)GlobalAlloc(GPTR, (lstrlen(g_sdata.input_script)+3)*sizeof(char)); - wsprintf(g_sdata.script,"\"%s\"",g_sdata.input_script); + SetScript(g_sdata.input_script); } } +void ProcessCommandLine() +{ + int argc; + char **argv; + int i, j; + int argSpaceSize; + + argSpaceSize = SetArgv((char *)GetCommandLine(), &argc, &argv); + if (argc > 1) { + for (i = 1; i < argc; i++) + { + if (!lstrncmpi(argv[i], "/XSetCompressor ", lstrlen("/XSetCompressor "))) + { + char *p = argv[i] + lstrlen("/XSetCompressor "); + if(!lstrncmpi(p,"/FINAL ", lstrlen("/FINAL "))) + { + p += lstrlen("/FINAL "); + } + + while (*p == ' ') p++; + + for (j = (int) COMPRESSOR_SCRIPT + 1; j < (int) COMPRESSOR_BEST; j++) + { + if (!lstrcmpi(p, compressor_names[j])) + { + SetCompressor((NCOMPRESSOR) j); + } + } + } + else if (!lstrcmpi(argv[i], "/ChooseCompressor")) + { + g_sdata.userSelectCompressor = TRUE; + } + else if (argv[i][0] == '-' || argv[i][0] == '/') + { + AddScriptCmdArgs(argv[i]); + } + else + { + SetScript(argv[i]); + } + } + + PushMRUFile(g_sdata.script); + } + + if (argSpaceSize) + GlobalFree(argv); +} + BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { static HINSTANCE hRichEditDLL = 0; if (!hRichEditDLL) hRichEditDLL= LoadLibrary("RichEd32.dll"); switch (msg) { case WM_INITDIALOG: { - int argc; - char **argv; - int i, j; - int argSpaceSize; - bool chooseCompressor = false; - g_sdata.hwnd=hwndDlg; HICON hIcon = LoadIcon(g_sdata.hInstance,MAKEINTRESOURCE(IDI_ICON)); SetClassLong(hwndDlg,GCL_HICON,(long)hIcon); @@ -118,56 +181,22 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { RestoreWindowPos(g_sdata.hwnd); RestoreCompressor(); g_sdata.compressor = COMPRESSOR_NONE_SELECTED; - - argSpaceSize = SetArgv((char *)GetCommandLine(), &argc, &argv); - if(argc > 1) { - int n; - - g_sdata.script_alloced = true; - g_sdata.script = (char *) GlobalAlloc(GPTR,argSpaceSize+2*(argc-1)*sizeof(char)+1); - lstrcpy(g_sdata.script,""); - for(i=1; i 0) { - g_sdata.script[n-1] = '\0'; - } - PushMRUFile(argv[argc-1]); - } - if (argSpaceSize) - GlobalFree(argv); + g_sdata.script_cmd_args = (char *) GlobalAlloc(GPTR, 1); + g_sdata.userSelectCompressor = FALSE; + + ProcessCommandLine(); if(g_sdata.compressor == COMPRESSOR_NONE_SELECTED) { SetCompressor(g_sdata.default_compressor); } - if(chooseCompressor) { + + if(g_sdata.userSelectCompressor) { if (DialogBox(g_sdata.hInstance,MAKEINTRESOURCE(DLG_COMPRESSOR),g_sdata.hwnd,(DLGPROC)CompressorProc)) { EnableItems(g_sdata.hwnd); return TRUE; } } + CompileNSISScript(); return TRUE; } @@ -211,9 +240,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { if (num==1) { DragQueryFile((HDROP)wParam,0,szTmp,MAX_PATH); if (lstrlen(szTmp)>0) { - g_sdata.script_alloced = true; - g_sdata.script = (char *)GlobalAlloc(GPTR,sizeof(szTmp)+7); - wsprintf(g_sdata.script,"\"%s\"",szTmp); + SetScript(szTmp); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); @@ -500,8 +527,7 @@ BOOL CALLBACK DialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { l.Flags = OFN_HIDEREADONLY|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST; lstrcpy(buf,""); if (GetOpenFileName(&l)) { - g_sdata.script = (char *)GlobalAlloc(GPTR,lstrlen(buf)+3); - wsprintf(g_sdata.script,"\"%s\"",buf); + SetScript(buf); PushMRUFile(g_sdata.script); ResetObjects(); CompileNSISScript(); diff --git a/Contrib/Makensisw/makensisw.h b/Contrib/Makensisw/makensisw.h index 7efcfb96..147e0390 100644 --- a/Contrib/Makensisw/makensisw.h +++ b/Contrib/Makensisw/makensisw.h @@ -163,14 +163,15 @@ void RestoreMRUList(); void SaveMRUList(); typedef struct NSISScriptData { - bool script_alloced; char *script; + char *script_cmd_args; char *output_exe; char *input_script; char *branding; char *brandingv; char **symbols; int retcode; + BOOL userSelectCompressor; DWORD logLength; DWORD warnings; BOOL appended; diff --git a/Contrib/Makensisw/utils.cpp b/Contrib/Makensisw/utils.cpp index 268dde48..b419118e 100644 --- a/Contrib/Makensisw/utils.cpp +++ b/Contrib/Makensisw/utils.cpp @@ -33,9 +33,10 @@ char g_mru_list[MRU_LIST_SIZE][MAX_PATH] = { "", "", "", "", "" }; extern NSCRIPTDATA g_sdata; extern char *compressor_names[]; -int SetArgv(char *cmdLine, int *argc, char ***argv) +int SetArgv(const char *cmdLine, int *argc, char ***argv) { - char *p, *arg, *argSpace; + const char *p; + char *arg, *argSpace; int size, argSpaceSize, inquote, copy, slashes; size = 2; @@ -280,10 +281,9 @@ void CompileNSISScript() { } s = (char *)GlobalAlloc(GPTR, lstrlen(g_sdata.script)+lstrlen(symbols)+lstrlen(compressor)+sizeof(EXENAME)+sizeof(" /NOTIFYHWND ")+23); - wsprintf(s,"%s %s%s /NOTIFYHWND %d -- %s",EXENAME,compressor,symbols,g_sdata.hwnd,g_sdata.script); + wsprintf(s,"%s %s%s /NOTIFYHWND %d %s -- \"%s\"",EXENAME,compressor,symbols,g_sdata.hwnd,g_sdata.script_cmd_args,g_sdata.script); GlobalFree(symbols); - if (g_sdata.script_alloced) GlobalFree(g_sdata.script); - g_sdata.script_alloced = true; + if (g_sdata.script) GlobalFree(g_sdata.script); g_sdata.script = s; g_sdata.appended = TRUE; } @@ -701,7 +701,6 @@ BOOL IsValidFile(char *fname) void PushMRUFile(char* fname) { int i; - char buf[MAX_PATH+1]; DWORD rv; char* file_part; char full_file_name[MAX_PATH+1]; @@ -710,16 +709,8 @@ void PushMRUFile(char* fname) return; } - if(fname[0] == '"') { - fname++; - } - - lstrcpy(buf,fname); - if(buf[lstrlen(buf)-1] == '"') { - buf[lstrlen(buf)-1] = '\0'; - } my_memset(full_file_name,0,sizeof(full_file_name)); - rv = GetFullPathName(buf,sizeof(full_file_name),full_file_name,&file_part); + rv = GetFullPathName(fname,sizeof(full_file_name),full_file_name,&file_part); if (rv == 0) { return; } diff --git a/Contrib/Makensisw/utils.h b/Contrib/Makensisw/utils.h index 1428e63e..8e16f54a 100644 --- a/Contrib/Makensisw/utils.h +++ b/Contrib/Makensisw/utils.h @@ -28,7 +28,7 @@ #define MRU_LIST_SIZE 5 #define MRU_DISPLAY_LENGTH 40 -int SetArgv(char *cmdLine, int *argc, char ***argv); +int SetArgv(const char *cmdLine, int *argc, char ***argv); void SetTitle(HWND hwnd,char *substr); void SetBranding(HWND hwnd); void CopyToClipboard(HWND hwnd);