[comp.sources.amiga] v90i014: CShell 4.00A - alternative command interface, Part01/04

Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (01/16/90)

Submitted-by: PERUGIA@ICNUCEVM.CNUCE.CNR.IT (Carlo & Cesare)
Posting-number: Volume 90, Issue 014
Archive-name: unix/cshell-4.00a/part01

Shell provides a convient AmigaDos alternative command interface.  All
its commands are internal and thus does not rely on the c: commands
for any functionality.

New to 4.00A:

- This version is called 4.00A because it is not 100% compatible with
  previous versions. We choose to accept this in order to better support
  the new ARP.library 1.3.
- External commands are searched in a different order than before; Shell
  path is now searched AFTER current directory, AmigaDOS path and C:.
- ARP pattern matching has been implemented (in part for line arg expanding,
  fully for search -w).
- Internal changes for various optimizations.
- Search command has been improved in several ways.
- New commands: basename, tackon.
- New options: if -v, resident -d, fornum -v -s, dir -n.
- Fixed bugs with dir (some dirs remained locked), foreach -v, htype
  (blanks were treated as binary), info (for devices > 32M).
- rback command now works ok (run, however, doesn't).
- Oh, I forgot: it also has an AREXX port... And you don't even have to get
  AREXX to use it. See new commands rxsend, rxrec

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 1 (of 4)."
# Contents:  comm3.c globals.c main.c makefile rawconsole.c run.c set.c
#   shell.h shellfunctions.h
# Wrapped by tadguy@xanth on Mon Jan 15 11:28:07 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'comm3.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'comm3.c'\"
else
echo shar: Extracting \"'comm3.c'\" \(12209 characters\)
sed "s/^X//" >'comm3.c' <<'END_OF_FILE'
X/*
X * COMM3.C
X *
X * Version 4.00A by Carlo Borreo & Cesare Dieni 13-Jan-90
X *
X */
X
Xdo_assign() {
Xswitch(ac) {
X	case 1:  assignlist();
X		 break;
X	case 2:  doassign(av[1], NULL);
X		 break;
X	case 3:  doassign(av[1], av[2]);
X		 break;
X	default: ierror(NULL, 500);
X		 break;
X	}
Xreturn 0;
X}
X
Xchar *assign_errors[4]={
X	"",
X	"Name %s is not valid\n",
X	"Weird error\n",
X	"Can't cancel %s\n"
X	};
X
Xdoassign(log, phy)
Xchar *log, *phy;
X{
Xint last=strlen(log) - 1;
X
Xif (log[last] != ':') fprintf(stderr, "Bad name %s\n", log);
Xelse {
X	log[last] = 0;
X	fprintf(stderr,assign_errors[Assign(log, phy)],phy);
X	}
X}
X
Xassignlist()
X{
Xstruct DirectoryEntry *de_head=NULL, *de;
Xchar buf[256];
XBPTR lock;
Xint ctr=0;
X
XAddDADevs(&de_head, DLF_DEVICES | DLF_VOLUMES | DLF_DIRS);
Xprintf("Devices:\n");
Xfor (de=de_head; de && de->de_Type==DLX_DEVICE; de=de->de_Next) {
X	printf("%-8s",de->de_Name);
X	if (ctr++ == 5) { ctr=0; printf("\n"); }
X	}
Xprintf("\n\nVolumes:\n");
Xfor (	;
X	de && (de->de_Type==DLX_VOLUME || de->de_Type==DLX_UNMOUNTED);
X	de=de->de_Next
X	)
X	printf( "%-16s %s\n",
X		de->de_Name,
X		de->de_Type == DLX_VOLUME ? "[Mounted]" : ""
X		);
Xprintf("\nDirectories:\n");
Xfor (; de && de->de_Type==DLX_ASSIGN; de=de->de_Next) {
X	if (lock=Lock(de->de_Name, ACCESS_READ)) {
X		PathName(lock, buf, 256L);
X		UnLock(lock);
X		}
X	else
X		strcpy(buf,"Unexisting lock");
X	printf("%-20s%s\n",de->de_Name,buf);
X	}
XFreeDAList(&de_head);
X}
X
Xdo_join()
X{
XBPTR sou, dest;
Xchar *buffer;
Xunsigned int i;
Xlong n;
Xchar *namedest=av[--ac];
X
Xget_opt("r", &i);
Xif (options==0 && exists(namedest)) { ierror(namedest,203); return 20; }
Xif ( (buffer=malloc(8192)) == NULL ) { ierror(NULL,103); return 20; }
Xif ( (dest=Open(namedest, MODE_NEWFILE)) == NULL )
X	{ pError(namedest); goto fail1; }
Xfor (i=1; i<ac; i++) {
X	if ( (sou=Open(av[i], MODE_OLDFILE)) == NULL ) pError(av[i]);
X	else
X		while( (n=Read(sou, buffer, 8192L)) > 0 )
X			if (Write(dest, buffer, n) != n)
X				{ pError(namedest); Close(sou); goto fail2; }
X	Close(sou);
X	}
Xfail2:
X	Close(dest);
Xfail1:
X	free(buffer);
X	return 0;
X}
X
X#define BUFDIM 512L
X#define MAXSTR 256
X
Xint minstr;
X
Xstrings_in_file(s)
Xchar *s;
X{
Xchar c;
Xchar readbuf[BUFDIM+1], strbuf[MAXSTR+1];
Xregister unsigned int i, strctr=0;
XBPTR fh;
Xint out, n;
X
Xif ( fh=Open(s, MODE_OLDFILE) ) {
X	fprintf(stderr, "Strings in %s (len>=%d):\n",s,minstr);
X	while ( (n=(int)Read(fh, readbuf, BUFDIM)) > 0 && !CHECKBREAK() )
X	    for (i=0; i<n; i++) {
X		c=readbuf[i];
X		if (c<0x20 || c>0x7f) {
X			out=(strctr>=minstr);
X			if (!out) strctr=0;
X			}
X		else {
X			strbuf[strctr++]=c;
X			out=(strctr>=BUFDIM);
X			}
X		if (out) {
X			strbuf[strctr]='\0';
X			puts(strbuf);
X			strctr=0;
X			}
X		}
X	Close(fh);
X	}
Xelse pError(s);
X}
X
Xdo_strings()
X{
Xminstr=myatoi(av[--ac],1,255);
Xall_args("r", strings_in_file, 0);
Xreturn 0;
X}
X
XBPTR myfile[MAXMYFILES];
X
Xdo_open()
X{
Xlong mode;
Xunsigned int n;
X
Xswitch (toupper(av[2][0])) {
X	case 'R': mode=MODE_OLDFILE; break;
X	case 'W': mode=MODE_NEWFILE; break;
X	default : ierror(NULL,500); return;
X	}
Xn=(unsigned int)myatoi(av[3],0,MAXMYFILES-1); if (atoierr) return 20;
Xif (myfile[n]) myclose(n);
Xmyfile[n]=Open(av[1],mode);
Xreturn (myfile[n]==NULL);
X}
X
Xdo_close()
X{
Xregister unsigned int i;
Xint n;
X
Xif (ac==1)
X	for (i=1; i<MAXMYFILES; i++)
X		myclose(i);
Xfor (i=1; i<ac; i++) {
X	n=myatoi(av[i],0,MAXMYFILES-1); if (atoierr) return 20;
X	myclose(n);
X	}
Xreturn 0;
X}
X
Xmyclose(n)
X{
Xif (myfile[n]) { Close(myfile[n]); myfile[n]=NULL; }
X}
X
Xdo_fileslist()
X{
Xregister unsigned short i;
Xint flag=0;
X
Xprintf("Open files:");
Xfor (i=0; i<MAXMYFILES; i++)
X	if (myfile[i]) { printf(" %d",i); flag=1; }
Xif (!flag) printf(" None!");
Xprintf("\n");
Xreturn 0;
X}
X
XBPTR extOpen(name,mode)
Xchar *name;
Xlong mode;
X{
Xif (name[0]=='.') return myfile[atoi(name+1)];
Xreturn Open(name,mode);
X}
X
XextClose(fh)
XBPTR fh;
X{
Xregister unsigned short i;
X
Xfor (i=0; i<MAXMYFILES; i++)
X	if (myfile[i]==fh) return;
XClose(fh);
X}
X
Xdo_basename()
X{
Xset_var(LEVEL_SET, av[1], BaseName(av[2]));
Xreturn 0;
X}
X
Xdo_tackon()
X{
Xchar buf[256];
X
Xstrcpy(buf, av[2]);
XTackOn(buf, av[3]);
Xset_var(LEVEL_SET, av[1], buf);
Xreturn 0;
X}
X
Xdo_resident()
X{
Xunsigned int i;
Xregister struct ResidentProgramNode *p;
Xchar buf[256];
X
Xget_opt("ard", &i);
Xif (options==0 && ac>1) options=1;
Xswitch (options) {
X    case 0:
X	ObtainSemaphore (& (ArpBase->ResPrgProtection) );
X	if (p=ArpBase->ResidentPrgList) {
X		printf("Name             Users Access\n");
X		for (; p; p=p->rpn_Next)
X			printf("%-17s%5ld%6ld\n",
X				p->rpn_Name-2, (long)p->rpn_Usage, (long)p->rpn_AccessCnt);
X		}
X	else printf("No resident program(s)\n");
X	ReleaseSemaphore(& (ArpBase->ResPrgProtection) );
X	break;
X    case 1:
X	for (; i<ac; i++)
X		if (loadres(av[i]))
X			printf("OK! %s is now resident\n", BaseName(av[i]));
X		else pError(av[i]);
X	break;
X    case 2:
X	for (; i<ac; i++)
X		if (RemResidentPrg(av[i])) ierror(av[i],202);
X		else printf("Removed %s\n",av[i]);
X	break;
X    case 4:
X	for (; i<ac; i++) {
X		sprintf(buf,"res_%s",av[i]);
X		Setenv(buf,"1");
X		}
X	break;
X    default:
X	ierror(NULL,500);
X	break;
X    }
Xreturn 0;
X}
X
Xint loadres(s)
Xchar *s;
X{
XBPTR seg;
X
Xif (seg=(BPTR)LoadPrg(s)) AddResidentPrg(seg,BaseName(s));
Xreturn (seg != NULL);
X}
X
Xstruct ProcessControlBlock pcb={
X	4000,		/* pcb_StackSize	*/
X	0,		/* pcb_Pri		*/
X	};
X/* remaining field are NULL */
X	
Xdo_truerun(avline, backflag)
Xchar *avline;
X{
Xchar name[200];
Xchar *FindIt();
X
Xif (backflag) {
X	pcb.pcb_Control=NULL;
X	pcb.pcb_Input=pcb.pcb_Output=Open("NIL:",MODE_OLDFILE);
X	}
Xelse {
X	pcb.pcb_Control=NULL;
X	pcb.pcb_Input=pcb.pcb_Output =NULL;
X	}
Xif (FindIt(av[1], "", name))
X	ASyncRun(name,next_word(next_word(avline)),&pcb);
Xelse
X	ierror(av[1],205);
Xreturn 0;
X}
X
Xint exists(name)
Xchar *name;
X{
XBPTR lock;
X
Xif (lock=Lock(name,ACCESS_READ)) {
X	UnLock(lock);
X	return 1;
X	}
Xreturn 0;
X}
X
Xdo_aset()
X{
XSetenv(av[1],av[2]);
Xreturn 0;
X}
X
X#define HTYPELINE 16L
X
Xhtype_a_file(s)
Xchar *s;
X{
XBPTR fh;
Xlong n, filesize=0;
Xchar buf[HTYPELINE+1];
Xregister unsigned short i;
X
Xif ( (fh=Open(s,MODE_OLDFILE))==NULL ) { pError(s); return 20; }
Xwhile ( (n=Read(fh,buf,HTYPELINE))>0 && !dobreak()) {
X	printf("%06lx: ",filesize);
X	filesize+=n;
X	for (i=0; i<n; i++) {
X		printf( (i&3) ? "%02x" : " %02x",(int)(unsigned char)buf[i]);
X		if (buf[i]<0x20) buf[i]='.';
X		}
X	for ( ; i<HTYPELINE; i++) {
X		printf( (i&3) ? "  " : "   ");
X		buf[i]=' ';
X		}
X	buf[i]=0;
X	printf("    %s\n",buf);
X	}
XClose(fh);
Xreturn 0;
X}
X
Xdo_htype()
X{
Xall_args("", htype_a_file, 0);
Xreturn 0;
X}
X
Xdo_stack()
X{
Xlong n;
X
Xif (ac>1) {
X	n=Atol(av[1]);
X	if (!IoErr()) Mycli->cli_DefaultStack=(long)(n >> 2L);
X	}
Xelse printf("current stack size is %ld bytes\n",
X				(long)Mycli->cli_DefaultStack << 2L);
Xreturn 0;
X}
X
Xdo_fault()
X{
Xstruct PERROR *p;
Xregister unsigned int i;
Xint n;
X
Xfor (i=1; i<ac; i++) {
X	n=myatoi(av[i],0,32767);
X	if (!atoierr) {
X		for (p=Perror; p->errnum && p->errnum!=n; p++);
X		if (p->errnum)
X			printf("Fault %d: %s\n",n,p->errstr);
X		else
X			printf("Fault %d not recognized\n",n);
X		}
X	}
Xreturn 0;
X}
X
Xstruct rpncommand {
X	char *str;
X	int parsin, parsout;
X	};
X
Xstruct rpncommand rpn[]={
X	"+",	2,	1,
X	"-",	2,	1,
X	"*",	2,	1,
X	"/",	2,	1,
X	"%",	2,	1,
X	"&",	2,	1,
X	"|",	2,	1,
X	"~",	1,	1,
X	">",	2,	1,
X	"<",	2,	1,
X	"==",	2,	1,
X	"!",	1,	1,
X	"DUP",	1,	2,
X	"DROP",	1,	0,
X	"SWAP",	2,	2,
X	"HELP",	0,	0,
X	NULL,	0,	1,	/* this looks for a number */
X};
X
Xdo_rpn(garbage,ifflag) /* ifflag!=0 if called from if */
Xchar *garbage;
X{
Xregister long n0, n1;
Xlong t;
Xunsigned int i, j;
Xint sp=0;
Xlong stack[100];
Xstruct rpncommand *temp;
X
Xi=1;
Xif (ifflag) get_opt("rn",&i);
Xfor (; i<ac; i++) {
X	for (j=0; rpn[j].str && Strcmp(rpn[j].str,av[i]); j++) ;
X	n0=stack[sp-1];
X	n1=stack[sp-2];
X	sp -= (rpn[j].parsin);
X	if (sp<0) { fprintf(stderr, "RPN: Empty stack\n"); return 1; }
X	switch (j) {
X	  case 0:	n0 += n1;		break;
X	  case 1:	n0 = n1-n0;		break;
X	  case 2:	n0 *= n1;		break;
X	  case 3:	n0 = n1/n0;		break;
X	  case 4:	n0 = n1%n0;		break;
X	  case 5:	n0 &= n1;		break;
X	  case 6:	n0 |= n1;		break;
X	  case 7:	n0 =  ~n0;		break;
X	  case 8:	n0 = (n1 > n0);		break;
X	  case 9:	n0 = (n1 < n0);		break;
X	  case 10:	n0 = (n0 == n1);	break;
X	  case 11:	n0 = !n0;		break;
X	  case 12:	n1=n0;			break;
X	  case 13:	t=n0; n0=n1; n1=t;	break;
X	  case 14:				break;
X	  case 15:	printf("In Commands Out\n");
X			for (temp=rpn; temp->str; temp++)
X			    printf(" %d %-10s%d\n",
X				temp->parsin,temp->str,temp->parsout);
X			break;
X	  default:	n0=Atol(av[i]);
X			if (IoErr()) {
X				fprintf(stderr, "Bad RPN cmd: %s\n",av[i]);
X				return 20;
X				}
X			break;
X	  }
X	stack[sp]=n0;
X	stack[sp+1]=n1;
X	sp += rpn[j].parsout;
X	}
Xif (ifflag) return (int)(stack[sp-1]);	/* called from if: return top value */
Xfor (i=sp-1;(int)i>=0;i--) printf("%ld\n", stack[i]); /* else print stack */
Xreturn 0;
X}
X
Xdo_path()
X{
Xunion {	long *lp; long ll; } l;
Xchar buf[256];
X
Xputs("Current dir");
Xl.lp = (long *) Mycli->cli_CommandDir;
Xwhile (l.ll) {
X	l.ll <<= 2;
X	PathName(l.lp[1], buf, 256L);
X	puts(buf);
X	l.ll = *l.lp;
X	}
Xputs("C:");
Xreturn 0;
X}
X
Xdo_pri()
X{
Xint t, pri;
Xstruct Process *proc;
X
Xt=myatoi(av[1],0,20); if (atoierr) return 20;
Xpri=myatoi(av[2],-128,127); if (atoierr) return 20;
XForbid();
Xproc=(t==0 ? Myprocess : FindCLI((long)t));
Xif (proc==NULL) fprintf(stderr, "process not found\n");
X	else SetTaskPri(proc, (long)pri);
XPermit();
Xreturn 0;
X}
X
Xdo_strleft()
X{
Xchar buf[256];
Xint n;
X
Xstrcpy(buf,av[2]);
Xn=myatoi(av[3],1,strlen(buf)); if (atoierr) return 20;
Xbuf[n]='\0';
Xset_var(LEVEL_SET, av[1], buf);
Xreturn 0;
X}
X
Xdo_strright()
X{
Xchar buf[256];
Xint n;
X
Xstrcpy(buf, av[2]);
Xn=myatoi(av[3],1,strlen(buf)); if (atoierr) return 20;
Xset_var(LEVEL_SET, av[1], buf+strlen(buf)-n);
Xreturn 0;
X}
X
Xdo_strmid()
X{
Xchar buf[256];
Xint n1, n2;
X
Xstrcpy(buf, av[2]);
Xn1=myatoi(av[3],1,strlen(buf))-1; if (atoierr) return 20;
Xif (ac>4) {
X	n2=myatoi(av[4],1,strlen(buf)-n1); if (atoierr) return 20;
X	buf[n1+n2]='\0';
X	}
Xset_var(LEVEL_SET, av[1], buf+n1);
Xreturn 0;
X}
X
Xdo_strlen()
X{
Xchar buf[16];
X
Xsprintf(buf,"%d",strlen(av[2]));
Xset_var(LEVEL_SET, av[1], buf);
Xreturn 0;
X}
X
Xint atoierr;
X
Xmyatoi(s,min,max)
Xchar *s;
X{
Xint n;
X
Xn=(int)(long)Atol(s);
Xif (atoierr=IoErr())
X	ierror(s,511);
X	else if (n<min || n>max) {
X		atoierr=1;
X		printf("%s(%d) not in (%d,%d)\n",s,n,min,max);
X		}
Xreturn n;
X}
X
Xdo_fltlower()
X{
Xchar buf[256], *s;
X
Xwhile (!CHECKBREAK() && gets(buf)) {
X	for (s=buf; *s; s++) *s=tolower(*s);
X	puts(buf);
X	}
Xreturn 0;
X}
X
Xdo_fltupper()
X{
Xchar buf[256], *s;
X
Xwhile (!CHECKBREAK() && gets(buf)) {
X	for (s=buf; *s; s++) *s=toupper(*s);
X	puts(buf);
X	}
Xreturn 0;
X}
X
X#define RXFB_RESULT  17
X
Xstatic struct rexxmsg {
X	struct Message cm_Node;
X	LONG   RFU1;
X	LONG   RFU2;
X	LONG   rm_Action;
X	LONG   rm_Result1;
X	LONG   rm_Result2;
X	char   *cm_Args[16];
X	LONG   RFU7;
X	LONG   RFU8;
X	LONG   RFU9;
X	LONG   RFU10;
X	LONG   RFU11;
X	LONG   RFU12;
X} mymsg;
X
Xdo_rxsend()
X{
Xint i=1, resflag;
Xchar *result;
Xstruct MsgPort *port, *reply;
Xlong len;
X
Xget_opt("r", &i);
Xresflag=options;
Xif (!(port = FindPort(av[i++]))) { fprintf(stderr, "No port %s!\n", av[--i]); return 20; }
Xmymsg.cm_Node.mn_Node.ln_Type = NT_MESSAGE;
Xmymsg.cm_Node.mn_Length = sizeof(struct rexxmsg);
Xmymsg.rm_Action = (resflag ? 1L << RXFB_RESULT : 0);
Xif (!(reply = CreatePort(NULL, 0L))) {
X	fprintf(stderr, "No reply port\n");
X	return 20;
X	}
Xmymsg.cm_Node.mn_ReplyPort = reply;
X
Xfor ( ; i<ac; i++) {
X	mymsg.cm_Args[0] = av[i];
X	mymsg.rm_Result2 = 0;	/* clear out the last result. */
X	PutMsg(port, &mymsg.cm_Node);
X	WaitPort(reply);
X
X	if (resflag) {
X		result=(char *)mymsg.rm_Result2;
X		len=*( (long *)(result-4) );
X		if (len<0 || len>256)
X			fprintf(stderr, "Risultato troppo lungo\n");
X		else
X			printf("%s\n", result);
X		FreeMem(result, len);
X		}
X	}
X
Xif (reply) DeletePort(reply);
Xreturn 0;
X}
X
Xdo_rxrec()
X{
Xstruct MsgPort *port;
Xstruct rexxmsg *msg;
Xchar *portname, *str;
X
Xif (ac > 1)
X	portname=av[1];
Xelse
X	portname="rexx_csh";
X
Xport=CreatePort(portname, 0L);
Xif (port==NULL) {
X	fprintf(stderr, "Can't have MsgPort %s\n", portname);
X	return 20;
X	}
Xfor (;;) {
X	WaitPort(port);
X	while (msg=(struct rexxmsg *)GetMsg(port)) {
X		if ( ! Strcmp(msg->cm_Args[0], "bye")) {
X			DeletePort(port);
X			return 0;
X			}
X		exec_command(msg->cm_Args[0]);
X		if (msg->rm_Action & (1L << RXFB_RESULT)) {
X			str = get_var(LEVEL_SET, v_lasterr);
X			msg->rm_Result2=(str) ? atoi(str) : 20;
X			}
X		ReplyMsg((struct Message *)msg);
X		}
X	}
X}
END_OF_FILE
if test 12209 -ne `wc -c <'comm3.c'`; then
    echo shar: \"'comm3.c'\" unpacked with wrong size!
fi
# end of 'comm3.c'
fi
if test -f 'globals.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'globals.c'\"
else
echo shar: Extracting \"'globals.c'\" \(3551 characters\)
sed "s/^X//" >'globals.c' <<'END_OF_FILE'
X
X/*
X * GLOBALS.C
X *
X * (c)1986 Matthew Dillon     9 October 1986
X *
X * Version 2.07M by Steve Drew 10-Sep-87
X *
X *    Most global variables.
X *
X * Version 4.00A by Carlo Borreo & Cesare Dieni 13-Jan-90
X *
X */
X
Xchar v_titlebar	[]="_titlebar";	/* Window title				*/
Xchar v_prompt	[]="_prompt";	/* your prompt (ascii command)		*/
Xchar v_hist	[]="_history";	/* set history depth (value)		*/
Xchar v_histnum	[]="_histnum";	/* set history numbering var		*/
Xchar v_debug	[]="_debug";	/* set debug mode			*/
Xchar v_verbose	[]="_verbose";	/* set verbose for source files		*/
Xchar v_stat	[]="_maxerr";	/* worst return value to date		*/
Xchar v_lasterr	[]="_lasterr";	/* return value from last comm.		*/
Xchar v_cwd	[]="_cwd";	/* current directory			*/
Xchar v_except	[]="_except";	/* "nnn;command"			*/
Xchar v_passed	[]="_passed";	/* passed arguments to source file	*/
Xchar v_path	[]="_path";	/* search path for external commands	*/
Xchar v_gotofwd	[]="_gtf";	/* set name for fwd goto name		*/
Xchar v_linenum	[]="_linenum";	/* name for forline line #		*/
X
Xstruct HIST *H_head, *H_tail;	/* HISTORY lists */
X
Xstruct PERROR Perror[]= {	/* error code->string */
X	103,	"Insufficient free storage",
X	105,	"Task table full",
X	120,	"Argument line invalid or too long",
X	121,	"File is not an object module",
X	122,	"Invalid resident library during load",
X	201,	"No default directory",
X	202,	"Object in use",
X	203,	"Object already exists",
X	204,	"Directory not found",
X	205,	"Object not found",
X	206,	"Bad stream name",
X	207,	"Object too large",
X	209,	"Action not known",
X	210,	"Invalid stream component name",
X	211,	"Invalid object lock",
X	212,	"Object not of required type",
X	213,	"Disk not validated",
X	214,	"Disk write protected",
X	215,	"Rename across devices",
X	216,	"Directory not empty",
X	217,	"Too many levels",
X	218,	"Device not mounted",
X	219,	"Seek error",
X	220,	"Comment too long",
X	221,	"Disk full",
X	222,	"File delete protected",
X	223,	"File write protected",
X	224,	"File read protected",
X	225,	"Not a DOS disk",
X	226,	"No disk",
X
X /* custom error messages */
X
X	500,	"Bad arguments",
X	501,	"Label not found",
X	502,	"Must be within source file",
X	503,	"Syntax Error",
X	504,	"Redirection error",
X	505,	"Pipe error",
X	506,	"Too many arguments",
X	507,	"Destination not a directory",
X	508,	"Cannot mv a filesystem",
X	509,	"Error in command name",
X	510,	"Bad drive name",
X	511,	"Illegal number",
X	0,	NULL
X};
X
Xchar *av[MAXAV];		/* Internal argument list		*/
Xlong Src_base[MAXSRC];		/* file pointers for source files	*/
Xlong Src_pos[MAXSRC];		/* seek position storage for same	*/
Xchar If_base[MAXIF];		/* If/Else stack for conditionals	*/
Xint H_len, H_tail_base;		/* History associated stuff		*/
Xint H_stack;			/* AddHistory disable stack		*/
Xint E_stack;			/* Exception disable stack		*/
Xint Src_stack, If_stack;	/* Stack Indexes			*/
Xint forward_goto;		/* Flag for searching for foward lables	*/
Xint ac;				/* Internal argc			*/
Xint debug;			/* Debug mode				*/
Xint disable;			/* Disable com. execution (conditionals)*/
Xint Verbose;			/* Verbose mode for source files	*/
Xint Lastresult;			/* Last return code			*/
Xint Exec_abortline;		/* flag to abort rest of line		*/
Xint Quit;			/* Quit flag				*/
Xlong Cout, Cin;			/* Current input and output file handles*/
Xlong Cout_append;		/* append flag for Cout			*/
Xchar *Cin_name, *Cout_name;	/* redirection input/output name or NULL*/
Xchar *Pipe1, *Pipe2;		/* the two pipe temp. files		*/
Xstruct Process *Myprocess;
Xstruct CommandLineInterface *Mycli;
Xint S_histlen = 20;		/* Max # history entries		*/
Xunsigned int options;
END_OF_FILE
if test 3551 -ne `wc -c <'globals.c'`; then
    echo shar: \"'globals.c'\" unpacked with wrong size!
fi
# end of 'globals.c'
fi
if test -f 'main.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'main.c'\"
else
echo shar: Extracting \"'main.c'\" \(4977 characters\)
sed "s/^X//" >'main.c' <<'END_OF_FILE'
X/*
X * MAIN.C
X *
X * Matthew Dillon, 24 Feb 1986
X * (c)1986 Matthew Dillon     9 October 1986
X *
X * Version 2.07M by Steve Drew 10-Sep-87
X *
X * Version 4.00A by Carlo Borreo & Cesare Dieni 13-Jan-90
X *
X */
X
Xchar shellname[]="Shell V4.00A";
Xchar shellctr []="CshCounter";
X
Xint aux; /* for use with aux: driver */
Xchar *oldtitle;
Xchar trueprompt[100];
Xchar Inline[260];
Xstruct IntuitionBase *IntuitionBase;
Xstruct Window *w;
Xstruct ArpBase *ArpBase;
X
Xmain(argc, argv)
Xregister char *argv[];
X{
X#if RAW_CONSOLE
X	char *rawgets();
X#endif
X
Xregister unsigned int i;
Xextern int Enable_Abort;
Xchar buf[10];
Xstatic char pipe1[32], pipe2[32];
Xstruct Window *getwindow();
X
XArpBase=(struct ArpBase *)OpenLibrary("arp.library",34L);
Xif (ArpBase==NULL) { printf("No arp library\n"); exit(0); }
X
XForbid();
Xi=0;
Xif (Getenv(shellctr,buf,10L)) {
X	i=(int)(long)Atol(buf);
X	if (IoErr()) i=0;
X	}
Xsprintf(buf,"%d",i+1);
XSetenv(shellctr,buf);
XPermit();
X
XIntuitionBase=(struct IntuitionBase *)ArpBase->IntuiBase;
X
Xstdin->_flags	|= 0x80;	/* make sure we're set as a tty */
Xstdout->_flags	|= 0x80;	/* in case of redirection in .login */
XClose(_devtab[2].fd);
X_devtab[2].mode |= O_STDIO;
X_devtab[2].fd = _devtab[1].fd;	/* set stderr to Output() otherwise */
X				/* don't work with aux driver */
XMyprocess = (struct Process *)FindTask(0L);
XMycli=(struct CommandLineInterface *)((long)Myprocess->pr_CLI << 2);
Xw=getwindow();
XPipe1 = pipe1;
XPipe2 = pipe2;
Xsprintf(pipe1, "ram:pipe1_%ld", Myprocess);
Xsprintf(pipe2, "ram:pipe2_%ld", Myprocess);
X
Xsprintf(buf,"%ld",Myprocess->pr_TaskNum);
Xset_var(LEVEL_SET, "_clinumber", buf);
X
Xoldtitle=(char *)(w->Title);
X
Xset_var(LEVEL_SET, v_titlebar, shellname);
Xset_var(LEVEL_SET, v_prompt,
X	(IsInteractive(Input())) ? "\23337m%p> \2330m" : "");
Xset_var(LEVEL_SET, v_hist, "20");
Xset_var(LEVEL_SET, v_lasterr, "0");
Xset_var(LEVEL_SET, v_stat, "0");
Xset_var(LEVEL_SET, v_path, "RAM:,RAM:c/,df0:c/,df1:c/,sys:system/");
Xset_var(LEVEL_SET, "_insert", "1");
Xset_var(LEVEL_SET, "f1", "cdir df0:\15");
Xset_var(LEVEL_SET, "F1", "cdir df1:\15");
Xset_var(LEVEL_SET, "f3", "cdir RAM:\15");
Xset_var(LEVEL_SET, "F3", "cdir vd0:\15");
Xset_var(LEVEL_SET, "f4", "cd df0:\15");
Xset_var(LEVEL_SET, "F4", "cd df1:\15");
Xset_var(LEVEL_SET, "f5", "cls; ls\15");
Xset_var(LEVEL_SET, "F5", "cdir ");
Xset_var(LEVEL_SET, "f6", "lc\15");
Xset_var(LEVEL_SET, "f7", "info\15");
Xset_var(LEVEL_SET, "F7", "assign \15");
Xset_var(LEVEL_SET, "f8", "window -lf\15");
Xset_var(LEVEL_SET, "F8", "window -sb\15");
Xset_var(LEVEL_SET, "f10", "cls\15");
Xset_var(LEVEL_SET, "F10", "exit\15");
Xset_var(LEVEL_ALIAS, "cls", "echo -n ^l");
Xset_var(LEVEL_ALIAS, "lc", "ls -s");
Xset_var(LEVEL_ALIAS, "kr", "rm -r RAM:* >NIL:");
Xset_var(LEVEL_ALIAS, "cdir", "%q cd $q; cls; dir");
Xset_var(LEVEL_ALIAS, "exit", "endcli;quit");
Xset_var(LEVEL_ALIAS, "lp", "cat >PRT:");
Xseterr();
Xif (Myprocess->pr_CurrentDir == NULL)
X	do_cd("x :");
Xelse do_pwd(NULL);
XEnable_Abort = 0;
X
Xif (exists(av[1] = "S:.login")) do_source("x S:.login");
X
Xfor (i = 1; i < argc; ++i) {
X	if (!strcmp(argv[i],"-c")) {
X		Inline[0] = ' ';
X		Inline[1] = '\0';
X		while (++i < argc)
X			{ strcat(Inline,argv[i]); strcat(Inline," "); }
X		exec_command(Inline);
X		main_exit(Lastresult);
X		}
X	if (!strcmp(argv[i],"-a")) { aux = 1; continue; }
X	sprintf (Inline, "source %s",argv[i]);
X	av[1] = argv[i];
X	do_source (Inline);
X	}
Xfor (;;) {
X   if (breakcheck())
X	while (WaitForChar(Input(), 100L) || stdin->_bp < stdin->_bend)
X		gets(Inline);
X   clearerr(stdin);  /* prevent acidental quit */
X#if RAW_CONSOLE
X   if (Quit || !rawgets(Inline, disable ? "_ " : trueprompt)) main_exit(0);
X#else
X   printf("%s", disable ? "_ " : trueprompt);
X   fflush(stdout);
X   if (Quit || !gets(Inline)) main_exit(0);
X#endif
X   breakreset();
X   if (*Inline) exec_command(Inline);
X   }
X}
X
Xmain_exit(n)
X{
Xregister unsigned short i;
Xchar buf[10];
X
XGetenv(shellctr,buf,10L);
Xi=(int)Atol(buf);
Xsprintf(buf,"%d",i-1);
XSetenv(shellctr,buf);
XSetWindowTitles(w,oldtitle,-1L);
Xfor (i=1; i<MAXMYFILES; i++) myclose((int)i);
XArpExit(0L,0L);			/* Intuition need not to be closed */
X}
X
Xbreakcheck()
X{
Xreturn (int)(SetSignal(0L,0L) & SIGBREAKF_CTRL_C);
X}
X
Xbreakreset()
X{
XSetSignal(0L, SIGBREAKF_CTRL_C);
X}
X
Xdobreak()
X{
Xif (breakcheck()) { printf("^C\n"); return(1); }
Xreturn(0);
X}
X
X/* this routine causes manx to use this Chk_Abort() rather than it's own */
X/* otherwise it resets our ^C when doing any I/O (even when Enable_Abort */
X/* is zero).  Since we want to check for our own ^C's			 */
X
XChk_Abort()
X{
Xreturn(0);
X}
X
X_wb_parse()
X{
X}
X
Xdo_howmany()
X{
Xchar buf[10];
X
XGetenv(shellctr, buf, 10L);
Xprintf("Shell(s) running: %s\n",buf);
X}
X
Xstruct Window *getwindow()
X{
Xstruct InfoData *infodata;
Xstruct Window *win;
Xlong args[8];
X
Xinfodata=AllocMem((long)sizeof(struct InfoData),MEMF_CLEAR | MEMF_PUBLIC);
Xargs[0]=(long)infodata >> 2;
XSendPacket(ACTION_DISK_INFO,args,Myprocess->pr_ConsoleTask);
Xwin=(struct Window *)infodata->id_VolumeNode;
XFreeMem(infodata,(long)sizeof(struct InfoData));
Xreturn win;
X}
END_OF_FILE
if test 4977 -ne `wc -c <'main.c'`; then
    echo shar: \"'main.c'\" unpacked with wrong size!
fi
# end of 'main.c'
fi
if test -f 'makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'makefile'\"
else
echo shar: Extracting \"'makefile'\" \(1019 characters\)
sed "s/^X//" >'makefile' <<'END_OF_FILE'
X######################################################################
X#
X# Makefile to build Shell 4.00A
X# by Carlo Borreo & Cesare Dieni 13-Gen-90
X#
X######################################################################
X
XOBJS	= run.o main.o comm1.o comm2.o comm3.o execom.o set.o sub.o \
X	  globals.o rawconsole.o
X
XINCL	= shell.h
X
XShell   : Shell.syms $(OBJS)
X	ln  +q -m -o Shell $(OBJS) -la -lc32
X
XShell.syms : $(INCL)
X	cc +L +HShell.syms shell.h -DAZTEC_C
X
Xrawconsole.o : rawconsole.c $(INCL)
X	cc +L +IShell.syms rawconsole.c
X
Xrun.o   : run.c $(INCL)
X	cc +L +IShell.syms run.c
X
Xmain.o  : main.c $(INCL)
X	cc +L +IShell.syms main.c
X
Xcomm1.o : comm1.c $(INCL)
X	cc +L +IShell.syms comm1.c
X
Xcomm2.o : comm2.c $(INCL)
X	cc +L +IShell.syms comm2.c
X
Xcomm3.o : comm3.c $(INCL)
X	cc +L +IShell.syms comm3.c
X
Xset.o   : set.c $(INCL)
X	cc +L +IShell.syms set.c
X
Xsub.o   : sub.c $(INCL)
X	cc +L +IShell.syms sub.c
X
Xglobals.o : globals.c $(INCL)
X	cc +L +IShell.syms globals.c
X
Xexecom.o : execom.c $(INCL)
X	cc +L +IShell.syms execom.c
END_OF_FILE
if test 1019 -ne `wc -c <'makefile'`; then
    echo shar: \"'makefile'\" unpacked with wrong size!
fi
# end of 'makefile'
fi
if test -f 'rawconsole.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rawconsole.c'\"
else
echo shar: Extracting \"'rawconsole.c'\" \(9156 characters\)
sed "s/^X//" >'rawconsole.c' <<'END_OF_FILE'
X/*
X * RawConsole.c
X *
X * Shell 2.07M  17-Jun-87
X * console handling, command line editing support for Shell
X * using new console packets from 1.2.
X * Written by Steve Drew. (c) 14-Oct-86.
X * 16-Dec-86 Slight mods to rawgets() for Disktrashing.
X *
X * Version 4.00A by Carlo Borreo & Cesare Dieni 13-Jan-90
X *
X */
X
X#if RAW_CONSOLE
X
Xchar *tyahdptr;
X
Xmyget()
X{
Xif (*tyahdptr) return *tyahdptr++;
Xreturn getchar();
X}
X
Xextern int aux; /* for use with aux: */
X
X#define SETRAW setrawcon(-1L);
X#define SETCON setrawcon(0L);
X
Xint width;
X
Xnewwidth()
X{
Xextern struct Window *w;
X
Xwidth=(w->Width- (w->BorderLeft + w->BorderRight)) / w->RPort->TxWidth;
X}
X
Xchar *rawgets(line,prompt)
Xchar *line, *prompt;
X{
Xchar *get_var();
Xchar *gets();
Xregister int n, pl;
Xregister int max, i;
Xunsigned char c1,c2,c3;
Xchar fkeys[5];
Xchar *s;
Xchar *ps;
Xchar typeahd[256];
Xint fkey, savn;
Xint insert = 1;
Xint recall = -1;
Xstruct HIST *hist;
X
Xnewwidth();
X
Xif (aux) {
X	printf("%s",prompt);
X	fflush(stdout);
X	}
Xif (!IsInteractive(Input()) || aux ) return(gets(line));
Xif (WaitForChar((long)Input(), 100L) ||   /* don't switch to 1L ...*/
X		stdin->_bp < stdin->_bend) {     /* else causes read err's*/
X	gets(line);
X	return(line);
X	}
XSETRAW;
Xprintf("\015%s\2336n",prompt);
Xsavn = pl = n = 0;
Xtyahdptr = typeahd;
Xwhile((typeahd[n]=getchar()) != 'R') {
X	if ((unsigned char)typeahd[n] == 155) savn = n;
X	n++;
X	}
X	/* typeahd now contains possible type a head chars
X	   followed by <CSI> cursor position report.
X	*/
Xtypeahd[savn]  = '\0';
Xif (typeahd[n-2] != ';') pl = (typeahd[n-2] - 48) * 10;
Xpl += typeahd[n-1] - 49;
Xps = line + pl;
Xline[max = i = pl] = '\0';
X
Xif (s = get_var (LEVEL_SET, "_insert")) insert = atoi(s) ? 1 : 0;
X
Xwhile( (c1 = myget()) != 255) {
X        switch(c1) {
X            case 155:
X                 c2 = myget();
X                 switch(c2) {
X                     case 'A':                  /* up arrow   */
X                        n = ++recall;
X                     case 'B':                  /* down arrow */
X                        line[pl] = '\0';
X                        if (recall >= 0 || c2 == 'A') {
X                            if (c2 == 'B') n = --recall;
X                            if (recall >= 0) {
X                                for(hist = H_head; hist && n--;
X                                    hist = hist->next);
X                                if (hist) strcpy(&line[pl],hist->line);
X                                else recall = H_len;
X                            }
X                        }
X                        if (i != pl)
X                            printf("\233%dD",i);
X                        printf("\015\233J%s%s",prompt,ps);
X                        i = max = strlen(ps) + pl;
X                        break;
X                     case 'C':                  /* right arrow*/
X                        if (i < max) {
X                            i++;
X                            printf("\233C");
X                        }
X                        break;
X                     case 'D':                  /* left arrow */
X                        if (i > pl) {
X                            i--;
X                            printf("\233D");
X                        }
X                        break;
X                     case 'T':           /* shift-up   */
X                       n = recall = H_len-1;
X                     case 'S':           /* shift-down */
X                       line[pl] = '\0';
X                       if (c2 == 'S') {
X                           n = recall = 0;
X                           if (H_head) strcpy(&line[pl], H_head->line);
X                       }
X                       else if (H_tail) strcpy(&line[pl], H_tail->line);
X                       printf("\015\233J%s%s", prompt, ps);
X                       i = max = strlen(ps) + pl;
X                       break;
X                    case ' ':                   /* shift -> <-*/
X                        c3 = myget();
X                                     switch(c3) {
X                    case('@'):      /* shift ->   */
X                        while (ps[i-pl-1] == ' ' && i<max) {
X      		            i++;
X      		            printf("\233C");
X		        }
X                        while (ps[i-pl-1] != ' ' && i<max) {
X      		            i++;
X		            printf("\233C");
X               		}
X                        break;
X                    case('A'):      /* shift <-   */
X                        while (ps[i-pl-1] == ' ' && i>pl) {
X                            i--;
X                            printf("\233D");
X                        }
X                        while (ps[i-pl-1] != ' ' && i>pl) {
X                            i--;
X                            printf("\233D");
X                        }
X                        break;
X                        default:
X                        break;
X                    }
X                        break;
X                    default:
X                        c3 = myget();
X                        if (c3 == '~') {
X                            fkey = c2;
X                            fkeys[0] = 'f';
X                            if (c2 == '?') {
X                                strcpy(ps,"help");
X                                goto done;
X                            }
X                        }
X                        else if (myget() != '~') { /* window was resized */
X                            while(myget() != '|');
X                            newwidth();
X                            break;
X                        }
X                        else {
X                            fkey = c3;
X                            fkeys[0] = 'F';
X                        }
X                        sprintf(fkeys+1,"%d",fkey - 47);
X                        if (s = get_var(LEVEL_SET, fkeys))
X                                tyahdptr = strcpy(typeahd,s);
X                        break;
X                    }
X                break;
X            case 8:
X                if (i > pl) {
X                    i--;
X                    printf("\010");
X                }
X                else break;
X            case 127:
X                if (i < max) {
X                    int j,t,l = 0;
X                    movmem(&line[i+1],&line[i],max-i);
X                    --max;
X                    printf("\233P");
X                    j = width - i % width - 1;   /* amount to end     */
X                    t = max/width - i/width;     /* no of lines       */
X                    for(n = 0; n < t; n++) {
X                        l += j;                  /* no. of char moved */
X                        if (j) printf("\233%dC",j); /* goto eol       */
X                        printf("%c\233P",line[width*(i/width+n+1)-1]);
X                        j = width-1;
X                    }
X                    if (t)
X                    printf("\233%dD",l+t);   /* get back */
X                }
X                break;
X            case 18:
X                n = i/width;
X                if (n) printf("\233%dF",n);
X                printf("\015\233J%s%s",prompt,ps);
X                i = max;
X                break;
X            case 27:
X                break;
X            case 1:
X                insert ^= 1;
X                break;
X            case 21:
X            case 24:
X            case 26:
X                if (i>pl) printf("\233%dD",i-pl);
X                i = pl;
X                if (c1 == 26) break;
X            case 11:        /* ^K */
X                printf("\233J");
X                max = i;
X                line[i] = '\0';
X                break;
X            case 28:        /* ^\ */
X                SETCON;
X                return(NULL);
X            case 5:
X                if (i!=max) printf("\233%dC",max - i);
X                i = max;
X                break;
X            case 10:
X            case 13:
X                line[max] = '\0';
Xdone:           printf("\233%dC\n",max - i);
X
X                SETCON;
X                strcpy(line, ps);
X                return(line);
X            default:
X                c1 &= 0x7f;
X                if (c1 == 9) c1 = 32;
X                if (c1 > 31 & i < 256) {
X                    if (i < max && insert) {
X                        int j,t,l = 0;
X                        movmem(&line[i], &line[i+1], max - i);
X                        printf("\233@%c",c1);
X                        t = max/width - i/width;
X                        j = width - i % width - 1;
X                        for(n = 0; n < t; n++) {
X                            l += j;
X                            if (j) printf("\233%dC",j);
X                            printf("\233@%c",line[width*(i/width+n+1)]);
X                            j = width-1;
X                        }
X                        if (t) printf("\233%dD",l + t);
X                        ++max;
X                    }
X                    else {
X                        if(i == pl && max == i) printf("\015%s%s",prompt,ps);
X                        putchar(c1);
X                    }
X                    line[i++] = c1;
X                    if (max < i) max = i;
X                    line[max] = '\0';
X                }
X        }
X	}
XSETCON;
Xreturn(NULL);
X}
X
Xsetrawcon(flag) /* -1L=RAW:, 0L=CON: */
Xlong flag;
X{
Xlong packargs[8];
X
Xpackargs[0]=flag;
XSendPacket(994L, packargs, Myprocess->pr_ConsoleTask);
X}
X
X#endif
END_OF_FILE
if test 9156 -ne `wc -c <'rawconsole.c'`; then
    echo shar: \"'rawconsole.c'\" unpacked with wrong size!
fi
# end of 'rawconsole.c'
fi
if test -f 'run.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'run.c'\"
else
echo shar: Extracting \"'run.c'\" \(1712 characters\)
sed "s/^X//" >'run.c' <<'END_OF_FILE'
X
X/*
X * RUN.C
X *
X * (c)1986 Matthew Dillon     9 October 1986
X *
X *    RUN   handles running of external commands.
X *
X * Version 2.07M by Steve Drew 10-Sep-87
X *
X * Version 4.00A by Carlo Borreo & Cesare Dieni 13-Jan-90
X *
X */
X
Xchar *FindIt();
X
Xdo_run(str)
Xchar *str;
X{
Xint retcode;
Xchar buf[200]; /* enough space for 100 char cmd name + path stuff */
Xchar *path, *argline, *trueargline, *copy, *p = av[0];
X
Xwhile(*p++) *p &= 0x7F;      /* allow "com mand" */
X
Xargline=compile_av(av, 1, ac, ' ', 1);
Xtrueargline= (*argline ? argline : "\n");
X
Xif (strlen(av[0]) > 100) { ierror(NULL,509); return -1; }
X
Xsprintf(buf,"res_%s",BaseName(av[0]));
Xif (Getenv(buf, buf+100, 90L) && loadres(av[0])) Setenv(buf,NULL);
Xretcode=SyncRun(av[0],trueargline,0L,0L);
Xif (retcode>=0) { free(argline); return retcode; }
Xif (path = FindIt(av[0],"",buf)) {
X	retcode = SyncRun(path,trueargline,0L,0L);
X	free(argline);
X	return retcode;
X	}
Xelse free(argline);
Xif ((path = FindIt(av[0],".sh",buf)) == NULL) {
X	fprintf(stderr,"Command Not Found %s\n",av[0]);
X	return -1;
X	}
Xav[1] = buf;
Xcopy = malloc(strlen(str)+3);
Xsprintf(copy,"x %s",str);
Xretcode = do_source(copy);
Xfree(copy);
Xreturn retcode;
X}
X
Xchar *dofind(cmd, ext, buf)
Xchar *cmd, *ext, *buf;
X{
Xchar *ptr, *s;
X
Xsprintf(buf,"%s%s",cmd,ext);
Xif (exists(buf)) return buf;
Xif (BaseName(buf)==buf) {
X	s = get_var(LEVEL_SET, v_path);
X	while (*s) {
X		for (ptr=buf; *s && *s!=','; ) *ptr++ = *s++;
X		sprintf(ptr, "%s%s", cmd, ext);
X		if (exists(buf)) return buf;
X		if (*s) s++;
X		}
X	}
Xreturn NULL;
X}
X
Xchar *FindIt(cmd,ext,buf)
Xchar *cmd, *ext, *buf;
X{
Xchar *response;
X
XMyprocess->pr_WindowPtr = (APTR)(-1);
Xresponse=dofind(cmd,ext,buf);
XMyprocess->pr_WindowPtr = NULL;
Xreturn response;
X}
END_OF_FILE
if test 1712 -ne `wc -c <'run.c'`; then
    echo shar: \"'run.c'\" unpacked with wrong size!
fi
# end of 'run.c'
fi
if test -f 'set.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'set.c'\"
else
echo shar: Extracting \"'set.c'\" \(3884 characters\)
sed "s/^X//" >'set.c' <<'END_OF_FILE'
X
X/*
X * SET.C
X *
X * (c)1986 Matthew Dillon     9 October 1986
X *
X * Version 2.07M by Steve Drew 10-Sep-87
X *
X * Version 4.00A by Carlo Borreo & Cesare Dieni 13-Jan-90
X *
X */
X
Xextern struct Window *w;
X
X#define MAXLEVELS (3 + MAXSRC)
X
Xstruct MASTER {
X	struct MASTER *next;
X	struct MASTER *last;
X	char *name;
X	char *text;
X};
X
Xstatic struct MASTER *Mbase[MAXLEVELS];
X
Xchar *set_var(level, name, str)
Xregister char *name, *str;
X{
X   register struct MASTER *base = Mbase[level];
X   register struct MASTER *last;
X   register int len;
X
X   for (len = 0; isalphanum(name[len]); ++len);
X   while (base != NULL) {
X      if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
X         Free (base->text);
X         goto gotit;
X      }
X      last = base;
X      base = base->next;
X   }
X   if (base == Mbase[level]) {
X      base = Mbase[level] = (struct MASTER *)malloc (sizeof(struct MASTER));
X      base->last = NULL;
X   } else {
X      base = (struct MASTER *)malloc (sizeof(struct MASTER));
X      base->last = last;
X      last->next = base;
X   }
X   base->name = malloc (len + 1);
X   bmov (name, base->name, len);
X   base->name[len] = 0;
X   base->next = NULL;
Xgotit:
X   base->text = malloc (strlen(str) + 1);
X   strcpy (base->text, str);
X   if (*name=='_') sys_vars();
X   return (base->text);
X}
X
Xchar *get_var (level, name)
Xregister char *name;
X{
X   register struct MASTER *base = Mbase[level];
X   register unsigned char *scr;
X   register int len;
X
X   for (scr = (unsigned char *)name; *scr && *scr != 0x80 && *scr != ' ' && *scr != ';' && *scr != '|'; ++scr);
X   len = scr - name;
X
X   while (base != NULL) {
X      if (strlen(base->name) == len && strncmp (name, base->name, len) == 0)
X         return (base->text);
X      base = base->next;
X   }
X   return (NULL);
X}
X
Xunset_level(level)
X{
X   register struct MASTER *base = Mbase[level];
X
X   while (base) {
X      Free (base->name);
X      Free (base->text);
X      Free (base);
X      base = base->next;
X   }
X   Mbase[level] = NULL;
X}
X
Xunset_var(level, name)
Xchar *name;
X{
X   register struct MASTER *base = Mbase[level];
X   register struct MASTER *last = NULL;
X   register int len;
X
X   for (len = 0; isalphanum(name[len]); ++len);
X   while (base) {
X      if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
X         if (base != Mbase[level])
X            last->next = base->next;
X         else
X            Mbase[level] = base->next;
X         if (base->next != NULL)
X            base->next->last = last;
X         if (base == Mbase[level])
X            Mbase[level] = base->next;
X         Free (base->name);
X         Free (base->text);
X         Free (base);
X         return (1);
X      }
X      last = base;
X      base = base->next;
X   }
X   return (-1);
X}
X
Xdo_unset_var(str, level)
Xchar *str;
X{
Xregister unsigned int i;
X
Xfor (i = 1; i < ac; ++i) unset_var (level, av[i]);
Xsys_vars();
Xreturn 0;
X}
X
Xdo_set_var(command, level)
Xchar *command;
X{
Xregister struct MASTER *base = Mbase[level];
Xregister char *str;
X
Xswitch (ac) {
Xcase 1:
X	while (base && !dobreak()) {
X		printf ("\2330m%-10s %s\n", base->name, base->text);
X		base = base->next;
X		}
X	break;
Xcase 2:
X	if (str=get_var(level,av[1])) printf ("%-10s %s\n", av[1], str);
X	break;
Xdefault:
X	set_var (level, av[1], next_word (next_word (command)));
X	if (*av[1]=='_') sys_vars();
X	break;
X	}
Xreturn 0;
X}
X
Xsys_vars()
X{
Xregister char *str, *t;
Xextern char trueprompt[100];
X
Xif (strcmp(w->Title, str=get_var(LEVEL_SET, v_titlebar)))
X	SetWindowTitles(w, str, -1L);
XS_histlen=(str = get_var(LEVEL_SET, v_hist)) ? atoi(str) : 0;
Xdebug  =(get_var(LEVEL_SET, v_debug)  !=NULL);
XVerbose=(get_var(LEVEL_SET, v_verbose)!=NULL);
Xif (S_histlen < 2) S_histlen=2;
X
Xif ( (str=get_var(LEVEL_SET,v_prompt)) ==NULL) str="$ ";
Xt=trueprompt;
Xwhile (*str)
X	if (*str=='%' && str[1]=='p') {
X		str+=2;
X		strcpy(t,get_var(LEVEL_SET, "_cwd"));
X		t+=strlen(t);
X		}
X	else *t++=*str++;
Xstrcpy(t,"\2330m");
X}
END_OF_FILE
if test 3884 -ne `wc -c <'set.c'`; then
    echo shar: \"'set.c'\" unpacked with wrong size!
