rico@oscvax.UUCP (07/30/86)
<----- Purina Line Eater Chow -----> Don't look now, here comes my first ever public source posting... This little ditty will allow you to run CLI commands from the workbench. It's a mite kludgy but it is pretty effective... In any case, this is just a preliminary release, I hope to get something a little more polished out here soon. #ifdef AZTEC To compile runner.c using Manx C just cc runner.c ln runner.o -lc #else /* must be Lattice C */ If you only have Lettuce then you'll have to make one small change to the source, just declare WBenchMsg as an external rather than as the second argument to main. You should be able to compile it with that "make" script that's on the Lettuce disk... (but I ain't got Lettuce so I haven't tried it) #endif Once you have the executable 'runner', you must a) install it in the c: directory of your favourite workbench disk(s) b) change the startup-sequence so that the original CLI is *not* ended (this is to give CLI commands that you run with runner a place to write their output and maybe get input... you'll want to size the window to your taste once you see what commands you like to run) c) using your favourite workbench tool (say Notepad), create a project, a small one, with minimal data in it. Now select the icon that was created and ask for it's Info from the Workbench (pick the "Info" entry from the "Workbench" menu). Now here's where the fun starts. d) fill in the "comment" field with a CLI command you would like to run e) change the default tool to c:runner f) get rid of all the "tool types" junk (if any) by picking DEL until they are all gone. g) pick save on the info screen. h) rename the project to something that reflects what you put in the comment field. If you're really keen edit the icon image too... i) double click the icon you just made and watch the fun! From here on in you can just duplicate and edit the command icon you used for your first one, be careful because AmigaDOS doesn't preserve the Comment field across copies. I've used runner with success on Kickstart 1.1 and 1.2 Beta 4. Caveats: Your command will be run with its current directory as DF0: and with only 4000 bytes of stack (the defaults (sorry I don't know how to fix this right now)). If you need more stack than 4000, you can just create a CLI batch file that has a suitable "stack" command in it as well as the command you really want to execute and then aim the comment field at your batch file. The main affect of the current directory being DF0: is that you almost always have to specify a complete path to your files in the commands that you run (Sigh). You will find it all too easy to start more than one task, but keep in mind that they will all share their stdin and stdout (it's gonna be that CLI screen I told you to leave around unless you explictly redirect it in the command you put in the comment string (not such a bad idea)) so that window can get real cluttered... Suggested things to do with runner: invoke your favourite editor on a source file compile a source file run make do a dir on some useful directory call up the vt100 emulator with arguments for your favourite colours and baud rate and ... and... etc. Feel free to mail any suggestions to me, or better yet post them... This program is so simple that oodles of people should be able to make improvements (and it does need them!). Rico Mariani {allegra|ihnp4|watmath|linus|decvax}!utzoo!oscvax!rico -------runner.c-----AIM-LASER-WEAPON-HERE------- /* :ts=8 */ /* * runner.c July 29/86 Rico Mariani * runs CLI commands from the comment field of an icon * */ #include <exec/types.h> #include <workbench/startup.h> #include <libraries/dos.h> #include <libraries/dosextens.h> #include <stdio.h> struct FileLock *Lock(); struct FileLock *CurrentDir(); main(argc,WBenchMsg) int argc; struct WBStartup *WBenchMsg; { struct WBArg *arg; struct FileLock *olddir; char buf[80]; int stat; if (argc) { printf("run from workbench\n"); exit(999); } arg = WBenchMsg->sm_ArgList; if (WBenchMsg->sm_NumArgs != 2 ) exit(999); arg++; if (arg->wa_Lock) { olddir = CurrentDir(arg->wa_Lock); strcpy(buf,arg->wa_Name); stat = runit(buf); CurrentDir(olddir); exit (stat); } exit(999); } runit(buf) char *buf; { struct FileLock *lock; struct FileInfoBlock fib; lock = Lock(buf,ACCESS_READ); if (!lock) return(999); if (!Examine(lock,&fib)) { UnLock(lock); return(999); } UnLock(lock); return(Execute(fib.fib_Comment,0L,0L)); }