[comp.sys.amiga] FNAMS revisited

mrr@amanpt1.zone1.com (Mark Rinfret) (05/31/88)

What follows is a shar of a program that appeared in comp.sources.amiga
recently.  I made a few changes, emailed it back to the author (Svante
Gellerstam) and he, in turn, added some improvements.  We both agreed that
the modified program should be re-released.  It's small, so you're getting
it here.

Mark
--------------------------------------------------------------------------
#       This is a shell archive.
#       Remove everything above and including the cut line.
#       Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar:    Shell Archiver
#       Run the following text with /bin/sh to create:
#       ReadMe
#       fnams.man
#       Makefile
#       make.lat
#       fnams.pragmas
#       fnams.c
#       fnams.uu
# This archive created: Wed Oct 21 15:18:19 1987
cat << \SHAR_EOF > ReadMe
This archive should contain:

       fnams           - executable.

       fnams.c         - C-source for the Amiga.

       fnams.man       - Documentation pages for fnams.

       fnams.pragmas   - #pragma def's for Lattice (4.0).

       make.lat        - Compile script for Lattice.

       Makefile        - Aztec Makefile.

       ReadMe          - This file.

/svante

WayBack     -   Svante Gellerstam (d87sg@efd.lth.se)

         Idea & initial program conceived.

05/21/88    -   Mark Rinfret (mrr@amanpt1)

            This program was, shall we say, a little "incomplete" in its
        original form.  I have added some error checking and other changes.
        This program will now compile under Aztec C (V3.6a was used).  I
        liked the author's idea for a raw pathname generator (vs. "List
        QUICK", which outputs trailing blanks) so I spent a little time
        fixing this up to suit my tastes.  Actually, the code leading into
        the search loop could be rewritten, but I didn't want to spend too
        much time on this.  It works.

05/22/88    -   Svante Gellerstam (d87sg@efd.lth.se)

            I received Mark's fixes to fnams. He really fixed a lot of
        things up making the program much safer to use. I thought it was a
        shame though that there was a LIMIT of how deep the nesting of
        directories could be. So I added doubly linked lists to hold
        directory info. Now the only thing limiting depth is available
        memory. The casual user should however note that the program migth
        cause some fragmentation if multitasked with other heavily
        allocating programs.
            Changed the man pages to reflect changes made.

05/30/88    -   Mark Rinfret (mrr@amanpt1)

            Tested the source under Aztec for compatibility. As a result, the
        #pragma definitions were placed in a separate file.


SHAR_EOF
cat << \SHAR_EOF > fnams.man
        NAME
                FNAMS - a filter program for the ZOO archiver. Amiga
                version.

        SYNOPSIS
                FNAMS <volume>
                FNAMS <unit>
                FNAMS ""
                FNAMS

        DESCRIPTION
                FNAMS will produce a listing on stdout of all files under
                the given directory/unit with their full pathnames. Thus
                FNAMS is a complement to the ZOO archiver. The first
                objective is to provide a easy way to archive entire
                directory structures.


                The intended use is as follows:

                First produce a listing of the desired directory using
                FNAMS:

                        FNAMS > <tempfile> <dirpath>

                Then use <tempfile> together with the ZOO option I:

                        ZOO < <tempfile> aI <archivename>


                ZOO will then put into <archivename> all files described in
                <tempfile>.

        EXAMPLES
                FNAMS may generate tree listings from a directory, a volume
                or the current directory.

                To generate a listing of a directory you call FNAMS with
                the appropriate directory name. For example if you want to
                make a listing of all files in the directory 'texts' one
                might type as follows:

                        FNAMS texts
                        FNAMS texts/

                To generate a listing of an entire volume is about the
                same:

                        FNAMS df0:

                The current directory is perhaps not as intuitive:

                        FNAMS ""

                For a brief reminder of syntax:

                        FNAMS

        FILES
                In the event of I/O redirection the file <tempfile> will be
                created. See description.

        SEE ALSO
                ZOO documentation.

        BUGS
                None known... If you should happen to find these unknown
                bugs, drop me a letter at below adress.
                   Oh, yes, one thing: all output goes through stdout
                including error messages. This could create a problem if
                redirection is used.

        DIAGNOSTICS
                The original version of this program produced no
                diagnostics and also quietly skipped over error conditions
                which should have been fatal.  Several error messages are
                now output for failures to allocate memory, obtain locks on
                files or to examine file info. All error messages have a
                triple exclamation point prefix (!!!).

        THANKS TO
                Lattice for including those hints on how to squeeze
                filesize to a minimum.
                Rahul Dhesi for writing ZOO in the first place.
                One very large and heartfelt thanks must also go to Mark
                Rinfret for his effort in adding error messages and making
                the code work with Aztec C.

        AUTHOR
                Svante Gellerstam   - Idea & Prototype.
                Mark Rinfret        - See Thanks to above.

                Please send hints, flames, bugs and/or suggestions to me
                at:

                                USENET - d87sg@efd.lth.se

