[comp.sources.amiga] v91i067: NoDelete 1.5a - intercept DeleteFile

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

Submitted-by: hoover@math4.uni-bielefeld.de (Uwe Sch"urkamp)
Posting-number: Volume 91, Issue 067
Archive-name: utilities/nodelete-1.5a/part01

[ includes uuencoded executable  ...tad ]

                     CHANGES TO VERSION 1.4: MAR 1991
Switched  to  ARP  (finally).   This  great  bunch  of routines should have
experienced  a  wide  enough  distribution  by now to make this acceptable.
Cheers to everyone involved in this project!  ARP is used to do the pattern
matching  on filenames.  No more restriction is made on the patterns.  They
can  be  complete  filenames  or  just  patterns,  with  every ARP wildcard
allowed.   I forgot the name of the guy who suggested this one, and answers
by  UUCP  is not a favourite of math4.unibi.de.  Anyway, as soon as this is
implemented, you'll get a "thank you", mate!

                              WHAT IT DOES
NoDelete  enables  you  erraneous  humans  to  once  again  reflect  on the
righteousness  of  your  decisions  concerning  the  deleting  of  files on
AmigaDos devices.  If you try to delete a file or a program tries to remove
it,  this  is  mostly  done  via  DeleteFile()  of  the  dos.library.  When
executed,  NoDelete  bends  this  vector to its own routine which brings up
this  cute  little requester on the active window.  This requester contains
the  name  of  the file that the system is trying to delete.  If you really
want  to  delete  this  file,  click to the "Yes, Delete!" gadget.  If not,
click  to the "Oops, no way!"-Gadget of the requester.  NoDelete works just
fine   with   aliases,   wildcards   etc.   For  problems  see  the  "known
bugs"-section of this text.


#!/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 1)."
# Contents:  nodelete.c nodelete.doc nodelete.uu
# Wrapped by tadguy@ab20 on Thu Mar 21 07:49:10 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'nodelete.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'nodelete.c'\"
else
echo shar: Extracting \"'nodelete.c'\" \(6689 characters\)
sed "s/^X//" >'nodelete.c' <<'END_OF_FILE'
X/* NoDelete V1.5A (C) HooverSoft 1991
X
X	cc NoDelete +L
X	ln NoDelete -la -lc32
X
X
X*/
X
X
X#ifdef AZTEC_C					/* Works under Manx, convert it to Lattice */
X									/* if you don't mind the hassle...			 */
X
X#include<libraries/arpbase.h>
X#include<intuition/intuition.h>
X#include<intuition/intuitionbase.h>
X#include<libraries/dos.h>
X#include<libraries/dosextens.h>
X#include<stdio.h>
X/* #define DEBUG 1 */
X
Xchar bodystring[80],patterns[10][10], titlebak[80], title[80];
XULONG answer, PAT_SET = 0L,  howmany = 0L;
XULONG OVERRIDE = 0L, SILENT = 0L;
X
X
Xstruct NewWindow mywindow = {
X	100,0,	/* window XY origin relative to TopLeft of screen */
X	350,10,	/* window width and height */
X	0,1,	/* detail and block pens */
X	CLOSEWINDOW+VANILLAKEY,	/* IDCMP flags */
X	WINDOWDRAG+WINDOWDEPTH+WINDOWCLOSE+SIMPLE_REFRESH,	/* other window flags */
X	NULL,	/* first gadget in gadget list */
X	NULL,	/* custom CHECKMARK imagery */
X	(UBYTE *)title,	/* window title */
X	NULL,	/* custom screen pointer */
X	NULL,	/* custom bitmap */
X	5,5,	/* minimum width and height */
X	640,110, /* maximum width and height */
X	WBENCHSCREEN	/* destination screen type */
X	};
X
X
Xstruct IntuiText body = {
X	1,0,
X	JAM1|COMPLEMENT,
X	30,16,
X	NULL,
X	NULL,
X	NULL
X	};
X
Xstruct IntuiText fbody = {
X	1,0,
X	JAM1|COMPLEMENT,
X	30,5,
X	NULL,
X	(UBYTE *) "System tries to fool around...",
X	&body
X	};
X
Xstruct IntuiText ok = {
X	1,0,
X	JAM1|COMPLEMENT,
X	6,3,
X	NULL,
X	(UBYTE *)	"Yes, Delete!",
X	NULL
X	};
X
Xstruct IntuiText no = {
X	1,0,
X	JAM1|COMPLEMENT,
X	6,3,
X	NULL,
X	(UBYTE *)  "Oops, No Way!",
X	NULL
X	};
X
X
Xstruct IntuiMessage *msg, *GetMsg();
X
Xstruct IntuitionBase *IntuitionBase;
Xstruct Window			*mw, *aw, *OpenWindow();
Xstruct DosBase			*DosBase;
Xstruct ArpBase			*ArpBase;
XUBYTE						*filename;
Xvoid 						*OpenLibrary();
Xstruct Task				*FindTask();
X
Xvoid NoDelete()
X{
X	char parsed[10];
X#asm
X	public	_LVOSetProtection
X
X	movem.l	d0-d7/a0-a6,-(sp)
X#endasm
X	geta4();
X#asm
X	move.l	d1,_filename
X#endasm
X
X	if(PAT_SET)
X		{
X
X		for(answer=0L; answer < howmany; answer++)			
X			{
X			PreParse(patterns[answer], parsed);
X			if( !PatternMatch(parsed, filename) ) /* this is new */
X				continue;
X			else
X				goto request;
X			}
X		}
X	else 
X		goto request;
X	goto delete_anyway;		
X		
Xrequest:
X	strcpy(bodystring, "Delete File `");
X	strcat(bodystring, (char *)filename);
X	strcat(bodystring, "'?");
X	body.IText = (UBYTE *) bodystring;
X	aw = (struct Window *) IntuitionBase->ActiveWindow;
X	answer = (long)AutoRequest(aw, &fbody, &ok, &no, NULL, NULL, 360L, 61L);
X	if(!answer)
X	{
X		;
X#asm
X	movem.l	(sp)+,d0-d7/a0-a6
X	move.l	#1,d0
X#endasm
X	return;
X	}
X
X	if(answer)
X	{
X
Xdelete_anyway:
X		;
X#asm
X
X		move.l	_DosBase,a6		
X		move.l	#$70f7,d0			;restore old vector
X		move.w	d0,-72(a6)
X		move.l	#$60000092,d0
X		move.l	d0,-70(a6)
X		
X		tst.l		_OVERRIDE
X		beq.s		_dont_unprotect
X
X		move.l	_filename,d1
X
X
X		move.l	#0,d2
X		jsr		_LVOSetProtection(a6)
X
X_dont_unprotect:
X
X		move.l	_filename,d1
X		jsr		-72(a6)				;DeleteFile() call
X#endasm
X
X		;
X
X		SetFunction(DosBase, -72L, &NoDelete);
X
X/* install our function */
X
X
X#asm
X		movem.l	(sp)+,d0-d7/a0-a6
X		move.l	#1,d0
X#endasm
X		return;
X		}
X	}
X		
X
Xvoid quit(why)
XUBYTE *why;
X{
X	if(!SILENT)
X		Printf(why);
X	SetTaskPri((struct Task *)FindTask(0L), 0L);
X	if(DosBase)
X	{
X		;
X#asm
X		move.l	_DosBase,a6		
X		move.l	#$70f7,d0			;restore old vector
X		move.w	d0,-72(a6)
X		move.l	#$60000092,d0
X		move.l	d0,-70(a6)
X#endasm
X		;
X	}
X
X	if	(mw)
X		CloseWindowSafely(mw);
X
X	if(ArpBase)
X		CloseLibrary(ArpBase);
X	exit(0L);
X}
X
X/* test_nd() tests the DeleteFile vector to see if NoDelete is already 
X	installed. Returns zero if NoDelete is installed, one if it is not.
X*/
X#asm
X		public	_test_nd
X_test_nd:
X
X		move.l	_DosBase,a6
X		cmpi.l	#$60000092,-70(a6)
X		bne.s		_is_there				
X		moveq		#1,d0
X		bra.s		_fuckoff
X_is_there:
X		moveq		#0,d0
X_fuckoff:
X		rts	
X#endasm
X
X
Xvoid main(argc,argv)
Xlong argc;
Xchar *argv[];
X	{
X
X	static UBYTE *msg1 = (UBYTE *)"Installing NoDelete...";
X	static UBYTE *msg2 = (UBYTE *)"done. NoDelete V1.5A (c) HooverSoft 1991. \
XThis Program is FREEWARE.\n";
X	long i;
X
X	if(! (ArpBase = (struct ArpBase *) OpenLibrary("arp.library",0L) ) )
X		quit("NoDelete needs arp.library\n");
X	
X	DosBase = (struct DosBase *) ArpBase->DosBase;
X	IntuitionBase = (struct IntuitionBase *) ArpBase->IntuiBase;  
X
X	strcpy(title, (UBYTE *) "NoDelete V1.5A (c) HooverSoft");
X
X
X	
X
X
X			
X
X#ifdef	DEBUG
X		Printf("I found %ld patterns.\n", howmany);
X#endif			
X
X
X
X	for(i=1; i<argc; i++)
X		{
X#ifdef DEBUG
X			Printf("Scanning argv[%ld]: %s\n", i, (UBYTE *) argv[i] );
X#endif
X			if( (char) argv[i][0] == '-')
X				{
X				switch( (char) argv[i][1] )
X					{
X					case 'y':	if( atoi(argv[i+1]) <= 245L)
X										mywindow.TopEdge = atoi(argv[i+1]);
X									i++;	
X									goto fuckoff;					
X 									break;
X
X					case 'p':	if(atoi(argv[i+1]) < 10L && atoi(argv[i+1]) > -20L)
X										SetTaskPri((struct Task *)FindTask(0L),\
X														(long)atoi(argv[i+1]));
X									else
X										SetTaskPri((struct Task *)FindTask(0L), -5L);
X
X									i++;
X									goto fuckoff;
X									break;
X
X
X					case  'O':	OVERRIDE = 1L;
X									goto fuckoff;
X									break;
X				
X					case  'S':	SILENT = 1L;
X									goto fuckoff;
X									break;
X				
X					case default:
X									Printf("Unknown Option -%c\n", argv[i][1]); 
X									goto fuckoff; 
X									break;
X					}
X				/* end switch */
X				}/*end if */
X			else
X				{
X				PAT_SET = 1L;
X				if( howmany<10 )
X					strcpy(patterns[howmany], argv[i]);
X#ifdef	DEBUG
X				Printf("Copied %s, Result: %s\n", argv[i], patterns[i-1L]);
X#endif	
X				howmany++;
X				}
Xfuckoff:
X			;
X		/*end for */
X			}	
X					
X	if(howmany)
X		strcat(title, (UBYTE *) " PAT SET");			
X	else
X		{
X		PAT_SET = 0L;
X		strcat(title, (UBYTE *) " NO PAT");
X		}
X
X/* calculate dimension of TitleBar */
X
X	mywindow.Width = ( strlen(title) * 8L) + 85L;
X	mywindow.LeftEdge = (640L-mywindow.Width) / 2L;
X
X	if(!SILENT)
X		Printf(msg1);
X
X	if( !test_nd() )
X		{
X		Printf("NoDelete already installed.\n");
X		CloseLibrary(DosBase);
X		CloseLibrary(IntuitionBase);
X		CloseLibrary(ArpBase);
X		exit(0L);
X		}
X
X	mw = OpenWindow(&mywindow);
X	if(!mw)
X		quit("Could not open Window.\n\n");
X	if(!SILENT)
X		Printf(msg2);
X
X	SetFunction(DosBase, -72L, &NoDelete); 
X
X	for(;;)
X		{
X		Wait(1L << mw->UserPort->mp_SigBit);
Xgetmsg:
X		msg = GetMsg(mw->UserPort);
X		ReplyMsg(msg);
X		if (msg->Class == CLOSEWINDOW)
X			quit("NoDelete V1.5A exiting.\n\n");
X		if(msg->Class == VANILLAKEY)
X			{
X			strcpy(titlebak, (UBYTE *) "Patterns: ");
X			for(i=0L; i < howmany ; i++)
X				{
X				strcat(titlebak, patterns[i]);
X				strcat(titlebak, " ");
X				}
X			SetWindowTitles(mw, titlebak);
X			Wait(1L << mw->UserPort->mp_SigBit);
X			SetWindowTitles(mw, title);
X			ReplyMsg( GetMsg(mw->UserPort) );
X			}
X
X		else
X			continue;
X		}
X	}
X#endif	
X	
END_OF_FILE
if test 6689 -ne `wc -c <'nodelete.c'`; then
    echo shar: \"'nodelete.c'\" unpacked with wrong size!
fi
# end of 'nodelete.c'
fi
if test -f 'nodelete.doc' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'nodelete.doc'\"
else
echo shar: Extracting \"'nodelete.doc'\" \(10917 characters\)
sed "s/^X//" >'nodelete.doc' <<'END_OF_FILE'
X *************************************************************************
X *              NoDelete V1.5A  (C) HooverSoft  Oct 30th, 1990            *
X *************************************************************************
X
XUSAGE:	1> run NoDelete [patterns] [-p priority] [-y ypos] <ENTER>
X			from CLI only.
X
X                                  HISTORY
X
X                     CHANGES TO VERSION 1.4: MAR 1991
XSwitched  to  ARP  (finally).   This  great  bunch  of routines should have
Xexperienced  a  wide  enough  distribution  by now to make this acceptable.
XCheers to everyone involved in this project!  ARP is used to do the pattern
Xmatching  on filenames.  No more restriction is made on the patterns.  They
Xcan  be  complete  filenames  or  just  patterns,  with  every ARP wildcard
Xallowed.   I forgot the name of the guy who suggested this one, and answers
Xby  UUCP  is not a favourite of math4.unibi.de.  Anyway, as soon as this is
Ximplemented, you'll get a "thank you", mate!
X
X                     CHANGES TO VERSION 1.35: OCT 1990
XProgrammed  two  new options -O and -S (Cheers, John!).  These options sort
Xof  "fix"  a  bug  with NoDelete which used to override the file protection
Xbit.
X
X                     CHANGES TO VERSION 1.3: SEP 1990
XLots  of  changes.   Thinking  of  writing  a  new  documentation.  Anyway,
Xintroduced  command line options -p and -y for run-time setting of priority
Xof NoDelete and of vertical position of titlebar.
X
X                     CHANGES TO VERSION 1.2: AUG 1990
XIntroduced  the  possibilty  to  give  multiple patterns on startup.  Lists
Xpatterns when pressing a key while Nodelete's titlebar is active.
X
X                     CHANGES TO VERSION 1.1: Aug 1990
XNoDelete now automatically centers the Dragbar on Screen and calculates the
Xcorrect width for the window if a pattern is specified.
X
XNow  works  fine  with  AmiOmega.   System won't crash if "Yes, Delete!" is
Xselected.
X
XNow  supports  the  use  of  patterns to ask confirmations only for special
Xfiles  ending  in  defined  pattern.   Will  show  the  selected pattern in
Xwindow's titlebar.
X
XNoDelete  now  checks  if  another  NoDelete is already active and exits if
Xtrue.
X
X                     CHANGES TO VERSION 1.01: Jul 1990
XNow handles protected Files correctly.  Previous version didn't complain if
Xfile was delete protected.
X
XNoDelete sets its priority to a value of -5 directly after startup.
X
X                    CHANGES TO VERSION 1.00: June 1990
XVersion  1.01  now  restores  the  Dos Vector relative to _DosBase, so this
Xprogram  should  work under Kickstart 1.3 as well.  If someone already uses
XKick 2.0, he or she should let me know if NoDelete works with that.  I have
Xheard  that  the  funny  instructions  in DosBase have been replaced with a
Xregular jump table.
X
X
X                           WHY USE NODELETE?
XI  wrote  this  program  mainly  to  make  the fantastic public domain game
X"Omega"  more  enjoyable  to  play.   The author of this program thought it
Xreasonable to have the system unlink the save-file after having reloaded it
Xto  somehow  "simulate the continuity of character".  Too bad that NoDelete
Xdoes not work correctly with this program...
XFootnote: It works now!
X
X                              WHAT IT DOES
XNoDelete  enables  you  erraneous  humans  to  once  again  reflect  on the
Xrighteousness  of  your  decisions  concerning  the  deleting  of  files on
XAmigaDos devices.  If you try to delete a file or a program tries to remove
Xit,  this  is  mostly  done  via  DeleteFile()  of  the  dos.library.  When
Xexecuted,  NoDelete  bends  this  vector to its own routine which brings up
Xthis  cute  little requester on the active window.  This requester contains
Xthe  name  of  the file that the system is trying to delete.  If you really
Xwant  to  delete  this  file,  click to the "Yes, Delete!" gadget.  If not,
Xclick  to the "Oops, no way!"-Gadget of the requester.  NoDelete works just
Xfine   with   aliases,   wildcards   etc.   For  problems  see  the  "known
Xbugs"-section of this text.
X
X                                 PATTERNS
XLots  of programs, programmers and normal people use patterns in their file
Xsystem  to  be  able  to  immediately make out the contents of a file.  For
Xexample,  ".c"  specifies  the file to be a C source code and ".bas" should
Xcontain  a  basic  program's  source.   There  are  tons of frequently used
Xextensions,  from  ".asm"  up to ".cfg".  If you use NoDelete and you don't
Xwant  the  system to get on your nerves by confirming EVERY rm command, you
Xshould  use a certain extension on NoDelete's command line to tell NoDelete
Xthat  it  should  only  ask  confirmation for those precious ".c" or ".iff"
Xfiles and let all others alone.
X
XThe  new  version  of  NoDelete also supports complete filenames as pattern
Xmatching is done via PatternMatch() of ARP.  The command line
X
X		1> run nodelete *.c
X
Xwould  tell NoDelete to only intercept the removing of files ending in ".c"
Xand not to worry about any other files that are removed from the device.
X
XYou can specifiy up to ten patterns when running NoDelete. The command
X
X		1> run NoDelete *.c *.iff *.tex *.asm
X
Xwill  make  NoDelete  complain  about  any  file  which  ends in one of the
Xspecified patterns and leave all others alone.  If you have forgotten which
Xpatterns  you  specified  at startup, just activate NoDelete's titlebar and
Xpress  any key.  NoDelete will then give a list of patterns in the titlebar
Xuntil another key is pressed.
X
XAnother one:
X
X		1> run NoDelete Peter Pecker picked a pepper
X
Xwould  intercept  any attempt to remove the files peter, pecker, picked, a,
Xand pepper.  NoDelete does discriminate between upper or lower case letters
Xin  filenames.   If the extensions get too long to fit into the titlebar...
Xwell, you won't see them!
X
XTo make things totally clear, let me cite the ARP programmer's manual:
X
XCITE
Xarp.doc/PatternMatch (V31)
X 
X 	NAME
X 	   PatternMatch - perform a wildcard match on a string
X 
X 	SYNOPSIS
X 	   result = PatternMatch(pat,str)
X 	     D0                 A0   A1
X 
X 	FUNCTION
X 	   This function compares a string to the given pattern and determines
X           if it is a valid match.  If so it returns a true result.
X           The pattern must be constructed with special preparsed tokens and
X           supports the following patterns:
X            (p1|p2|p3)  One of the patterns p1, p2 or p3
X            ?           Any single character
X            #<pat>      Pattern repeated 0 or more times
X            [class]     Character class
X            [^class]    Negated character class
X            {pat}       Structure tag for replacement
X            *           0 or more occurances of any character
X 
X 	INPUTS
X 	  char *pat     The pattern string to match against
X          char *str     The string to be matched
X 
X 	RESULT
X 	  result - a boolean value indicating success/failure.  The condition
X 		   codes are guarenteed to reflect the status of the result
X 	
X 	BUGS
X 	  None known.
X 
X 	SEE ALSO
X 
X 	Author:	JAT
XEND CITE
X
XRight?  So far for all the wildcards you can use with ARP.  IMPORTANT NOTE:
Xif  you  work  with  Csh  or  WB  1.3  shell,  you  will have to escape the
Xcharacters special to these shells, respectively.  To protect all C sources
Xwhile in Csh, you would use the syntax
X
X		$ run nodelete \*.c
X
Xto have the special shell wildcard "*" survive on its way to NoDelete.
X
X
X
X                           COMMAND LINE OPTIONS
XFinally,  HooverSoft  is  proud  to have introduced command line options in
XNoDelete.  So far, four options are supported:
X
X-p	number	where number is an integer between -20 and 9. If given on
X				the command line, NoDelete will set its priority to this
X				value.  If you type rubbish or use values not allowed, the
X				default priority of -5 is set.
X
X-y ypos		where ypos is an integer ranging from zero to 245 (sorry,
X				all you NTSC users...).  This number will determine the ver-
X				tical position of NoDelete's titlebar.  if you try to fool
X				NoDelete or do not give this option, the default value zero
X				(top of screen) is used.
X
X-O				Override file protection bit. If this option is given,
X				NoDelete will NOT care about the file's protection status.
X				This option is sort of dangerous, but I think if you are
X				explicitly asked wether you want to delete a file this
X				should be presto! wiped off the disk without return or
X				any other chance of survival..., Anyway, the default now
X				is to consider and respect the file protection.
X
X-S				if given, this option tells NoDelete to shut up. No screams,
X				no comments!
X
X                               KNOWN BUGS
XNoDelete  cannot  take  care of the AmigaDos command Delete.  God knows how
Xthis command erases a disk file...
X
XThe  Shell  won't complain if you try to delete any non-existent file while
XNoDelete  has  its  grip  on  the system.  This is not really a bug because
XNoDelete  works  on  this  basis  of  cheating  the  calling  function  and
Xpretending that everything is just fine and deleted. This also is the cause
Xthat the calling program will not be informed if the file in question
Xis delete protected.
X
X                            THE LEGAL STUFF
XNoDelete  is  FreeWare  and  may  be  copied  freely by everyone except for
Xpurposes  listed below as long as this notice is left intact.  This program
Xis  copyright  (C)  by  HooverSoft.   It  may  NOT  be  copied  or sold for
Xcommercial  purposes  without  written  permssion  by the author (Get lost,
XCarsten  Wolf and all you other sharks!).  It may be distributed and copied
Xfreely for non-commercial purposes only.
X
XWhen  distributed,  this program should always be accompanied by this file,
Xthe documentation.
X
X                    FURTHER PLANS & HOPELESS DREAMS
XI  would  like  to use CreateTask() to launch a separate Task for Nodelete.
XThis would unlink NoDelete's memory requirements from the current stacksize
Xof  the  system.  It would be nice if "delete" could also be disabled but I
Xam not sure how to do this. 
X
X                                  CREDITS
XI'm very thankful to all those people who have continued to make their
Xsources available through FreeWare, especially Fred Fish, Udo K Schuermann
X(The walrus and maintainer of Akvarium Data Files) and Matt Dillon.
X
X                            PUBLIC FEEDBACK
XBug  reports  (cheers, Jensi & John!), criticism, comments and approvements
Xshould be sent to
X						
X				SNAIL:
X                              HooverSoft Inc.
X                            Joellenbecker Weg 4
X                              D-4900 Herford
X                                  Germany
X
X				BITNET:			
X                          hoover@math4.uni-bielefeld.de
X
X                                DISCLAIMER
XDo  whatever you like with this program, but listen:  you can't blaim it on
Xme if anything goes down the drain!
XHave fun,
XHoover
X
X--
X"It's impossible to make things foolproof because fools are so ingenious..."
END_OF_FILE
if test 10917 -ne `wc -c <'nodelete.doc'`; then
    echo shar: \"'nodelete.doc'\" unpacked with wrong size!
fi
# end of 'nodelete.doc'
fi
if test -f 'nodelete.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'nodelete.uu'\"
else
echo shar: Extracting \"'nodelete.uu'\" \(6418 characters\)
sed "s/^X//" >'nodelete.uu' <<'END_OF_FILE'
Xbegin 666 nodelete
XM```#\P`````````#``````````(```0'````NP````$```/I```$!T[Z!\!3;
XM>7-T96T@=')I97,@=&\@9F]O;"!A<F]U;F0N+BX``%EE<RP@1&5L971E(0``P
XM3V]P<RP@3F\@5V%Y(0!.5?_V2.?__DZZ!^HI08*62JR``F=&0JR">F`T2&W_R
XM]G(*("R">DZZ#AA![(%VT(@O`$ZZ!J)03R\L@I9(;?_V3KH&AE!/2D!G`F`49
XM4JR">B`L@GJPK(`&9<)@`F`"8'I(>@#&2&R!)DZZ!GI03R\L@I9(;($F3KH*3
XMEE!/2'H`N$AL@29.N@J(4$]![($F*4B`3B!L@H(I:``T@HI(>``]2'@!:$*G&
XM0J=(;(!^2&R`:DAL@%8O+(**3KH.Y$_O`"`I0()Z2JR">F8*3-]__W`!3EU.<
XM=4JL@GIG3"QL@HX@/```</<]0/^X(#Q@``"2+4#_NDJL@`IG"B(L@I9T`$ZNT
XM_T8B+(*63J[_N$AZ_O1(>/^X+RR"CDZZ#B1/[P`,3-]__W`!8*I@J$1E;&5T2
XM92!&:6QE(&``)S\``$Y5``!*K(`.9@HO+0`(3KH%8%A/0J="ITZZ#8Q83R\`#
XM3KH-]%!/2JR"CF<8+&R"CB`\``!P]SU`_[@@/&```)(M0/^Z2JR"AF<*+RR",
XMADZZ!3!83TJL@I)G"B\L@I).N@TH6$]"ITZZ"Q183TY=3G4L;(*.#*Y@``"2Q
XM_[IF!'`!8`)P`$YU3E7__$*G2'H$'$ZZ#4Q03RE`@I)F"DAZ!!A.NO]>6$\@)
XM;(*2*6@`,(*.(&R"DBEH`#B"@DAZ!!9(;((J3KH$YE!/*WP````!__Q@``&4C
XM("W__.6`(&T`#")P"``,$0`M9@`!/B`M__SE@"!M``PB<`@`$"D``4B`2,!@9
XM``$`("W__%*`Y8`@;0`,+S`(`$ZZ!+983["\````]6X:("W__%*`Y8`@;0`,J
XM+S`(`$ZZ!)A83SE`@!12K?_\8``!("`M__Q2@.6`(&T`#"\P"`!.N@1V6$^P2
XMO`````IL2"`M__Q2@.6`(&T`#"\P"`!.N@186$^PO/___^QO*B`M__Q2@.6`Q
XM(&T`#"\P"`!.N@0Z6$\O`$*G3KH,"EA/+P!.N@QR4$]@%$AX__M"ITZZ"_184
XM3R\`3KH,7%!/4JW__&```)XI?`````&`"F```)(I?`````&`#F```(8@+?_\)
XMY8`@;0`,(G`(`!`I``%(@$C`+P!(>@+V3KH#=%!/8&"0O````$]GO%F`9\20[
XMO````!UG`/\ND+P````)9P#^Y&"Z8#PI?`````&``@RL````"H`&9"8@+?_\#
XMY8`@;0`,+S`(`'(*("R`!DZZ"KA![(%VT(@O`$ZZ`U!03U*L@`92K?_\("W_L
XM_+"M``AM`/YD2JR`!F<02'H"B$AL@BI.N@=24$]@$D*L@`)(>@)]2&R"*DZZ:
XM!SY03TAL@BI.N@,:6$_G@-"\````53E`@!8@/````H`R+(`62,&0@7("3KH(7
XM$CE`@!)*K(`.9@HO+("23KH"G%A/3KK]EDJ`9C!(>@(Q3KH"BEA/+RR"CDZZI
XM"IA83R\L@H).N@J.6$\O+(*23KH*A%A/0J=.N@AP6$](;(`23KH+;%A/*4"""
XMADJL@H9F"DAZ`@I.NOS66$]*K(`.9@HO+("63KH"-EA/2'K[ADAX_[@O+(*.T
XM3KH*MD_O``P@;(*&(F@`5G``$"D`#W(!X:$O`4ZZ"KY83R!L@H8O*`!63KH*M
XM6%A/*4""?B\L@GY.N@IN6$\@;()^#*@```(``!1F"DAZ`;%.NOQD6$\@;()^_
XM#*@`(````!1F``":2'H!L4AL@=I.N@'P4$]"K?_\8"YR"B`M__Q.N@DZ0>R!X
XM=M"(+P!(;(':3KH%^%!/2'H!C$AL@=I.N@7J4$]2K?_\("W__+"L@`9ER$ALI
XM@=HO+(*&3KH*B%!/(&R"AB)H`%9P`!`I``]R`>&A+P%.N@H&6$](;((J+RR"$
XMADZZ"F!03R!L@H8O*`!63KH)DEA/+P!.N@FN6$]@`/\(3EU.=4EN<W1A;&QI,
XM;F<@3F]$96QE=&4N+BX`9&]N92X@3F]$96QE=&4@5C$N-4$@J2!(;V]V97)3-
XM;V9T(#$Y.3$N(%1H:7,@4')O9W)A;2!I<R!&4D5%5T%212X*`&%R<"YL:6)R:
XM87)Y`$YO1&5L971E(&YE961S(&%R<"YL:6)R87)Y"@!.;T1E;&5T92!6,2XUU
XM02"I($AO;W9E<E-O9G0`56YK;F]W;B!/<'1I;VX@+25C"@`@4$%4(%-%5``@2
XM3D\@4$%4`$YO1&5L971E(&%L<F5A9'D@:6YS=&%L;&5D+@H`0V]U;&0@;F]TT
XM(&]P96X@5VEN9&]W+@H*`$YO1&5L971E(%8Q+C5!(&5X:71I;F<N"@H`4&%T&
XM=&5R;G,Z(``@`"!O``1#[P`(+&R"DD[N_QQ,[P,```0L;(*23N[^U$SO`P``P
XM!"QL@I).[OY03.\#```$+&R"DD[N_=(@;P`$(`@B;P`($-EF_$YU(&\`!"`(0
XM2AAF_)'`(`A3@$YU3E4``$CG#"`D;0`(#!(`(&<&#!(`"68$4HI@\'H`#!(`J
XM+68&>@%2BF`(#!(`*V8"4HIX`&`@($I2BA`02(!(P'(*+P`@!$ZZ!O(B']*`U
XM*`&8O````#`0$DB`2,!![(";"#```@@`9LY*A6<&(`1$@&`"(`1,WP0P3EU.?
XM=6%P0^R!)D7L@2:UR68.,CP`<6L(=``BPE')__PI3X*:+'@`!"E.@IY(YX"`G
XM""X`!`$I9Q!+^@`(3J[_XF`&0J?S7TYS0_H`($ZN_F@I0(*B9@PN/``#@`=.G
XMKO^48`1.N@`:4$].=61O<RYL:6)R87)Y`$GY``!__DYU3E4``"\*2'D``0``R
XM,"R!','\``8O`$ZZ!KXI0(*F4$]F%$*G2'D``0``3KH&@E!/+FR"FDYU(&R""
XMID)H``0@;(*F,7P``0`0(&R"IC%\``$`"B!L@IH@+(*:D*@`!%"`*4""JB!LO
XM@JH@O$U!3EA"ITZZ!G8D0$JJ`*Q83V<P+RT`#"\M``@O"DZZ`+(I?`````&"2
XMKB!L@J8`:(````0@;(*F`&B````*3^\`#&!"2&H`7$ZZ!KQ(:@!<3KH&5"E`1
XM@K(@;(*R2J@`)%!/9Q`@;(*R(F@`)"\13KH%FEA/+RR"LB\*3KH">"EL@K*"Q
XMME!/3KH%CB!L@J8@@$ZZ!9H@;(*F(4``!F<62'@#[4AZ`"Q.N@5V(&R"IB%`Y
XM``Q03R\L@K8O+(*Z3KKXG$*G3KH#C$_O``PD7TY=3G4J`$Y5``!(YPPP)&T`U
XM$"!M``A*J`"L9Q@@;0`(("@`K.6`*``@1"`H`!#E@"9`8`0F;($>$!-(@$C`G
XMT*T`#%2`*4""OD*G+RR"ODZZ!5`I0(+"4$]F"$S?##!.74YU$!-(@$C`*@`O"
XM!2!+4H@O""\L@L).N@&.(&R"PM'%0_H!6!#99OPO+0`,+PHO+(+"3KH!3B!LA
XM@L)",%@`*7P````!@KH@;(+"T<4F2%*+)$M/[P`8$!-(@$C`*@"PO````"!GV
XM(+J\````"6<8NKP````,9Q"ZO`````UG"+J\````"F8$4HM@S`P3`"!M``",T
XM#!,`(F8R4HL@2U*+$!!(@$C`*@!G("!*4HH0A;J\````(F80#!,`(F8$4HM@P
XM!D(J__]@`F#28$0@2U*+$!!(@$C`*@!G,+J\````(&<HNKP````)9R"ZO```"
XM``QG&+J\````#6<0NKP````*9P@@2E**$(5@PB!*4HI"$$J%9@)3BU*L@KI@X
XM`/\\0A)"IR`L@KI2@.6`+P!.N@04*4""ME!/9@A"K(*Z8`#^OGH`)FR"PF`>(
XM(`7E@"!L@K8ABP@`($L@"$H89OR1P%.(4HC7R%*%NJR"NFW<(`7E@"!L@K9"0
XML`@`8`#^@B``,#Q__V`$,"\`#B!O``1*&&;\4T@B;P`(4T`0V5?(__QG`D(0/
XM("\`!$YU3.\#```$(`@B+P`,8`(0V5?)__QG!E)!8`)"&%')__Q.=4Y5``!("
XMYPXP)&T`"$*G2'H`CDZZ`ZXI0(+&4$]F"$S?#'!.74YU(&T`#")H`"0O*0`$F
XM3KH$!"@`6$]G4DAZ`&T@1"\H`#9.N@/6)D!*@%!/9S1(>`/M+PM.N@+0+`!0#
XM3V<D(`;E@"H`($4E:``(`*0E1@"<2'@#[4AZ`#A.N@*L)4``H%!/+P1.N@.B8
XM6$\O+(+&3KH"U$*L@L983V"`:6-O;BYL:6)R87)Y`%=)3D1/5P`J`$CG2`!"L
XMA$J`:@1$@%)$2H%J!D2!"D0``6$^2D1G`D2`3-\`$DJ`3G5(YT@`0H1*@&H$^
XM1(!21$J!:@)$@6$:(`%@V"\!81(@`2(?2H!.=2\!808B'TJ`3G5(YS``2$%*3
XM068@2$$V`30`0D!(0(##(@!(0#("@L,P`4)!2$%,WP`,3G5(028!(@!"04A!`
XM2$!"0'0/T(#3@;:!8@22@U)`4<K_\DS?``Q.=4Y5``!*K(+*9P8@;(+*3I`OR
XM+0`(3KH`"%A/3EU.=4Y5__PO!"MM``C__$JL@J9G+'@`8`HO!$ZZ`/Q83U*$-
XM,"R!'$C`N(!M[#`L@1S!_``&+P`O+(*F3KH!ZE!/2JR"SF<&(&R"SDZ02JR!V
XM(F<*+RR!(DZZ`7!83TJL@M)G""!L@M(@K(+62JR"VF<*+RR"VDZZ`7Y83TJL,
XM@MYG"B\L@MY.N@%N6$]*K(+B9PHO+(+B3KH!7EA/2JR"YF<*+RR"YDZZ`4Y8#
XM3RQX``0(+@`$`2EG%"\-2_H`"DZN_^(J7V`&0J?S7TYS2JR"LF8J2JR"PF<BF
XM+RR"OB\L@L).N@%&("R"NE*`Y8`O`"\L@K9.N@$T3^\`$&`.3KH!(B\L@K).+
XMN@%:6$\@+?_\+FR"FDYU*!].74YU3E4``$CG#B`H+0`(<@8@!$ZZ`$0D0-7L<
XM@J9*A&T.,"R!'$C`N(!L!$J29A(I?`````*"ZG#_3-\$<$Y=3G4P*@`$P'R`7
XM`&8(+Q).N@`N6$]"DG``8.!(YW``-`'$P"8!2$/&P$A#0D/4@TA`P,%(0$)`:
XMT(),WP`.3G4B+P`$+&R"HD[N_]PB+P`$+&R"HD[N_X(L;(*B3N[_RDSO``8`&
XM!"QL@J).[O_B+&R"HD[N_\1.^@`"(B\`!"QL@J).[O^F2.<!!$SO((``#"QL'
XM@IY.KO^43-\@@$YU3OH``B)O``0L;(*>3N[^8DSO``,`!"QL@IY.[O\Z3OH`G
XM`B)O``0L;(*>3N[^VBQL@IY.[O]\(F\`!"`O``@L;(*>3N[_+D[Z``(@;P`$\
XM+&R"GD[N_HQ.^@`"+&R"GB)O``0@+P`(3N[]V$[Z``(B;P`$+&R"GD[N_H8BV
XM;P`$(&\`""`O``PL;(*>3N[^7")O``0@+P`(+&R"GD[N_M0@+P`$+&R"GD[NL
XM_L(@;P`$+&R"GD[N_H!,[P,```0L;(+&3N[_H"!O``0L;(+&3N[_IB!O``0L5
XM;(+&3N[_LDCG`#!,[P\```Q,[P`/`!PL;(*"3J[^I$S?#`!.=2!O``0L;(*"?
XM3N[_-"\*3.\'```(+&R"@DZN_NPD7TYU```#[`````$````!```(-@``````I
XM``/R```#Z@```$D``````````````````````&0```%>``H``0`@`@````!.I
XM``````````````(H````````````!0`%`H``;@`!`0`"```>`!``````````6
XM```````!``(``!X`!0`````````$````0`$``@``!@`#`````````"0`````:
XM`0`"```&``,`````````,@````````7*```%X0`@("`@("`@("`P,#`P,"`@#
XM("`@("`@("`@("`@("`@()!`0$!`0$!`0$!`0$!`0$`,#`P,#`P,#`P,0$!`(
XM0$!`0`D)"0D)"0$!`0$!`0$!`0$!`0$!`0$!`0$!0$!`0$!`"@H*"@H*`@(",
XM`@("`@("`@("`@("`@("`@)`0$!`(```%``````````````#[`````(````!(
XM````*@```&0````%`````````&````!T````B````)````"4`````````_(`(
X+``/K`````0```_(%I
X``
Xend
Xsize 4556
END_OF_FILE
if test 6418 -ne `wc -c <'nodelete.uu'`; then
    echo shar: \"'nodelete.uu'\" unpacked with wrong size!
fi
# end of 'nodelete.uu'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have the archive.
    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.