/* this is called from main() in s_entry.c */ int sys_main(int argc, char **argv) { int i, noprefs; sys_externalschedlib = 0; sys_extraflags = 0; #ifdef PD_DEBUG fprintf(stderr, "Pd: COMPILED FOR DEBUGGING\n"); #endif /* use Win32 "binary" mode by default since we don't want the * translation that Win32 does by default */ #ifdef _WIN32 # ifdef _MSC_VER /* MS Visual Studio */ _set_fmode( _O_BINARY ); # else /* MinGW */ { extern int _fmode; _fmode = _O_BINARY; } # endif /* _MSC_VER */ #endif /* WIN32 */ pd_init(); /* start the message system */ sys_findprogdir(argv[0]); /* set sys_progname, guipath */ for (i = noprefs = 0; i < argc; i++) /* prescan args for noprefs */ if (!strcmp(argv[i], "-noprefs")) noprefs = 1; if (!noprefs) sys_loadpreferences(); /* load default settings */ #ifndef _WIN32 if (!noprefs) sys_rcfile(); /* parse the startup file */ #endif if (sys_argparse(argc-1, argv+1)) /* parse cmd line */ return (1); sys_afterargparse(); /* post-argparse settings */ if (sys_verbose || sys_version) fprintf(stderr, "%s compiled %s %s\n", pd_version, pd_compiletime, pd_compiledate); if (sys_version) /* if we were just asked our version, exit here. */ return (0); sys_setsignalhandlers(); if (sys_startgui(sys_libdir->s_name)) /* start the gui */ return (1); if (sys_externalschedlib) return (sys_run_scheduler(sys_externalschedlibname, sys_extraflagsstring)); else if (sys_batch) return (m_batchmain()); else { /* open audio and MIDI */ sys_reopen_midi(); if (audio_shouldkeepopen()) sys_reopen_audio(); /* run scheduler until it quits */ return (m_mainloop()); } }
/* this is called from main() in s_entry.c */ int sys_main(int argc, char **argv) { int i, noprefs; sys_externalschedlib = 0; sys_extraflags = 0; #ifdef PD_DEBUG fprintf(stderr, "Pd: COMPILED FOR DEBUGGING\n"); #endif pd_init(); /* start the message system */ logpost(NULL, 2, "PD_FLOATPRECISION = %lu bits", sizeof(t_float)*8); sys_findprogdir(argv[0]); /* set sys_progname, guipath */ for (i = noprefs = 0; i < argc; i++) /* prescan args for noprefs */ if (!strcmp(argv[i], "-noprefs")) noprefs = 1; if (!noprefs) sys_loadpreferences(); /* load default settings */ #ifndef MSW if (!noprefs) sys_rcfile(); /* parse the startup file */ #endif if (sys_argparse(argc-1, argv+1)) /* parse cmd line */ return (1); sys_afterargparse(); /* post-argparse settings */ if (sys_verbose || sys_version) fprintf(stderr, "%s compiled %s %s\n", pd_version, pd_compiletime, pd_compiledate); if (sys_version) /* if we were just asked our version, exit here. */ return (0); if (sys_startgui(sys_libdir->s_name)) /* start the gui */ return(1); if (sys_externalschedlib) return (sys_run_scheduler(sys_externalschedlibname, sys_extraflagsstring)); else if (sys_batch) return (m_batchmain()); else { /* open audio and MIDI */ sys_reopen_midi(); sys_reopen_audio(); /* run scheduler until it quits */ return (m_mainloop()); } }
void sys_doflags( void) { int i, beginstring = 0, state = 0, len = strlen(sys_flags->s_name); int rcargc = 0; char *rcargv[MAXPDSTRING]; if (len > MAXPDSTRING) { error("flags: %s: too long", sys_flags->s_name); return; } for (i = 0; i < len+1; i++) { int c = sys_flags->s_name[i]; if (state == 0) { if (c && !isspace(c)) { beginstring = i; state = 1; } } else { if (!c || isspace(c)) { char *foo = malloc(i - beginstring + 1); if (!foo) return; strncpy(foo, sys_flags->s_name + beginstring, i - beginstring); foo[i - beginstring] = 0; rcargv[rcargc] = foo; rcargc++; if (rcargc >= MAXPDSTRING) break; state = 0; } } } if (sys_argparse(rcargc, rcargv)) error("error parsing startup arguments"); }
int sys_rcfile(void) { FILE* file; int i; int k; int rcargc; char* rcargv[NUMARGS]; char* buffer; char fname[MAXPDSTRING], buf[1000], *home = getenv("HOME"); int retval = 1; /* that's what we will return at the end; for now, let's think it'll be an error */ /* initialize rc-arg-array so we can safely clean up at the end */ for (i = 1; i < NUMARGS-1; i++) rcargv[i]=0; /* parse a startup file */ *fname = '\0'; strncat(fname, home? home : ".", MAXPDSTRING-10); strcat(fname, "/"); strcat(fname, STARTUPNAME); if (!(file = fopen(fname, "r"))) return 1; post("reading startup file: %s", fname); rcargv[0] = "."; /* this no longer matters to sys_argparse() */ for (i = 1; i < NUMARGS-1; i++) { if (fscanf(file, "%998s", buf) < 0) break; buf[999] = 0; if (!(rcargv[i] = malloc(strlen(buf) + 1))) goto cleanup; strcpy(rcargv[i], buf); } if (i >= NUMARGS-1) fprintf(stderr, "startup file too long; extra args dropped\n"); rcargv[i] = 0; rcargc = i; /* parse the options */ fclose(file); if (sys_verbose) { if (rcargc) { post("startup args from RC file:"); for (i = 1; i < rcargc; i++) post("%s", rcargv[i]); } else post("no RC file arguments found"); } if (sys_argparse(rcargc-1, rcargv+1)) { error("error parsing RC arguments"); goto cleanup; } retval=0; /* we made it without an error */ cleanup: /* prevent memleak */ for (i = 1; i < NUMARGS-1; i++) if(rcargv[i])free(rcargv[i]); return(retval); }
/* this is called from main() in s_entry.c */ int sys_main(int argc, char **argv) { int i, noprefs; char *prefsfile = ""; sys_externalschedlib = 0; sys_extraflags = 0; #ifdef PD_DEBUG fprintf(stderr, "Pd: COMPILED FOR DEBUGGING\n"); #endif /* use Win32 "binary" mode by default since we don't want the * translation that Win32 does by default */ #ifdef _WIN32 # ifdef _MSC_VER /* MS Visual Studio */ _set_fmode( _O_BINARY ); # else /* MinGW */ { extern int _fmode; _fmode = _O_BINARY; } # endif /* _MSC_VER */ #endif /* _WIN32 */ #ifndef _WIN32 /* long ago Pd used setuid to promote itself to real-time priority. Just in case anyone's installation script still makes it setuid, we complain to stderr and lose setuid here. */ if (getuid() != geteuid()) { fprintf(stderr, "warning: canceling setuid privilege\n"); setuid(getuid()); } #endif /* _WIN32 */ pd_init(); /* start the message system */ sys_findprogdir(argv[0]); /* set sys_progname, guipath */ for (i = noprefs = 0; i < argc; i++) /* prescan for prefs override */ { if (!strcmp(argv[i], "-noprefs")) noprefs = 1; else if (!strcmp(argv[i], "-prefsfile") && i < argc-1) prefsfile = argv[i+1]; } if (!noprefs) /* load preferences before parsing args to allow ... */ sys_loadpreferences(prefsfile, 1); /* args to override prefs */ if (sys_argparse(argc-1, argv+1)) /* parse cmd line args */ return (1); sys_afterargparse(); /* post-argparse settings */ if (sys_verbose || sys_version) fprintf(stderr, "%s compiled %s %s\n", pd_version, pd_compiletime, pd_compiledate); if (sys_version) /* if we were just asked our version, exit here. */ return (0); sys_setsignalhandlers(); if (sys_dontstartgui) clock_set((sys_fakefromguiclk = clock_new(0, (t_method)sys_fakefromgui)), 0); else if (sys_startgui(sys_libdir->s_name)) /* start the gui */ return (1); if (sys_hipriority) sys_setrealtime(sys_libdir->s_name); /* set desired process priority */ if (sys_externalschedlib) return (sys_run_scheduler(sys_externalschedlibname, sys_extraflagsstring)); else if (sys_batch) return (m_batchmain()); else { /* open audio and MIDI */ sys_reopen_midi(); if (audio_shouldkeepopen()) sys_reopen_audio(); /* run scheduler until it quits */ return (m_mainloop()); } }
/* this is called from main() in s_entry.c */ int sys_main(int argc, char **argv) { int i, noprefs; sys_externalschedlib = 0; sys_extraflags = 0; char * filenames; #ifdef PD_DEBUG fprintf(stderr, "Pd-L2Ork: COMPILED FOR DEBUGGING\n"); #endif pd_init(); /* start the message system */ sys_findprogdir(argv[0]); /* set sys_progname, guipath */ for (i = noprefs = 0; i < argc; i++) /* prescan args for noprefs */ if (!strcmp(argv[i], "-noprefs")) noprefs = 1; if (!noprefs) sys_loadpreferences(); /* load default settings */ #ifndef MSW if (!noprefs) sys_rcfile(); /* parse the startup file */ #endif if (sys_argparse(argc-1, argv+1)) /* parse cmd line */ return (1); sys_afterargparse(); /* post-argparse settings */ /* build version string from defines in m_pd.h */ pd_makeversion(); if (sys_verbose || sys_version) fprintf(stderr, "%scompiled %s %s\n", pd_version, pd_compiletime, pd_compiledate); if (sys_version) /* if we were just asked our version, exit here. */ return (0); if (sys_startgui(sys_guidir->s_name)) /* start the gui */ return(1); /* check if we are unique, otherwise, just focus existing instance, and if necessary open file inside it */\ if (sys_openlist) { // let's create one continuous string from all files int length = 0; t_namelist *nl; for (nl = sys_openlist; nl; nl = nl->nl_next) length = length + strlen(nl->nl_string) + 1; if((filenames = malloc(length)) != NULL) { filenames[0] = '\0'; // ensures the memory is an empty string if (sys_openlist) { for (nl = sys_openlist; nl; nl = nl->nl_next) { strcat(filenames,nl->nl_string); if (nl->nl_next) strcat(filenames," "); } } //fprintf(stderr,"final list: <%s>\n", filenames); } else { error("filelist malloc failed!\n"); return(1); } } sys_vgui("pdtk_check_unique %d %s\n", sys_unique, (filenames ? filenames : "0")); if (sys_externalschedlib) return (sys_run_scheduler(sys_externalschedlibname, sys_extraflagsstring)); else if (sys_batch) return (m_batchmain()); else { /* open audio and MIDI */ sys_reopen_midi(); sys_reopen_audio(); if (sys_console) sys_vgui("pdtk_toggle_console 1\n"); if (sys_k12_mode) { t_namelist *path = pd_extrapath; while (path->nl_next) path = path->nl_next; sys_vgui("pdtk_enable_k12_mode %s\n", path->nl_string); } /* run scheduler until it quits */ return (m_mainloop()); } }