[comp.sources.amiga] v91i027: CShell 5.00 - alternative command interface, Part01/06

amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (03/04/91)

Submitted-by: <umueller@iiic.ethz.ch>
Posting-number: Volume 91, Issue 027
Archive-name: shells/cshell-5.00/part01

[ file `shell.doc' was split to facilitate posting  ...tad ]

Announcing: C-Shell 5.00

C-Shell 5.00 is a legitimate follow of the Matt Dillon shell.

Main features include:
- Kickstart 2.0 compatible, some kick 2.0 specific features
- 20 new built in commands
- 70 functions like: echo @strleft( "hello world" 7 )
- Many new system variables
- Residentable (finally!)
- Tab file name completion
- Freely programmable editing keys
- Object oriented features (file classes, actions on classes)
- Jump scrolling for some internal commands
- Automatic cd (type a directory name to 'cd' to it)
- Quick cd ('cd' to any directory without typing a path)
- Intuition Menus in the console window
- VT terminal compatibility, command line editing on a VT
- Foreign character sets supported
- Automatic RX-ing (type a .rexx file name to 'rx' it)
- Unlimited number of args & commands per line

Restrictions:
- Due to the dramatic changes, certainly not 100% bug free. Everyday
  use should not be affected. The first update fill follow soon; I 
  count on your bug reports
- Executable size 85K

#!/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 6)."
# Contents:  README class.sh globals.c lmakefile main.c makefile
#   menu.sh proto.h run.c sample.sh set.c shell.doc.ac shell.h
#   technotes.doc
# Wrapped by tadguy@ab20 on Sun Mar  3 16:55:55 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'README'\"
else
echo shar: Extracting \"'README'\" \(1300 characters\)
sed "s/^X//" >'README' <<'END_OF_FILE'
XAnnouncing: C-Shell 5.00
X
XC-Shell 5.00 is a legitimate follow of the Matt Dillon shell.
X
XMain features include:
X- Kickstart 2.0 compatible, some kick 2.0 specific features
X- 20 new built in commands
X- 70 functions like: echo @strleft( "hello world" 7 )
X- Many new system variables
X- Residentable (finally!)
X- Tab file name completion
X- Freely programmable editing keys
X- Object oriented features (file classes, actions on classes)
X- Jump scrolling for some internal commands
X- Automatic cd (type a directory name to 'cd' to it)
X- Quick cd ('cd' to any directory without typing a path)
X- Intuition Menus in the console window
X- VT terminal compatibility, command line editing on a VT
X- Foreign character sets supported
X- Automatic RX-ing (type a .rexx file name to 'rx' it)
X- Unlimited number of args & commands per line
X
XRestrictions:
X- Due to the dramatic changes, certainly not 100% bug free. Everyday
X  use should not be affected. The first update fill follow soon; I 
X  count on your bug reports
X- Executable size 85K
X
X |          Urban Mueller         |      / / |    Urban Mueller    |
X | USENET:  umueller@iiic.ethz.ch | __  / /  |    Schulhausstr. 83 |
X | FIDONET: 2:302/906 (AUGL)      | \ \/ /   | CH-6312 Steinhausen |
X | "Don't tell my employer"       |  \__/    |    SWITZERLAND      |
X
END_OF_FILE
if test 1300 -ne `wc -c <'README'`; then
    echo shar: \"'README'\" unpacked with wrong size!
fi
# end of 'README'
fi
if test -f 'class.sh' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'class.sh'\"
else
echo shar: Extracting \"'class.sh'\" \(1717 characters\)
sed "s/^X//" >'class.sh' <<'END_OF_FILE'
Xclass -n
Xclass dms      offs=0,444D5321
Xclass warp     offs=0,57617270
Xclass zoom     offs=0,5A4F4F4D
Xclass lharc    offs=2,2D6C68..2D
Xclass zoo      offs=0,5A4F4F20
Xclass arc      offs=0,1a08
Xclass compr    offs=0,1f9d
Xclass anim     offs=0,464f524d........414e494d
Xclass icon     offs=0,e3100001 offs=0,f34c0012
Xclass gif      offs=0,474946
Xclass zip      offs=0,504b0304
Xclass ppacked  offs=0,50503230
X
Xclass dms      suff=.dms act exec="Dms write" extr="Dms write" view="Dms view"
Xclass warp     suff=.wrp act exec="Warp write 0 79" extr="Warp write 0 79"
Xclass zoom     suff=.zom act exec="Zoom" extr="Zoom"
Xclass lharc    suff=.lzh act exec="lharc e" extr="lharc e" view="lharc v" add="lharc a" edit=lharca
Xclass zoo      suff=.zoo act exec="zoo e" extr="zoo e//" view="zoo v" add="zoo a"
Xclass arc      suff=.arc act exec="arc e" extr="arc e" view="arc -v"
Xclass zip      suff=.zip act exec="unzip" extr="unzip" view="unzip l"
Xclass ppacked  suff=.pp  act exec="ppmore" view=ppmore
Xclass lhwarp   suff=.lhw act exec="lhwarp write 0"
Xclass anim     suff=.anim act exec=showanim view=showanim
Xclass gif      suff=.gif  act exec=virtgif  view=virtgif extr="shamsharp"
Xclass ilbm     offs=0,464F524D........494C424D act exec=M view=M edit=dpaint
Xclass text     offs=0,464F524D........46545854 act edit=excellence
Xclass prog     offs=0,000003f300000000 act view=htype edit=newzap
Xclass object   suff=.o
Xclass include  suff=.h
Xclass c_source suff=.c
Xclass script   suff=.sh
Xclass ascii    suff=.doc suff=.txt name=readme chars act view=more exec=more edit=ced
Xclass ""       default act view=htype edit=ced
X
Xalias v    "%n action -a view $n;more $n"
Xalias ed   "%n action -a edit $n;ced $n"
Xalias xt   "action extr"
END_OF_FILE
if test 1717 -ne `wc -c <'class.sh'`; then
    echo shar: \"'class.sh'\" unpacked with wrong size!
fi
# end of 'class.sh'
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'\" \(4589 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 *    Most global variables.
X *
X * Version 2.07M by Steve Drew 10-Sep-87
X * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
X * Version 5.00L by Urban Mueller 17-Feb-91
X *
X */
X
X#include "shell.h"
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_every	[]="_every";	/* executed before prompt			*/
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 #			*/
Xchar v_lcd		[]="_lcd";		/* last current directory			*/
Xchar v_rxpath	[]="_rxpath";	/* path for .rexx commands			*/
Xchar v_hilite	[]="_hilite";	/* hilighting escape sequence		*/
Xchar v_scroll	[]="_scroll";	/* scroll jump in fast mode			*/
Xchar v_minrows	[]="_minrows";	/* minimum # of rows for fast scroll*/
Xchar v_result	[]="_result";	/* result from rxsend				*/
Xchar v_qcd		[]="_qcd";		/* file name for csh-qcd			*/
Xchar v_noreq	[]="_noreq";	/* turn off system requesters		*/
Xchar v_value	[]="_value";	/* return value of a function		*/
Xchar v_nobreak	[]="_nobreak";	/* disabling of ^C					*/
Xchar v_bground	[]="_bground";	/* started in background			*/
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 in drive",
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	512,	"Out of memory",
X	0,	NULL
X};
X
Xchar **av;					/* Internal argument list				*/
XFILE *Src_base[MAXSRC];		/* file pointers for source files		*/
Xlong Src_pos[MAXSRC];		/* seek position storage for same		*/
Xint  Src_if[MAXSRC];		/* the if level at batch file start		*/
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 max_ac=256;				/* Maximum # of args (increasable)		*/
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				*/
X
Xunsigned int options;
Xchar Buf[280], confirmed;
XCLASS *CRoot, *LastCRoot;
END_OF_FILE
if test 4589 -ne `wc -c <'globals.c'`; then
    echo shar: \"'globals.c'\" unpacked with wrong size!
fi
# end of 'globals.c'
fi
if test -f 'lmakefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'lmakefile'\"
else
echo shar: Extracting \"'lmakefile'\" \(1339 characters\)
sed "s/^X//" >'lmakefile' <<'END_OF_FILE'
X######################################################################
X#
X# Makefile to build Shell 5.00A under Lattice C 5.10
X# NOTE: Our char's are UNSIGNED by default!
X#
X######################################################################
X
XFLAGS	= -ms -v -d3 -cu -cs -O
XPRECOM	=
X#PRECOM	= -HShell.syms
X
X# -ms = short code
X# -v  = no stack overflow check
X# -d0 = no debug info
X# -cu = unsigned chars
X# -cs = no copies of string
X# -m3 = code for 68030
X# -H  = read precompiled header file
X
X
X
XOBJS	= run.o main.o comm1.o comm2.o comm3.o execom.o set.o sub.o \
X	  globals.o rawcon.o
X
XINCL	= shell.h
X
Xcsh   : makefile $(OBJS)
X	BLINK lib:cres.o $(OBJS) LIB lib:lc.lib lib:amiga.lib TO csh NOICONS ND
X
X#shell.syms: Shell.h Proto.h
X#	lc -cu -ph -oShell.Syms Syms.c
X
Xrawcon.o : rawcon.c $(INCL)
X	lc $(FLAGS) $(PRECOM) rawcon.c
X
Xrun.o   : run.c $(INCL)
X	lc $(FLAGS) $(PRECOM) run.c
X
Xmain.o  : main.c $(INCL)
X	lc $(FLAGS) $(PRECOM) main.c
X
Xcomm1.o : comm1.c $(INCL)
X	lc $(FLAGS) $(PRECOM) comm1.c
X
Xcomm2.o : comm2.c $(INCL)
X	lc $(FLAGS) $(PRECOM) comm2.c
X
Xcomm3.o : comm3.c $(INCL)
X	lc $(FLAGS) $(PRECOM) comm3.c
X
Xset.o   : set.c $(INCL)
X	lc $(FLAGS) $(PRECOM) set.c
X
Xsub.o   : sub.c $(INCL)
X	lc $(FLAGS) $(PRECOM) sub.c
X
Xglobals.o : globals.c $(INCL)
X	lc $(FLAGS) $(PRECOM) globals.c
X
Xexecom.o : execom.c $(INCL)
X	lc $(FLAGS) $(PRECOM) execom.c
END_OF_FILE
if test 1339 -ne `wc -c <'lmakefile'`; then
    echo shar: \"'lmakefile'\" unpacked with wrong size!
fi
# end of 'lmakefile'
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'\" \(8799 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 * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
X * Version 5.00L by Urban Mueller 17-Feb-91
X *
X */
X
X#include "shell.h"
X
Xvoid breakreset(void);
Xstruct Window *getwindow (void);
X
Xchar shellname[]   ="CShell V5.00L";
Xchar shellversion[]="500";
Xchar shellvers[]   ="5.00";
Xchar shellctr []   ="CshCounter";
Xchar shellres []   ="CshResident";
Xchar shellv   []   ="\0$VER: csh 5.00";
X
Xstatic void add_residents(void);
X
Xchar *oldtitle;
Xchar trueprompt[100];
Xchar Inline[260];
Xstruct IntuitionBase *IntuitionBase;
Xstruct Window *Win;
Xstruct ArpBase *ArpBase;
Xint    oldtaskpri=-999;
X
Xstatic char *defset[]={
X	v_histnum,  "0",
X	v_titlebar, shellname,
X	v_hist,     "50",
X	v_lasterr,  "0",
X	v_stat,     "0",
X	v_path,     "RAM:,RAM:c,df0:c,df1:c,sys:system",
X	v_rxpath,   "REXX:",
X	v_scroll,   "3",
X	v_minrows,  "34",
X	v_hilite,   "c7",
X	v_lcd,      "",
X	v_qcd,      "s:csh-qcd",
X	"_terminal","",
X	"_man",     "shell.doc",
X	"_insert",  "1",
X	"_version", shellversion,
X	"f1",       "cdir df0:\15",
X	"F1",       "cdir df1:\15",
X	"f3",       "cdir RAM:\15",
X	"F3",       "cdir vd0:\15",
X	"f4",       "cd df0:\15",
X	"F4",       "cd df1:\15",
X	"f5",       "cls; ls\15",
X	"F5",       "cdir ",
X	"f6",       "ls -s\15",
X	"f7",       "info\15",
X	"F7",       "assign \15",
X	"f8",       "window -lf\15",
X	"F8",       "window -sb\15",
X	"f10",      "cls\15",
X	"F10",      "exit\15",
X	NULL,       NULL
X};
X
Xstatic char *defalias[]={
X	"cdir", "%q cd $q; cls; dir",
X	"cls",  "echo -n ^l",
X	"diffdir","dir -u",
X	"dswap","cd $_lcd",
X	"exit", "endcli;quit",
X	"fg",   "pri 0 1",
X	"kr",   "rm -r RAM:* >NIL:",
X	"nice", "pri 0 -1",
X	"lp",   "cat >PRT:",
X	"q",    "quit",
X	"manlist", "sea -qwnl $_man \"    *\"",
X	NULL,   NULL
X};
X
X#ifndef AZTEC_C
Xchkabort()
X{
X	return 0;
X}
X#endif
X
Xextern struct Library *DosBase;
X
Xmain(argc, argv)
Xchar *argv[];
X{
X	int i;
X	char buf[10];
X	static char pipe1[32], pipe2[32];
X	struct Window *getwindow();
X	char nologin=0 , *mymem=malloc(4);
X#ifdef AZTEC_C
X	extern int Enable_Abort;
X	Enable_Abort = 0;
X#endif
X
X	if( argc==0 )               /* Prevent starting from workbench */
X		exit(0);
X
X	if( !(av=malloc( max_ac*sizeof(char *)))) exit( 0 );
X
X	initmap();
X
X	if(!(ArpBase=(struct ArpBase *)OpenLibrary("arp.library",34L)))
X		{ printf("No arp library\n"); exit(0); }
X
X	IntuitionBase=(struct IntuitionBase *)ArpBase->IntuiBase;
X
X	if( ArpBase->DosBase->lib_Version >= 36 )
X		o_kick20=1;
X	set_var( LEVEL_SET, "_kick2x", (o_kick20) ? "1" : "0" );
X
X	if( !IsInteractive(Input()))
X		o_bground=1;
X	set_var( LEVEL_SET, v_bground, (o_bground) ? "1" : "0" );
X
X
X	Forbid();
X	i=0;
X	if (Getenv(shellctr,buf,10L)) i=atoi(buf);
X	if (Getenv(shellres,buf,10L)) o_resident=1;
X	sprintf(buf, "%d", i+1);
X	Setenv(shellctr, buf);
X	Permit();
X
X#ifdef isalphanum
X	for( i='a'; i<='z'; i++ )
X		isalph[i]=1;
X	for( i='A'; i<='Z'; i++ )
X		isalph[i]=1;
X	for( i='0'; i<='9'; i++ )
X		isalph[i]=1;
X	isalph['_']=1;
X#endif
X
X#ifdef AZTEC_C
X	stdin->_flags	|= _IONBF;	/* make sure we're set as an unbuffered tty */
X	stdout->_flags	|= _IONBF;	/* in case of redirection in .login */
X	Close(_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 */
X#else
X	/* if( setvbuf( stdout,NULL,_IOLBF,BUFSIZ )) exit(20); */
X	/* setnbf( stdout ); */
X	/* Close( _ufbs[2] ); */
X	/*_ufbs[2]=_ufbs[1]; */
X	/* setnbf( stderr ); */
X#endif
X
X	Myprocess = (struct Process *)FindTask(0L);
X	Mycli=(struct CommandLineInterface *)((long)Myprocess->pr_CLI << 2);
X
X	if( !o_nowindow && (Win=getwindow()) && IsInteractive(Input())) {
X		oldtitle=(char *)(Win->Title);
X		set_menu();
X	}
X
X	Pipe1 = pipe1;
X	Pipe2 = pipe2;
X	sprintf(pipe1, "t:pipe1_%ld", mymem);
X	sprintf(pipe2, "t:pipe2_%ld", mymem);
X
X	sprintf(buf,"%ld",Myprocess->pr_TaskNum);
X	set_var(LEVEL_SET, "_clinumber", buf);
X
X	seterr();
X	if (Myprocess->pr_CurrentDir == NULL)
X		do_cd("x :");
X	else do_pwd(NULL);
X
X	o_nowindow= 1;
X
X	set_var(LEVEL_SET,v_prompt, (IsInteractive(Input())) ? "%c%p> ":"");
X	for( i=0; defset[i]; i+=2 )
X		set_var( LEVEL_SET, defset[i], defset[i+1] );
X	for( i=0; defalias[i]; i+=2 )
X		set_var( LEVEL_ALIAS, defalias[i], defalias[i+1] );
X
X	o_nowindow= 0;
X
X	for (i = 1; i < argc; ++i) {
X		if (*argv[i]=='-') {
X			char *str=argv[1];
X
X			if( index(str,'k') ) set_var(LEVEL_SET,v_nobreak,"1");
X			if( index(str,'i') ) o_internal=1;
X			if( index(str,'r') ) add_residents();
X			if( index(str,'v') ) Verbose=1, set_var(LEVEL_SET,v_verbose,"1");
X			if( index(str,'n') ) nologin=TRUE;
X			if( index(str,'b') ) {
X				oldtaskpri=Myprocess->pr_Task.tc_Node.ln_Pri;
X				SetTaskPri( &Myprocess->pr_Task, -1 );
X			}
X			if( index(str,'f') ) {
X				oldtaskpri=Myprocess->pr_Task.tc_Node.ln_Pri;
X				SetTaskPri( &Myprocess->pr_Task,  1 );
X			}
X			if( index(str,'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( index(str,'a')) {
X				o_nowindow= o_noraw= 1;
X				set_var( LEVEL_SET, v_hilite, "" );
X			}
X			if( index(str,'t')) {
X				o_nowindow= o_vt100= o_nofastscr= 1;
X				/*       clr     */
X				set_var( LEVEL_SET, v_hilite, "r" );
X				set_var( LEVEL_SET, v_noreq, "1" );
X				set_var( LEVEL_SET, "_terminal", "1" );
X				set_var( LEVEL_ALIAS, "cls", "e -n ^[[0\\;0H^[[J" );
X			}
X		} else {
X			sprintf (Inline, "source %s",argv[i]);
X			av[1] = argv[i];
X			do_source (Inline);
X		}
X	}
X
X	if (!nologin && exists(av[1] = "S:.login")) do_source("x S:.login");
X
X	for (;;) {
X		if (breakcheck())
X#ifdef AZTEC_C
X		while (WaitForChar(Input(), 100L) || stdin->_bp < stdin->_bend)
X#else
X		while (WaitForChar(Input(), 100L) || stdin->_rcnt != stdin->_wcnt )
X#endif
X			gets(Inline);
X		clearerr(stdin);  /* prevent acidental quit */
X		exec_every();
X		update_sys_var(v_titlebar);
X		update_sys_var(v_prompt);
X		breakreset();
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
Xvoid
Xmain_exit(n)
X{
X	int i;
X	char buf[10];
X
X	Getenv(shellctr,buf,10L);
X	i=atoi(buf);
X	sprintf(buf,"%d",i-1);
X	Setenv(shellctr,buf);
X	if( oldtitle )
X		SetWindowTitles(Win,oldtitle,(char *)-1);
X	if( oldtaskpri != -999 )
X		SetTaskPri(&Myprocess->pr_Task,oldtaskpri);
X	for (i=1; i<MAXMYFILES; i++) myclose(i);
X	remove_menu();
X	CloseLibrary((struct Library *)ArpBase);
X	exit(0);
X}
X
Xint
Xbreakcheck()
X{
X	return !o_nobreak && SetSignal(0L,0L) & SIGBREAKF_CTRL_C;
X}
X
Xvoid
Xbreakreset()
X{
X	SetSignal(0L, SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D);
X}
X
Xdobreak()
X{
X	if (breakcheck()) { printf("^C\n"); return(1); }
X	return(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
Xlong
XChk_Abort()
X{
X	return(0);
X}
X
Xvoid
X_wb_parse()
X{
X}
X
Xdo_howmany()
X{
X	char buf[10];
X
X	Getenv(shellctr, buf, 10L);
X	printf("Shell(s) running: %s\n",buf);
X	return 0;
X}
X
Xstatic struct Window *
Xgetwindow()
X{
X	struct InfoData *infodata;
X	struct Window *win;
X	long args[8];
X
X	if( o_nowindow )
X		return NULL;
X	infodata=(void *)AllocMem((long)sizeof(struct InfoData),MEMF_CLEAR|MEMF_PUBLIC);
X	args[0]=(long)infodata >> 2;
X	Write(Output(),"",1);        /* make window appear */
X	SendPacket(ACTION_DISK_INFO,args,(void *)Myprocess->pr_ConsoleTask);
X	win=(struct Window *)infodata->id_VolumeNode;
X	FreeMem(infodata,(long)sizeof(struct InfoData));
X	if( win==NULL )
X		o_nowindow=1;
X	newwidth();
X	return win;
X}
X
X#ifndef AZTEC_C
X
Xchar *
Xrindex( char *str , char c )
X{
X	char *ret=NULL;
X
X	for( ; *str; str++ )
X		if( *str==c )
X			ret=str;
X	return ret;
X}
X
X#endif
X
Xextern struct DosLibrary *DOSBase;
X
Xstruct ResidentList {
X	BPTR rl_Next;
X	LONG rl_UseCount;
X	BPTR rl_SegList;
X	char rl_SegName[1];
X};
X
X
Xstatic void
Xadd_residents()
X{
X	char buf[80], *g, *p, c;
X	struct RootNode *Node;
X	struct DosInfo  *Info;
X	struct ResidentList *res;
X	struct ResidentProgramNode *rpn;
X
X	if( ArpBase->ResidentPrgList )
X		return;
X
X	Forbid(); 
X	Node=(struct RootNode *)DOSBase->dl_Root;
X	Info=(struct DosInfo  *)(Node->rn_Info*4);
X	res=(struct ResidentList *)((long)Info->di_NetHand*4);
X
X	for( ; res; res=(struct ResidentList *)((long)res->rl_Next*4) ) {
X		g=res->rl_SegName, p=buf;
X		for( c=*g++; c>0; --c ) *p++=*g++;
X		*p=0;
X		if( res->rl_UseCount>=0 )
X			res->rl_UseCount++;
X		else
X			continue;
X		AddResidentPrg( res->rl_SegList, buf);
X		for(rpn=ArpBase->ResidentPrgList; rpn; rpn=rpn->rpn_Next)
X			if( rpn->rpn_Segment==res->rl_SegList )
X				rpn->rpn_Usage++;
X	}
X	Permit();
X}
END_OF_FILE
if test 8799 -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'\" \(1302 characters\)
sed "s/^X//" >'makefile' <<'END_OF_FILE'
X######################################################################
X#
X# Makefile to build Shell 5.00  under Aztec C 5.0d
X# make sure you use 5.0d or above, as setenv() has changed
X# NOTE: Our chars are UNSIGNED by default!
X#
X######################################################################
X
XOBJS	= run.o main.o comm1.o comm2.o comm3.o execom.o set.o sub.o \
X	  globals.o rawcon.o
X
XINCL	= shell.syms
X
XERRFILE	=
XFLAGS	= -pp -wurp -ssr $(ERRFILE)
XDEBUG	= -bs
XPRECOM	= -hiShell.syms
X
Xcsh:  makefile shell.syms $(OBJS)
X	ln  +q -m -g -o csh $(OBJS) -larpl -lc
X
Xshell.syms : shell.h proto.h
X	cc -pp -hoShell.syms shell.h -DAZTEC_C
X
Xrawcon.o : rawcon.c $(INCL)
X	cc $(DEBUG) $(FLAGS) $(PRECOM) rawcon.c
X
Xrun.o   : run.c $(INCL)
X	cc $(DEBUG) $(FLAGS) $(PRECOM) run.c
X
Xmain.o  : main.c $(INCL)
X	cc $(DEBUG) $(FLAGS) $(PRECOM) main.c
X
Xcomm1.o : comm1.c $(INCL)
X	cc $(DEBUG) $(FLAGS) $(PRECOM) comm1.c
X
Xcomm2.o : comm2.c $(INCL)
X	cc $(DEBUG) $(FLAGS) $(PRECOM) comm2.c
X
Xcomm3.o : comm3.c $(INCL)
X	cc $(DEBUG) $(FLAGS) $(PRECOM)  comm3.c
X
Xset.o   : set.c $(INCL)
X	cc $(DEBUG) $(FLAGS) $(PRECOM) set.c
X
Xsub.o   : sub.c $(INCL)
X	cc $(DEBUG) $(FLAGS) $(PRECOM) sub.c
X
Xglobals.o : globals.c $(INCL)
X	cc $(DEBUG) $(FLAGS) $(PRECOM) globals.c
X
Xexecom.o : execom.c $(INCL)
X	cc $(DEBUG) $(FLAGS) $(PRECOM) execom.c
END_OF_FILE
if test 1302 -ne `wc -c <'makefile'`; then
    echo shar: \"'makefile'\" unpacked with wrong size!
fi
# end of 'makefile'
fi
if test -f 'menu.sh' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'menu.sh'\"
else
echo shar: Extracting \"'menu.sh'\" \(982 characters\)
sed "s/^X//" >'menu.sh' <<'END_OF_FILE'
X# This installs an intuition menu with all editing keys
X
Xmenu -n Move \
X "Left         CursL",\
X "Right        CursR",\
X "WordLeft   S-CursL",\
X "WordRight  S-CursR",\
X "BegOfLine       ^A",^a\
X "EndOfLine       ^E",^e
X
Xmenu  Delete \
X "Left         BkSpc",^h\
X "Right          Del",\177\
X "WordLeft        ^W",^[^h\
X "WordRight  ESC-Del",^[\177\
X "To BOL          ^B",^[x^h\
X "To EOL          ^K",^[x\177\
X "Line            ^X",^[d
X
Xmenu History \
X "Back         CursU",\
X "Forward      CursD",\
X "Start      S-CursU",\
X "End        S-CursD",\
X "Complete     ESC-!",^[!\
X "Get tail        ^T",^T
X
Xmenu Complete \
X "One            TAB",^I\
X "Partial      S-TAB",\
X "All        ESC-TAB",^[^I\
X "QuickCD      ESC-c",^[c\
X "LastCD       ESC-~",^[~
X
Xmenu Execute \
X "Now         RETURN",^M\
X "+Hist   ESC-RETURN",^[^M\
X "Not             ^N",^N\
X "Exit            ^\",
X
Xmenu Misc \
X "Undo            ^U",^U\
X "Repeat          ^R",^R\
X "Retype          ^L",^L\
X "Ins/Ovr      ESC-i",^[i
X
END_OF_FILE
if test 982 -ne `wc -c <'menu.sh'`; then
    echo shar: \"'menu.sh'\" unpacked with wrong size!
fi
# end of 'menu.sh'
fi
if test -f 'proto.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'proto.h'\"
else
echo shar: Extracting \"'proto.h'\" \(5157 characters\)
sed "s/^X//" >'proto.h' <<'END_OF_FILE'
X/* main.c */
Xint main(int argc, char **argv);
Xvoid main_exit(int n);
Xint breakcheck(void);
Xint dobreak(void);
Xlong Chk_Abort(void);
Xvoid _wb_parse(void);
Xint do_howmany(void);
Xvoid breakreset(void);
X
X/* comm1.c */
Xint do_sleep(void);
Xint do_protect(void);
Xint do_filenote(void);
Xint do_cat(void);
Xvoid get_drives(char *buf);
Xchar *drive_name(char *name);
Xchar *oneinfo( char *name, int function );
Xint do_info(void);
Xint do_dir(void);
Xchar *formatfile(struct file_info *info);
Xint do_quit(void);
Xint do_echo(void);
Xint do_source(char *str );
Xint do_pwd(char *str );
Xint do_cd(char *str );
Xchar *quick_cd( char *buf, char *name, int repeat );
Xint do_mkdir(void);
Xint do_mv(void);
Xint all_args(int (*action)(char *str), int dirsflag);
Xint do_search(void);
Xint do_rm(void);
Xint do_history(void);
Xint do_mem(void);
Xint do_forline(void);
Xint do_fornum(void);
Xint do_foreach(void);
Xint do_forever(char *str);
Xint do_window(void);
Xchar *dates(struct DateStamp *dss);
Xint do_date(void);
X
X/* comm2.c */
Xint do_abortline(void);
Xint do_return(void);
Xint do_strhead(void);
Xint do_strtail(void);
Xint do_if(char *garbage, int com);
Xint do_label(void);
Xint do_goto(void);
Xint do_inc(char *garbage, int com);
Xint do_input(void);
Xint do_ver(void);
Xint do_ps(void);
Xint do_copy(void);
Xint do_touch(void);
Xint do_addbuffers(void);
Xint do_relabel(void);
Xint do_diskchange(void);
Xint dofunc(int id, char **av, int ac);
X
X/* comm3.c */
Xint do_tee(void);
Xint do_head(char *garbage, int com);
Xvoid man(struct __stdio *f, char *s);
Xint do_man(void);
Xint do_assign(void);
Xint do_join(void);
Xint do_strings(void);
Xint do_open(void);
Xint do_close(void);
Xvoid myclose(int n);
Xint do_fileslist(void);
Xlong extOpen(char *name, long mode);
Xvoid extClose(long fh);
Xint do_basename(void);
Xint do_tackon(void);
Xint do_resident(void);
Xint loadres(char *s);
Xint do_truerun(char *avline, int backflag);
Xint exists(char *name);
Xint do_aset(void);
Xint do_htype(void);
Xint do_stack(void);
Xint do_fault(void);
Xint eval_rpn(char **av, int ac, int flag);
Xint do_rpn(char *garbage, int ifflag);
Xint do_path(void);
Xint do_pri(void);
Xint do_strleft(void);
Xint do_strright(void);
Xint do_strmid(void);
Xint do_strlen(void);
Xint myatoi(char *s, int min, int max);
Xint unlatoi(char *s);
Xint posatoi(char *s);
Xint do_fltlower(void);
Xint do_fltupper(void);
Xint do_linecnt(void);
Xint do_uniq(void);
Xint do_rxsend(char *avline);
Xint do_rxrec(void);
Xint do_rxreturn(void);
Xint do_waitport(void);
Xint do_ascii(void);
Xvoid appendslash(char *path);
Xint do_whereis(void);
Xint do_usage(void);
Xint do_menu(void);
Xvoid remove_menu(void);
Xvoid set_menu(void);
Xint do_getenv(void);
Xint do_setenv(void);
Xchar **read_file(struct __stdio *file, int *ac);
Xvoid free_file(char **ptr);
Xint do_qsort(void);
Xint do_truncate(void);
Xint do_split(void);
X
X/* execom.c */
Xvoid *mymalloc(int len);
Xint exec_command(char *base);
X#ifndef isalphanum
Xint isalphanum(char c);
X#endif
Xchar *exec_function(char *str, char **fav, int fac);
Xint do_help(void);
Xvoid exec_every(void);
Xvoid show_usage(char *str);
Xint do_exec(char *str);
Xint interactive(void);
Xchar *a0tospace(char *str);
Xint execute( char *str );
Xchar *find_internal(char *str);
X
X/* sub.c */
Xchar *getclass(char *file);
Xvoid seterr(void);
Xchar *next_word(char *str);
Xchar *compile_av(char **av, int start, int end, char delim, int quote);
Xvoid Free(void *ptr);
Xvoid add_history(char *str);
Xchar *get_history(char *ptr, int echo);
Xvoid replace_head(char *str);
Xvoid pError(char *str);
Xint ierror(char *str, int err);
Xstruct DPTR *dopen(char *name, int *stat);
Xint dclose(struct DPTR *dp);
Xint isdir(char *file);
Xvoid free_expand(char **av);
Xchar **expand(char *base, int *pac);
Xchar *strupr(char *s);
Xchar *strlwr(char *s);
Xint compare_ok(char *wild, char *name, int casedep);
Xvoid expand_all(char *name, struct __stdio *file);
Xint cmp(char *s1, char *s2);
Xint sizecmp(char *s1, char *s2);
Xint datecmp(char *s1, char *s2);
Xint classcmp(char *s1, char *s2);
Xvoid QuickSort(char **av, int n);
Xvoid DirQuickSort(char **av, int n, int (*func)(char *,char *), int rev);
Xint filesize(char *name);
Xchar **and(char **av1, int ac1, char **av2, int ac2, int *ac, int base);
Xchar **without(char **av1, int ac1, char **av2, int ac2, int *ac, int base);
Xchar **or(char **av1, int ac1, char **av2, int ac2, int *ac, int base);
Xvoid clear_archive_bit(char *name);
Xchar *itoa( int i );
Xchar *itok( int i );
Xchar *getaction( char *class, char *action );
Xint doaction( char *file, char *action, char *args );
X
X/* set.c */
Xvoid set_var(int level, char *name, char *str);
Xvoid update_sys_var( char *name );
Xvoid set_var_n(int level, char *name, char *str, int n);
Xchar *get_var(int level, char *name);
Xvoid unset_level(int level);
Xvoid unset_var(int level, char *name);
Xint do_unset_var(char *str, int level);
Xint do_set_var(char *command, int level);
X
X/* rawconsole.c */
Xint newwidth(void);
Xvoid initmap(void);
Xchar *rawgets(char line[], char prompt[]);
Xvoid prepscroll(int fromtee);
Xvoid quickscroll(void);
Xvoid setrawcon( long flag, int ievent );
X
X/* run.c */
Xint do_run(char *str);
Xchar *dofind(char *cmd, char *ext, char *buf, char *path);
X#ifndef AZTEC_C
Xchar *rindex( char *str , char c );
X#endif
END_OF_FILE
if test 5157 -ne `wc -c <'proto.h'`; then
    echo shar: \"'proto.h'\" unpacked with wrong size!
fi
# end of 'proto.h'
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'\" \(4716 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 * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
X * Version 5.00L by Urban Mueller 17-Feb-91
X *
X */
X
X#include "shell.h"
X
Xchar *rindex();
Xint MySyncRun( char *com, char *args, BPTR in, BPTR out );
Xint echofunc(void);
Xlong IoError;
X
Xint
Xdo_run( char *str )
X{
X	int retcode;
X	char buf[200]; /* enough space for 100 char cmd name + path stuff */
X	char *path, *argline, *trueargline, *copy, *ext, *dst, *end;
X
X	if( !*av[0] )
X		return 0;
X
X	if( (retcode=echofunc())>=0 )
X		return retcode;
X
X	a0tospace( av[0] );                                 /* allow "com mand" */
X
X	IoError=0;
X	if( ac==1 && (isdir(av[0]) || !strcmp( av[0],"..") || !strcmp(av[0],"~"))) {
X		if( !strcmp(av[0],"~") && (dst=get_var(LEVEL_SET,v_lcd)) )
X			sprintf(buf,"cd %s",dst);
X		else 
X			sprintf(buf,"cd %s",av[0]);
X		execute( buf );
X		return 0;
X	}
X
X	if( (IoError==218 || IoError==225 || IoError==226) && index(av[0],':')) {
X		ierror( av[0], IoError );
X		return 20;
X	}
X
X	argline=compile_av(av, 1, ac, ' ', 1);
X	trueargline= (*argline ? argline : "\n");
X
X	if (strlen(av[0]) > 100) { ierror(NULL,509); return -1; }
X
X	sprintf(buf,"res_%s",BaseName(av[0]));              /* delayed residents */
X	if (o_resident && Getenv(buf, buf+100, 90L) && loadres(av[0]))
X		Setenv(buf,NULL);
X
X	if( (retcode=MySyncRun(av[0],trueargline,0L,0L))>=0 )   /* AmigaDOS path */
X		goto done2;
X
X	strcpy(buf,"source ");
X	if (path = dofind(av[0],"",buf+7,v_path)) {             /* shell path    */
X		if((retcode = MySyncRun(path,trueargline,0L,0L))>=0)
X			goto done2;
X		else {
X			struct DPTR *dp;
X			int stat;
X			if(dp=dopen(path,&stat)) {
X				stat=dp->fib->fib_Protection & FIBF_SCRIPT;
X				dclose(dp);
X				if( stat ) {
X					execute(buf);
X					return 0;
X				}
X			}
X		}
X	}
X
X	if(!(end=rindex(av[0],'.'))) end="";               /* automatic sourcing */
X	ext=strcmp(end,".sh") ? ".sh" : "";
X	if (path = dofind(av[0],ext,buf,v_path)) {
X		av[1] = buf;
X		copy = malloc(strlen(str)+3);
X		sprintf(copy,"x %s",str);
X		retcode = do_source(copy);
X		goto done;
X	}
X
X	copy=malloc(strlen(av[0])+strlen(argline)+5);
X	sprintf(copy,"%s %s",av[0],trueargline);
X
X	ext=strcmp(end,".rexx") ? ".rexx" : "";           /* automatic rx-ing   */
X	if( path = dofind(av[0], ext, buf, v_rxpath )) {
X		if( (retcode=MySyncRun("rx",copy,0L,0L)) >=0 ) goto done;
X		if (path = dofind("rx","",buf,v_path)) {
X			retcode = MySyncRun(path,copy,0L,0L);
X			goto done;
X		}
X	}
X
X	if( !doaction(av[0],"exec",argline)) {
X		retcode=0;
X		goto done;
X	}
X
X	retcode=-1;
X	fprintf(stderr,"Command Not Found %s\n",av[0]);
X
Xdone:
X	free( copy );
Xdone2:
X	free( argline );
X	return retcode;
X}
X
Xstruct Segment {
X	BPTR NextEntry;
X	LONG UseCount;
X	BPTR SegPtr;
X	BSTR SegName;
X};
X
Xint
XMySyncRun( char *com, char *args, BPTR in, BPTR out )
X{
X	struct Segment *seg;
X	int ret;
X	char buf2[84], *buf=buf2;
X	long oldname;
X
X#ifdef KICK20
X	if( o_kick20 ) {
X		oldname = (long)Mycli->cli_CommandName;
X
X		while( (long)buf & 3 ) buf++;
X		buf[0] = strlen( com );
X		strncpy(buf+1,com,80);
X
X		Forbid();
X		seg=FindSegment( com, NULL, 0 );
X		Permit();
X		if( seg ) {
X			Mycli->cli_CommandName = (long)buf/4;
X			seg->UseCount++;
X
X			ret=RunCommand(seg->SegPtr, Mycli->cli_DefaultStack,
X			                                 args, strlen(args));
X			seg->UseCount--;
X			Mycli->cli_CommandName = (long)oldname;
X			return ret;
X		}
X
X		if( o_internal ) {
X			Forbid();
X			seg=FindSegment( com, NULL, 1 );
X			Permit();
X			if( seg ) {
X				Mycli->cli_CommandName = (long)buf/4;
X
X				ret=RunCommand(seg->SegPtr, Mycli->cli_DefaultStack,
X				                                 args, strlen(args));
X				Mycli->cli_CommandName = (long)oldname;
X				return ret;
X			}
X		}
X
X	}
X#endif
X	if( (ret= SyncRun( com, args, in, out ))>=0 )
X		return ret;
X
X	return ret;
X}
X
Xint
Xdo_which( char *str )
X{
X	char *got, *com=av[1];
X
X	if( get_var(LEVEL_ALIAS,com) ) {
X		printf("Shell Alias '%s'\n",com);
X		return 0;
X	}
X
X	if( *(got=find_internal( com ))>1 ) {
X		printf("Shell Internal '%s'\n",got);
X		return 0;
X	}
X
X
X
X	printf( "Not found\n" );
X	return 20;
X}
X
X
Xchar *
Xdofind( char *cmd, char *ext, char *buf, char *path)
X{
X	char *ptr, *s=path;
X
X	Myprocess->pr_WindowPtr = (APTR)(-1);
X	sprintf(buf,"%s%s",cmd,ext);
X	if (exists(buf)) return buf;
X	if (BaseName(buf)==buf) {
X		if( *path=='_' )
X			s = get_var(LEVEL_SET, path);
X		while (*s) {
X			for (ptr=buf; *s && *s!=','; ) *ptr++ = *s++;
X			if( ptr[-1]!=':' && ptr[-1]!='/')
X				*ptr++='/';
X			sprintf(ptr, "%s%s", cmd, ext);
X			if (exists(buf)) {
X				Myprocess->pr_WindowPtr = (APTR)o_noreq;
X				return buf;
X			}
X			if (*s) s++;
X		}
X	}
X	Myprocess->pr_WindowPtr = (APTR)o_noreq;
X	return NULL;
X}
END_OF_FILE
if test 4716 -ne `wc -c <'run.c'`; then
    echo shar: \"'run.c'\" unpacked with wrong size!
fi
# end of 'run.c'
fi
if test -f 'sample.sh' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'sample.sh'\"
else
echo shar: Extracting \"'sample.sh'\" \(926 characters\)
sed "s/^X//" >'sample.sh' <<'END_OF_FILE'
X# first a few useful aliases
X
Xal d   "dir -hq"  # hides .info and block lengths
Xal lst "ls -t"    # sorts by access time
Xal lsl "ls -l"    # sorts by length
X
X# sc searches *.c, even 'sc -c main()' works
X
Xal sc "%a search @pickopts( $a ) *.c @pickargs( $a )
X
X# edf edits a function in Cygnus Ed if the name starts in the first column:
X
Xal edf "%func set b \"\";search -afl *.c $func | inp b;\
X if $b;split b file line;ed $file;waitforport rexx_ced;\
X  inc line 1;rxs rexx_ced \"jump to file \"$file \"jumpto \"$line\" 0\";\
X else;\
X  echo Not found;\
X endif
X
X# this aliases suppress wild card expansion for certain commands
X
Xal zoo     "*a Zoo $a
Xal lharc   "*a Lharc $a
Xal lz      "*a Lz $a
Xal newlist "*a Newlist $a
X
X# pushd pushes the current directory on a stack
X# popd  retrieves it from there
X
Xset stk ""
Xal pushd   "set stk $_cwd @subwords( $stk 1 10 );"
Xal popd    "\\cd @first( $stk );set stk @subwords( $stk 2 10 );"
END_OF_FILE
if test 926 -ne `wc -c <'sample.sh'`; then
    echo shar: \"'sample.sh'\" unpacked with wrong size!
fi
# end of 'sample.sh'
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'\" \(6486 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 * Version 4.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
X * Version 5.00L by Urban Mueller 17-Feb-91
X *
X */
X
X#include "shell.h"
X
Xstatic char *sys_expand( char *str, char *t );
Xstatic void set_sys_var( char *name );
X
X#define MAXLEVELS (3+MAXSRC)
X#define HASH 32
X
Xtypedef struct VNode {
X	struct VNode *next;
X	char *text;
X	char name[1];
X} NODE;
X
Xtypedef struct VRoot {
X	NODE *first[HASH];
X} ROOT;
X
XROOT Mbase[ MAXLEVELS ];
X
Xvoid
Xset_var( int level, char *name, char *str )
X{
X	NODE **first=&Mbase[level].first[*name & HASH-1], *node;
X	char *t, c;
X
X	if( !str ) str="";
X
X	for( t=name; isalphanum(*t); t++ ) ;
X	c=*t; *t=0;
X
X	for( node=*first; node; node=node->next )
X		if( !strcmp( node->name, name) ) {
X			free( node->text );
X			goto copy;
X		}
X
X	node=malloc(sizeof(NODE) + strlen(name));
X	node->next=*first;
X	*first=node;
X	strcpy( node->name, name );
X
Xcopy:
X	node->text=strcpy( malloc(strlen(str)+1), str );
X	*t=c;
X	if( *name=='_' )
X		set_sys_var( name );
X}
X
X
Xchar *
Xget_var( int level, char *name )
X{
X	NODE *node=Mbase[level].first[*name & HASH-1];
X	char *t, c;
X
X	for ( t= name; *(signed char *)t > 0; t++ ) ; /*  *t!=0 && *t<0x80  */
X	c=*t; *t=0;
X
X	for( ; node; node=node->next )
X		if( !strcmp(node->name,name) )
X			{ *t=c; return node->text; }
X	*t=c;
X	return NULL;
X}
X
Xvoid
Xunset_level( int level )
X{
X	NODE *node;
X	int i;
X
X	for( i=0; i<HASH; i++ ) {
X		for( node=Mbase[level].first[i]; node; node=node->next ) {
X			Free ( node->text );
X			Free ( node );
X		}
X		Mbase[level].first[i] = NULL;
X	}
X}
X
Xvoid
Xunset_var( int level, char *name )
X{
X	NODE **first=&Mbase[level].first[*name & HASH-1], *node, *prev;
X	char *t, c;
X
X	for( t=name; isalphanum(*t); t++ ) ;
X	c=*t; *t=0;
X
X	for( node=*first, prev=NULL; node; prev=node, node=node->next )
X		if( !strcmp( node->name, name) ) {
X			if( prev ) prev->next=node->next; else *first=node->next;
X			Free( node->text );
X			Free( node );
X			if( *name=='_' )
X				set_sys_var( name );
X			break;
X		}
X	*t=c;
X}
X
X
Xvoid
Xset_var_n( int level, char *name, char *str, int n )
X{
X	char c, len=strlen(str);
X
X	if( n>len )
X		n=len;
X
X	if( n>=0 ) {
X		c=str[n]; str[n]=0;
X		set_var( level, name, str );
X		str[n]=c;
X	} else 
X		set_var( level, name, "" );
X}
X
Xint
Xdo_unset_var( char *str, int level )
X{
X	int i;
X
X	for (i = 1; i < ac; ++i)
X		unset_var (level, av[i]);
X	return 0;
X}
X
Xint
Xdo_set_var( char *command, int level )
X{
X	ROOT *root = &Mbase[level];
X	NODE *node;
X	int i;
X	char *str;
X
X	switch (ac) {
X	case 1:
X		for( i=0; i<HASH && !breakcheck(); i++ )
X			for( node=root->first[i]; node && !dobreak(); node=node->next )
X				printf ("%s%-10s %s\n", o_lolite, node->name, node->text);
X		break;
X	case 2:
X		if (str=get_var(level,av[1])) printf ("%-10s %s\n", av[1], str);
X		break;
X	default:
X		set_var (level, av[1], next_word (next_word (command)));
X		break;
X	}
X	return 0;
X}
X
X
Xextern char shellvers[];
X
Xstatic char *
Xsys_expand( char *str, char *t )
X{
X	struct DateStamp dss;
X	DateStamp(&dss);
X
X	if( !str ) {
X		*t=0;
X		return t;
X	}
X
X	while (*str)
X		if (*str=='%') {
X			str+=2;
X			switch( str[-1] ) {
X			case 'p': t+=sprintf(t,"%s", get_var(LEVEL_SET, "_cwd")); break;
X			case 'm': t+=sprintf(t,"%d", AvailMem( 0 )/1024);         break;
X			case 't': t+=sprintf(t,"%s", next_word(dates(&dss)));     break;
X			case 'd':    sprintf(t,"%s", dates(&dss)); t=index(t,' ');break;
X			case 'c': t+=sprintf(t,"%s", o_hilite);                   break;
X			case 'v': t+=sprintf(t,"%s", shellvers );                 break;
X			case 'n': t+=sprintf(t,"%s", get_var(LEVEL_SET,"_clinumber"));break;
X			case 'h': t+=sprintf(t,"%s", get_var(LEVEL_SET, v_histnum));  break;
X			case 'f': t+=sprintf(t,"%s", oneinfo(get_var(LEVEL_SET,v_cwd),4));break;
X			case 'r': t+=sprintf(t,"%d", (SBYTE)Myprocess->pr_Task.tc_Node.ln_Pri);break;
X			default : *t++=str[-1];
X			}
X		}
X		else *t++=*str++;
X	*t=0;
X	return t;
X}
X
Xchar truetitle[200];
X
Xchar o_hilite[24], o_lolite[8], *o_csh_qcd, o_kick20, o_nobreak;
Xchar o_minrows, o_scroll, o_nowindow, o_noraw, o_vt100, o_nofastscr;
Xchar o_nobreak, o_bground, o_resident, o_internal;
Xlong o_noreq;
X
Xextern char trueprompt[100];
X
Xstatic void
Xset_sys_var( char *name )
X{
X	char *get, *str, c=name[1], col;
X
X	if( c==v_debug  [1] ) debug  =  get_var(LEVEL_SET,v_debug  )!=NULL;
X	if( c==v_verbose[1] ) Verbose=  get_var(LEVEL_SET,v_verbose)!=NULL;
X	if( c==v_nobreak[1] ) o_nobreak=get_var(LEVEL_SET,v_nobreak)!=NULL;
X	if( c==v_hilite [1] && !strcmp( name, v_hilite)) {
X		o_hilite[0]=o_lolite[0]=0;
X		get= get_var(LEVEL_SET,v_hilite);
X		str= o_hilite;
X		while( get && *get ) {
X			switch( *get++ ) {
X			case 'b': str+=sprintf( str, "\033[1m" ); break;
X			case 'i': str+=sprintf( str, "\033[3m" ); break;
X			case 'u': str+=sprintf( str, "\033[4m" ); break;
X			case 'r': str+=sprintf( str, "\033[7m" ); break;
X			case 'c': str+=strlen(str);
X			          if( *get>='0' && *get<='9' ) {
X			             col=*get++;
X			             if( *get==',' && get[1]>='0' && get[1]<='9' ) {
X			                 str+=sprintf( str,"\033[3%cm\033[4%cm",col,get[1]);
X			                 get+=2;
X			             } else 
X			                 str+=sprintf( str,"\033[3%cm",col );
X			          }
X			          break;
X			}
X		}
X		*str=0;
X		if( *o_hilite )
X			strcpy(o_lolite,"\033[m");
X		strcpy(sys_expand(str,trueprompt),o_lolite);
X	}
X	if( c==v_scroll[1] ) {
X		o_scroll=0;
X		if( (str= get_var(LEVEL_SET,v_scroll))) {
X			o_scroll=atoi( str );
X			if( o_scroll<2 ) o_scroll=0;
X			if( o_scroll>8 ) o_scroll=8;
X		}
X	}
X	if( c==v_minrows[1] ) {
X		o_minrows=34;
X		if( (str= get_var(LEVEL_SET,v_minrows))) {
X			o_minrows=atoi( str );
X			if( o_minrows<8 )   o_minrows=8;
X			if( o_minrows>100 ) o_minrows=100, o_scroll=0;
X		}
X	}
X	if( c==v_qcd[1] ) {
X		o_csh_qcd="s:csh-qcd";
X		if( str=get_var(LEVEL_SET,v_qcd) )
X			o_csh_qcd=str;
X	}
X	if( c==v_noreq[1] ) {
X		o_noreq= get_var(LEVEL_SET,v_noreq ) ? -1 : 0;
X		Myprocess->pr_WindowPtr = (APTR)o_noreq;
X	}
X	if( c==v_hist[1] )
X		S_histlen=(str= get_var(LEVEL_SET, v_hist)) ? atoi(str) : 0;
X	if( c==v_titlebar[1] )
X		update_sys_var( v_titlebar );
X}
X
Xvoid
Xupdate_sys_var( char *name )
X{
X	char c=name[1], *str, buf[250];
X
X	if( c==v_prompt[1] ) {
X		if( (str=get_var(LEVEL_SET,v_prompt) ) ==NULL) str="$ ";
X		strcpy(sys_expand(str,trueprompt),o_lolite);
X	}
X	if( c==v_titlebar[1] && !o_nowindow && Win ) {
X		sys_expand( get_var(LEVEL_SET, v_titlebar), buf);
X		if (strcmp(Win->Title, buf)) {
X			strcpy(truetitle,buf);
X			SetWindowTitles(Win, truetitle, (char *)-1);
X		}
X	}
X}
END_OF_FILE
if test 6486 -ne `wc -c <'set.c'`; then
    echo shar: \"'set.c'\" unpacked with wrong size!
fi
# end of 'set.c'
fi
if test -f 'shell.doc.ac' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'shell.doc.ac'\"
else
echo shar: Extracting \"'shell.doc.ac'\" \(10945 characters\)
sed "s/^X//" >'shell.doc.ac' <<'END_OF_FILE'
X	  in the next chapter which aliases all those cases.
X	- because the 'if' command works differently now, variables with
X	  embedded stand-alone '<' or '<=' type operators will cause problems
X	  if they are on the left side in an 'if' statement:
X		set a b "<" c;if $a > x;echo b > x;end --> b > x
X	- A question mark '?' as the only argument to a command now shows the
X	  usage of that command and does NOT pattern match.
X
XXII. EXAMPLE SOURCE FILES
X-------------------------
X
XIf from a CLI or the startup-script you say 'SHELL filename', that file is
Xsourced first.
X
X### compat.sh ###
X
X# this makes sure that your old abbreviations don't call new commands
X
Xalias as  aset
Xalias cl  close
Xalias g   goto
Xalias h   help
Xalias he  help
Xalias m   md
Xalias q   quit
Xalias re  rename
Xalias w   window
X
Xalias kr  "rm -r ram:* >NIL:
X
X### End of compat.sh ###
X
X
XMoreover, if you have a file called S:.login, it will be sourced for every
XShell you run. This is useful for aliases and setting that you want in ALL
XShells.
X
X
X### Example S:.login ###
X
XHere is an example .login file:
X
Xset F5 "cdir WORK:"^M
Xset f9 "ed s:login.sh"^M
Xset F9 "ed df0:s/startup-sequence"^M
X
Xalias toram  "%q foreach i ( $q ) \"cp -r $i: ram:$i >NIL:;assign $i: ram:$i
Xalias ramop  "md RAM:op; assign OP: ram:op
Xalias noop   "assign OP: ; rm -r ram:op
Xalias newop  "rm -r OP:*
Xalias dc     "dfc df0: to df1:
Xalias go     "%q assign WORK: Boot:$q; cd WORK:; source startme.sh
Xalias get    "%q cp $q RAM: >NIL:
Xalias filter "%a%b%c exec $b \\<$a \\>$c
X	# reads $a, filters it with $b and writes result to $c
X
Xalias rm     "%q \\rm @confirm( Remove $q )
X
X#alias rm     "%a set f @pickargs( $a );set opts @pickargs( $a );\
X# e -n OK to delete @words( @files( $f ) ) file(s) and @words( @dirs( $f ) )\
X# directories\"? \";input b;if $b = y;\\rm $opts $f;endif 
X#		# for the anxious among us: confirmed rm
X
Xset _prompt   "%c%p> "
X	# this puts the path highlighted in the prompt
X
X# this one puts cli number, free mem, date and time in title bar
Xset _titlebar "Shell %n    Mem %m     Date %d    Time %t
X
X# This file will be sourced for every Shell you start
X
X### End of example .login ###
X
X****************************************************************************
X
XIf you are a CLI user, your startup-sequence may be as simple as:
X
X	C:csh S:startup.sh
X
XHere is, my startup code:
X
X### Example S:startup.sh ###
X
Xwind -l	# if you are on a PAL machine, or use overscan
X	# note that commands may be abbreviated (wind=window)
X
Xassign LC: Stuff:c  INCLUDE: Stuff:include   LIB: Boot:lib   QUAD: RAM:
X
Xrback C:FaccII; sleep 1
X	# after spawning a process, it is always better to allow it
X	# to load the command, to avoid excessive drive head movement
X
Xresident -d blink lc1 lc2 >NIL:	#defer loading
X
XC:PopCli 300 C:Newcli 		#using full pathname loads faster
XC:FF -1 Siesta.font >NIL:
XC:Patch_1 >NIL:
Xstack 8000			# lc1 and lc2 need this
X
Xsource S:setdate.sh		# this is listed next 
X
X### End of example startup.sh ###
X
X****************************************************************************
X
XThe following is an example source file to set date and time; it may be
Xused at startup if you don't have an internal clock.
X
X### setdate.sh ###
X
Xopen CON:200/100/440/80/SetDate write 1
Xecho >.1 -n "Current date is "
Xdate >.1
Xecho >.1 -n "Please enter date: "
Xinput <.1 d
Xclose 1
Xstrlen len $d
Xif $len > 1 ; date $d ; endif
Xecho -n "New date: " ; date
X
X### End of setdate.sh ###
X
X***************************************************************************
X
XNext comes a makefile that needs no Make program: may be executed from
XShell directely!!!
X
X### make.sh ###
X
Xif -t Shell.syms Shell.h; cc +HShell.syms Shell.h; rm shell.o; endif
Xif -t RAM:Shell.syms Shell.syms; cp -d Shell.syms RAM:; endif
X
Xforeach i ( main comm1 comm2 comm3 execom globals rawconsole run set \
X sub ) "if -t $i.o $i.c; echo Compile $i...;cc +IRAM:shell.syms $i.c; endif"
X
X# we used line continuation for better visibility. this is not necessary,
X# you can type it all in one line. note the limit of 256 bytes per line
X
Xif -t Shell run.o main.o comm1.o comm2.o comm3.o execom.o \
Xset.o sub.o globals.o rawconsole.o
X	ln  +q -m -o Shell run.o main.o comm1.o comm2.o comm3.o\
X	execom.o set.o sub.o globals.o rawconsole.o -la -lc
Xendif
X
X### End of make.sh ###
X
X
XXIII.  Default Values
X--------------------
X
XTo make things easier, some aliases are predefined whenever you start a
Xnew Shell. These are:
X
X    CLS
X	Simply clear the screen.
X
X    CDIR
X	Use "cdir directory" to clear the screen, set CD to directory,
X	and list it.
X
X    EXIT
X	Leave Shell and exit CLI.
X
X    FG
X	Runs current shell in foreground, this means priority 1.
X
X    KR
X	Used to delete everything on RAM:. This one is gone, if you still
X	want it, you'll have to put it in your s:.login
X
X    LP
X	List to printer one or more files.
X
X    MANLIST
X	Display  a list of possible arguments to man.  You can pipe this to
X	qsort to get a sorted output.
X
X    NICE
X	Sets this shell to priority -1.
X
XMoreover, many variables have default values, and many function keys are
Xpredefined. You can use set command to determine all of these.
X
XXIV.  Object oriented features
X------------------------------
X
X    CLASSES OF FILES
X
X	You can define a class of files using several 'class' commands.
X	Here a simple example:
X
X	  class picture  suff=.pic suff=.iff suff=.ilbm 
X	  class anim     suff=.anim
X
X	From now on, everything with the suffix .pic, .iff or .ilbm will
X	be identified as a picture. Please note that there may be no blanks
X	between the names and the '=', and that blanks inside the names
X	must be put in quotes. So these are the ways to identify a file:
X
X	  suff=.doc        True if the suffix of the file is .doc
X	  name=readme      True if the file is "readme"
X	  offs=14,DC..C4FD True if the bytes starting at $14 are $DC,
X	                   anything, $C4, $FD  (all numbers hexadecimal!). 
X	                   Each pair of dots means one byte ignored.
X	  chars            True if 90% of the bytes in the file are 32..127
X	                   or 9..13
X	  default          Always true, used to define the default type
X
X	Note that only the first character is examined, so 's' = 'suff'.
X	One class can be identified by more than one 'class' statement.
X	They are looked at in the same sequence they were entered. So to
X	make sure that an zoo archive misnamed as .lzh is identified
X	correctly, use the following 'class' statements:
X
X	  class zoo offs=14,DCA7C4FD
X	  class lzh offs=2,2D6C68..2D
X	  class zoo suff=.zoo
X	  class lzh suff=.lzh
X
X	Moreover, there is a builtin class 'dir', which means directory.
X	Now we know many file types. But what to do with them? This is
X	where we define 'actions'.
X
X    ACTIONS ON CLASSES
X
X	There may be one or more 'class' command that define what actions
X	need to be taken in various cases for that specific class:
X
X	  class zoo actions view="zoo -list" extr="zoo -extract"
X	  class lzh actions view="lz l"      extr="lz e"
X
X	Whenever somebody tries to 'view' a test.zoo, the command
X	'zoo -list test.zoo' will be issued, but if he tries to
X	view test.lzh, then 'lz l test.lzh' will be executed. Note
X	that any command supplied here goes through the normal csh
X	parser, so AmigaDOS and csh paths will be searched. Aliases
X	with arguments are allowed here, too, so whatever the user
X	typed will be stored in the variable after the '%'.
X
X	How do I tell a file that I want to 'view' it? There comes the
X	second command used for object oriented features:
X
X	  action view test.zoo
X
X	will first identify the type of that file and then apply, if
X	possible, the 'view' action to it. Of course, this works best
X	inside an alias:  alias v "action view" will define a v-command
X	that views all types of files known to cshell. Similarly, you
X	can define   alias xtr "action extr" and use this command to
X	extract files from any type of archive.
X	There is one action that will be sent to every file that you
X	try to start but is not executable. This action is 'exec'. 
X	Assume you have defined the class 'picture', then after
X
X	  class picture actions view=Mostra exec=Mostra
X
X	you can display a picture using Mostra by just typing its name.
X	More builtin actions like 'rm' and 'dir' may be implemented,
X	so don't use command names for action names.
X
X	The batch file class.sh defines a few useful classes.
X
X
X
XXV.     Keymaps
X---------------
X
X	You define a keymap as a collection of key/function pairs. Both
X	are given as numbers. There can be several keymaps which activate
X	each other, but at first we only edit keymap 0, which is active
X	at the beginning. All keys you define will eventually overwrite
X	the old definitions in an existing keymap. Everithing marked with
X	a (*) is not yet implemented.
X
X    KEYCODES
X
X	1..255    The corresponding ASCII character
X	256	  Up Arrow
X	257	  Down Arrow
X	258	  Right Arrow
X	259	  Left Arrow
X	260	  Help
X	261..270  F1..F10  (unshifted)
X
X
X	Modifiers (add them to the key code)
X
X	512       SHIFT (only necessary for arrows and fkeys)
X	1024      ESC   (was pressed & released before this key)
X
X    EDITFUNCTIONS
X
X	- Movement      Move cursor...
X	 0  CursLeft    1 left
X	 1  CursRight   1 right
X	 2  WordLeft    1 word left
X	 3  WordRight   1 word right
X	 4  BegOfLine   to beginning of line
X	 5  EndOfLine   to end of line
X
X	- Deleting      Delete...
X	10  Backspace   char left from cursor
X	11  Delete      char right from cursor
X	12  BkspcWord   word left from cursor
X	13  DelWord     word right from cursor
X	14  DeleteToSOL to start of line
X	15  DeleteToEOL to end of line
X	16  DeleteLine  whole line
X
X	- History
X	20  Back        Move one line back in history
X	21  Forward     Move one line forward in history
X	22  Beg         Move to first line in history
X	23  End         Move to last line in history
X	24  Complete    History retrieve like '!'
X	25  Exec        Execute history line & bring up next
X	26  Tail        Insert previous line except first word
X
X	- Completion
X	30  Normal      Insert first matching file (or cycle)
X	31  Partial     Insert substring of all matching files
X	32  All         Insert all matching files
X	33  Directory   Find dir in quick cd list
X	34  LastCD      Insert last current directory
X
X	- Special
X	40  Insert      Toggle Insert/Overwrite
X	41  Quit        Silently perform 'quit'
X	42  Help        Silently perform 'help'
X	43  Refresh     Redraw current line
X	44  Execute     Execute current line
X	45  Leave       Edit new line, store this in hist
X	46  EOF         Terminate shell
X	47  NOP         Do nothing
X	48  Echo^O      Echoes a ^O
X	49  Beep        Echoes a ^G
X
X	- Other
X	50  Fkey        Execute command associated to last fkey
X	51  Menu        Execute command associated to last menu
X	52  Undo        Undoes last edit
X	53  Repeat      Repeats last function
X
X
X	Command types
X
X	0   +x	  Editing function x, see above descriptions
X	512 +x	  Setmap x,     x=0..7
X	1024+x	  Insert key x, x=1..255
X	1536+x	  Macro x       x=1..15         (*)
X	2048+x	  String x      x=1..15         (*)
END_OF_FILE
if test 10945 -ne `wc -c <'shell.doc.ac'`; then
    echo shar: \"'shell.doc.ac'\" unpacked with wrong size!
fi
# end of 'shell.doc.ac'
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'\" \(5730 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.01A by Carlo Borreo & Cesare Dieni 17-Feb-90
X *
X */
X
X#define RAW_CONSOLE 1   /* Set to 0 to compile out Cmd Line Editing */
X#define KICK20
X
X#define strlen strlen
X
X#include <exec/types.h>
X#include <exec/exec.h>
X#include <libraries/arpbase.h>
X#include <intuition/intuitionbase.h>
X#include <libraries/dosextens.h>
X#include <time.h>
X#include <ctype.h>
X#include <fcntl.h>
X#include <stdio.h>
X#include <stdlib.h>
X#include <string.h>
X#include "proto.h"
X
XLONG AssignLock( UBYTE *name, BPTR lock );
XBOOL AssignLate( UBYTE *name, UBYTE *path );
XBOOL AssignPath( UBYTE *name, UBYTE *path );
XBOOL AssignAdd( UBYTE *name, BPTR lock );
X
Xtypedef struct FileInfoBlock FIB;
X#ifdef AZTEC_C
X
X# include <functions.h>
X# define DEVTAB(x) _devtab[x->_unit].fd
X# define CHARSWAIT(x) (x->_bp < x->_bend)
X# define COMPILER "Aztec C 5.0d"
X# pragma amicall(DOSBase, 0x264, AssignLock(d1,d2))
X# pragma amicall(DOSBase, 0x26a, AssignLate(d1,d2))
X# pragma amicall(DOSBase, 0x270, AssignPath(d1,d2))
X# pragma amicall(DOSBase, 0x276, AssignAdd(d1,d2))
X
X#else
X
X# include <proto/all.h>
X# include <ios1.h>
X# define DEVTAB(x) _ufbs[(x)->_file].ufbfh
X# define CHARSWAIT(x) (x->_rcnt != x->_wcnt)
X
X  extern struct UFB _ufbs[];
X# define COMPILER "Lattice C 5.10"
X# define index strchr
X# define memmove(t,f,l) movmem((f),(t),(l))
X# define swapmem(x,y,z) swmem(x,y,z)
X# pragma libcall DOSBase AssignLock 264 2102
X# pragma libcall DOSBase AssignLate 26a 2102
X# pragma libcall DOSBase AssignPath 270 2102
X# pragma libcall DOSBase AssignAdd 276 2102
X
X#endif
X
X#ifndef MAX
X#define MAX(x,y) ((x)>(y) ? (x) : (y))
X#endif
X
X#ifdef KICK20
Xtypedef ULONG	Tag;
Xstruct TagItem	{
X    Tag		ti_Tag;
X    ULONG	ti_Data;
X};
X#define TAG_DONE   (0L)	/* terminates array of TagItems. ti_Data unused	*/
X#define TAG_END	TAG_DONE
X#define	TAG_IGNORE (1L)	/* ignore this item, not end of array		*/
X#define	TAG_MORE   (2L)	/* ti_Data is pointer to another array of TagItems
X						 * note that this tag terminates the current array */
X#define	TAG_SKIP   (3L)	/* skip this and the next ti_Data items		*/
X#define TAG_USER (1L<<31) /* differentiates user tags from system tags*/
X
X/* definitions for the System() call */
X
Xenum {	SYS_Dummy = TAG_USER + 32,
X	SYS_Input,			/* specifies the input filehandle  */
X	SYS_Output,			/* specifies the output filehandle */
X	SYS_Asynch,			/* run asynch, close input/output on exit(!) */
X	SYS_UserShell,		/* send to user shell instead of boot shell */
X	SYS_CustomShell,	/* send to a specific shell (data is name) */
X};
X#endif
X
X#define MAXAV		256		/* Max. # of 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#define LEVEL_SOURCE	2
X
X#define SBYTE signed char
X#define MAXITEMS 16
X#define MAXMENUS 6
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 **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  max_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 FILE *Src_base[MAXSRC];
Xextern long Src_pos[MAXSRC];
Xextern int  Src_if[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[], v_passed[],
X	v_path[], v_gotofwd[], v_linenum[], v_every[], v_lcd[], v_rxpath[],
X	v_hilite[], v_scroll[], v_minrows[], v_result[], v_qcd[], v_noreq[],
X	v_value[], v_nobreak[], v_bground[];
X
Xextern char o_hilite[], o_lolite[], *o_csh_qcd, o_internal;
Xextern char o_aux, o_minrows, o_scroll, o_nowindow, o_noraw, o_vt100;
Xextern char o_nofastscr, o_kick20, o_nobreak, o_bground, o_resident;
Xextern long o_noreq;
Xextern char Buf[], isalph[], confirmed, *classfile;
X
X/* #define isalphanum(x) isalph[x] */
X
Xtypedef struct file_info {
X	LONG flags;
X	LONG size;
X	LONG blocks;
X	char class[12];
X	struct DateStamp date;
X} FILEINFO;
X
Xtypedef struct Class {
X	struct Class *next;
X	char name[1];
X} CLASS;
X
Xextern CLASS *CRoot, *LastCRoot;
Xextern struct Window *Win;
X
X#if 1
XLONG RunCommand( BPTR seg, long stack, UBYTE *paramptr, long paramlen );
Xstruct Segment *FindSegment( UBYTE *name, struct Segment *seg, long system );
XLONG System( UBYTE *command, struct TagItem *tags );
X
X# pragma libcall DOSBase RunCommand 1f8 432104
X# pragma libcall DOSBase FindSegment 30c 32103
X# pragma libcall DOSBase System 25e 2102
X#endif
END_OF_FILE
if test 5730 -ne `wc -c <'shell.h'`; then
    echo shar: \"'shell.h'\" unpacked with wrong size!
fi
# end of 'shell.h'
fi
if test -f 'technotes.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'technotes.doc'\"
else
echo shar: Extracting \"'technotes.doc'\" \(2908 characters\)
sed "s/^X//" >'technotes.doc' <<'END_OF_FILE'
X		TECHINCAL NOTES FOR SHELL VERSION: 5.00 17-Feb-91
X		=================================================
X
XSTRUCTURE
X---------
X
XThe  heart  of  CShell  is  still the old parser of Matt Dillon, which went
Xthrough  its  first  major change in this version (Matt abused bit 7 of the
Xcharacters,  so  international characters would not work).  Everything else
Xwere  just  minor  enhancements, which are very useful, though.  It's quite
Xhard  to read, and it's huge (took me DAYS to understand it), but maybe all
Xinterpreters look like this...
X
XThe other side of the shell are the built in commands.  They look much like
XCLI commands in C, but they have helluva lot of support functions for their
Xneeds.
X
XTo  write a builtin command for CShell, you use the global variables av and
Xac  instead of argv and argc, and use printf() for output.  That's it.  Any
Xother changes, if necessary, will be done by me.
X
XEvery  builtin  command  has its equivalent as a C function with the prefix
Xdo_ (example:  do_addbuffers).  The are no hard coded jumps to any of those
Xfunctions,  instead there is a table with the descriptions of all functions
X(like  name, usage, minimum arguments and, last but not least, a pointer to
Xthat function).
X
XI'll  probably  create  a  .doc that descibes the insides of the thell more
Xprecisely, and distribute it along with the source if I find the time to do
Xit (not everybody is a 24 hour programmer like Matt :-)
X
XWHY BUILT IN COMMANDS?
X----------------------
X
XThe reasons why does C-Shell still relies heavily on internal
Xcommands:
X- They can take advantage from each other (e.g. class recognition in the
X  'dir' command, use of 'search' command in quick cd)
X- They have a fast calling sequence
X- They need no hard disk seeks, so the startup can be accelerated
X  significantly
X- They are shorter than external commands
X- And finally, if you don't like them, don't use them. The wasted resources
X  become more and more negligible nowadays.
X
XSOURCE
X------
X
XThe  source  for CShell is available, if you don't have it, request it from
Xme.   It consists of 10 modules, together 190K.  It is compilable under SAS
X(Lattice)  &  Manx  C,  although  the  executables produced by Manx are not
Xresidentable.   If you want to modify it, ask me for an up-to-date version
Xfirst.   You  may  not  release  modified  versions  (imagine  the chaos if
Xeverbody  releases his private csh), but if you send them to me, you have a
Xvery good chance that I'll build it in.  You'll be, of course, be mentioned
Xin the docs.
X
XEven  if  you  don't  intend to modify it, I still encourage you to get the
Xsource,  because  there  are  so many things you can look up there once you
Xneed  it  (did *you* know how to set the system date?).  I apologize for my
Xpoor to nonexistent comments, I'll go through again when I've got the time.
XAh,  yes,  that  famous  Dillon-formatting  is gone, now it's traditionally
Xformatted.
END_OF_FILE
if test 2908 -ne `wc -c <'technotes.doc'`; then
    echo shar: \"'technotes.doc'\" unpacked with wrong size!
fi
# end of 'technotes.doc'
fi
echo shar: End of archive 1 \(of 6\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 2 3 4 5 6 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 6 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
-- 
Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
Mail comments to the moderator at <amiga-request@uunet.uu.net>.
Post requests for sources, and general discussion to comp.sys.amiga.misc.