SHAR_EOF
cat << \SHAR_EOF > Makefile
# Aztec C makefile for fnams, the file name list preparation utility to
# be used with the Zoo archiver.

fnams: fnams.o
       ln -o fnams fnams.o -lc32

fnams.o: fnams.c
       cc +L -B fnams.c

SHARFILES = fnams.c Makefile ReadMe fnams.man

shar:  $(SHARFILES)
       makekit -n FNAMS $(SHARFILES)
SHAR_EOF
cat << \SHAR_EOF > make.lat
lc -w -Lcd fnams.c
SHAR_EOF
cat << \SHAR_EOF > fnams.pragmas
/* fnams.pragmas */

/* Aztec C won't ignore these, even if surrounded by #ifndef AZTEC_C. */

#pragma libcall DOSBase Lock 54 2102
#pragma libcall DOSBase UnLock 5a 101
#pragma libcall DOSBase Examine 66 2102
#pragma libcall DOSBase ExNext 6c 2102
#pragma libcall DOSBase Write 30 32103
#pragma libcall DOSBase Output 3c 0
#pragma libcall DOSBase IoErr 84 0
#pragma syscall AllocMem c6 1002
#pragma syscall FreeMem d2 902
SHAR_EOF
cat << \SHAR_EOF > fnams.c

/* fnams.c */
/* :ts=4 */


   /* includes */

#ifdef AZTEC_C
   #include <libraries/dos.h>
   #include <exec/memory.h>
   #include <stdio.h>
   #include <functions.h>
#else /* For Lattice */
   #include "libraries/dos.h"
   #include "exec/memory.h"
   #include "stdio.h"
   #include "string.h"
#endif


   /* structure declarations */

      /*
      This is the root fib. We do this to avoid any hairy depth problems
      with HD:s or other large disc devices with deeply nested directory
      trees.
      */

struct ext_fib
   {
   struct FileInfoBlock fib;
   struct ext_fib *prev_fib, *next_fib;
   BPTR   flock;
   };


   /* defines */

#define  MAX_DEPTH   20    /* Maximum depth of pathnames. */


   /* prototypes or casts */

#ifndef AZTEC_C
   extern struct DosLibrary *DOSBase;

   BPTR  Lock(char *, ULONG);
   void  UnLock(BPTR);
   int   Examine(BPTR, struct ext_fib *);
   int   ExNext(BPTR, struct ext_fib *);
   ULONG AllocMem(ULONG, ULONG);
   void  FreeMem(ULONG, ULONG);
   void  Write(ULONG, char *, ULONG);
   ULONG Output(void);
   ULONG IoErr(void);

   void  exit(ULONG);
   void  myputs(char *);

#include "fnams.pragmas"

#else
   void    myputs();
#endif


   /* external declarations */

extern int      errno;


   /* global structures */

char     dirstr[108];


