[comp.sources.amiga] click

ain@j.cc.purdue.edu (Patrick White) (06/22/88)

Submitted by:	peter@sugar.UUCP  (Peter de Silva)
Summary:	start a workbench program from CLI.
Poster Boy:	Patrick White	(ain@j.cc.purdue.edu)
Archive Name:	sources/amiga/volume5/click.sh.Z
untested
 
NOTES:
   Couldn't test it since it is written for Lattice (?) and I have Manx...
It needs a file "launch.h", which Peter assured me isn't needed for manx,
but I didn't bother to do the port.
 
 
-- Pat White   (co-moderator comp.sources/binaries.amiga)
ARPA/UUCP: j.cc.purdue.edu!ain  BITNET: PATWHITE@PURCCVM  PHONE: (317) 743-8421
U.S.  Mail:  320 Brown St. apt. 406,    West Lafayette, IN 47906
 
========================================
 
: 'click.shar Fri Mar  4 20:45:58 CST 1988' cut here
# click.shar Fri Mar  4 20:45:58 CST 1988 cut here
: This archive contains the following files...
: 'click.doc'
: 'click.c'
: 'Makefile'
: To extract them, run the following through /bin/sh
echo x - click.doc
sed 's/^X//' > click.doc << '//END'
XCLICK -- start a workbench application from the CLI.
X
XThis is an example of how you run a workbench application. As you can see,
Xit's pretty complex... even with the stuff encapsulated like this. However,
Xonce you get it working it works just fine... unlike the CLI. Just ask anyone
Xwho's tried to run a program under the CLI from, say, runback.
X
XUsage: click program
X
XLoads and executes program in a workbench environment, then returns to the
XCLI.
X
XAuthor: Peter da Silva.
//END
echo x - click.c
sed 's/^X//' > click.c << '//END'
X#include <exec/memory.h>
X#include <workbench/startup.h>
X#include <workbench/workbench.h>
X#include "launch.h"
X
Xmain(ac, av)
Xint ac;
Xchar **av;
X{
X	click(av[1]);
X}
X
XUBYTE *AllocMem();
Xstruct SegList *LoadSeg();
Xstruct MsgPort *CreateProc(), *CreatePort();
Xstruct WBStartup *BuildStartup();
X
Xstruct MsgPort *rport;
Xstruct WBStartup *startup;
X
Xcleanup(msg, name)
Xchar *msg;
Xchar *name;
X{
X	if(msg && name)
X		printf("click: %s: %s\n", name, msg);
X	if(startup)
X		FreeStartup(startup);
X	if(rport) DeletePort(rport);
X}
X
Xclick(name)
Xchar *name;
X{
X	rport = NULL;
X
X	rport = CreatePort(0, 0);
X	if(!rport) {
X		cleanup("Can't create reply port", name);
X		exit(20);
X	}
X
X	startup = BuildStartup(name);
X	if(!startup) {
X		cleanup("Can't load", name);
X		exit(20);
X	}
X
X	startup->sm_Message.mn_ReplyPort = rport;
X	startup->sm_Message.mn_Length = sizeof(struct WBStartup);
X	startup->sm_Message.mn_Node.ln_Type = NT_MESSAGE;
X
X	PutMsg(startup->sm_Process, startup);
X	WaitPort(rport);
X
X	cleanup(0, 0);
X	exit(0);
X}
X
XFreeStartup(msg)
Xstruct WBStartup *msg;
X{
X	if(msg->sm_ArgList) {
X		int i;
X		for(i = 0; i < msg->sm_NumArgs; i++) {
X			if(msg->sm_ArgList[i].wa_Lock)
X				UnLock(msg->sm_ArgList[i].wa_Lock);
X			if(msg->sm_ArgList[i].wa_Name)
X				FreeMem(msg->sm_ArgList[i].wa_Name,
X					strlen(msg->sm_ArgList[i].wa_Name)+1);
X		}
X		FreeMem(msg->sm_ArgList,
X			sizeof(struct WBArg) * msg->sm_NumArgs);
X	}
X	if(msg->sm_Segment)
X		UnLoadSeg(msg->sm_Segment);
X	if(msg->sm_ToolWindow)
X		FreeMem(msg->sm_ToolWindow,
X			strlen(msg->sm_ToolWindow)+1);
X	FreeMem(msg, sizeof(struct WBStartup));
X}
X
Xstruct WBStartup *
XBuildStartup(name)
Xchar *name;
X{
X	ULONG flock;
X	struct WBStartup *msg;
X	char *s, *namep;
X
X	msg = (struct WBStartup *)
X		AllocMem(sizeof(struct WBStartup), MEMF_PUBLIC|MEMF_CLEAR);
X	if(!msg)
X		return 0;
X
X	msg->sm_Segment = LoadSeg(name);
X	if(!msg->sm_Segment) {
X		FreeStartup(msg);
X		return 0;
X	}
X
X	msg->sm_ToolWindow = 0;
X
X	msg->sm_ArgList = (struct WBArg *)
X		AllocMem(sizeof(struct WBArg), MEMF_PUBLIC | MEMF_CLEAR);
X	if(!msg->sm_ArgList) {
X		FreeStartup(msg);
X		return 0;
X	}
X
X	msg->sm_NumArgs = 1;
X
X	flock = Lock(name);
X	if(!flock) {
X		FreeStartup(msg);
X		return 0;
X	}
X	msg->sm_ArgList[0].wa_Lock = ParentDir(flock);
X	UnLock(flock);
X	if(!msg->sm_ArgList[0].wa_Lock) {
X		FreeStartup(msg);
X		return 0;
X	}
X
X	namep = name;
X	for(s = name; *s; s++)
X		if(*s=='/' || *s==':')
X			namep = s+1;
X	msg->sm_ArgList[0].wa_Name = AllocMem(strlen(namep)+1, MEMF_PUBLIC);
X	if(!msg->sm_ArgList[0].wa_Name) {
X		FreeStartup(msg);
X		return 0;
X	}
X	strcpy(msg->sm_ArgList[0].wa_Name, namep);
X
X	msg->sm_Process =
X		CreateProc(msg->sm_ArgList[0].wa_Name, 0, msg->sm_Segment, 8192);
X	if(!msg->sm_Process) {
X		FreeStartup(msg);
X		return 0;
X	}
X
X	return msg;
X}
//END
echo x - Makefile
sed 's/^X//' > Makefile << '//END'
X.SUFFIXES: .c .o .h .x
X
X.c.o:
X	-delete $*.o
X	cc +P -B -DAMIGA $*.c
X
Xclick: click.o
X	-delete click
X	ln -o t:click click.o -lcl32
X	copy t:click click
X	-delete t:click
X
Xclick.arc: click.doc click click.c Makefile
X	arc a click click.doc click click.c Makefile
X
Xclick.shar: click.doc click.c Makefile
X	shar >click.shar click.doc click.c Makefile
//END
: end of archive.
exit 0