fi
# end of 'set.c'
fi
if test -f 'shell.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'shell.h'\"
else
echo shar: Extracting \"'shell.h'\" \(3029 characters\)
sed "s/^X//" >'shell.h' <<'END_OF_FILE'
X
X/*
X * SHELL.H
X *
X * (c)1986 Matthew Dillon     9 October 1986
X *
X *
X * SHELL include file.. contains shell parameters and extern's
X *
X * Version 2.07M by Steve Drew 10-Sep-87
X *
X * Version 4.00A by Carlo Borreo & Cesare Dieni 13-Jan-90
X *
X */
X
X#define RAW_CONSOLE 1   /* Set to 0 to compile out Cmd Line Editing */
X
X#include <stdio.h>
X#include <exec/exec.h>
X#include <time.h>
X#include <libraries/dos.h>
X#include <libraries/dosextens.h>
X#include <intuition/intuition.h>
X#include <intuition/intuitionbase.h>
X#include "shellfunctions.h"
X#include <fcntl.h>
X#include <libraries/arpbase.h>
X
Xtypedef struct FileInfoBlock FIB;
X
X#define bmov movmem
X
X#define MAXAV		256		/* Max. # arguments		*/
X#define MAXSRC		5		/* Max. # of source file levels */
X#define MAXIF		10		/* Max. # of if levels		*/
X#define MAXALIAS	20		/* Max. # of alias levels	*/
X#define MAXMYFILES	9		/* Max. # of internal files	*/
X
X#define LEVEL_SET	0		/* which variable list to use   */
X#define LEVEL_ALIAS	1
X#define LEVEL_LABEL	2
X
X	/* EXECOM.C defines */
X
X#define FL_DOLLAR	0x01  /* One of the following */
X#define FL_BANG		0x02
X#define FL_PERCENT	0x04
X#define FL_QUOTE	0x08
X#define FL_IDOLLAR	0x10  /* Any or all of the following may be set */
X#define FL_EOC		0x20
X#define FL_EOL		0x40
X#define FL_OVERIDE	0x80
X#define FL_WILD		0x100
X#define FL_MASK		(FL_DOLLAR|FL_BANG|FL_PERCENT|FL_QUOTE)
X
X#ifndef NULL
X#define NULL 0L
X#endif
X
X#define CHECKBREAK() dobreak()
X
X#ifndef AZTEC_C
Xstruct _dev {
X	long  fd;
X	short mode;
X	};
X#endif
X
Xstruct HIST {
X	struct HIST *next, *prev;	/* doubly linked list */
X	char *line;			/* line in history    */
X};
X
Xstruct PERROR {
X	int errnum;			/* Format of global error lookup */
X	char *errstr;
X};
X
Xstruct DPTR {				/* Format of directory fetch pointer */
X	BPTR lock;			/* lock on directory   */
X	FIB *fib;			/* mod'd fib for entry */
X	};
X
Xextern struct HIST *H_head, *H_tail;
Xextern struct PERROR Perror[];
Xextern struct DPTR *dopen();
Xextern char *set_var(), *get_var(), *next_word();
Xextern char *get_history(), *compile_av(), *get_pwd();
Xextern char *malloc(), *strcpy(), *strcat(), *index();
Xextern char **expand();
Xextern char *av[];
Xextern char *Current;
Xextern int  H_len, H_tail_base, H_stack;
Xextern int  E_stack;
Xextern int  Src_stack, If_stack, forward_goto;
Xextern int  ac;
Xextern int  debug, Rval, Verbose, disable, Quit;
Xextern int  Lastresult, atoierr;
Xextern int  Exec_abortline;
Xextern int   S_histlen;
Xextern unsigned int options;
Xextern long  Cin, Cout, Cout_append;
Xextern char *Cin_name, *Cout_name;
Xextern char  Cin_type,  Cout_type;  /* these variables are in transition */
Xextern char *Pipe1, *Pipe2;
X
Xextern long Src_base[MAXSRC];
Xextern long Src_pos[MAXSRC];
Xextern char If_base[MAXIF];
Xextern struct Process *Myprocess;
Xextern struct CommandLineInterface *Mycli;
X
Xextern struct ArpBase *ArpBase;
X
Xextern long atol(), Atol(), myatol();
X
Xextern char	v_titlebar[], v_prompt[], v_hist[], v_histnum[], v_debug[],
X		v_verbose[], v_stat[], v_lasterr[], v_cwd[], v_except[],
X		v_passed[], v_path[], v_gotofwd[], v_linenum[];
END_OF_FILE
if test 3029 -ne `wc -c <'shell.h'`; then
    echo shar: \"'shell.h'\" unpacked with wrong size!