void
main(argc,argv)
int     argc;
char   *argv[];
   {
   struct ext_fib *currfib, *tempfib;
   char errString[81];
   char *killptr,temp;
   int kris;
                              /*
                              For all you non swedish people out there: the
                              word 'kris' translates to 'crisis' and is
                              used as a flag telling whether we're in
                              running shape or not. It is set to nonzero
                              value to indicate an error. Thus the 'while
                              (!kris)' below.
                              */

   *errString = '\0';
   kris = 0;

   if(argc < 2)
      {
      myputs("Fnams 2.0 - 880530\n\n");
      myputs("Fnams          - display this message.\n");
      myputs("Fnams \"\"       - list current directory.\n");
      myputs("Fnams <volume> - list the contents of <volume>.\n");
      myputs("Fnams <dir>    - list the contents of <dir>.\n");
      exit(20L);
      }

   if (!(currfib = (struct ext_fib *)
          AllocMem((ULONG) sizeof(struct ext_fib), MEMF_PUBLIC|MEMF_CLEAR)))
      {
      strcpy(errString, "No memory for root FileInfoBlock!");
      kris = 1;
      }

   strcpy(dirstr,argv[1]);

   if(!kris && ((currfib->flock = (BPTR) Lock(dirstr, ACCESS_READ)) == 0))
      {
      sprintf(errString,"!!! Unable to lock %s, error %ld\n",
                  dirstr,IoErr());
      kris = 1;
      }

   if (!kris && (Examine(currfib->flock, currfib) == 0))
      {
      sprintf(errString,"!!! Initial Examine call failed: %ld\n",IoErr());
      kris = 1;
      }

   if(!kris)
      {
      if (currfib->fib.fib_EntryType < 0)
         {
         myputs("Pathname argument must be volume or directory!\n");
         kris = 1;
         }
      else
         {

                   /* This program requires that the initial directory specification
                        * be terminated with a colon or slash.  We already know that this
                        * is either a directory or a device.  If the pathname isn't
                        * terminated with a colon, it must be a directory.  If it's not
                        * already terminated with a slash, just add one.  Oh - one other
                        * thing.  If dirstr is null (user specified "" = current dir),
                        * leave it alone.
                        */

         if (*dirstr && (temp = dirstr[strlen(dirstr)-1]) != ':' &&
                     temp != '/')
            strcat(dirstr, "/");
         }
      }

   if(!kris && (ExNext(currfib->flock, currfib)== 0))
      {
      sprintf(errString,"!!! Initial ExNext failed: %ld\n",IoErr());
      kris = 1;
      }

   while (!kris)
      {                                 /* Who's kris? :-) */

      /* Is this entry a directory? */

      if(currfib->fib.fib_EntryType > 0)
         {
         strcat(dirstr, currfib->fib.fib_FileName);
         strcat(dirstr,"/");

         if(currfib->next_fib == 0L) /* Have to allocate a new fib */
            {
            if (!(currfib->next_fib = (struct ext_fib *)
                            AllocMem((ULONG) sizeof(struct ext_fib),
                                         MEMF_PUBLIC|MEMF_CLEAR)))
               {
               sprintf(errString, "!!! No memory for file info!\n");
               kris = 1;
               }
            currfib->next_fib->prev_fib = currfib;
            }

         if(!kris) /* Step down into the new fib */
            currfib = currfib->next_fib;

         if (currfib->flock)
            UnLock(currfib->flock);

         if((currfib->flock = (BPTR) Lock(dirstr,ACCESS_READ))== 0)
            {
            sprintf(errString, "!!! Unable to lock %s, error %ld\n",
              dirstr, IoErr());
            kris = 1;                         /* This is fatal. */
            }
         else
            {
            if (!kris && !Examine(currfib->flock, currfib))
               {
               sprintf(errString, "!!! Examine error on %s - %ld\n",
                 dirstr, IoErr());
               kris = 1;
               }
            }
         }
      else  /* No directory - process filename */
         {
         myputs(dirstr);
         myputs(currfib->fib.fib_FileName);
         myputs("\n");
         }

      while((ExNext(currfib->flock, currfib) == 0L) && !kris )
         {
         UnLock(currfib->flock);
         currfib->flock = 0L;

         if( currfib->prev_fib == 0 ) /* We're at root level. */
            {
            kris = 1;   /* Always true since this is the last entry! */
            break;
            }
         else  /* We're at some lower than root level */
            currfib = currfib->prev_fib;

         killptr = dirstr + strlen(dirstr)- 3;
         while((*killptr != '/')&& (*killptr != ':'))
            killptr--;
         *(killptr+1)= '\0';
         }
      }

       /* Free up resources before leaving. */

      while(currfib->next_fib) /* Move to last fib in chain */
         currfib = currfib->next_fib;

      while(currfib) /* Free up allocated fib:s */
         {
         tempfib = currfib->prev_fib;
         FreeMem((ULONG)currfib, (ULONG)sizeof(struct ext_fib));
         currfib = tempfib;
         }

   if (*errString)
      {                                       /* There was an error. */
      myputs(errString);                      /* Tell the user about it. */
      }
   }

void
myputs(string)
char   *string;
   {
   if (*string)
      Write(Output(), string, (long) strlen(string));
   }
SHAR_EOF
cat << \SHAR_EOF > fnams.uu

