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.