amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator) (06/15/91)
Submitted-by: davids@ucscf.UCSC.EDU (Dave Schreiber) Posting-number: Volume 91, Issue 122 Archive-name: utilities/ddu-1.01/part01 [ includes uuencoded executable ...tad ] This is a DU program that I put together for use under Kickstart 2.0. Under 2.0, you can have links to directories; it is possible to have a link in a directory to it's parent. In this situation, if a DU program can't detect links, it will enter an infinite loop. My DU will detect links, and thus won't enter an infinite loop. As far as I know, this is the only DU program for the Amiga that detects links. #!/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: DU.c DU.doc DU.lnk du.uu # Wrapped by tadguy@ab20 on Fri Jun 14 18:37:41 1991 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'DU.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'DU.c'\" else echo shar: Extracting \"'DU.c'\" \(7606 characters\) sed "s/^X//" >'DU.c' <<'END_OF_FILE' X X/********************************************************************\ X* * X* Dave's DU version 1.01 * X* * X* (c)1991 by Dave Schreiber. All rights reserved. This program may * X* be freely distributed. The only charges allowed in relation to * X* distributing this program is in relation to media, shipping, and * X* handling costs. * X* * X* Version list: * X* 1.01 (05/23/91) - Improved CTRL-C handling * X* 1.00 (04/29/91) - Original release version * X* * X* Compiled with SAS/C V5.10. To compile, do the following: * X* 1> lc DU * X* 1> blink with DU.lnk * X* * X\********************************************************************/ X X X#include <exec/types.h> X#include <exec/exec.h> X#include <exec/tasks.h> X#include <dos/dos.h> X#include <dos/dosextens.h> X#include <stdio.h> X#include <signal.h> X XULONG *DOSBase; X X/*Function prototypes*/ X XULONG __regargs getDirSize(BPTR lock,char *dirName); Xvoid interpretArgs(int argc,char *argv[],WORD *countDirs,WORD *countFiles, X char *dirName); Xvoid printSize(char *dirName,ULONG size); Xvoid printHelp(void); Xvoid ctrlC_Handler(void); X X/*-------------------*/ X X/*Pragmas*/ X X#pragma syscall AllocMem C6 1002 X#pragma syscall FreeMem D2 0902 X#pragma syscall FindTask 126 901 X X#pragma libcall DOSBase CurrentDir 7E 101 X#pragma libcall DOSBase Examine 66 2102 X#pragma libcall DOSBase ExNext 6C 2102 X#pragma libcall DOSBase Lock 54 2102 X#pragma libcall DOSBase UnLock 5A 101 X X/*-------*/ X X/*Global variables*/ X XWORD countFiles,countDirs; Xstruct Task *task; XBYTE quitNow=FALSE; X X/*----------------*/ X X/*Defines*/ X X#define ERROR 0xFFFFFFFF X X/*-------*/ X X/*Main. Initializes, find the directory size, and then cleans up*/ Xmain(int argc,char *argv[]) X{ X BPTR lock; X char dirName[256]; X LONG totalSize; X X /*Interpret the command line arguments*/ X interpretArgs(argc,argv,&countDirs,&countFiles,dirName); X X /*Replace the CTRL-C handler*/ X signal(SIGINT,ctrlC_Handler); X X /*Get a lock on the provided directory name*/ X lock=Lock(dirName,SHARED_LOCK); X if(lock == NULL) /*Abort if the directory isn't there*/ X { X fputs("Couldn't access the directory you requested; aborting.\n", X stderr); X exit(200); X } X X /*Get the size of the contents of the directory*/ X totalSize=getDirSize(lock,dirName); X X /*Abort if something went wrong, otherwise print the directory size*/ X if(totalSize == ERROR) X fputs("Error. Aborting!\n",stderr); X else X if(!countDirs && !quitNow) X printSize(dirName,totalSize); X X UnLock(lock); /*Free the lock on the top directory*/ X exit(0); /*And exit*/ X} X X/*Get the size of the contents of the specified directory (recursive)*/ XULONG __regargs getDirSize(BPTR lock,char *dirName) X{ X register ULONG totalSize=0; X register struct FileInfoBlock *fib; X register BPTR dirLock,oldCurDir; X register UWORD dirNameLen; X register ULONG size; X X dirNameLen=strlen(dirName); X X /*Allocate (longword aligned) FileInfoBlock structure*/ X fib=(struct FileInfoBlock *)AllocMem(sizeof(struct FileInfoBlock), X MEMF_PUBLIC,MEMF_CLEAR); X if(fib==NULL) X return(ERROR); X X /*Save the current directory, and change to the directory we need*/ X /*to find the size of.*/ X oldCurDir=CurrentDir(lock); X Examine(lock,fib); X X /*For each file/directory, get the size...*/ X while(ExNext(lock,fib) && !quitNow) X { X if(fib->fib_EntryType != 4) /*If the file isn't a link...*/ X { X if(fib->fib_EntryType < 0) /*If the file isn't a directory*/ X { /*get the size directly*/ X /*Add the size to the total*/ X totalSize+=fib->fib_NumBlocks+1; X X if(countFiles) /*If the user wants the size of each file*/ X { /*printed, print the file size*/ X if(dirNameLen!=0 && dirName[dirNameLen-1]!=':') X strcat(dirName,"/"); X strcat(dirName,fib->fib_FileName); X printSize(dirName,totalSize); X dirName[dirNameLen]=NULL; X } X } X else /*It's a directory*/ X { X /*Get the lock on the directory*/ X dirLock = Lock(fib->fib_FileName,SHARED_LOCK); X X if(dirLock == NULL) /*Abort if there was a problem getting*/ X { /*a lock on the directory*/ X CurrentDir(oldCurDir); X fputs("Couldn't lock directory:",stderr); X fputs(fib->fib_FileName,stderr); X fputs("\n",stderr); X FreeMem(fib,sizeof(struct FileInfoBlock)); X return(ERROR); X } X /*Create the full name of the directory we're going to */ X /*descend into*/ X if(dirNameLen!=0 && dirName[dirNameLen-1]!=':') X strcat(dirName,"/"); X strcat(dirName,fib->fib_FileName); X X /*Recursively get the directory size*/ X size=getDirSize(dirLock,dirName); X UnLock(dirLock); X X if(size==ERROR) /*Abort if there was an error*/ X { X CurrentDir(oldCurDir); X FreeMem(fib,sizeof(struct FileInfoBlock)); X return(ERROR); X } X else X totalSize+=size+2; /*Otherwise, add the size to the total*/ X X /*Restore the old directory name*/ X dirName[dirNameLen]=NULL; X } X } X } X CurrentDir(oldCurDir); X X if(quitNow) /*If the user pressed CTRL-C, abort*/ X fputs("*** Break: du\n",stderr); X else X if(countDirs) /*If CTRL-C wasn't pressed, print the size of the*/ X printSize(dirName,totalSize); /*directory (if the user wants it)*/ X X /*Deallocate the FileInfoBlock*/ X FreeMem(fib,sizeof(struct FileInfoBlock)); X /*Return the total size*/ X return(totalSize); X} X X/*Interpret the command line arguments*/ Xvoid interpretArgs(int argc,char *argv[],WORD *countDirs,WORD *countFiles, X char *dirName) X{ X int i; X X if(argv[1][0]=='?') /*The user is asking for help*/ X { X printHelp(); X exit(0); X } X X /*Set these variables to their default value*/ X *countDirs=TRUE; X *countFiles=FALSE; X strcpy(dirName,""); X X for(i=1;i<argc;i++) X { X if(argv[i][0]=='-') X switch(argv[i][1]) X { X case 's': /*Don't print the size of each directory*/ X case 'S': X *countDirs=FALSE; X break; X case 'a': /*Print the size of each directory*/ X case 'A': X *countFiles=TRUE; X break; X } X else /*If the first character wasn't '-', the argument must be the*/ X strcpy(dirName,argv[i]); /*directory name*/ X } X /*If the user specified that directory sizes wouldn't be printed,*/ X /*don't print out the file sizes either*/ X if(*countDirs==FALSE) X *countFiles=FALSE; X return; X} X X/*Make the directory/file name, then print out the size*/ Xvoid printSize(char *dirName,ULONG size) X{ X char sizeStr[16]; X X /*Conver the size (int) to a string*/ X stci_d(sizeStr,size); X X /*Print it out*/ X fputs(sizeStr,stdout); X X /*Print out a TAB*/ X fputs("\t",stdout); X X /*Print out the directory name, or '.' if it's the current directory*/ X if(dirName[0]==NULL) X puts("."); X else X puts(dirName); X X /*Flush the output stream*/ X flushall(); X return; X} X X/*Print help*/ Xvoid printHelp(void) X{ X puts("\nDave's DU V1.01 (c)1991 by Dave Schreiber. All rights reserved."); X puts("\nUsage:"); X puts(" du [-s][-a][<dir>]"); X puts("-s -- Print only the grand total size"); X puts("-a -- Print the size for each file"); X puts("<dir> -- Starting directory"); X puts(""); X return; X} X X/*CTRL-C handler*/ Xvoid ctrlC_Handler(void) X{ X signal(SIGINT,ctrlC_Handler); X quitNow=TRUE; X return; X} X END_OF_FILE if test 7606 -ne `wc -c <'DU.c'`; then echo shar: \"'DU.c'\" unpacked with wrong size! fi # end of 'DU.c' fi if test -f 'DU.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'DU.doc'\" else echo shar: Extracting \"'DU.doc'\" \(1444 characters\) sed "s/^X//" >'DU.doc' <<'END_OF_FILE' X X Dave's DU X V1.01 X X (c)1991 by Dave Schreiber. All rights reserved. This program may be Xfreely distributed. The only charges allowed in relation to distributing Xthis program is in relation to media, shipping, and handling costs. X XThis utility is based upon the Unix utility of the same name. It prints Xout the size of the contents of the given directory. If there are Xdirectories inside that directory, it will find the size of those. If they Xhave directories inside them, the sizes of those directories are found as Xwell, and so on. X X There's one feature of this version that seperates it from all other XDU utilities for the Amiga: it will not act upon soft links (a part of XKickstart version 2.00 and higher). With other DU programs, if you create Xa link to a directory's parent, then perform a DU upon that directory, the XDU program will end up going around in circles. This version of DU was Xcreated with links in mind, however, and doesn't suffer from this problem. X X One other note: this version of DU is pure. This means that it can Xbe made resident, using the Resident command (Workbench 1.3 and higher). XYou should do a 'protect DU +p' to set the pure bit on the program (not all XAmiga archivers save the pure bit). X XUsage: X DU [-s][-a][<dir>] X-s -- Print only the grand total size X-a -- Print the size for each file X<dir> -- Starting directory X XCompiling instructions: X lc DU X blink with DU.lnk X X END_OF_FILE if test 1444 -ne `wc -c <'DU.doc'`; then echo shar: \"'DU.doc'\" unpacked with wrong size! fi # end of 'DU.doc' fi if test -f 'DU.lnk' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'DU.lnk'\" else echo shar: Extracting \"'DU.lnk'\" \(81 characters\) sed "s/^X//" >'DU.lnk' <<'END_OF_FILE' XFROM LIB:cres.o+"DU.o" XTO "DU" XLIB LIB:lc.lib LIB:amiga.lib XSMALLCODE XSMALLDATA X END_OF_FILE if test 81 -ne `wc -c <'DU.lnk'`; then echo shar: \"'DU.lnk'\" unpacked with wrong size! fi # end of 'DU.lnk' fi if test -f 'du.uu' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'du.uu'\" else echo shar: Extracting \"'du.uu'\" \(9519 characters\) sed "s/^X//" >'du.uu' <<'END_OF_FILE' Xbegin 666 du XM```#\P`````````"``````````$```7A````GP```^D```7A2.=^_B1()`!)4 XM^0`````L>``$+P)(YP#@)FX!%"(K`*QG#.6)($$B*``TY8E@!B(/DJL`.G0`S XM(#P```3DLJP!T&0((BP!T-"!=`$F02(\``$``4ZN_SI*@&8&3-\'!$YU($`DS XM0")`(#P```":F?P`````(-Q3@&;Z(!QG#B!)T=S5T""*)$E3@&#P*$G9_```( XM```I?```!.0":$S?!P`I3@*D2@),WP`$2.R```*L9R8@#`2```````:````$J XMY-"L`=`$@````(`N0"`L`=`O0``$T:P":"(/DHL&@0```(`I00)P0JP"J'``3 XM(CP``#``3J[^SD/Z`8QP`$ZN_=@I0`+`9@9P9&```0@F;@$4*6L`F`*@2JL`A XMK&<``((@:P"LT<C1R")H`!#3R=/)(`)R`!(9*4D"M-"!7H`"0/_\*4`"O$CGY XM0$`B/``!``%.KO\Z2H!F#"`\```#Z"\`9P`!`B!`*4`"N$S?`@(@`E.`U($1^ XML@``(`)3@E'(__81O``@(`)3@A&\`"(@`A&Q(``@`5'*__@0O``B+PA@9$'K6 XM`%Q.KOZ`0>L`7$ZN_HPI0`*H+P`D0"`J`"1G$BQL`L`@0"(H```I00*@3J[_\ XM@B(J`"!G&B0\```#[4ZN_^(I0`*P9PKEB"!`)V@`"`"D(&P"J"\(2&P";"!H' XM`"0I:``$`K1.N@3:3KH%0G``8`0@+P`$+P`@+`*89P0@0$Z03KH.&BQX``0B# XM;`+`3J[^8DZZ!+!*K`*H9QPB+`*P9P1.KO_<+'@`!$ZN_WPB;`*H3J[^AF`.P XM("P"O&<((FP"N$ZN_RX@+`)H(DR3_``````L>``$*FP"K$ZN_RX@'RY-3-]_6 XM?DYU9&]S+FQI8G)A<GD```!.5?[XO^P"<&4`"E9(YR<"+BT`"$AM_OQ(;`+$) XM2&P"QB\M``PO!V$``G9(>@/.2'@``DZZ"SI/[P`<0>W^_"((=/XL;`+`3J[_( XMK"P`2H9F&$AL`:A(;``"3KH._DAX`,A.N@^^3^\`#"`&0>W^_&$``$PJ`'#_( XMNH!F$$AL`:A(;``\3KH.U%!/8!A*;`+&9A)*+```9@PO!4AM_OQA``*T4$\B7 XM!BQL`L!.KO^F0J=.N@]P3.U`Y/[D3EU.=4Y5_^2_[`)P90`)FDCG+S(F2"M`R XM_^9^`"\+3KH)_%A/*``@/````01R`2QX``1.KO\Z)$`@"F8&</]@``&<(BW_> XMYBQL`L!.KO^"*@`B+?_F)`I.KO^:(BW_YB0*+&P"P$ZN_Y1*@&<``2Y*+```_ XM9@`!)B`J`'AR!+"!9]I*@&I,("H`@%*`WH!*;`+$9\A*1&<8<``P!'(ZLC,(F XM_V<,2&P`4"\+3KH)EE!/0>H`""\(+PM.N@F(+H<O"V$``=I/[P`,<``P!$(S! XM"`!@BD/J``@B"73^3J[_K"P`2H9F0B(%3J[_@DAL`:A(;`!23KH-KD'J``A(4 XM;`&H+PA.N@V@2&P!J$AL`&Q.N@V4(DH@/````00L>``$3J[_+G#_8```NDI$< XM9QAP`#`$<CJR,PC_9PQ(;`!N+PM.N@D$4$]!Z@`(+P@O"TZZ"/8@!B!+80#^8 XMLE!/*T#_ZB(&+&P"P$ZN_Z9P_["M_^IF&B(%3J[_@B)*(#P```$$+'@`!$ZN2 XM_RYP_V!6("W_ZE2`WH!P`#`$0C,(`&``_L(B!2QL`L!.KO^"2BP``&<02&P!; XMJ$AL`'!.N@SL4$]@$$IL`L9G"B\'+PMA``#44$\B2B`\```!!"QX``1.KO\NL XM(`=,[4ST_\1.74YU3E7__+_L`G!E``>X2.<#,"XM``@F;0`0)&T`%")M``P@X XM:0`$<#^P$&8,80``ZD*G3KH-4%A/-KP``4)22&P`@"\M`!A.N@@$4$]\`;R'P XM;%8@!N6`(&T`#"!P"`!R+;(09BI#Z``!$!%(@`1``$%G%@1``!)G#`1```YG( XM"@1``!)F($)38!PTO``!8!8@!N6`(&T`#"\P"``O+0`83KH'K%!/4H9@IDI3R XM9@)"4DS?#,!.74YU3E7_\+_L`G!E``<$2.<!$"9M``@N+0`,+P=(;?_P3KH'K XMGDAL`89(;?_P3KH+VDAL`89(;`""3KH+SD_O`!A*$V8,2&P`A$ZZ"8I83V`(# XM+PM.N@F`6$].N@PV3-\(@$Y=3G6_[`)P90`&IDAL`(9.N@EB2&P`QDZZ"5I(E XM;`#.3KH)4DAL`.).N@E*2&P!"$ZZ"4)(;`$L3KH).DAL`4A.N@DR3^\`'$YUG XMO^P"<&4`!F!(>O_V2'@``DZZ!V)03QE\``$``$YU2.<P,BQO`#@@;P`8(F\`F XM'"1O`"`F;P`D("\`*"(O`"PD+P`P)B\`-$ZN_J1,WTP,3G4``$YU3G5(YP<P8 XM+B\`&"9O`!PL+P`@+P=.NA`$6$\D0"`*9@1P_V`V""H``P`#9Q!(>``"0J<O@ XM!TZZ"51/[P`,+P8O"R\J``1.N@O@3^\`#"H`2JP"A&<$</]@`B`%3-\,X$YU@ XM``````````!P84Y5_^Q(YR$R)FT`"`RL````(`1&;```TA`3<B"P`6<,<@FP@ XM`6<&<@JP`68$4HM@Z!`39P``M"(L!$;E@5*L!$9![`1.T<$D2'(BL`%F<E*+E XM($LDB"M(_^P0$W(BL`%G4'(JL`%F/E*+<``0$P1``$5G"`1```EG$&`<(&W_Y XM[!#\`!<K2/_L8!@@;?_L$/P`"BM(_^Q@"B!M_^P0TRM(_^Q2BV"T(&W_[!#;( XM*TC_[&"H4HL@;?_L0A@K2/_L8`#_3B2+$!-G%G(@L`%G$'()L`%G"G(*L`%G: XM!%*+8.9*$V8"8`9"&V``_R8@+`1&9@8@;`*H8`1![`1.*4@$2DJ`9GQ#^@$D< XM3>P$#"S9+-DLV2S9/)$B;`*H(&D`)$AX`"@O*``$2&P$#$ZZ!)Q/[P`,0>P$Y XM#"(()#P```/N+&P"P$ZN_^(I0`+0*4`"V'(0*4$"U"E``N`I00+<Y8`K0/_P0 XMD\DL>``$3J[^VB!M__`B0"-H``@`I'X`*T#_]&`J+&P"P$ZN_\HI0`+03J[_H XMQ"E``MA!^@"F(@@D/````^U.KO_B*4`"X'X0(`<`0(`!@:P"S"`'`$"``H&L1 XM`M0`K```@`,"W$JL`<QG!'``8`8@/```@``N`$*L`8`@!P!```$I0`%\<`$I( XM0`&B(`<`0``"*4`!GG`"*4`!Q"`'`$``@"E``<!!^@R`*4@"G"\L!$HO+`1&I XM3KKY-$*73KH)3DSM3(3_V$Y=3G5C;VXZ,3`O,3`O,S(P+S@P+P`J````````: XM````````````````````````````````````````````+PLF;P`(2JL`%&<,3 XM""L``P`;9@1P`&`T+RP"9$ZZ!UY83R=```0G0``09@IP#"E`!.!P_V`6)VP"I XM9``4<//!JP`8<``G0``,)T``""9?3G4```````````````!.5?_L2.<O$"XM0 XM``@F;0`,*`=P,<"K`!AG!G#_8``"9`@K``<`&E;`1`!(@$C`+`!*JP`49@``U XM@`@K``(`&V9V<``G0``,<O^^@6<``C8O"TZZ_U)83TJ`9PP(ZP`%`!MP_V``W XM`AX(ZP`!`!M*!F<.("L`%"(`1($G00`,8`@@*P`4)T``#%.K``QM$B!K``122 XMJP`$(`<0@'(`$@!@$B`'<@`2`"\++P%A`/]64$\B`"`!8``!S@@K``(`&V=8' XM</^^@&8&<`!@``&Z(`<;0/__2@9G(G`*OH!F''`"+P!(>@&J+RL`'"M`__!.C XMNOOP3^\`#"H`8!IP`2\`2&W__R\K`!PK0/_P3KK[U$_O``PJ`'[_8```W`CKM XM``$`&TH&9TYP_[Z`9TA4JP`,<@J^@68B(&L`!%*K``00O``-(BL`#$J!:PHO\ XM"R\`80#^ME!/4JL`#"!K``12JP`$(`<0@"`K``Q*@&H&(`=@``$8?O\@*P`$[ XMD*L`$"M`__!G<@@K``8`&F=22'@``D*G+RL`'$ZZ!-1/[P`,*T#_[$H&9SA3M XMK?_L;3)"IR\M_^PO*P`<3KH$M$AX``%(;?_]+RL`'$ZZ`ZA/[P`82JP"A&8*Z XM$"W__7(:L`%GR"\M__`O*P`0+RL`'$ZZ^OA/[P`,*@!@`GH`</^Z@&8(".L`D XM!0`;8`RZK?_P9P8(ZP`$`!M*!F<.(BL`%"0!1((G0@`,8!@(*P`"`!MG"'(`0 XM)T$`#&`((BL`%"=!``P@:P`0)T@`!+Z`9RI3JP`,;1(@:P`$4JL`!"`'$(!R0 XM`!(`8!(@!W(`$@`O"R\!80#]G%!/(@!P,,"K`!AG!'#_8`QP_[B`9@1P`&`"@ XM(`1,WPCT3EU.=0T*`````$CG!P`N+P`0("P!3%.`+`!*1FLP(`9(P.>`0>P"Z XMS"HP"`!*!6<:"`4`!&84(`9(P.>`0>P"S"\P"`1.N@=`6$]31F#,+P=.NO4PB XM6$],WP#@3G4``````````'!A+FP"K$ZZ!SY(>0```!1.N@6P``````````!P= XM84Y5__A(YP,P)FT`""1M``PN+0`0($I*&&;\4XB1RBP(($M*&&;\4XB1RR`(F XM(DO3P"M)__B\AV,"+`<@!B!*8`(2V%.`9/H@;?_X0C!H`"`+3-\,P$Y=3G4@A XM;P`$(`A*&&;\4TB1P"`(3G4``")O``@@;P`$(`@0V6;\3G4B;P`((&\`!"`(L XM2AAF_%.($-EF_$YU```@+P`((&\`!$Y5__0B3VP&$/P`+42`<@I.N@>`!D$`? XM,!+!2H!F\!#AO\EF^D(0(`A.79"O``1.=7``3G4O"TAZ__A.N@)`)FP$T'`!N XM*4`$T$AX``).DU!/<``F7TYU2.<!,"XO`!`F;P`4(`=5@&<.78!F0"1L`HPIH XM2P*,8$0D;`30*4L$T"`+9@I"ITZZ`?983V`N,'P``;?(9@Q(>O^:3KH!XEA/L XM8!I(>O^23KH!UEA/8`YP%BE`!.`P?/__(`A@`B`*3-\,@$YU``````````!P< XM84Y5_^A(YP$R+BT`#$J';@9P_V```-)P"+Z`9`(N`"`'5H`N``)'__PD;0`(L XM("T`"-"'WZP!8$'L`5PF4"M`__`K2/_T(`MG``"0($L@*P`$T<!([0$`_^PB( XM;?_PM\EC$"2+)4<`!"QM__0LBG``8':WR68:+%,DCB`K``0B`-*')4$`!"QMT XM__0LBG``8%BUR&0(GZP!8'#_8$RUR&8J(!-G#+/`8PB?K`%@</]@.-^K``0@S XM$V<.L\!F"B`I``31JP`$)I%P`&`>*TO_]"MM_^S_Z"938`#_;B!M__0@BD*2T XM)4<`!'``3-],@$Y=3G4``````````'!A2.<',"XO`!@F;P`<+"\`("\'3KH'B XM>%A/)$`@"F8$</]@'B\&+PLO*@`$3KH$+$_O``PJ`$JL`H1G!'#_8`(@!4S?$ XM#.!.=0``2.<!$"9O``Q^`!X;2H=G+E.L`9)M$B!L`8I2K`&*(`<0@'(`$@!@Y XMX"`'<@`2`$AL`88O`4ZZ^AI03R(`8,I3K`&2;1(@;`&*4JP!BG`*$(!R`!(`\ XM8!!(;`&&2'@`"DZZ^?!03R(`(`%,WPB`3G4``"`O``1F!B`\```5S"E``IQPQ XM`$YU2.<`,B9L!-0@"V<4)%,B2R`I``@L>``$3J[_+B9*8.B1R"E(!-@I2`34A XM3-],`$YU2.</$"XO`!@L+P`<*B\`("\'3KH&?%A/)D`@"V8$</]@'B\%+P8O4 XM*P`$3KH"O$_O``PH`$JL`H1G!'#_8`(@!$S?"/!.=0``````````<&%(YP$R< XM+B\`%'`,WH`@!W(`+'@`!$ZN_SHF0"`+9@1P`&`X)T<`"$7L!-0@:@`$)T@`` XM!)'()HA*DF8")(L@*@`$9P0B0"*+)4L`!$JL`5!F!"E+`5!!ZP`,(`A,WTR`' XM3G4```````````````!(YP,P+B\`%$J';@9P`&```*1P"+Z`9`(N`"`'5H`N$ XM``)'__Q%[`%<)E(@"V=`("L`!+"';3*PAV8,(%,DB)^L`6`@"V!N("L`!)"'4 XM<@BP@646($O1QR2()$@DDR5```2?K`%@(`M@3"1+)E-@O"`'(BP!U-"!4X!.D XMN@-J(BP!U$ZZ`T(L`%"&(`96@"P``D;__"\&3KK^_EA/)D`@"V<2+P8O"TZZE XM_*HNAV$`_U103V`"<`!,WPS`3G4``````````'!A2.<!,"9O`!`D;P`4?@`>3 XM&TJ'9Q(O"B\'3KH`%E!/4H!FZG#_8`)P`$S?#(!.=0``2.<!$"XO``PF;P`0\ XM""L`!@`;9Q)P"KZ`9@PO"R\'3KKWS%!/8"Q3JP`,;1(@:P`$4JL`!"`'$(!R? XM`!(`8!(@!W(`$@`O"R\!3KKWHE!/(@`@`4S?"(!.=4CG`Q!\`"X&1^P!9"`+' XM9QY*JP`89Q0O"TAX__].NO=V4$]*@&<"?O]2AB938-Y*AV<$</]@`B`&3-\(^ XMP$YU``!(YP,0+B\`$$?L`60@"V<T""L``@`;9B@(*P`!`!MG("`K``20JP`0> XM+`!*AF<2+P8O*P`0+RL`'$ZZ\_9/[P`,)E-@R"\'3KKYG%A/3-\(P$YU``!(> XMYS<2+B\`("9O`"0L+P`H2JP"G&<$3KH$'$*L`H0B!R0+)@8L;`+`3J[_T"H`7 XM</^Z@&8.3J[_?"E``H1P!2E`!.`@!4S?2.Q.=0``2.<_`BXO`"`L+P`D*B\`1 XM*$JL`IQG!$ZZ`]!"K`*$(`53@"(')`8F`"QL`L!.KO^^*`!P_[B`9@Y.KO]\T XM*4`"A'`6*4`$X"`%2H!G"E.`9PI3@&<,8!@@!F`4(`30AF`.(@=T`"8"+&P"% XMP$ZN_[Y,WT#\3G5(YS<2+B\`("9O`"0L+P`H2JP"G&<$3KH#7$*L`H0B!R0+& XM)@8L;`+`3J[_UBH`</^Z@&8.3J[_?"E``H1P!2E`!.`@!4S?2.Q.=0``2.<!] XM`BXO``Q*K`*<9P1.N@,8(@<L;`+`3J[_W'``3-]`@$YU3E7_J$CG`1)#^@"0> XM<``L>``$3J[]V"9`(`MF"DAX`!1.NO@^6$]^`"!L`K0>*/__(`=#[?^P8`(2A XMV%.`9/I"-7BP0>W_L"E(`>0O"TAX`"A(>`#Z<``O`"\`2&P"`'(`+P%(;`'L^ XM+P%.NO(*2'@`%$ZZ]^Y,[4B`_YQ.74YU*BH@4W1A8VL@3W9E<F9L;W<@*BH`1 XM`$58250``&EN='5I=&EO;BYL:6)R87)Y`````````'!A2.<P`"0`)@%(0DA#0 XMQ,'&P,#!U$-(0D)"T(),WP`,3G5*@&H``!Y$@$J!:@``#$2!80``($2!3G5A# XM```81(!$@4YU2H%J```,1(%A```&1(!.=2\"2$$T`68``")(0$A!2$(T`&<`% XM``:$P3`"2$`T`(3!,`)(0C(")!].=2\#=A`,00"`9```!N&944,,00@`9```J XM!NF964,,02``9```!N6954-*06L```;CF5-#-`#FJ$A"0D+FJDA#@,$V`#`"S XM-`-(0<3!D()D```(4T/0@63^<@`R`TA#Y[A(0,%!)A\D'TYU3E7_F$CG,S)^^ XM`"!L`K0>*/__<$^^@&\"+@`@!T/M_Z]@`A+84X!D^D(U>*^3R2QX``1.KO[:: XM)D`@*P"L9TCE@"1`+"H`.$J&9@0L*P"@2H9G-"(&0?H`MB0(=@LL;`+`3J[_: XMT"!'4H<@"!N\``H(KR(&0>W_KR0()@<L;`+`3J[_T'#_8%)#^@"0<``L>``$8 XM3J[]V"M`_YIF!'#_8#I![?^O*4@"-"\M_YI(>``\2'@`^G``+P`O`$AL`E!(2 XM;`(\2&P"*$*G3KKP%$_O`"13@&<$</]@`G``3-],S$Y=3G4J*B!5<V5R($%BE XM;W)T(%)E<75E<W1E9"`J*@``0T].5$E.544``$%"3U)4`"HJ*B!"<F5A:SH@5 XM`&EN='5I=&EO;BYL:6)R87)Y````+P<N+P`(<``I0`*$2H=K(KZL`4QL'"`'$ XMYX!![`+,2K`(`&<.(`?G@$'L`LS1P"`(8`AP"2E`!.!P`"X?3G4``$CG`0)PK XM`"(\```P`"QX``1.KO[.+@`"AP``,`!*AV<@2JP"G&<:(&P"G$Z02H!F`F`.Z XM0JP"G$AX`!1.NO4@6$],WT"`3G5AN$YU``````/L`````0```````!`L````: XM`0````$````*`````````_(```/J````GP``0V]U;&1N)W0@86-C97-S('1H; XM92!D:7)E8W1O<GD@>6]U(')E<75E<W1E9#L@(&%B;W)T:6YG+@H``$5R<F]R< XM+B`@06)O<G1I;F<A"@``+P!#;W5L9&XG="!L;V-K(&1I<F5C=&]R>3H```H`` XM+P`J*BH@0G)E86LZ(&1U"@`````)`"X`"D1A=F4G<R!$52!6,2XP,2"I,3DYE XM,2!B>2!$879E(%-C:')E:6)E<BX@06QL(')I9VAT<R!R97-E<G9E9"X```I5H XM<V%G93H`(&1U(%LM<UU;+6%=6SQD:7(^70`M<R`M+2!0<FEN="!O;FQY('1HG XM92!G<F%N9"!T;W1A;"!S:7IE`"UA("TM(%!R:6YT('1H92!S:7IE(&9O<B!E- XM86-H(&9I;&4``#QD:7(^("TM(%-T87)T:6YG(&1I<F5C=&]R>0``````````` XM*``````````````````````````````!A@``````````````````````````O XM`````````````````:@`````````````````````````````````````````I XM`````````````````````````````````````````````````(`````/H```O XM!`#__P````X`#@```````````````/__````!``$````````%+(```'8__\`! XM```$``0````````4R`````#__P````X`#@```````!:L`````/__````!``$& XM``````````````(4__\````$``0````````6R`````#__P````0`!```````` XM`!;2`````````@`````$```!A@```60```'\```".````^P````%````````% X:`EP```)(```"(````@P```'X`````````_+\" X`` Xend Xsize 6776 END_OF_FILE if test 9519 -ne `wc -c <'du.uu'`; then echo shar: \"'du.uu'\" unpacked with wrong size! fi # end of 'du.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.