summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/osd/osdcore.cpp48
-rw-r--r--src/osd/osdcore.h4
-rw-r--r--src/osd/sdl/sdlmain.cpp8
-rw-r--r--src/osd/windows/main.cpp24
-rw-r--r--src/osd/windows/winmain.cpp6
-rw-r--r--src/tools/imgtool/main.cpp6
6 files changed, 64 insertions, 32 deletions
diff --git a/src/osd/osdcore.cpp b/src/osd/osdcore.cpp
index 58bb1157674..4da081e2111 100644
--- a/src/osd/osdcore.cpp
+++ b/src/osd/osdcore.cpp
@@ -8,6 +8,14 @@
#if defined(SDLMAME_ANDROID)
#include <SDL2/SDL.h>
#endif
+
+#ifdef _WIN32
+#include <windows.h>
+#include <stdio.h>
+#include <shellapi.h>
+#include "strconv.h"
+#endif
+
static const int MAXSTACK = 10;
static osd_output *m_stack[MAXSTACK];
static int m_ptr = -1;
@@ -194,3 +202,43 @@ void osd_sleep(osd_ticks_t duration)
{
std::this_thread::sleep_for(std::chrono::high_resolution_clock::duration(duration));
}
+
+
+//============================================================
+// osd_get_command_line - returns command line arguments
+// in an std::vector<std::string> in UTF-8
+//
+// The real purpose of this call is to hide details necessary
+// on Windows (provided that one wants to avoid using wmain)
+//============================================================
+
+std::vector<std::string> osd_get_command_line(int argc, char *argv[])
+{
+ std::vector<std::string> results;
+#ifdef WIN32
+ {
+ // Get the command line from Windows
+ int count;
+ LPWSTR *wide_args = CommandLineToArgvW(GetCommandLineW(), &count);
+
+ // Convert the returned command line arguments to UTF8 std::vector<std::string>
+ results.reserve(count);
+ for (int i = 0; i < count; i++)
+ {
+ std::string arg = osd::text::from_wstring(wide_args[i]);
+ results.push_back(std::move(arg));
+ }
+
+ LocalFree(wide_args);
+ }
+#else // !WIN32
+ {
+ // for non Windows platforms, we are assuming that arguments are
+ // already UTF-8; we just need to convert to std::vector<std::string>
+ results.reserve(argc);
+ for (int i = 0; i < argc; i++)
+ results.emplace_back(argv[i]);
+ }
+#endif // WIN32
+ return results;
+}
diff --git a/src/osd/osdcore.h b/src/osd/osdcore.h
index c22bfd03800..2bfc7cb5950 100644
--- a/src/osd/osdcore.h
+++ b/src/osd/osdcore.h
@@ -26,6 +26,7 @@
#include <cstdint>
#include <memory>
#include <string>
+#include <vector>
/***************************************************************************
@@ -883,6 +884,9 @@ void CLIB_DECL osd_printf_info(const char *format, ...) ATTR_PRINTF(1,2);
void CLIB_DECL osd_printf_verbose(const char *format, ...) ATTR_PRINTF(1,2);
void CLIB_DECL osd_printf_debug(const char *format, ...) ATTR_PRINTF(1,2);
+// returns command line arguments as an std::vector<std::string> in UTF-8
+std::vector<std::string> osd_get_command_line(int argc, char *argv[]);
+
/* discourage the use of printf directly */
/* sadly, can't do this because of the ATTR_PRINTF under GCC */
/*
diff --git a/src/osd/sdl/sdlmain.cpp b/src/osd/sdl/sdlmain.cpp
index 3f4b3815359..4fa78bbed38 100644
--- a/src/osd/sdl/sdlmain.cpp
+++ b/src/osd/sdl/sdlmain.cpp
@@ -183,15 +183,9 @@ sdl_options::sdl_options()
extern "C" DECLSPEC void SDLCALL SDL_SetModuleHandle(void *hInst);
#endif
-// translated to utf8_main
-#if defined(SDLMAME_WIN32)
-int main(std::vector<std::string> &args)
-{
-#else
int main(int argc, char** argv)
{
- std::vector<std::string> args(argv, argv+argc);
-#endif
+ std::vector<std::string> args = osd_get_command_line(argc, argv);
int res = 0;
// disable I/O buffering
diff --git a/src/osd/windows/main.cpp b/src/osd/windows/main.cpp
index e87fa24e57c..efe2ad68d72 100644
--- a/src/osd/windows/main.cpp
+++ b/src/osd/windows/main.cpp
@@ -18,29 +18,7 @@
#include "strconv.h"
-#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
-
-extern int utf8_main(std::vector<std::string> &args);
-//============================================================
-// main
-//============================================================
-
-#ifdef UNICODE
-extern "C" int _tmain(int argc, TCHAR **argv)
-{
- int i;
- std::vector<std::string> argv_vectors(argc);
-
- // convert arguments to UTF-8
- for (i = 0; i < argc; i++)
- argv_vectors[i] = osd::text::from_tstring(argv[i]);
-
- // run utf8_main
- return utf8_main(argv_vectors);
-}
-#endif
-
-#else
+#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
#include "winmain.h"
diff --git a/src/osd/windows/winmain.cpp b/src/osd/windows/winmain.cpp
index 805a769d1b8..b1702f7fac3 100644
--- a/src/osd/windows/winmain.cpp
+++ b/src/osd/windows/winmain.cpp
@@ -273,11 +273,13 @@ const options_entry windows_options::s_option_entries[] =
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
//============================================================
-// utf8_main
+// main
//============================================================
-int main(std::vector<std::string> &args)
+int main(int argc, char *argv[])
{
+ std::vector<std::string> args = osd_get_command_line(argc, argv);
+
// use small output buffers on non-TTYs (i.e. pipes)
if (!isatty(fileno(stdout)))
setvbuf(stdout, (char *) nullptr, _IOFBF, 64);
diff --git a/src/tools/imgtool/main.cpp b/src/tools/imgtool/main.cpp
index 9559b687c9d..516c4f49e4e 100644
--- a/src/tools/imgtool/main.cpp
+++ b/src/tools/imgtool/main.cpp
@@ -864,6 +864,12 @@ int main(int argc, char *argv[])
return -1;
#endif // MAME_DEBUG
+ // convert arguments to UTF-8
+ std::vector<std::string> args = osd_get_command_line(argc, argv);
+ argv = (char **)alloca(sizeof(char *) * args.size());
+ for (i = 0; i < args.size(); i++)
+ argv[i] = (char *)args[i].c_str();
+
util::stream_format(std::wcout, L"\n");
if (argc > 1)