35static constexpr const char* STDOUT_LOG_FILE_NAME =
"openmsx_system/openmsx.stdout";
36static constexpr const char* STDERR_LOG_FILE_NAME =
"openmsx_system/openmsx.stderr";
45static int setenv(
const char* name,
const char* value,
int overwrite)
47 if (!overwrite && getenv(name)) {
50 return _putenv_s(name, value);
56static void EnableConsoleOutput()
58 if (AttachConsole(ATTACH_PARENT_PROCESS)) {
59 freopen(
"CONOUT$",
"w", stdout);
60 freopen(
"CONOUT$",
"w", stderr);
65static void initializeSDL()
68 flags |= SDL_INIT_JOYSTICK;
70 flags |= SDL_INIT_NOPARACHUTE;
72 if (SDL_Init(flags) < 0) {
73 throw FatalError(
"Couldn't init SDL: ", SDL_GetError());
81 setenv(
"FREETYPE_PROPERTIES",
"truetype:interpreter-version=35", 0);
84static int main(
int argc,
char **argv)
87 ad_printf(
"Redirecting stdout to %s and stderr to %s\n",
88 STDOUT_LOG_FILE_NAME, STDERR_LOG_FILE_NAME);
90 if (!freopen(STDOUT_LOG_FILE_NAME,
"a", stdout)) {
91 ad_printf(
"Couldn't redirect stdout to logfile, aborting\n");
92 std::cerr <<
"Couldn't redirect stdout to "
93 STDOUT_LOG_FILE_NAME
"\n";
96 if (!freopen(STDERR_LOG_FILE_NAME,
"a", stderr)) {
97 ad_printf(
"Couldn't redirect stderr to logfile, aborting\n");
98 std::cout <<
"Couldn't redirect stderr to "
99 STDERR_LOG_FILE_NAME
"\n";
103 std::string msg =
Date::toString(time(
nullptr)) +
": starting openMSX";
104 std::cout << msg <<
'\n';
105 std::cerr << msg <<
'\n';
109 EnableConsoleOutput();
119 ArgumentGenerator argGen;
120 argv = argGen.GetArguments(argc);
122 CommandLineParser parser(reactor);
123 parser.parse({argv, size_t(argc)});
127 auto& display = reactor.getDisplay();
128 if (!parser.isHiddenStartup()) {
129 auto& render = display.getRenderSettings().getRendererSetting();
130 render.setValue(render.getDefaultValue());
137 reactor.getEventDistributor().deliverEvents();
142 CliServer cliServer(reactor.getCommandController(),
143 reactor.getEventDistributor(),
144 reactor.getGlobalCliComm());
148 }
catch (FatalError& e) {
149 std::cerr <<
"Fatal error: " << e.getMessage() <<
'\n';
151 }
catch (MSXException& e) {
152 std::cerr <<
"Uncaught exception: " << e.getMessage() <<
'\n';
154 }
catch (std::exception& e) {
155 std::cerr <<
"Uncaught std::exception: " << e.what() <<
'\n';
158 std::cerr <<
"Uncaught exception of unexpected type." <<
'\n';
162 if (SDL_WasInit(SDL_INIT_EVERYTHING)) {
178 return openmsx::main(argc, argv);
int main(int argc, char **argv)
std::string toString(time_t time)
void setMainThread()
Store ID of the main thread, should be called exactly once from the main thread.
This file implemented 3 utility functions:
void randomize()
Seed the (shared) random number generator.