/* ChildApp.c d.g.gilbert, Dec'94 program main call for Mac apps needing to handle command-line parameters true main should be renamed to void RealMain(int argc, char** argv); used HighLevel event called "Cmdl" that calling application sends to this child application. This isn't an appleevent. */ #include #include #include #undef DEBUG /* use this only w/ Mac apps */ #define MACINTOSH 1 #include /* Apple highlevel events */ #include #include void BeFriendly(); // use for multiprocessing Boolean StopKey(); // check if user wants to quit in middle extern "C" int RealMain( int argc, char *argv[]); extern "C" int ccommand(char **argv[]); #ifdef DEBUG char* long2str( long val) { static char buf[5]; buf[0]= (val >> 24) & 0xff; buf[1]= (val >> 16) & 0xff; buf[2]= (val >> 8) & 0xff; buf[3]= val & 0xff; buf[4]= 0; return buf; } #endif char* FindWordEnd( char** start) { char *ep, *cp; ep= cp= *start; if (*cp == '"' || *cp == '\'') { char key= *cp; cp++; (*start)++; // need to move word start up 1 for (ep= cp; *ep && *ep != key; ep++) ; } else if (*cp) { for (ep= cp+1; *ep && *ep>' ' && *ep!='>' && *ep!='<' && *ep != '"' && *ep != '\''; ep++) ; } return ep; } char* FindWordStart( char* cp) { while (*cp && *cp <= ' ') cp++; return cp; } main(int argc, char *argv[]) { enum { kMaxBuflen = 512 }; Boolean doloop = true, flag; char **myargv, * cmdline; int i, err, trynum, myargc = argc; long time; unsigned long msgRefcon, buflen; EventRecord evt; TargetID sender; // need this to prevent crashes MaxApplZone(); InitGraf((Ptr)&qd.thePort); InitFonts(); InitWindows(); InitMenus(); TEInit(); InitDialogs(nil); InitCursor(); #ifdef DEBUG freopen( "ChildApp.stdout", "w", stdout); fprintf(stdout, "+debug: Test output from ChildApp.c --\n+debug: where is stdout going to??\n"); #endif trynum= 0; buflen= kMaxBuflen; cmdline= (char*) malloc(buflen+1); memset(cmdline,0,buflen+1); while (WaitNextEvent( highLevelEventMask, &evt, 2, NULL) || trynum<3) { trynum++; err= AcceptHighLevelEvent( &sender, &msgRefcon, cmdline, &buflen); #ifdef NOT_DEBUG fprintf(stderr, " HL Event '%s' ", long2str(evt.message)); fprintf(stderr, " HL message '%s' ", long2str(msgRefcon)); fprintf(stderr, " error= %d \n", err); #endif if (msgRefcon == 'Cmdl') { if (err == bufferIsSmall) { free(cmdline); buflen= kMaxBuflen; cmdline= (char*) malloc( buflen+1); err= AcceptHighLevelEvent( &sender, &msgRefcon, cmdline, &buflen); } if (!err) { /* push buf into argv, separating words */ char *cp, *ep, *sin, *sout, *serr, * maxp, savec; char done, nextStderr, nextStdin, nextStdout; if (buflen>kMaxBuflen) buflen= kMaxBuflen; cmdline[buflen]= 0; sout= sin= serr= NULL; nextStderr= nextStdin = nextStdout= 0; done= 0; myargc= 0; myargv= (char**) malloc( (myargc+2) * sizeof(char*)); cp= cmdline; maxp= cmdline + buflen; { enum { kDlogID = 100 }; WindowPtr wPort; char buf[kMaxBuflen]; CursHandle hCurs; memset(buf,0,kMaxBuflen); sprintf( buf, "Running %s ...", cmdline); paramtext( buf, "1", "2", "3"); wPort= GetNewDialog( kDlogID, NULL, (GrafPtr)-1); if (wPort) DrawDialog( wPort); hCurs = GetCursor(watchCursor); if (hCurs) SetCursor(*hCurs); } #ifdef DEBUG fprintf(stderr, " Cmdline: '%s' \n", cmdline); #endif while (!done && cp') { nextStderr= 1; ep= cp+1; } else if (*cp == '>') { nextStdout= 1; ep= cp; } else if (*cp == '<') { nextStdin= 1; ep= cp; } else { if (*ep) *ep= 0; else done= 1; if (*cp) { myargc++; myargv= (char**) realloc(myargv, (myargc+2) * sizeof(char*)); myargv[myargc-1]= cp; } } cp= ep+1; } myargv[myargc]= NULL; #ifdef DEBUG fprintf(stderr, " +comment: stderr '%s' \n", serr); if (sout) fprintf(stderr, "+comment: new stdout is '%s'\n",sout); if (serr) fprintf(stderr, "+comment: new stderr is '%s'\n",serr); if (sin) fprintf(stderr, "+comment: new stdin is '%s'\n",sin); for (i=0; i From: dowdy@apple.com (Tom Dowdy) To: gilbertd@sunflower.bio.indiana.edu Subject: Re: MPW SIOW library References: <1991Sep1.174155.13408@gn.ecn.purdue.edu> <6260@dftsrv.gsfc.nasa.gov > <1991Sep4.233506.25878@bronze.ucs.indiana.edu> Organization: Apple Computer, Inc. Status: R In article <1991Sep4.233506.25878@bronze.ucs.indiana.edu>, gilbertd@sunflower.bi o.indiana.edu (Don Gilbert) writes: > In article <6260@dftsrv.gsfc.nasa.gov> rdominy@kong.gsfc.nasa.gov (Robert Domi ny) writes: > > > >I have tried calling the routine EventAvail from an SIOW application to > >provide background processing time without success. I suspect you > > I just put a commandline c program into SIOW and sprinkled some calls > to WaitNextEvent thru the time consuming procedures. It seems to work > okay, though a bit cranky, for getting the app to work in the background. > When I say cranky, it will miss some os events telling it to shift into > background, but if I beat the mouse on the desktop, it will eventually > shift into background. This is just a guess, but the process manager will continue to call you with update events if you fail to handle them. After you have ignore something like 120 requests to update a window of yours, the PM will assume you are a "MultiFinder hostile" application and stop giving them to you until the update rgn changes. I'm wondering if this is causing your initial strangeness. I know a fellow programmer here got himself into the same fix and this ended up being the reason he saw his application perform so slowly in the background. Once the events were cleared, things were fine again. Tom Dowdy Internet: dowdy@apple.COM Apple Computer MS:81EQ UUCP: {sun,voder,amdahl,decwrl}!apple!dowdy 20525 Mariani Ave AppleLink: DOWDY1 Cupertino, CA 95014 "The 'Ooh-Ah' Bird is so called because it lays square eggs." ***************/ void BeFriendly(void) /* make this app multifinder-friendly w/ background processing */ /* this can slow the app down quite a bit -- don't use too liberally */ { const int cmdKey = 256; /* command-period == halt */ const long charCodeMask = 0x000000FF; int eventMask = osMask; /*? +keyDownMask+highLevelEventMask*/ long sleepTime = 1; /* # x 1/60 to sleep for others */ EventRecord theEvent; if (WaitNextEvent( eventMask, &theEvent, sleepTime, NULL)) { /***** if (theEvent.what==keyDown) { if ((theEvent.message & charCodeMask == '.') && (theEvent.modifiers & cmdKey !=0)) exit(1); } ******/ } /* SpinCursor(1); */ /* !!!? not seeing this, need .rsrc ACUR cursor ? */ }