int main (int argc, char **argv) { printf(GAMENAME" v%s - SVN revision %s - SDL version\nCompiled on %s\n\n", DOTVERSIONSTR_NOREV,SVN_REVISION_STRING,__DATE__); { int s[4] = { SIGSEGV, SIGILL, SIGFPE, SIGBUS }; cc_install_handlers(4, s, "zdoom-crash.log", DoomSpecificInfo); } seteuid (getuid ()); std::set_new_handler (NewFailure); #ifndef NO_GTK GtkAvailable = gtk_init_check (&argc, &argv); #endif setlocale (LC_ALL, "C"); if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE) == -1) { fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError()); return -1; } atterm (SDL_Quit); SDL_WM_SetCaption (GAMESIG " " DOTVERSIONSTR " (" __DATE__ ")", NULL); try { Args = new DArgs(argc, argv); atterm(FinalGC); /* killough 1/98: This fixes some problems with exit handling during abnormal situations. The old code called I_Quit() to end program, while now I_Quit() is installed as an exit handler and exit() is called to exit, either normally or abnormally. Seg faults are caught and the error handler is used, to prevent being left in graphics mode or having very loud SFX noise because the sound card is left in an unstable state. */ atexit (call_terms); atterm (I_Quit); // Should we even be doing anything with progdir on Unix systems? char program[PATH_MAX]; if (realpath (argv[0], program) == NULL) strcpy (program, argv[0]); char *slash = strrchr (program, '/'); if (slash != NULL) { *(slash + 1) = '\0'; progdir = program; } else { progdir = "./"; } C_InitConsole (80*8, 25*8, false); D_DoomMain (); } catch (class CDoomError &error) { if (error.GetMessage ()) fprintf (stderr, "%s\n", error.GetMessage ()); exit (-1); } catch (...) { call_terms (); throw; } return 0; }
int main (int argc, char **argv) { #if !defined (__APPLE__) { int s[4] = { SIGSEGV, SIGILL, SIGFPE, SIGBUS }; cc_install_handlers(argc, argv, 4, s, "zdoom-crash.log", DoomSpecificInfo); } #endif // !__APPLE__ printf(GAMENAME" %s - %s - SDL version\nCompiled on %s\n", GetVersionString(), GetGitTime(), __DATE__); seteuid (getuid ()); std::set_new_handler (NewFailure); #if defined(__MACH__) && !defined(NOASM) unprotect_rtext(); #endif // Set LC_NUMERIC environment variable in case some library decides to // clear the setlocale call at least this will be correct. // Note that the LANG environment variable is overridden by LC_* setenv ("LC_NUMERIC", "C", 1); #ifndef NO_GTK GtkAvailable = gtk_init_check (&argc, &argv); #endif setlocale (LC_ALL, "C"); if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE|SDL_INIT_JOYSTICK) == -1) { fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError()); return -1; } atterm (SDL_Quit); { char viddriver[80]; if (SDL_VideoDriverName(viddriver, sizeof(viddriver)) != NULL) { printf("Using video driver %s\n", viddriver); #ifdef USE_XCURSOR UseXCursor = (strcmp(viddriver, "x11") == 0); #endif } printf("\n"); } char caption[100]; mysnprintf(caption, countof(caption), GAMESIG " %s (%s)", GetVersionString(), GetGitTime()); SDL_WM_SetCaption(caption, caption); #ifdef __APPLE__ const SDL_VideoInfo* videoInfo = SDL_GetVideoInfo(); if ( NULL != videoInfo ) { EXTERN_CVAR( Int, vid_defwidth ) EXTERN_CVAR( Int, vid_defheight ) EXTERN_CVAR( Int, vid_defbits ) EXTERN_CVAR( Bool, vid_vsync ) EXTERN_CVAR( Bool, fullscreen ) vid_defwidth = videoInfo->current_w; vid_defheight = videoInfo->current_h; vid_defbits = videoInfo->vfmt->BitsPerPixel; vid_vsync = true; fullscreen = true; } #endif // __APPLE__ try { Args = new DArgs(argc, argv); /* killough 1/98: This fixes some problems with exit handling during abnormal situations. The old code called I_Quit() to end program, while now I_Quit() is installed as an exit handler and exit() is called to exit, either normally or abnormally. Seg faults are caught and the error handler is used, to prevent being left in graphics mode or having very loud SFX noise because the sound card is left in an unstable state. */ atexit (call_terms); atterm (I_Quit); // Should we even be doing anything with progdir on Unix systems? char program[PATH_MAX]; if (realpath (argv[0], program) == NULL) strcpy (program, argv[0]); char *slash = strrchr (program, '/'); if (slash != NULL) { *(slash + 1) = '\0'; progdir = program; } else { progdir = "./"; } I_StartupJoysticks(); C_InitConsole (80*8, 25*8, false); D_DoomMain (); } catch (class CDoomError &error) { I_ShutdownJoysticks(); if (error.GetMessage ()) fprintf (stderr, "%s\n", error.GetMessage ()); exit (-1); } catch (...) { call_terms (); throw; } return 0; }
int main(int argc, char**argv) { // Some objects used to redirect cout and cerr // Scope must be here, so this still works inside the catch block for logging exceptions std::streambuf* cout_rdbuf = std::cout.rdbuf (); std::streambuf* cerr_rdbuf = std::cerr.rdbuf (); #if !(defined(_WIN32) && defined(_DEBUG)) boost::iostreams::stream_buffer<Tee> coutsb; boost::iostreams::stream_buffer<Tee> cerrsb; #endif std::ostream oldcout(cout_rdbuf); std::ostream oldcerr(cerr_rdbuf); boost::filesystem::ofstream logfile; std::auto_ptr<OMW::Engine> engine; int ret = 0; try { Files::ConfigurationManager cfgMgr; #if defined(_WIN32) && defined(_DEBUG) // Redirect cout and cerr to VS debug output when running in debug mode boost::iostreams::stream_buffer<DebugOutput> sb; sb.open(DebugOutput()); std::cout.rdbuf (&sb); std::cerr.rdbuf (&sb); #else // Redirect cout and cerr to openmw.log logfile.open (boost::filesystem::path(cfgMgr.getLogPath() / "/openmw.log")); coutsb.open (Tee(logfile, oldcout)); cerrsb.open (Tee(logfile, oldcerr)); std::cout.rdbuf (&coutsb); std::cerr.rdbuf (&cerrsb); #endif #if OGRE_PLATFORM == OGRE_PLATFORM_LINUX || OGRE_PLATFORM == OGRE_PLATFORM_APPLE // Unix crash catcher if ((argc == 2 && strcmp(argv[1], "--cc-handle-crash") == 0) || !is_debugger_attached()) { int s[5] = { SIGSEGV, SIGILL, SIGFPE, SIGBUS, SIGABRT }; cc_install_handlers(argc, argv, 5, s, (cfgMgr.getLogPath() / "crash.log").string().c_str(), NULL); std::cout << "Installing crash catcher" << std::endl; } else std::cout << "Running in a debugger, not installing crash catcher" << std::endl; #endif #if OGRE_PLATFORM == OGRE_PLATFORM_APPLE // set current dir to bundle path boost::filesystem::path bundlePath = boost::filesystem::path(Ogre::macBundlePath()).parent_path(); boost::filesystem::current_path(bundlePath); #endif engine.reset(new OMW::Engine(cfgMgr)); if (parseOptions(argc, argv, *engine, cfgMgr)) { engine->go(); } } catch (std::exception &e) { #if OGRE_PLATFORM == OGRE_PLATFORM_LINUX || OGRE_PLATFORM == OGRE_PLATFORM_APPLE if (isatty(fileno(stdin))) std::cerr << "\nERROR: " << e.what() << std::endl; else #endif SDL_ShowSimpleMessageBox(0, "OpenMW: Fatal error", e.what(), NULL); ret = 1; } // Restore cout and cerr std::cout.rdbuf(cout_rdbuf); std::cerr.rdbuf(cerr_rdbuf); return ret; }
int main (int argc, char **argv) { { int s[4] = { SIGSEGV, SIGILL, SIGFPE, SIGBUS }; cc_install_handlers(4, s, "zdoom-crash.log", DoomSpecificInfo); } seteuid (getuid ()); std::set_new_handler (NewFailure); if (SDL_Init (SDL_INIT_VIDEO|SDL_INIT_TIMER|SDL_INIT_NOPARACHUTE) == -1) { fprintf (stderr, "Could not initialize SDL:\n%s\n", SDL_GetError()); return -1; } atterm (SDL_Quit); SDL_WM_SetCaption (GAMESIG " " DOTVERSIONSTR " (" __DATE__ ")", NULL); try { Args.SetArgs (argc, argv); /* killough 1/98: This fixes some problems with exit handling during abnormal situations. The old code called I_Quit() to end program, while now I_Quit() is installed as an exit handler and exit() is called to exit, either normally or abnormally. Seg faults are caught and the error handler is used, to prevent being left in graphics mode or having very loud SFX noise because the sound card is left in an unstable state. */ atexit (call_terms); atterm (I_Quit); if (realpath (argv[0], progdir) == NULL) strcpy (progdir, argv[0]); char *slash = strrchr (progdir, '/'); if (slash) *(slash + 1) = '\0'; else progdir[0] = '.', progdir[1] = '/', progdir[2] = '\0'; C_InitConsole (80*8, 25*8, false); D_DoomMain (); } catch (class CDoomError &error) { if (error.GetMessage ()) fprintf (stderr, "%s\n", error.GetMessage ()); exit (-1); } catch (...) { call_terms (); throw; } return 0; }