fi
# end of 'shell.h'
fi
if test -f 'shellfunctions.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'shellfunctions.h'\"
else
echo shar: Extracting \"'shellfunctions.h'\" \(9694 characters\)
sed "s/^X//" >'shellfunctions.h' <<'END_OF_FILE'
Xtypedef	long	cList;
Xextern int Enable_Abort;
X
Xlong					AbleICR();
Xlong					AbortIO();
Xlong					ActivateGadget();
Xvoid					ActivateWindow();
Xvoid					AddAnimOb();
Xvoid					AddBob();
Xvoid					AddConfigDev();
Xvoid					AddDevice();
Xlong					AddDosNode();
Xvoid					AddFont();
Xvoid					AddFreeList();
Xshort					AddGadget();
Xunsigned short				AddGList();
Xvoid					AddHead();
Xstruct Interrupt *			AddICRVector();
Xvoid					AddIntServer();
Xvoid					AddLibrary();
Xlong					AddMemList();
Xvoid					AddPort();
Xvoid					AddResource();
Xvoid					AddSemaphore();
Xvoid					AddTail();
Xvoid					AddTask();
Xvoid					AddTime();
Xvoid					AddVSprite();
Xlong					Alert();
Xvoid *					AllocAbs();
Xlong					AllocBoardMem();
XcList					AllocCList();
Xstruct ConfigDev *			AllocConfigDev();
Xstruct MemList *			AllocEntry();
Xunsigned long				AllocExpansionMem();
Xvoid *					AllocMem();
Xlong					AllocPotBits();
Xvoid *					AllocRaster();
Xchar *					AllocRemember();
Xlong					AllocSignal();
Xlong					AllocTrap();
Xstruct WBObject *			AllocWBObject();
Xvoid *					Allocate();
Xvoid					AlohaWorkbench();
Xvoid					AndRectRegion();
Xlong					AndRegionRegion();
Xvoid					Animate();
Xshort					AreaDraw();
Xlong					AreaEllipse();
Xvoid					AreaEnd();
Xshort					AreaMove();
Xvoid					AskFont();
Xlong					AskSoftStyle();
Xlong					AttemptLockLayerRom();
Xlong					AttemptSemaphore();
Xshort					AutoRequest();
Xlong					AvailFonts();
Xlong					AvailMem();
Xvoid					BeginIO();
Xvoid					BeginRefresh();
Xvoid					BeginUpdate();
Xvoid					BeginLayer();
Xlong					BltBitMap();
Xlong					BltBitMapRastPort();
Xvoid					BltClear();
Xvoid					BltMaskBitMapRastPort();
Xvoid					BltPattern();
Xvoid					BltTemplate();
Xstruct Window *				BuildSysRequest();
Xchar *					BumpRevision();
Xvoid					Cause();
Xvoid					CBump();
Xstruct Events *				CDInputHandler();
Xvoid					ChangeSprite();
Xstruct IORequest *			CheckIO();
Xshort					ClearDMRequest();
Xvoid					ClearEOL();
Xvoid					ClearMenuStrip();
Xvoid					ClearPointer();
Xvoid					ClearRegion();
Xlong					ClearRectRegion();
Xvoid					ClearScreen();
Xvoid					ClipBit();
Xvoid					Close();
Xvoid					CloseDevice();
Xvoid					CloseFont();
Xvoid					CloseLibrary();
Xvoid					CloseScreen();
Xvoid					CloseWindow();
Xshort					CloseWorkBench();
Xvoid					CMove();
Xshort					CmpTime();
Xlong					ConcatCList();
Xlong					ConfigBoard();
Xlong					ConfigChain();
Xlong					ConsoleDevice();
Xlong					CopperListInit();
XcList					CopyCList();
Xvoid					CopyMem();
Xvoid					CopyMemQuick();
Xvoid					CopySBitMap();
Xstruct Layer *				CreateBehindLayer();
XBPTR		CreateDir();
Xstruct MsgPort *			CreatePort();
Xstruct Process *			CreateProc();
Xstruct IOStdReq *			CreateStdIO();
Xstruct Task *				CreateTask();
Xstruct Layer *				CreateUpfrontLayer();
XBPTR					CurrentDir();
Xvoid					CurrentTime();
Xvoid					CWait();
Xlong *					DateStamp();
Xvoid					Deallocate();
Xvoid					Debug();
Xvoid					Delay();
Xshort					DeleteFile();
Xvoid					DeleteLayer();
Xvoid					DeletePort();
Xvoid					DeleteStdIO();
Xvoid					DeleteTask();
Xstruct Process *			DeviceProc();
Xvoid					Disable();
Xvoid					DisownBlitter();
Xshort					DisplayAlert();
Xvoid					DisplayBeep();
Xvoid					DisposeRegion();
Xvoid					DoCollision();
Xlong					DoIO();
Xshort					DoubleClick();
Xvoid					Draw();
Xvoid					DrawBorder();
Xvoid					DrawEllipse();
Xvoid					DrawGList();
Xvoid					DrawImage();
XBPTR					DupLock();
Xvoid					Enable();
Xvoid					EndRefresh();
Xvoid					EndRequest();
Xvoid					EndUpdate();
Xvoid					Enqueue();
Xshort					ExNext();
Xshort					Examine();
Xshort					Execute();
Xvoid					Exit();
Xstruct ConfigDev *			FindConfigDev();
Xstruct Node *				FindName();
Xstruct MsgPort *			FindPort();
Xstruct Resident *			FindResident();
Xstruct SignalSemaphore *		FindSemaphore();
Xstruct Task *				FindTask();
Xchar *					FindToolType();
Xshort					Flood();
Xvoid					FlushCList();
Xvoid					Forbid();
Xvoid					FreeBoardMem();
Xvoid					FreeCList();
Xvoid					FreeColorMap();
Xvoid					FreeConfigDev();
Xvoid					FreeCopList();
Xvoid					FreeCprList();
Xvoid					FreeDiskObject();
Xvoid					FreeEntry();
Xvoid					FreeExpansionMem();
Xvoid					FreeFreeList();
Xvoid					FreeGBuffers();
Xvoid					FreeMem();
Xvoid					FreePotBits();
Xvoid					FreeRaster();
Xvoid					FreeRemember();
Xvoid					FreeSignal();
Xvoid					FreeSprite();
Xvoid					FreeSysRequest();
Xvoid					FreeTrap();
Xvoid					FreeVPortCopLists();
Xvoid					FreeWBObject();
Xlong					GetCC();
Xlong					GetCLBuf();
Xshort					GetCLChar();
Xshort					GetCLWord();
Xstruct ColorMap *			GetColorMap();
Xlong					GetCurrentBinding();
Xstruct Preferences *			GetDefPrefs();
Xstruct DiskObject *			GetDiskObject();
Xshort					GetGBuffers();
Xlong					GetIcon();
Xstruct Message *			GetMsg();
Xstruct Preferences *			GetPrefs();
Xshort					GetRGB4();
Xlong					GetScreenData();
Xshort					GetSprite();
Xstruct WBObject *			GetWBObject();
Xlong					IncrCLMark();
Xshort					Info();
Xvoid					InitArea();
Xvoid					InitBitMap();
Xlong					InitCLPool();
Xvoid					InitCode();
Xvoid					InitGMasks();
Xvoid					InitGels();
Xvoid					InitMasks();
Xvoid					InitRastPort();
Xvoid					InitRequester();
Xvoid					InitResident();
Xvoid					InitSemaphore();
Xvoid					InitStruct();
Xvoid					InitTmpRas();
Xvoid					InitVPort();
Xvoid					InitView();
XBPTR					Input();
Xvoid					Insert();
Xstruct Region *				InstallClipRegion();
Xlong					IntuiTextLength();
Xstruct InputEvent *			Intuition();
Xlong					IoErr();
Xshort					IsInteractive();
Xstruct MenuItem *			ItemAddress();
Xvoid					LoadRGB4();
Xstruct Segment *			LoadSeg();
Xvoid					LoadView();
XBPTR					Lock();
Xvoid					LockLayer();
Xvoid					LockLayerInfo();
Xvoid					LockLayerRom();
Xvoid					LockLayers();
Xstruct DeviceNode *			MakeDosNode();
Xlong					MakeFunctions();
Xstruct Library *			MakeLibrary();
Xvoid					MakeScreen();
Xvoid					MakeVPort();
Xlong					MarkCList();
Xlong					MatchToolValue();
Xvoid					ModifyIDCMP();
Xvoid					ModifyProp();
Xvoid					Move();
Xlong					MoveLayer();
Xvoid					MoveScreen();
Xvoid					MoveSprite();
Xvoid					MoveWindow();
Xvoid					MrgCop();
Xvoid					NewList();
Xvoid					NewModifyProp();
Xstruct Region *				NewRegion();
Xvoid					ObtainConfigBinding();
Xvoid					ObtainSemaphore();
Xvoid					ObtainSemaphoreList();
Xvoid					OffGadget();
Xvoid					OffMenu();
Xvoid					OnGadget();
Xvoid					OnMenu();
XBPTR					Open();
Xlong					OpenDevice();
Xstruct Font *				OpenDiskFont();
Xstruct Font *				OpenFont();
Xvoid					OpenIntuition();
Xstruct Library *			OpenLibrary();
Xstruct MiscResource *			OpenResource();
Xstruct Screen *				OpenScreen();
Xstruct Window *				OpenWindow();
Xshort					OpenWorkBench();
Xvoid					OrRectRegion();
Xlong					OrRegionRegion();
XBPTR					Output();
Xvoid					OwnBlitter();
XBPTR					ParentDir();
Xshort					PeekCLMark();
Xvoid					Permit();
Xvoid					PolyDraw();
Xvoid					PrintIText();
Xlong					PutCLBuf();
Xlong					PutCLChar();
Xlong					PutCLWord();
Xshort					PutDiskObject();
Xlong					PutIcon();
Xvoid					PutMsg();
Xlong					PutWBObject();
Xvoid					QBSBlit();
Xvoid					QBlit();
Xshort					RawKeyConvert();
Xlong					Read();
Xchar					ReadExpansionByte();
Xlong					ReadExpansionRom();
Xshort					ReadPixel();
Xvoid					RectFill();
Xvoid					RefreshGadgets();
Xvoid					RefreshGList();
Xvoid					RefreshWindowFrame();
Xvoid					ReleaseConfigBinding();
Xvoid					ReleaseSemaphore();
Xvoid					ReleaseSemaphoreList();
Xvoid					RemConfigDev();
Xlong					RemDevice();
Xvoid					RemFont();
Xstruct Node *				RemHead();
Xvoid					RemIBob();
Xvoid					RemICRVector();
Xvoid					RemIntServer();
Xlong					RemLibrary();
Xunsigned short				RemoveGList();
Xvoid					RemPort();
Xvoid					RemResource();
Xvoid					RemSemaphore();
Xstruct Node *				RemTail();
Xvoid					RemTask();
Xvoid					RemVSprite();
Xvoid					RemakeDisplay();
Xvoid					Remove();
Xunsigned short				RemoveGadget();
Xshort					Rename();
Xvoid					ReplyMsg();
Xvoid					ReportMouse();
Xshort					Request();
Xvoid					RethinkDisplay();
Xvoid					ScreenToBack();
Xvoid					ScreenToFront();
Xvoid					ScrollLayer();
Xvoid					ScrollRaster();
Xvoid					ScrollVPort();
Xlong					Seek();
Xvoid					SendIO();
Xvoid					SetAPen();
Xvoid					SetBPen();
Xvoid					SetCollision();
Xshort					SetComment();
Xvoid					SetCurrentBinding();
Xshort					SetDMRequest();
Xvoid					SetDRMd();
Xlong					SetExcept();
Xlong					SetFont();
Xlong					SetFunction();
Xlong					SetICR();
Xstruct Interrupt *			SetIntVector();
Xshort					SetMenuStrip();
Xvoid					SetPointer();
Xstruct Preferences *			SetPrefs();
Xshort					SetProtection();
Xvoid					SetRast();
Xvoid					SetRGB4();
Xvoid					SetRGB4CM();
Xlong					SetSR();
Xlong					SetSignal();
Xlong					SetSoftStyle();
Xshort					SetTaskPri();
Xvoid					SetWindowTitles();
Xvoid					ShowTitle();
Xvoid					Signal();
Xlong					SizeCList();
Xshort					SizeLayer();
Xvoid					SizeWindow();
Xvoid					SortGList();
XcList					SplitCList();
XcList					SubCList();
Xvoid					SubTime();
Xvoid					SubLibrary();
Xvoid					SumKickData();
Xlong					SuperState();
Xvoid					SwapBitsRastPortClipRect();
Xvoid					SyncSBitMap();
Xlong					Text();
Xlong					TextLength();
Xlong					Translate();
Xlong					UnGetCLChar();
Xlong					UnGetCLWord();
Xvoid					UnLoadSeg();
Xvoid					UnLock();
Xshort					UnPutCLChar();
Xshort					UnPutCLWord();
Xvoid					UnlockLayer();
Xvoid					UnlockLayerInfo();
Xvoid					UnlockLayerRom();
Xvoid					UnlockLayers();
Xshort					UpfrontLayer();
Xvoid					UserState();
Xshort					VBeamPos();
Xstruct View *				ViewAddress();
Xstruct ViewPort *			ViewPortAddress();
Xshort					WBenchToBack();
Xshort					WBenchToFront();
Xlong					Wait();
Xvoid					WaitBOVP();
Xvoid					WaitBlit();
Xshort					WaitForChar();
Xlong					WaitIO();
Xstruct Message *			WaitPort();
Xvoid					WaitTOF();
Xstruct Layer *				WhichLayer();
Xshort					WindowLimits();
Xvoid					WindowToBack();
Xvoid					WindowToFront();
Xlong					Write();
Xlong					WriteExpansionByte();
Xvoid					WritePixel();
Xvoid					WritePotgo();
Xvoid					XorRectRegion();
Xlong					XorRegionRegion();
END_OF_FILE
if test 9694 -ne `wc -c <'shellfunctions.h'`; then
    echo shar: \"'shellfunctions.h'\" unpacked with wrong size!
fi
# end of 'shellfunctions.h'
fi
echo shar: End of archive 1 \(of 4\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 3 4 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 4 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Submissions to comp.sources.amiga and comp.binaries.amiga should be sent to:
	amiga@cs.odu.edu	
or	amiga@xanth.cs.odu.edu	( obsolescent mailers may need this address )
or	...!uunet!xanth!amiga	( very obsolescent mailers need this address )

Comments, questions, and suggestions s should be addressed to ``amiga-request''
(only use ``amiga'' for submissions) at the above addresses.