IO_stat MCDispatch::startup(void) { IO_stat stat; MCStack *sptr; // set up image cache before the first stack is opened MCCachedImageRep::init(); startdir = MCS_getcurdir(); enginedir = strclone(MCcmd); char *eptr; eptr = strrchr(enginedir, PATH_SEPARATOR); if (eptr != NULL) *eptr = '\0'; else *enginedir = '\0'; MCExecPoint ep; ep . setstaticbytes(MCstartupstack, MCstartupstack_length); MCDecompress::do_decompress(ep, 0, 0); IO_handle stream = MCS_fakeopen(ep . getsvalue()); if ((stat = MCdispatcher -> readfile(NULL, NULL, stream, sptr)) != IO_NORMAL) { MCS_close(stream); return stat; } MCS_close(stream); memset((void *)ep . getsvalue() . getstring(), 0, ep . getsvalue() . getlength()); ep . clear(); // Temporary fix to make sure environment stack doesn't get lost behind everything. #if defined(_MACOSX) ProcessSerialNumber t_psn = { 0, kCurrentProcess }; SetFrontProcess(&t_psn); #elif defined(_WINDOWS) SetForegroundWindow(((MCScreenDC *)MCscreen) -> getinvisiblewindow()); #endif MCenvironmentactive = True; sptr -> setfilename(strclone(MCcmd)); MCdefaultstackptr = MCstaticdefaultstackptr = stacks; { MCdefaultstackptr -> setextendedstate(true, ECS_DURING_STARTUP); MCdefaultstackptr -> message(MCM_start_up, nil, False, True); MCdefaultstackptr -> setextendedstate(false, ECS_DURING_STARTUP); } if (!MCquit) { MCresult -> fetch(ep); ep . appendchar('\0'); if (ep . getsvalue() . getlength() == 1) { sptr -> open(); MCImage::init(); X_main_loop(); MCresult -> fetch(ep); ep . appendchar('\0'); if (ep . getsvalue() . getlength() == 1) return IO_NORMAL; } if (sptr -> getscript() != NULL) memset(sptr -> getscript(), 0, strlen(sptr -> getscript())); destroystack(sptr, True); MCtopstackptr = NULL; MCquit = False; MCenvironmentactive = False; send_relaunch(); sptr = findstackname(ep . getsvalue() . getstring()); if (sptr == NULL && (stat = loadfile(ep . getsvalue() . getstring(), sptr)) != IO_NORMAL) return stat; } if (!MCquit) { // OK-2007-11-13 : Bug 5525, after opening the IDE engine, the allowInterrupts should always default to false, // regardless of what the environment stack may have set it to. MCallowinterrupts = true; sptr -> setparent(this); MCdefaultstackptr = MCstaticdefaultstackptr = stacks; send_startup_message(false); if (!MCquit) sptr -> open(); } return IO_NORMAL; }
int platform_main(int argc, char *argv[], char *envp[]) { // On Linux, the argv and envp could be in pretty much any format. The // safest thing to do is let the C library's iconv convert to a known // format. To do this, the system locale needs to be retrieved. setlocale(LC_ALL, ""); MCsysencoding = strclone(nl_langinfo(CODESET)); if (!MCInitialize()) { fprintf(stderr, "Fatal: initialization failed\n"); exit(-1); } if (!MCSInitialize()) { fprintf(stderr, "Fatal: platform initialization failed\n"); exit(-1); } if (!MCScriptInitialize()) { fprintf(stderr, "Fatal: script initialization failed\n"); exit(-1); } // Linux needs the platform layer to be initialised early so that it can // use it to load the weakly-linked dynamic libraries that the engine // depends on. MCS_preinit(); // Core initialisation complete; // This depends on libFoundation and MCsystem being initialised first initialise_required_weak_link_glib(); // Convert the argv array to StringRefs MCAutoStringRefArray t_argv; /* UNCHECKED */ t_argv.New(argc); for (int i = 0; i < argc; i++) { /* UNCHECKED */ MCStringCreateWithSysString(argv[i], t_argv[i]); } // Convert the envp array to StringRefs int envc = 0; while (envp[envc] != nullptr) ++envc; MCAutoStringRefArray t_envp; /* UNCHECKED */ t_envp.New(envc + 1); for (int i = 0; envp[i] != nullptr; ++i) { /* UNCHECKED */ MCStringCreateWithSysString(envp[i], t_envp[i]); } // Terminate the envp array t_envp[envc] = nil; extern int MCSystemElevatedMain(int, char* argv[]); if (argc == 3&& strcmp(argv[1], "-elevated-slave") == 0) return MCSystemElevatedMain(argc, argv); struct X_init_options t_options; t_options.argc = argc; t_options.argv = *t_argv; t_options.envp = *t_envp; t_options.app_code_path = nullptr; if (!X_init(t_options)) { // Try to print an informative error message or, failing that, just // report that an error occurred. if (MCresult != nil) { MCExecContext ctxt(nil, nil, nil); MCAutoValueRef t_result; MCAutoStringRef t_string; MCresult -> eval(ctxt, &t_result); ctxt . ConvertToString(*t_result, &t_string); MCAutoStringRefAsSysString t_autostring; /* UNCHECKED */ t_autostring . Lock(*t_string); fprintf(stderr, "Startup error - %s\n", *t_autostring); } else { fprintf(stderr, "Fatal: unknown startup error\n"); } exit(-1); } X_main_loop(); int t_exit_code = X_close(); MCScriptFinalize(); MCFinalize(); exit(t_exit_code); }