[comp.sources.amiga] v91i122: DDU 1.01 - Dave's DU; KS-2.0-aware disk usage utility, Part01/01

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.