/* * RUNPRG.ACC - A desk accessory to run programs... * by Todd A. Coram 21aug87 * Can you say Buggy? Tricky to run .PRG files.... Runs .TOS & .TTP w/o param */ #include #include #include /* Some lazy GEM programs allocate all mem and leave us nothing, so we beat them to the punch and allocate some mem on boot-up. Ha! */ #define DEFAULTRES 100000 /* reserve 100k for selected program */ #define RESERVEFILE "\\runprg.res" long int reserved; /* contains memory to reserve */ extern int gl_apid; int contrl[12]; int intin[128]; int ptsin[128]; int intout[128]; int ptsout[128]; int menu_id; int msg_buf[8]; char *new_scr, *old_phy, *old_log; char *reserve; /* pointer to reserved memory */ char workpath[20],filespec[80],filepath[20]; int fresult,fbutton; FILE *fp; main() { long int n; char buf[80], prgname[12]; filespec[0]=0; /* Find out how much memory to reserve */ if ((fp = fopen(RESERVEFILE,"r")) == NULL) reserved = DEFAULTRES; else{ /* open file and try to read 1 number, filespec and prg name*/ if (fscanf(fp, "%ld,%80s %12s", &reserved,filespec,prgname) < 1) reserved = DEFAULTRES; fclose(fp); } appl_init(); if (filespec[0] == 0) menu_id = menu_register(gl_apid, " Execute Prg"); else menu_id = menu_register(gl_apid, prgname); if ((reserve = (char *)malloc(reserved)) == 0 ){ sprintf(buf, "[3][Can't allocate %6ld bytes][OK]", reserved); form_alert(1, buf); } strcpy(workpath,"\\*.*"); /* set path */ /* Q: How long is forever? A: A very long time */ while (1){ evnt_mesag(msg_buf); /* wait....be patient until we are selected */ if ((msg_buf[0] == 40) && (msg_buf[4] == menu_id)){ /* free reserved memory */ free (reserve); /* allocate space for a new screen */ if ((new_scr = (char *)calloc(32512,1)) == 0 ) form_alert(1, "[3][Can't allocate 32512 bytes][OK]"); else { /* setup a new screen */ n = (long int)new_scr; /* align on a 512 page boundary */ new_scr = (char *)(n + (512-(n % 512))); old_phy = (char *)Physbase(); old_log = (char *)Logbase(); /* fsel a program */ if (filespec[0] != 0){ /* got a reserved program to execute */ Cursconf(1,0); /* set a new screen and Pexec that program */ Setscreen(new_scr, new_scr, -1); Pexec(0,filespec,"",0L); Setscreen(old_log, old_phy, -1); Cursconf(0,0); free(new_scr); /* free screen */ } else { filepath[0]=0; fresult=fsel_input(workpath,filepath,&fbutton); if(fresult>0 && fbutton==1){ strcpy(filespec,workpath); strip_wild(filespec); strcat(filespec,filepath); Cursconf(1,0); /* set a new screen and Pexec that program */ Setscreen(new_scr, new_scr, -1); Pexec(0,filespec,"",0L); Setscreen(old_log, old_phy, -1); Cursconf(0,0); free(new_scr); /* free screen */ } } /* try and re-reserve memory released */ if ((reserve = (char *)malloc(reserved)) == 0 ){ sprintf(buf, "[3][Can't allocate %6ld bytes][OK]", reserved); form_alert(1, buf); } } } } } /* * STRIP_WILD strips wildcards */ strip_wild(string) / cps wildcards */ strip_wild( /* ,,ÄcÃnew screen andcÂC"s]2TR0g r *md llomd esefi d))P0 s0 aùaÀ*Áb( r2TR0g r *md llk/ strip_wild( *Áb(,