From 36bd61b1deaf031a1fbd4c294e7d61bab3b46f85 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Wed, 25 Mar 2009 00:21:25 +0200 Subject: [PATCH] imported winuaesrc1600b18b.zip --- audio.c | 7 +- cfgfile.c | 11 ++- main.c | 36 ++++++++-- od-win32/debug_win32.c | 20 +++--- od-win32/fsdb_win32.c | 6 +- od-win32/registry.c | 4 +- od-win32/win32.c | 131 +++++++++++++++++++++++++---------- od-win32/win32.h | 3 +- od-win32/win32gui.c | 6 +- od-win32/winuaechangelog.txt | 15 ++++ 10 files changed, 177 insertions(+), 62 deletions(-) diff --git a/audio.c b/audio.c index 2bc8f731..9309066c 100644 --- a/audio.c +++ b/audio.c @@ -1025,7 +1025,7 @@ static void audio_event_reset (void) next_sample_evtime = scaled_sample_evtime; for (i = 0; i < 4; i++) { struct audio_channel_data *cdp = audio_channel + i; - zerostate(cdp); + zerostate (cdp); } schedule_audio (); events_schedule (); @@ -1037,8 +1037,9 @@ static void audio_deactivate (void) return; gui_data.sndbuf_status = 3; gui_data.sndbuf = 0; - clear_sound_buffers(); - audio_event_reset(); + reset_sound (); + clear_sound_buffers (); + audio_event_reset (); } int audio_activate (void) diff --git a/cfgfile.c b/cfgfile.c index d1ce40f0..ecda35ad 100644 --- a/cfgfile.c +++ b/cfgfile.c @@ -1897,7 +1897,6 @@ static int cfgfile_separate_linea (char *line, TCHAR *line1b, TCHAR *line2b) } else { au_copy (line2b, MAX_DPATH, line2); } - return 1; } @@ -1927,6 +1926,16 @@ static int cfgfile_separate_line (TCHAR *line, TCHAR *line1b, TCHAR *line2b) line[--i] = '\0'; line += _tcsspn (line, L"\t \r\n"); _tcscpy (line1b, line); + + if (line2b[0] == '"' || line2b[0] == '\"') { + TCHAR c = line2b[0]; + int i = 0; + memmove (line2b, line2b + 1, (_tcslen (line2b) + 1) * sizeof (TCHAR)); + while (line2b[i] != 0 && line2b[i] != c) + i++; + line2b[i] = 0; + } + if (isutf8ext (line1b)) return 0; return 1; diff --git a/main.c b/main.c index 0d68a8d5..448fb731 100644 --- a/main.c +++ b/main.c @@ -433,7 +433,9 @@ static void parse_cmdline_2 (int argc, TCHAR **argv) cfgfile_addcfgparam (0); for (i = 1; i < argc; i++) { - if (_tcscmp (argv[i], L"-cfgparam") == 0) { + if (_tcsncmp (argv[i], L"-cfgparam=", 10) == 0) { + cfgfile_addcfgparam (argv[i] + 10); + } else if (_tcscmp (argv[i], L"-cfgparam") == 0) { if (i + 1 == argc) write_log (L"Missing argument for '-cfgparam' option.\n"); else @@ -463,22 +465,48 @@ static void parse_diskswapper (TCHAR *s) free (tmp); } +static TCHAR *parsetext (const TCHAR *s) +{ + if (*s == '"' || *s == '\'') { + TCHAR *d; + TCHAR c = *s++; + int i; + d = my_strdup (s); + for (i = 0; i < _tcslen (d); i++) { + if (d[i] == c) { + d[i] = 0; + break; + } + } + return d; + } else { + return my_strdup (s); + } +} + static void parse_cmdline (int argc, TCHAR **argv) { int i; for (i = 1; i < argc; i++) { if (!_tcsncmp (argv[i], L"-diskswapper=", 13)) { - parse_diskswapper (argv[i] + 13); + TCHAR *txt = parsetext (argv[i] + 13); + parse_diskswapper (txt); + xfree (txt); } else if (_tcscmp (argv[i], L"-cfgparam") == 0) { if (i + 1 < argc) i++; } else if (_tcsncmp (argv[i], L"-config=", 8) == 0) { + TCHAR *txt = parsetext (argv[i] + 8); currprefs.mountitems = 0; - target_cfgfile_load (&currprefs, argv[i] + 8, -1, 1); + target_cfgfile_load (&currprefs, txt, -1, 1); + xfree (txt); } else if (_tcsncmp (argv[i], L"-statefile=", 11) == 0) { + TCHAR *txt = parsetext (argv[i] + 11); + write_log (L"%s\n", txt); savestate_state = STATE_DORESTORE; - _tcscpy (savestate_fname, argv[i] + 11); + _tcscpy (savestate_fname, txt); + xfree (txt); } else if (_tcscmp (argv[i], L"-f") == 0) { /* Check for new-style "-f xxx" argument, where xxx is config-file */ if (i + 1 == argc) { diff --git a/od-win32/debug_win32.c b/od-win32/debug_win32.c index 6f9e9181..5420f47b 100644 --- a/od-win32/debug_win32.c +++ b/od-win32/debug_win32.c @@ -42,8 +42,8 @@ static HWND hedit = 0; extern int consoleopen; BOOL debuggerinitializing = FALSE; -extern uae_u32 get_fpsr(); -extern void set_fpsr(uae_u32 x); +extern uae_u32 get_fpsr (void); +extern void set_fpsr (uae_u32 x); static TCHAR linebreak[] = {'\r', '\n', '\0'}; @@ -70,11 +70,11 @@ static int histcount; struct debuggerpage { HWND ctrl[MAXPAGECONTROLS]; uae_u32 memaddr; - uae_u32 dasmaddr; + uae_u32 dasmaddr; TCHAR addrinput[9]; - int selection; + int selection; int init; - int autoset; + int autoset; }; static struct debuggerpage dbgpage[MAXPAGES]; static int currpage, pages; @@ -179,20 +179,20 @@ static void AddToHistory(const TCHAR *command) int GetInput (TCHAR *out, int maxlen) { HWND hInput; - int TCHARs; + int chars; if (!hDbgWnd) return 0; hInput = GetDlgItem(hDbgWnd, IDC_DBG_INPUT); - TCHARs = GetWindowText(hInput, out, maxlen); - if (TCHARs == 0) + chars = GetWindowText(hInput, out, maxlen); + if (chars == 0) return 0; WriteOutput(linebreak + 1, 2); WriteOutput(out, _tcslen(out)); WriteOutput(linebreak + 1, 2); AddToHistory(out); SetWindowText(hInput, L""); - return TCHARs; + return chars; } static int CheckLineLimit(HWND hWnd, const TCHAR *out) @@ -807,7 +807,7 @@ static LRESULT CALLBACK MemInputProc (HWND hWnd, UINT message, WPARAM wParam, LP LPTSTR lptstr; TCHAR allowed[] = L"1234567890abcdefABCDEF"; int ok = 1; - TCHAR addrstr[11]; + TCHAR addrstr[12]; uae_u32 addr; WNDPROC oldproc; diff --git a/od-win32/fsdb_win32.c b/od-win32/fsdb_win32.c index 7ef69d06..71399ba0 100644 --- a/od-win32/fsdb_win32.c +++ b/od-win32/fsdb_win32.c @@ -884,7 +884,11 @@ int dos_errno (void) return ERROR_SEEK_ERROR; default: - gui_message (L"Unimplemented error %d\nContact author!", e); + { + uae_u8 *p = 0; + *p = 0; + gui_message (L"Unimplemented error %d\nContact author!", e); + } return ERROR_NOT_IMPLEMENTED; } } diff --git a/od-win32/registry.c b/od-win32/registry.c index 826c787f..1e531b49 100644 --- a/od-win32/registry.c +++ b/od-win32/registry.c @@ -369,14 +369,14 @@ int reginitializeinit (const TCHAR *ppath) if (!ppath) { int ok = 0; TCHAR *posn; - _tcscpy (path, pgmptr); + _tcscpy (path, _wpgmptr); if (_tcslen (path) > 4 && !_tcsicmp (path + _tcslen (path) - 4, L".exe")) { _tcscpy (path + _tcslen (path) - 3, L"ini"); if (GetFileAttributes (path) != INVALID_FILE_ATTRIBUTES) ok = 1; } if (!ok) { - _tcscpy (path, pgmptr); + _tcscpy (path, _wpgmptr); if((posn = _tcsrchr (path, '\\'))) posn[1] = 0; _tcscat (path, L"winuae.ini"); diff --git a/od-win32/win32.c b/od-win32/win32.c index 1f7c8d6a..15152cc2 100644 --- a/od-win32/win32.c +++ b/od-win32/win32.c @@ -149,7 +149,6 @@ static CRITICAL_SECTION cs_time; TCHAR start_path_data[MAX_DPATH]; TCHAR start_path_exe[MAX_DPATH]; -TCHAR *pgmptr; TCHAR start_path_af[MAX_DPATH]; /* OLD AF */ TCHAR start_path_new1[MAX_DPATH]; /* AF2005 */ TCHAR start_path_new2[MAX_DPATH]; /* AMIGAFOREVERDATA */ @@ -1814,10 +1813,13 @@ static void WIN32_InitLang (void) pritransla (); } - /* try to load COMDLG32 and DDRAW, initialize csDraw */ +typedef HRESULT (CALLBACK* SETCURRENTPROCESSEXPLICITAPPUSERMODEIDD)(PCWSTR); + +/* try to load COMDLG32 and DDRAW, initialize csDraw */ static int WIN32_InitLibraries (void) { LARGE_INTEGER freq; + SETCURRENTPROCESSEXPLICITAPPUSERMODEIDD pSetCurrentProcessExplicitAppUserModelID; CoInitialize (0); /* Determine our processor speed and capabilities */ @@ -1835,6 +1837,10 @@ static int WIN32_InitLibraries (void) pre_gui_message (L"MMTimer second initialization failed, exiting.."); return 0; } + pSetCurrentProcessExplicitAppUserModelID = (SETCURRENTPROCESSEXPLICITAPPUSERMODEIDD)GetProcAddress ( + GetModuleHandle (L"shell32.dll"), "SetCurrentProcessExplicitAppUserModelID"); + if (pSetCurrentProcessExplicitAppUserModelID) + pSetCurrentProcessExplicitAppUserModelID (L"Arabuusimiehet.WinUAE"); hRichEdit = LoadLibrary (L"RICHED32.DLL"); return 1; @@ -3201,7 +3207,7 @@ static void getstartpaths (void) if (!_tcscmp (prevpath, L"AMIGAFOREVERDATA")) path_type = PATH_TYPE_AMIGAFOREVERDATA; - _tcscpy (start_path_exe, pgmptr); + _tcscpy (start_path_exe, _wpgmptr); if((posn = _tcsrchr (start_path_exe, '\\'))) posn[1] = 0; @@ -3354,7 +3360,7 @@ static int getval (const TCHAR *s) return v; } -static void makeverstr(TCHAR *s) +static void makeverstr (TCHAR *s) { if (_tcslen (WINUAEBETA) > 0) { _stprintf (BetaStr, L" (%sBeta %s, %d.%02d.%02d)", WINUAEPUBLICBETA > 0 ? L"Public " : L"", WINUAEBETA, @@ -3362,7 +3368,7 @@ static void makeverstr(TCHAR *s) _stprintf (s, L"WinUAE %d.%d.%d%s%s", UAEMAJOR, UAEMINOR, UAESUBREV, WINUAEREV, BetaStr); } else { - _stprintf(s, L"WinUAE %d.%d.%d%s (%d.%02d.%02d)", + _stprintf (s, L"WinUAE %d.%d.%d%s (%d.%02d.%02d)", UAEMAJOR, UAEMINOR, UAESUBREV, WINUAEREV, GETBDY(WINUAEDATE), GETBDM(WINUAEDATE), GETBDD(WINUAEDATE)); } if (_tcslen (WINUAEEXTRA) > 0) { @@ -3552,21 +3558,19 @@ static int parseargs (const TCHAR *arg, const TCHAR *np) return 0; } - -static TCHAR **parseargstring (TCHAR *s, TCHAR **xargv) +static TCHAR **parseargstring (TCHAR *s) { - int cnt, i, xargc; + int cnt; TCHAR **args; if (_tcslen (s) == 0) return NULL; - args = xcalloc (sizeof (TCHAR*), 32 + 1); cnt = 0; for (;;) { TCHAR *p = s; int skip = 0; - while (*p && isspace (*p)) + while (*p && _istspace (*p)) p++; if (*p == 0) break; @@ -3577,13 +3581,13 @@ static TCHAR **parseargstring (TCHAR *s, TCHAR **xargv) p++; skip = 1; } else { - while (*p && !isspace (*p)) + while (*p && !_istspace (*p)) p++; } - args[cnt] = xcalloc (p - s + 1, 1); - memcpy (args[cnt++], s, p - s); + args[cnt] = xcalloc (p - s + 1, sizeof (TCHAR)); + memcpy (args[cnt++], s, (p - s) * sizeof (TCHAR)); p += skip; - while (*p && isspace (*p)) + while (*p && _istspace (*p)) p++; if (*p == 0) break; @@ -3591,6 +3595,16 @@ static TCHAR **parseargstring (TCHAR *s, TCHAR **xargv) break; s = p; } + return args; +} + +static TCHAR **parseargstrings (TCHAR *s, TCHAR **xargv) +{ + int cnt, i, xargc; + TCHAR **args; + + args = parseargstring (s); + for (cnt = 0; args[cnt]; cnt++); for (xargc = 0; xargv[xargc]; xargc++); for (i = 0; i < cnt; i++) { TCHAR *arg = args[i]; @@ -3605,17 +3619,63 @@ static TCHAR **parseargstring (TCHAR *s, TCHAR **xargv) } -static int process_arg (TCHAR **xargv) +static int process_arg (TCHAR *cmdline, TCHAR **xargv, TCHAR ***xargv3) { - int i, argc, xargc; - char **argv; + int i, xargc; + TCHAR **argv; + TCHAR tmp[MAX_DPATH]; + int fd, ok, added; + argv = parseargstring (cmdline); + if (argv == NULL) + return 0; + added = 0; xargc = 0; - argc = __argc; argv = __argv; - xargv[xargc++] = my_strdup_ansi (argv[0]); - for (i = 1; i < argc; i++) { - TCHAR *arg = au (argv[i]); - TCHAR *next = i + 1 < argc ? au (argv[i + 1]) : NULL; + xargv[xargc++] = my_strdup (_wpgmptr); + fd = 0; + for (i = 0; argv[i]; i++) { + TCHAR *f = argv[i]; + ok = 0; + if (f[0] != '-' && f[0] != '/') { + int type = -1; + struct zfile *z = zfile_fopen (f, L"rb"); + if (z) { + type = zfile_gettype (z); + zfile_fclose (z); + } + tmp[0] = 0; + switch (type) + { + case ZFILE_CONFIGURATION: + _stprintf (tmp, L"-config=%s", f); + break; + case ZFILE_STATEFILE: + _stprintf (tmp, L"-statefile=%s", f); + break; + case ZFILE_DISKIMAGE: + if (fd < 4) + _stprintf (tmp, L"-cfgparam=floppy%d=%s", fd++, f); + break; + } + if (tmp[0]) { + xfree (argv[i]); + argv[i] = my_strdup (tmp); + ok = 1; + added = 1; + } + } + if (!ok) + break; + } + if (added) { + for (i = 0; argv[i]; i++); + argv[i++] = my_strdup (L"-s"); + argv[i++] = my_strdup (L"use_gui=no"); + argv[i] = NULL; + } + for (i = 0; argv[i]; i++) { + TCHAR *arg = argv[i]; + TCHAR *next = argv[i + 1]; int v = parseargs (arg, next); if (!v) xargv[xargc++] = my_strdup (arg); @@ -3626,6 +3686,7 @@ static int process_arg (TCHAR **xargv) argv = 0; argv[0] = 0; #endif + *xargv3 = argv; return xargc; } @@ -3643,7 +3704,7 @@ static TCHAR **WIN32_InitRegistry (TCHAR **argv) KEY_WRITE | KEY_READ, NULL, &hWinUAEKey, &disposition); } if (regquerystr (NULL, L"Commandline", tmp, &size)) - return parseargstring (tmp, argv); + return parseargstrings (tmp, argv); return NULL; } @@ -3651,7 +3712,7 @@ static TCHAR **WIN32_InitRegistry (TCHAR **argv) static int PASCAL WinMain2 (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { HANDLE hMutex; - TCHAR **argv = NULL, **argv2 = NULL; + TCHAR **argv = NULL, **argv2 = NULL, **argv3; int argc, i; #ifdef _DEBUG @@ -3679,21 +3740,21 @@ static int PASCAL WinMain2 (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR AVIOutput_Initialize (); #endif - argv = xcalloc (sizeof (TCHAR*), __argc); - argc = process_arg (argv); + argv = xcalloc (sizeof (TCHAR*), 32); + argc = process_arg (lpCmdLine, argv, &argv3); argv2 = WIN32_InitRegistry (argv); getstartpaths (); makeverstr (VersionStr); logging_init (); -#if 0 - if (__argc > 1) { + if (_tcslen (lpCmdLine) > 0) + write_log (L"'%s'\n", lpCmdLine); + if (argv3[0]) { write_log (L"params:\n"); - for (i = 1; i < __argc; i++) - write_log (L"%d: '%s'\n", i, __argv[i]); + for (i = 0; argv3[i]; i++) + write_log (L"%d: '%s'\n", i + 1, argv3[i]); } -#endif if (argv2) { write_log (L"extra params:\n"); for (i = 0; argv2[i]; i++) @@ -4222,7 +4283,7 @@ void target_reset (void) typedef BOOL (CALLBACK* SETPROCESSDPIAWARE)(void); typedef BOOL (CALLBACK* CHANGEWINDOWMESSAGEFILTER)(UINT, DWORD); -int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) +int PASCAL wWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) { SETPROCESSDPIAWARE pSetProcessDPIAware; DWORD_PTR sys_aff; @@ -4232,7 +4293,7 @@ int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin InitCommonControls (); original_affinity = 1; - GetProcessAffinityMask (GetCurrentProcess(), &original_affinity, &sys_aff); + GetProcessAffinityMask (GetCurrentProcess (), &original_affinity, &sys_aff); thread = GetCurrentThread (); //original_affinity = SetThreadAffinityMask(thread, 1); @@ -4251,10 +4312,8 @@ int PASCAL WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLin if (pSetProcessDPIAware) pSetProcessDPIAware (); - pgmptr = au (_pgmptr); - __try { - WinMain2 (hInstance, hPrevInstance, GetCommandLineW (), nCmdShow); + WinMain2 (hInstance, hPrevInstance, lpCmdLine, nCmdShow); } __except(WIN32_ExceptionFilter (GetExceptionInformation (), GetExceptionCode ())) { } //SetThreadAffinityMask(thread, original_affinity); diff --git a/od-win32/win32.h b/od-win32/win32.h index 35259ea6..403c0157 100644 --- a/od-win32/win32.h +++ b/od-win32/win32.h @@ -18,7 +18,7 @@ #define WINUAEPUBLICBETA 1 #define WINUAEBETA L"18" -#define WINUAEDATE MAKEBD(2009, 3, 22) +#define WINUAEDATE MAKEBD(2009, 3, 25) #define WINUAEEXTRA L"" #define WINUAEREV L"" @@ -85,7 +85,6 @@ extern int win_x_diff, win_y_diff; extern int window_extra_width, window_extra_height; extern int af_path_2005, af_path_old; extern TCHAR start_path_af[MAX_DPATH], start_path_new1[MAX_DPATH], start_path_new2[MAX_DPATH]; -extern TCHAR *pgmptr; #define PATH_TYPE_WINUAE 0 #define PATH_TYPE_NEWWINUAE 1 #define PATH_TYPE_OLDAF 2 diff --git a/od-win32/win32gui.c b/od-win32/win32gui.c index 475b1f5b..4fb91a94 100644 --- a/od-win32/win32gui.c +++ b/od-win32/win32gui.c @@ -1587,7 +1587,7 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs WIN32GUI_LoadUIString (IDS_CHOOSEBLANK, szTitle, MAX_DPATH); WIN32GUI_LoadUIString (IDS_ADF, szFormat, MAX_DPATH); _stprintf (szFilter, L"%s ", szFormat); - memcpy (szFilter + _tcslen (szFilter), L"(*.adf)\0*.adf\0", 15); + memcpy (szFilter + _tcslen (szFilter), L"(*.adf)\0*.adf\0", 15 * sizeof (TCHAR)); defext = L"ADF"; break; case 2: @@ -1603,7 +1603,7 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs WIN32GUI_LoadUIString (IDS_SELECTUAE, szTitle, MAX_DPATH); WIN32GUI_LoadUIString (IDS_UAE, szFormat, MAX_DPATH ); _stprintf (szFilter, L"%s ", szFormat); - memcpy (szFilter + _tcslen (szFilter), L"(*.uae)\0*.uae\0", 15); + memcpy (szFilter + _tcslen (szFilter), L"(*.uae)\0*.uae\0", 15 * sizeof (TCHAR)); defext = L"UAE"; break; case 6: @@ -1617,7 +1617,7 @@ int DiskSelection_2 (HWND hDlg, WPARAM wParam, int flag, struct uae_prefs *prefs WIN32GUI_LoadUIString (IDS_SELECTKEY, szTitle, MAX_DPATH); WIN32GUI_LoadUIString (IDS_KEY, szFormat, MAX_DPATH); _stprintf (szFilter, L"%s ", szFormat); - memcpy (szFilter + _tcslen (szFilter), L"(*.key)\0*.key\0", 15); + memcpy (szFilter + _tcslen (szFilter), L"(*.key)\0*.key\0", 15 * sizeof (TCHAR)); defext = L"KEY"; break; case 15: diff --git a/od-win32/winuaechangelog.txt b/od-win32/winuaechangelog.txt index 8e4b8238..1b7e9bc4 100644 --- a/od-win32/winuaechangelog.txt +++ b/od-win32/winuaechangelog.txt @@ -1,4 +1,19 @@ +Beta 19: + +- missing command line unicode support added +- added support for winuae.exe [] command line. + can be path to a configuration file, any supported floppy + disk image file or statefile, multiple paths supported, path + parsing stops when first parameter beginning with '-' or '/' is + detected. Now manually created Windows file extension mappings work + as expected. Automatically disables "show gui on startup". +- improved configuration parsing, now for example something="path" + and command line -something="path" works, previously " (or ') + were not accepted +- clear dsound buffer when sound autodeactivates, there could have + been some old sound data left if buffer size is really big + Beta 18: - gui debugger unicode conversion fixes (b15) -- 2.47.3