begin 644 fnams
M```#\P`````````#``````````(```5#```!%0```8H```/I```%0TCG?OY+.
M[P`T)$@D`$GY`````"QX``0I3@!`*4\`3$*L`$B3R4ZN_MHF0"EK`)@`.$JK]
M`*QG``!P(`V0K0`$!H````"`*4``!&$``7H@:P"LT<C1R")H`!#3R=/)(`)R/
M`!(9*4D`5-"!4H!"9U*``D#__I_`58!"=P@`(`)3@-2!'[(``"``4X)1R/_VA
M'[P`("``4X(?L2``(`!1RO_X(D\O"6```&PI:P`Z``0&K````(``!&$``0YA@
M``#X*4``2"\`)$`@*@`D9Q(L;`+H($`B*```*4$`.$ZN_X(B*@`@9QHD/```[
M`^U.KO_B*4``4&<*Y8@@0"=H``@`I"!L`$@O"$AL```@:``D*6@`!`!41_D`3
M``/X<@`@/````(Q@`B;!4<C__$ZZ"&!P`&`$("\`!"\`("P`+&<$($!.D$ZZA
M`P@L>``$(FP"Z$ZN_F)*K`+P9P@B;`+P3J[^8DJL`O1G"")L`O1.KOYB2JP`K
M6&<((FP`6$ZN_F)*K`!(9R0B+``\9P1.KO_<(BP`4&<$3J[_W"QX``1.KO]\=
M(FP`2$ZN_H8@'RYL`$Q,WW]^3G5P9&"`0>L`7$ZN_H!!ZP!<3J[^C$YU0^P`<
M7'``3J[]V"E``NAGVDYU``!(YS`R+'D```+L(&\`&")O`!PD;P`@)F\`)"`OG
M`"@B+P`L)"\`,"8O`#1.KOZD3-],#$YU3E7__DCG(`!P`#E``!A*;0`(:R8R'
M+0`(LFP"Y&P<(`%T!L'"0>P%.")(TL!*46<*(`'!PM#`(`A@"#E\``D"4'``5
M3-\`!$Y=3G4```````#__________P#_8XP`_V1X`/]D'$Y5__A(YP`@1>P"Y
M;+3\``!G-`@J``(`$V8H""H``0`39R`@*@`$D*H`##M`__Q*0&<0/P`O*@`,(
M/RH`%$ZZ!FY03R128,8_+0`(3KH/:%1/3-\$`$Y=3G4`_V.,`/]P84Y5```RZ
M+0`(#$$`,&T*#$$`.6X$<`%@`G``3EU.=0``3E7_]C\M``A.NO\25$\K0/_VZ
M2H!F!'#_8"H_+0`.+RT`"B!M__8O*``"3KH0!$_O``HK0/_Z2FP`&&<$</]@X
M!"`M__I.74YU3E7_^"`M``@&@`````HO0```("\``'(`+'@`!$ZN_SHK0/_\J
M2JW__&8$<`!@-"`M``@&@`````H@;?_\,4``""\(2&P$9&$``1!03TJL`M!F8
M!BEM__P"T"!M__S0_``*(`A.74YU3E7__'``,"T`""\`88Q83RM`__Q*@&8$M
M</](P$Y=3G5.5?_X2.<!(&$``(!P`"E``!`I0``(*4``#"E``MHI0`+>*4`"X
MU"E``M!";`+82JP"R&=,("P"^"(L`LC2@%.!(`$B+`+X3KH,WB(L`OA.N@VRX
M4(`N`"`'(`=6@.2`Y8`N`"\'80#_%%A/)$"T_```9@1P_V`,+P<O"DZZ`,)0,
M3W``3-\$@$Y=3G5.5?_T*VP$9/_\2JW__&<J(&W__"M0__AP`#`H``@O0```H
M(FW__"`O```L>``$3J[_+BMM__C__&#0D<@I2`1H*4@$9$Y=3G5.50``2.<`S
M(")M``@@:0`$(FT`#"-(``21R"*()&T`"$J29@(DB4JJ``1G!B!J``0@B25)E
M``1,WP0`3EU.=0``$G".S0`%:*,``R=```,W&````````U=(````8`<`````3
M```#)\@`((``<&%.5?_\<``P+0`,+P`O+0`(*T#__&$&4$].74YU3E7_Z$CG`
M(3`N+0`,2H=N!G#_8```\`R'````"&P"?@@@!R`'5H#D@.6`+@`@;0`(*TC_M
M]-''WZP"WD/L`MHD42M(__`K2?_XM/P``&<``*(@2B`J``0@2M'`*TC_["0M?
M__"UPF,6(FW_]"**(T<`!"9M__@FB7``8```BK7"9AXB4B9M__0FB2`J``0BB
M`-*')T$`!")M__@BBW``8&8B;?_TL\AD")^L`MYP_V!6L\AF+DJ29PXB$K2!P
M8PB?K`+></]@0-^J``1*DF<0M))F#"!"("@`!-&J``0DD'``8"0K2O_X*VW_5
M[/_H)%)@`/]:(&W_^""M__0@;?_T0I`A1P`$<`!,WPR$3EU.=4Y5``!2;`1TV
M,"T`""!L!'`0@%*L!'!.74YU3E4``$)L!'0I;0`(!'!(;0`0+RT`#$AZ_\Y.Z
MN@GF3^\`#"!L!'!"$#`L!'1.74YU``!.5?_X2.<@`'``.T#__CM`__P[0/_X`
M(&T`"!(0#`$`+68,<`$[0/_\.T#_^&`,#`$`*V8&.WP``?_\(&T`"#(M__P0^
M,!```D``_S\`3KK\$E1/2D!G*#`M__[!_``*,BW__%)M__P@;0`(%#`0``)"T
M`/_00@1``#`[0/_^8+Q*;?_X9P1$;?_^(&T`##"M__XP+?_\3-\`!$Y=3G5.6
M5?_T2.<`($(M__T[?``(__Y3;?_^("T`#"(``H$````/0>P"5-#!,BW__AN0C
M$/7H@"M```P"@`____\K0``,2JT`#&;,0>W_]=#M__XB2"1M``@4V6;\<`B04
M;?_^3-\$`$Y=3G5.50``,"T`#$C`+P`O+0`(88A03TY=3G4``$Y5__)(YR`@G
M.WP`"__R0BW__U-M__(@+0`,(@`"@0````<&@0```#`T+?_R&X$@].:`*T``@
M#`*`'____RM```Q*K0`,9LQ![?_TT.W_\B)()&T`"!399OQP"Y!M__),WP0$3
M3EU.=4Y5```P+0`,2,`O`"\M``AAB%!/3EU.=0``3E7_\DCG`"`[?``+__)"C
M+?__4VW_\B`M``QR"DZZ".P&@0```#`P+?_R&X$`]"`M``QR"DZZ"-0K0``,R
M2JT`#&;00>W_]-#M__(B2"1M``@4V6;\<`N0;?_R3-\$`$Y=3G4``$Y5__I($
MYP$`(&T`#$H89OQ3B)'M``PN""!M``A*&&;\4XB1[0`((`@B;0`(TL`K2?_Z8
M,BT`$+Y!8P(N`2`'(&T`#&`"$MA1R/_\(&W_^D(P<``@+0`(3-\`@$Y=3G4`X
M`$Y5__PK;0`(__P@;?_\2A!G&A`0`D``_S\`3KH`&%1/(&W__!"`4JW__&#>/
M("T`"$Y=3G4P+P`$#```86T*#```>FX$!```($YU``!.5?_Z/RT`"$ZZ^.94S
M3RM`__I*@&8$</]@1B!M__H(*``#``%G$'`"/P!"IS\M``A.NOFB4$\_+0`.W
M+RT`"B!M__HO*``"3KH)8$_O``H[0/_^2FP`&&<$</]@!#`M__Y.74YU``+MY
M8```<&%.5?_R2.<!,"1M``@,;``@!'AL``"0$A(,`0`@9PP,`0`)9P8,`0`*L
M9@12BF#H2A)G<C`L!'CE0%)L!'A![`1^T,`K2/_\#!(`(F8H4HH@BDH29PH,4
M$@`B9P12BF#R2A)F#'`!/P!.N@@T5$]@GD(24HI@F"!M__P@BDH29Q@2$@P!6
M`"!G$`P!``EG"@P!``IG!%**8.1*$F8"8`A"$E**8`#_:DIL!'AF!B!L`$A@W
M!$'L!'XI2`1Z2FP$>&8``(9![`*T(DA'[`3^)MDFV2;9)MDVD29L`$@B:P`D0
M<"@_`"\I``1(;`3^3KK]_D_O``I![`3^(@@D/````^XL;`+H3J[_XBE`!3H@%
M+`4Z*4`%0'($.4$%/BE`!48Y005$Y8`K0/_RD\DL>``$3J[^VBM`__8@;?_RZ
M(FW_]B-H``@`I'X`8#(L;`+H3J[_RBE`!3HL;`+H3J[_Q"E`!4!![`+&(@@DL
M/````^TL;`+H3J[_XBE`!49^!"`'(`<`0(`!@6P%."`'(`<`0(`"@6P%/@!LF
M@`,%1$IL`FAG!'``8`0P/(``+@!";`*`(`<@!P!```$Y0`)^.7P``0*8(`<@4
M!P!```(Y0`*6.7P``@*P(`<@!P!``(`Y0`*N0?H(;BE(`#`O+`1Z/RP$>$ZZ4
M`")<3T)G3KKV]E1/3-\,@$Y=3G4``&EB`'1E;7!F:6(`94[Y`````&YG`&MIY
M;&QP='(`='!A3E7_T$CG("!P`!M\`"#_^W(`.T'_^#M\____]D'M_]@;0/_U8
M&T#__!M`__T;0/_^&T#__SM!_^P[0?_N*TC_U"!M``A*$&=4$!`"0`#_<AA=F
M06M(L'L0"&;V3OL0!``C8```+``@8```'@`K8```$``M8````AM\``'__V`8U
M&WP``?_^8!`;?``!__U@"!M\``'__$YQ4JT`"&"D(&T`"!(0#`$`,&8*&WP`9
M,/_[4JT`""!M``@,$``J9A(B;0`,(%%4D3M0__A2K0`(8!9(;?_X+PA.NOGR*
M4$\@;0`(T,`K2``((&T`"!(0#`$`+F8V4JT`""!M``@,$``J9A(B;0`,(%%4'
MD3M0__92K0`(8!9(;?_V+PA.NOFP4$\@;0`(T,`K2``((&T`"!(0#`$`;&8,!
M&WP``?_U4JT`"&`*#`$`:&8$4JT`""!M``@0$%*M``@;0/_T`D``_W(P74%K9
M``)\L'L0"&;T3OL0!`!C8``"4@!S8``""@!88``!E@!X8``!D`!P8``!>`!O>
M8``!)`!U8```^`!D8````DHM__5G#")M``P@45B1(!!@#")M``P@4521,!!(`
MP"M`__!*@&H*<@%$K?_P.T'_[DIM_^YG!'`M8`Q*+?_^9P1P*V`"<"`;0/_8*
M$"W__@)``/\R+?_N@D`0+?_]`D``_X)`2D%G"%*M_]12;?_L+RW_\"\M_]1.#
MNOI04$\[0/_22FW_]FH&<`$[0/_V,"W_TC(M__:20#M!_]!*06\T(&W_U")(#
MTL$B`"1(8`(2VE')__P0+?_[`D``_S(M_]`@;?_48`(0P%')__PP+?_V.T#_=
MTM%M_^Q![?_8*TC_U$HM__]G``%B&WP`(/_[8``!6$HM__5G#")M``P@45B1"
M(!!@#")M``P@4521<``P$"M`__!@`/]:2BW_]6<,(FT`#"!16)$@$&`,(FT`.
M#"!15)%P`#`0*T#_\$HM__QG$B!M_]00O``P4JW_U#M\``'_["\`+RW_U$ZZ.
M^/!03SM`_])@`/\>&WP`,/_[2FW_]FH&.WP`"/_V2BW_]6<,(FT`#"!16)$@4
M$&`,(FT`#"!15)%P`#`0*T#_\$HM__QG'B!M_]00O``P4JW_U"!M_]00O`!X`
M4JW_U#M\``+_["\`+RW_U$ZZ^`103SM`_](,+0!8__1F`/ZL2&W_V$ZZ^;!8L
M3V``_IXB;0`,(%%8D2)0*TG_U++\``!F"$'L`LPK2/_4(&W_U$H89OQ3B)'M3
M_]0[2/_L2FW_]FLN,BW_]K#!;R8[0?_L8"`[?``!_^PB;0`,(%%4D3`0&T#_U
MV$(M_]E@!G``8```L#(M_^PT+?_XM$%L"'``.T#_^&`$DVW_^$HM__]G1E-MO
M_^PP+?_L2D!K&B!M_]00$`)``/]2K?_4/P`@;0`03I!43V#:4VW_^#`M__A*!
M0&M:$"W_^P)``/\_`"!M`!!.D%1/8.!3;?_X,"W_^$I`:Q00+?_[`D``_S\`E
M(&T`$$Z05$]@X%-M_^PP+?_L2D!K&B!M_]00$`)``/]2K?_4/P`@;0`03I!4!
M3V#:("T`"$S?!`1.74YU3E7_]BMM`!#_]B!M``P0$%*M``P;0/__2@!G>@P`(
M`"5F,"!M``P,$``E9@92K0`,8"`O+0`(2&W_]B\(80#[*D_O``PK0/_Z2H!GV
M!BM```Q@N$IL`#1G*`@M``?__V<@$"W__P)``/\_`"!M``A.D%1/(&T`#!`09
M4JT`#!M`__\0+?__`D``_S\`(&T`"$Z05$]@`/]V3EU.=0```>P`!AR&<&%*H
M@&H``!Y$@$J!:@``#$2!80``($2!3G5A```81(!$@4YU2H%J```,1(%A```&-
M1(!.=2\"2$$T`68``")(0$A!2$(T`&<```:$P3`"2$`T`(3!,`)(0C(")!].S
M=2\#=A`,00"`9```!N&944,,00@`9```!NF964,,02``9```!N6954-*06L`R
M``;CF5-#-`#FJ$A"0D+FJDA#@,$V`#`"-`-(0<3!D()D```(4T/0@63^<@`R<
M`TA#Y[A(0,-`)A\D'TYU+GD```!,3KD``!1P+SP````43KD```)P($(B0R0`D
M)@%(0DA#Q,'&P,#!U$-(0D)"T((F"20(3G4@;P`((F\`!#`O``QO&+/(91#0[
MP-+`4T`3(%'(__Q@!A+84<C_]"`O``1.=2!O``@B;P`$2AEF_%.)$MAF_"`O&
M``1.=4Y5__I(YP$@?@!%[`4XOFP"Y&P>2E)G%`@J``(``6<"8`HO*@`"3KH!\
M9%A/4D=<BF#<,"T`"$C`+RT`"B\`3KKNRE!/3-\$@$Y=3G5.5?_\<``B/```P
M,``L>``$3J[^S@*````P`"M`__Q*@&8$<`!@)$JL`#!G&B!L`#!.D$I`9@1P%
M`&`00F=P%#\`3KK_<EA/("W__$Y=3G5AL$YU``!.5?_X2.<!`$JL`#!G!$ZZI
M_YQ";``8,"T`$$C`+T``!"(M``@D+0`,)B\`!"QL`NA.KO_0+@`,A_____]F&
M$BQL`NA.KO]\.4``&#E\``4"4"`'3-\`@$Y=3G4``$Y5__A(YS$"2JP`,&<$U
M3KK_0$)L`!AP`#`M`!!3@"]``!`B+0`()"T`#"8O`!`L;`+H3J[_OBX`#(?_0
M____9A(L;`+H3J[_?#E``!@Y?``6`E`P+0`0#$```F<:#$```6<*2D!F(B`MU
M``Q@'"`'(`?0K0`,8!(B+0`(=`!V`"QL`NA.KO^^3G%,WT",3EU.=4Y5``!*>
MK``P9P1.NOZT(BT`""QL`NA.KO_<<`!.74YU3E7_L$CG``)*N0```NQF%D/Y[
M```#>'``+'@`!$ZN_=@CP````NP@>0```%12B'``(GD```!4$!$O`"\(2&W_6
ML$ZZ_<Y/[P`,('D```!4$!`"0`#_0C4`L$'M_[`CR````SA(>``\2'@`^G``K
M+P`O`$AY```#9$AY```#2DAY```#+"\`3KKM@D_O`"!3@&<$</]@`G``3-]`R
M`$Y=3G4``$Y5_[!(YP`"2KD```+L9A9#^0```^1P`"QX``1.KOW8(\````+L[
M('D```!44HAP`")Y````5!`1+P`O"$AM_[!.NOTN3^\`#"!Y````5!`0`D``=
M_T(U`+!![?^P(\@```.82'@`*$AX`/IP`"\`+P!(>0```]`O`$AY```#MB\`E
M3KKLYD_O`"!P%#\`3KK])E1/3-]``$Y=3G4``````^P````"````````$;P`@
M`!&P`````0````$```N6````%P````(``!2Z```4H@``%)@``!22```4>@``A
M%.H``!3B```4S@``%((``!0:```4`@``$_@``!/R```3V@``%$X``!1(```4_
M0@``%"X``!/B```1J@```=X```$2````#@````````/R```#Z0```15.5?^>K
M2.<@(K_L``1E``0N0BW_IT)M_YX,;0`"``AL/$AL`&AA``/&6$](;`!^80`#&
MO%A/2&P`IF$``[)83TAL`-!A``.H6$](;`$"80`#GEA/2'@`%$ZZ`_!83R`\C
M```!$"(\``$``2QX``1.KO\Z*T#__$J`9A1![`$P(DA%[?^G%-EF_#M\``'_>
MGB)M``H@:0`$(DA%[`/X%-EF_$IM_YYF1D'L`_@B"'3^+&P"Z$ZN_ZP@;?_\>
M(4`!#"!M__Q*J`$,9B0L;`+H3J[_?"\`2&P#^$AL`5)(;?^G3KH#<$_O`!!PQ
M`3M`_YY*;?^>9C8@;?_\(B@!#"0(+&P"Z$ZN_YI*0&8@+&P"Z$ZN_WPO`$AL7
M`71(;?^G3KH#-$_O``QP`3M`_YY*;?^>9EH@;?_\(B@`>$J!:A)(;`&:80`"Y
MKEA/.WP``?^>8#Q*+`/X9S9![`/X(DA*&6;\4XF3R"`)0>P#]]#`$!`;0/^A=
M#```.F<4#```+V<.2&P!RDAL`_A.N@+`4$]*;?^>9C8@;?_\(B@!#"0(+&P"=
MZ$ZN_Y1*0&8@+&P"Z$ZN_WPO`$AL`<Q(;?^G3KH"F$_O``P[?``!_YY*;?^>@
M9@`!U"!M__PB*`!X2H%O``$6(DA0B2\)2&P#^$ZZ`EY03TAL`>Q(;`/X3KH"A
M4%!/(&W__$JH`0AF0"`\```!$"(\``$``2QX``1.KO\Z(&W__"%``0A*@&84X
M2&P![DAM_Z=.N@(D4$]P`3M`_YXB;?_\(&D!""%)`01*;?^>9@H@;?_\*V@!_
M"/_\(&W__$JH`0QG#"(H`0PL;`+H3J[_ID'L`_@B"'3^+&P"Z$ZN_ZP@;?_\L
M(4`!#"!M__Q*J`$,9B8L;`+H3J[_?"\`2&P#^$AL`@Q(;?^G3KH!KD_O`!!PJ
M`3M`_YY@8$IM_YYF6B(H`0PD""QL`NA.KO^:2D!F2"QL`NA.KO]\+P!(;`/X6
M2&P"+DAM_Z=.N@%P3^\`$#M\``'_GF`B2&P#^&$``/I83R!M__Q0B"\(80``&
M[%A/2&P"3F$``.)83R!M__PB*`$,)`@L;`+H3J[_E$C`2H!F`/Z<2FW_GF8`I
M_I0@;?_\(B@!#"QL`NA.KO^F<``@;?_\(4`!#$JH`01F"CM\``'_GF``_FHKI
M:`$$__Q![`/X(DA*&6;\4XF3R"`)T,!7B"M(_Z(@;?^B$A`,`0`O9PP,`0`ZH
M9P93K?^B8.@@;?^B0B@``6``_W0@;?_\2J@!"&<(*V@!"/_\8.Y*K?_\9R(@T
M;?_\*V@!!/_X(D@@/````1`L>``$3J[_+BMM__C__&#82BW_IV<(2&W_IV$*S
M6$],WT0$3EU.=4Y5__A(YS`"O^P`!&4``$(@;0`(2A!G,"QL`NA.KO_$(&T`M
M"$H89OQ3B)'M``@B"$C!+T$`$"(`)"T`""8O`!`L;`+H3J[_T$S?0`Q.74YUR
M3OD``!&H3OD``!(,3OD```)P3OD```8^```#[`````0````````$1```!%``X
M``1*```$/@````````/R```#Z@```/X`````````````````````````````P
M`````````````````````````````````````````````````````````````
M`````````````````````````````````&1O<RYL:6)R87)Y`$9N86US(#(N>
M,"`M(#@X,#4S,`H*``!&;F%M<R`@("`@("`@("`M(&1I<W!L87D@=&AI<R!M&
M97-S86=E+@H`1FYA;7,@(B(@("`@("`@+2!L:7-T(&-U<G)E;G0@9&ER96-TP
M;W)Y+@H`1FYA;7,@/'9O;'5M93X@+2!L:7-T('1H92!C;VYT96YT<R!O9B`\B
M=F]L=6UE/BX*``!&;F%M<R`\9&ER/B`@("`M(&QI<W0@=&AE(&-O;G1E;G1S4
M(&]F(#QD:7(^+@H`3F\@;65M;W)Y(&9O<B!R;V]T($9I;&5);F9O0FQO8VLA_
M`"$A(2!5;F%B;&4@=&\@;&]C:R`E<RP@97)R;W(@)6QD"@`A(2$@26YI=&EA4
M;"!%>&%M:6YE(&-A;&P@9F%I;&5D.B`E;&0*`%!A=&AN86UE(&%R9W5M96YT>
M(&UU<W0@8F4@=F]L=6UE(&]R(&1I<F5C=&]R>2$*`"\`(2$A($EN:71I86P@%
M17A.97AT(&9A:6QE9#H@)6QD"@`O`"$A(2!.;R!M96UO<GD@9F]R(&9I;&4@I
M:6YF;R$*`"$A(2!5;F%B;&4@=&\@;&]C:R`E<RP@97)R;W(@)6QD"@`A(2$@-
M17AA;6EN92!E<G)O<B!O;B`E<R`M("5L9`H```H``````#`Q,C,T-38W.#EAJ
M8F-D968`````@````````H0``````````````````````````````IP`````8
M`````````````````````````````````````````````````````&-O;CHQK
M,"\Q,"\S,C`O.#`O`"H````````````````````````````````````````H<
M````````````````````````!````"HJ(%5S97(@06)O<G0@4F5Q=65S=&5D!
M("HJ``#__P````X`#@````````+\`````/__````!``$``````````````,8M
M0T].5$E.544``/__````!``$`````````T``````04)/4E0`__\````$``0`L
M```````#7@````!I;G1U:71I;VXN;&EB<F%R>0```/__````#@`.````````!
M````````*BH@4W1A8VL@3W9E<F9L;W<@*BH``/__````!``$`````````Z``[
M``.,15A)5```__\````$``0````````#R@````!I;G1U:71I;VXN;&EB<F%RI
M>0```````^P````)`````@```]P```/&```#P@```W````-6```#/````R0`2
/``*$```";`````````/RI
``
end
size 7800
SHAR_EOF
#       End of shell archive
exit 0


-- 
< Mark R. Rinfret,  mrr@amanpt1.ZONE1.COM | ...rayssd!galaxia!amanpt1!mrr    >
< AMA / HyperView Systems               Home: 401-846-7639                   >
< 28 Jacome Way                         Work: 401-849-9930 x301              >
< Middletown, RI 02840          	"If I just had a little more time...">