[comp.sources.amiga] v89i001: exdoc - extract docs from C code

page@swan.ulowell.edu (Bob Page) (01/11/89)

Submitted-by: oscvax!jan@uunet.UU.NET (Jan Sven Trabandt)
Posting-number: Volume 89, Issue 1
Archive-name: langauges/exdoc.1

[uuencoded binary included.  ..Bob]

#	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:
#	exdoc.c
#	exdoc.uu
# This archive created: Tue Jan 10 18:15:17 1989
cat << \SHAR_EOF > exdoc.c
/*
 *  exdoc.c V1.0  (C)Copyright 1988, Jan Sven Trabandt. All Rights Reserved.
 *  This software may not be distributed for profit; in other words, it is
 *  freely redistributable except that it may not be incorporated as part of any
 *  commercial software package without my express written consent.
 *  Portions of this code are (C)Copyright 1988, Matthew Dillon.
 *
 *  extract documentation that is in the canonical form from a [.c] file,
 *  putting it to stdout.
 *  it requires about 1K stack to run.
 *  can someone tell me exactly why it isn't pure (1.3 pure bit/resident)???
 *  uucp: {utgpu,utzoo,lsuc}!oscvax!jan
 *
 *  look at this comment as an example;
 *  note that the start of the comment block has 2 characters followed by a '\n'
 *	(the start-C-comment)
 *  and the last line has 3 characters followed by a '\n'
 *	(a space and the end-C-comment)
 *  what comes inbetween these 2 lines can be in any form
 */
#include <stdio.h>
#include <ctype.h>
#ifdef MCH_AMIGA
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <functions.h>
#endif MCH_AMIGA

#ifndef MCH_AMIGA
#ifndef NODATE
#define NODATE
#endif
#endif !MCH_AMIGA

#define VERSION     "1.0"

/* flags */
#define IN_COMMENT  ((char)(1 << 0))        /* inside a "valid" comment */
#define REVERSE     ((char)(1 << 1))
#define PRINTIT     ((char)(1 << 7))

#define MAX_LINESIZE	514

/* flags for copystuff */
#define COPY_DATE   ((char)(1 << 0))
#define COPY_COMM   ((char)(1 << 1))
#define COPY_PROT   ((char)(1 << 2))


#ifdef MCH_AMIGA
typedef struct FileInfoBlock FIB;
FIB *getFileInfo();

extern void *malloc();

#ifdef AZTEC_C
#define strcpy	_BUILTIN_strcpy
#define strcmp	_BUILTIN_strcmp
#define strlen	_BUILTIN_strlen
#endif AZTEC_C
#endif MCH_AMIGA


help( argc, argv )
    int argc;
    char **argv;
{
    fprintf(stderr,
	    "Usage: %s [infile] [-o outfile]"
#ifndef NODATE
	    " [-cdp]"
#endif !NODATE
	    " [-i<n>] [-r] [-qh?]\n"
	    "       V%s ... file and flags can appear in any order:\n"
	    "    infile     : input file (default: stdin)\n"
	    "    -o outfile : output file (default: stdout)\n"
#ifndef NODATE
	    "    -c         : copy file comment (must give in/out files)\n"
	    "    -d         : copy datestamp (must give infile & outfile)\n"
	    "    -p         : copy protection bits (must give in/out files)\n"
#endif !NODATE
	    "    -i<n>      : ignore <n> comment blocks\n"
	    "    -r         : reverse (everything but comment blocks)\n"
	    "                   in this case ignore# is how many to keep\n"
	    "    -q         : quiet (suppress warning messages)\n"
	    "    -h, -?     : help (this information)\n\n",
	    argv[0], VERSION);
    exit( (int) 0 );
} /* help */


main( argc, argv )
    int argc;
    char **argv;
{
    FILE    *fpin, *fpout;
    char    *infname = NULL, *outfname = NULL;
    char    *temp;
    register short  i;
    short   state = 0;
    char    copystuff = 0, quiet = 0;
    char    s[MAX_LINESIZE];
    register char   flags = 0;
    char    dummy = '\0';

    for( i = 1; i < argc; ++i ) {
	temp = argv[i];
	if( *temp++ == '-' ) {                  /* parse flags */
	    while( *temp ) {
		switch( tolower(*temp++) ) {
		  case 'i':
		    /* this way allows while loop to stop properly */
		    if( !*temp ) {                  /* if "-i <nnn>" */
			state = atoi( argv[++i] );  /* use next arg */
		    } else {
			state = atoi( temp );       /* #comments to skip/keep */
			temp = &dummy;
		    }
		    break;
		  case 'r':
		    flags |= REVERSE | PRINTIT;
		    break;
		  case 'o':
		    /* this way allows while loop to stop properly */
		    if( !*temp ) {                  /* if "-o outfile" */
			outfname = argv[++i];	    /* use next arg */
		    } else {
			outfname = temp;	    /* outfile name */
			temp = &dummy;
		    }
		    break;
#ifndef NODATE
		  case 'c':
		    copystuff |= COPY_COMM;
		    break;
		  case 'd':
		    copystuff |= COPY_DATE;
		    break;
		  case 'p':
		    copystuff |= COPY_PROT;
		    break;
#endif !NODATE
		  case 'q':
		    quiet = 1;
		    break;
		  case 'h':
		  case '?':
		    help( argc, argv );
		    break;
		  default:
		    fprintf(stderr, "unknown flag '%c' ignored\n", *(temp - 1));
		    break;
		} /* switch */
	    } /* while */
	} else {
	    if( infname ) {             /* error: too many filenames */
		help( argc, argv );
	    } else {
		infname = argv[i];
	    }
	}
    } /* for */

#ifndef NODATE
    if( !infname || !outfname ) {   /* need both i/o filenames to copy stuff */
	copystuff = 0;
    }
#endif !NODATE
    if( !infname ) {
	fpin = stdin;
	if( !outfname && !quiet ) {
	    fprintf(stderr, "%s from stdin to stdout (c-\\ is EOF)\n", argv[0]);
	}
    } else {
	if( !(fpin = fopen(infname, "r")) ) {
	    if( !quiet ) {
		fprintf(stderr, "Error, can't open file '%s' for input\n",
			    infname);
	    }
	    exit( (int) 1000 );
	}
    }
    if( !outfname ) {
	fpout = stdout;
    } else if( !(fpout = fopen(outfname, "w")) ) {
	if( !quiet ) {
	    fprintf(stderr, "Error, can't open file '%s' for output\n",
			outfname);
	}
	exit( (int) 1000 );
    }

    if( flags & REVERSE ) {
	state = -state; 	/* negative #ignore meanse #keep */
    }
    /* print comment block if state is negative
     * state is initialized to the number of comment blocks to skip
     */
    while( fgets(s, MAX_LINESIZE, fpin) ) {
	/* if start of valid comment (and not nested) */
	if( !strcmp(s, "/*\n") && !(flags & IN_COMMENT) ) {
	    flags |= IN_COMMENT;
	    if( !(flags & REVERSE) ) {  /* if not reverse, ie. state is #skip */
		--state;		/* one less to skip */
	    }
	    if( state < 0 ) {
		flags |= PRINTIT;
	    } else {
		flags &= ~PRINTIT;
	    }
	/* if end of valid comment (and we had start of comment) */
	} else if( !strcmp(s, " */\n") && (flags & IN_COMMENT) ) {
	    if( state < 0 ) {
		++state;
	    }
	    if( flags & PRINTIT ) {
		fprintf(fpout, "%s\n", s);
	    }
	    if( flags & REVERSE ) {
		flags |= PRINTIT;
	    } else {
		flags &= ~PRINTIT;
	    }
	    flags &= ~IN_COMMENT;
	    continue;
	}

	if( flags & PRINTIT ) {
	    fprintf(fpout, "%s", s);
	}
    } /* while */

    if( fpout != stdout ) {
	fclose( fpout );
    }

#ifndef NODATE
    if( copystuff ) {               /* need to copy file datestamp/comm/prot */
	FIB	*fib;
	long	lock;

	if( !(fib = getFileInfo(infname, &lock)) ) {
	    if( !quiet ) {
		fprintf(stderr, "couldn't get file info for input file '%s'\n",
			    infname);
	    }
	} else {
	    if( copystuff & COPY_DATE ) {
		setfiledate( outfname, &fib->fib_Date );
	    }
	    if( copystuff & COPY_PROT ) {
		SetProtection( outfname, fib->fib_Protection );
	    }
	    if( copystuff & COPY_COMM ) {
		SetComment( outfname, fib->fib_Comment );
	    }
	    freeFileInfo( fib, lock );
	}
    }
#endif !NODATE

    if( fpin != stdin ) {
	fclose( fpin );
    }
} /* main */


#ifdef MCH_AMIGA
#ifndef NODATE
/* The following routines (C)Copyright 1988, Matt Dillon,
 * from his backup program and support library (sup32.lib).
 * Permission was granted to use them in this program.
 */

FIB *
getFileInfo(path, plock)
char *path;
long *plock;
{
    register long lock;
    register FIB *fib;

    *plock = NULL;
    if (lock = (long) Lock(path, SHARED_LOCK)) {
	if (fib = malloc(sizeof(FIB))) {        /* longword align FIB */
	    if (Examine(lock, fib)) {
		*plock = lock;
		return(fib);
	    }
	    free(fib);
	}
	UnLock(lock);
    }
    return(NULL);
}


freeFileInfo(fib, lock)
FIB *fib;
long lock;
{
    if (fib)
	free(fib);
    if (lock)
	UnLock(lock);
}



/*
 *  SETFILEDATE.C
 *
 *  BOOL = setfiledate(filename, date)
 */

#define BTOC(bptr)    ((long)(bptr) << 2)
#define CTOB(cptr)    ((long)(cptr) >> 2)

#ifndef ACTION_SET_DATE
#define ACTION_SET_DATE 34
#endif

typedef struct Task	      TASK;
typedef struct Process	      PROC;
typedef struct StandardPacket STDPKT;
typedef struct MsgPort	      MSGPORT;
typedef struct FileLock       LOCK;
typedef struct DateStamp      DATESTAMP;


extern TASK *FindTask();
extern void *AllocMem();

setfiledate(file, date)
char *file;
DATESTAMP *date;
{
    register STDPKT *packet;
    register char   *buf;
    register PROC   *proc;
    long	result;
    long	lock;

    {
	register long flock = (long) Lock(file, SHARED_LOCK);
	register short i;
	register char *ptr = file;

	if (flock == NULL)
	    return(NULL);
	lock = (long) ParentDir(flock);
	UnLock(flock);
	if (!lock)
	    return(NULL);
	for (i = strlen(ptr) - 1; i >= 0; --i) {
	    if (ptr[i] == '/' || ptr[i] == ':')
		break;
	}
	file += i + 1;
    }
    proc   = (PROC *)FindTask(NULL);
    packet = (STDPKT *)AllocMem((long)sizeof(STDPKT), MEMF_CLEAR|MEMF_PUBLIC);
    buf = AllocMem((long)strlen(file)+2, MEMF_PUBLIC);
    strcpy(buf+1,file);
    buf[0] = strlen(file);

    packet->sp_Msg.mn_Node.ln_Name = (char *)&(packet->sp_Pkt);
    packet->sp_Pkt.dp_Link = &packet->sp_Msg;
    packet->sp_Pkt.dp_Port = &proc->pr_MsgPort;
    packet->sp_Pkt.dp_Type = ACTION_SET_DATE;
    packet->sp_Pkt.dp_Arg1 = NULL;
    packet->sp_Pkt.dp_Arg2 = (long)lock;       /* lock on parent dir of file  */
    packet->sp_Pkt.dp_Arg3 = (long)CTOB(buf);  /* BPTR to BSTR of file name   */
    packet->sp_Pkt.dp_Arg4 = (long)date;       /* APTR to datestamp structure */
    PutMsg(((LOCK *)BTOC(lock))->fl_Task, packet);
    WaitPort(&proc->pr_MsgPort);
    GetMsg(&proc->pr_MsgPort);
    result = packet->sp_Pkt.dp_Res1;
    FreeMem(packet, (long)sizeof(STDPKT));
    FreeMem(buf, (long)strlen(file)+2);
    UnLock(lock);
    return(result);
}

#endif !NODATE
#endif MCH_AMIGA
SHAR_EOF
cat << \SHAR_EOF > exdoc.uu

begin 600 exdoc
M```#\P`````````#``````````(```?2````N`````$```/I```'TD[Z#FI.@
M50``2'H"LR!M``HO$$AZ`!I(;(#X3KH,.$_O`!!"9TZZ&]I43TY=3G55<V%G+
M93H@)7,@6VEN9FEL95T@6RUO(&]U=&9I;&5=(%LM8V1P72!;+6D\;CY=(%LML
M<ET@6RUQ:#]="B`@("`@("!6)7,@+BXN(&9I;&4@86YD(&9L86=S(&-A;B!A!
M<'!E87(@:6X@86YY(&]R9&5R.@H@("`@:6YF:6QE("`@("`Z(&EN<'5T(&9I'
M;&4@*&1E9F%U;'0Z('-T9&EN*0H@("`@+6\@;W5T9FEL92`Z(&]U='!U="!F2
M:6QE("AD969A=6QT.B!S=&1O=70I"B`@("`M8R`@("`@("`@(#H@8V]P>2!FB
M:6QE(&-O;6UE;G0@*&UU<W0@9VEV92!I;B]O=70@9FEL97,I"B`@("`M9"`@>
M("`@("`@(#H@8V]P>2!D871E<W1A;7`@*&UU<W0@9VEV92!I;F9I;&4@)B!O@
M=71F:6QE*0H@("`@+7`@("`@("`@("`Z(&-O<'D@<')O=&5C=&EO;B!B:71S'
M("AM=7-T(&=I=F4@:6XO;W5T(&9I;&5S*0H@("`@+6D\;CX@("`@("`Z(&EGH
M;F]R92`\;CX@8V]M;65N="!B;&]C:W,*("`@("UR("`@("`@("`@.B!R979E"
M<G-E("AE=F5R>71H:6YG(&)U="!C;VUM96YT(&)L;V-K<RD*("`@("`@("`@&
M("`@("`@("`@(&EN('1H:7,@8V%S92!I9VYO<F4C(&ES(&AO=R!M86YY('1OT
M(&ME97`*("`@("UQ("`@("`@("`@.B!Q=6EE="`H<W5P<')E<W,@;7-G(&EFR
M('!I<&EN9R!S=&1I;BT^<W1D;W5T*0H@("`@+6@L("T_("`@("`Z(&AE;'`@Z
M*'1H:7,@:6YF;W)M871I;VXI"@H`,2XP``!.5?W<2.<,`$*M__1"K?_P0FW_7
MZD(M_^E"+?_H>@!"+?WE>`%@``%J,`1(P.6`(&T`"BMP"`#_["!M_^Q2K?_L.
M#!``+68``2(@;?_L2A!G``$6(&W_[%*M_^P0$$B`/P!.N@;T5$](P&```,0@<
M;?_L2A!F'%)$,`1(P.6`(&T`"B\P"`!.N@9&6$\[0/_J8!8O+?_L3KH&-EA/P
M.T#_ZD'M_>4K2/_L8```NHH\`()@``"R(&W_[$H09A121#`$2,#E@"!M``HK+
M<`@`__!@#BMM_^S_\$'M_>4K2/_L8```A`CM``'_Z6!Z".T``/_I8'(([0`"W
M_^E@:AM\``'_Z&!B+RT`"C\M``A.NOPX7$]@4B!M_^P0*/__2(`_`$AZ`M!(W
M;(#X3KH(;$_O``I@-)"\````/V?*D+P````D9Z)3@&>F68!GNE.`9P#_(EV`#
M9P#_8E.`9YI3@&>>4X!G`/],8*Y@`/[D8"9*K?_T9Q`O+0`*/RT`"$ZZ^\I<S
M3V`0,`1(P.6`(&T`"BMP"`#_]%)$N&T`"&T`_I)*K?_T9P9*K?_P9@1"+?_I+
M2JW_]&8L0>R`S"M(__Q*K?_P9AQ*+?_H9A8@;0`*+Q!(>@(_2&R`^$ZZ!\!/(
M[P`,8#)(>@)3+RW_]$ZZ!PQ03RM`__QF'B\M__1(>@(]2&R`^$ZZ!Y9/[P`,"
M/SP#Z$ZZ%S943TJM__!F"D'L@.(K2/_X8#)(>@(Z+RW_\$ZZ!LI03RM`__AF'
M'B\M__!(>@(D2&R`^$ZZ!U1/[P`,/SP#Z$ZZ%O143P@%``%G!$1M_^HO+?_\O
M/SP"`DAM_>9.N@4(3^\`"DJ`9P``O$'M_>9#^@(*$!BP&68$2@!F]I`A2(!F;
M)@@%``!F(`C%```(!0`!9@13;?_J2FW_ZFP&BCP`@&`$RCP`?V!<0>W]YD/ZR
M`=`0&+`99@1*`&;VD"%(@&9$"`4``&<^2FW_ZFP$4FW_ZA`%P#P`@&<42&W]=
MYDAZ`:4O+?_X3KH&I$_O``P(!0`!9P:*/`"`8`3*/`!_"(4``&``_TX0!<`\2
M`(!G%$AM_>9(>@%U+RW_^$ZZ!G!/[P`,8`#_+D'L@.(B;?_XL\AG"B\M__A.5
MNA'>6$]*+?_I9P``B$AM_=PO+?_T3KH!:E!/*T#]X&86+RW_]$AZ`2Y(;(#X]
M3KH&)D_O``Q@7`@M``#_Z6<2(&W]X$AH`(0O+?_P3KH!OE!/""T``O_I9Q(@7
M;?W@+R@`="\M__!.NA?04$\(+0`!_^EG$B!M_>!(:`"0+RW_\$ZZ%ZA03R\M\
M_=PO+?W@3KH!5%!/0>R`S")M__RSR&<*+RW__$ZZ$3I83TS?`#!.74YU=6YKE
M;F]W;B!F;&%G("<E8R<@:6=N;W)E9`H`)7,@9G)O;2!S=&1I;B!T;R!S=&1O/
M=70@*&,M7"!I<R!%3T8I"@!R`$5R<F]R+"!C86XG="!O<&5N(&9I;&4@)R5S,
M)R!F;W(@:6YP=70*`'<`17)R;W(L(&-A;B=T(&]P96X@9FEL92`G)7,G(&9O/
M<B!O=71P=70*`"\J"@`@*B\*`"5S"@`E<P!C;W5L9&XG="!G970@9FEL92!IV
M;F9O(&9O<B!I;G!U="!F:6QE("<E<R<*`$Y5``!(YP@@(&T`#$*02'C__B\M(
M``A.NA9`4$\H`&<^/SP!!$ZZ$J943R1`2H!G)B\*+P1.NA7T4$]*0&<0(&T`:
M#""$(`I,WP003EU.=2\*3KH2CEA/+P1.NA9J6$]P`&#D3E4``$JM``AG"B\M4
M``A.NA)N6$]*K0`,9PHO+0`,3KH60EA/3EU.=4Y5__A(YP\P2'C__B\M``A._
MNA6\4$\J`"XM``A*A68*<`!,WPSP3EU.=2\%3KH5R%A/*T#_^"\%3KH6`%A/6
M2JW_^&8$<`!@VB!'(`A*&&;\D<!3B#P(4T9@%B!'##``+V``9Q`@1PPP`#I@Z
M`&<&4T9*1FSF,`920$C`T:T`"$*G3KH6$%A/*`!(>0`!``%(>`!$3KH5[%!/3
M)$!(>``!(&T`""`(2AAF_)'`4X@P"$C`5(`O`$ZZ%<I03R9`($M2B")M``@0M
MV6;\(&T`""`(2AAF_)'`4X@P"!:`($K1_````!0E2``*)4H`%"!$T?P```!<(
M)4@`&"5\````(@`<0JH`*"5M__@`+"`+Y(`E0``P)6T`#``T+PH@+?_XY8`@E
M0"\H``Q.NA6X4$\@1$AH`%Q.NA746$\@1$AH`%Q.NA6`6$\K:@`@__Q(>`!$'
M+PI.NA5:4$\@;0`((`A*&&;\D<!3B#`(2,!4@"\`+PM.NA4\4$\O+?_X3KH4@
MPEA/("W__&``_J!.50``2.<,("1M``@,$@`@9P8,$@`)9@12BF#P>@`,$@`MS
M9@9Z`5**8`@,$@`K9@)2BG@`8!8@2E**$!!(@#($POP`"M!!.`"8?``P$!)()
M@%)`0>R`2@@P``(``&;82D5G!C`$1$!@`C`$3-\$,$Y=3G5P`!`O``6P/`!@8
M8PJP/`!Z8@20/``@3G5P`!`O``6P/`!`8PJP/`!:8@30/``@3G5.50``2.<(J
M("1M``A3;0`,2FT`#&\@+RT`#DZZ`#@X`+!\__]83V<.($I2BA"$N'P`"F<"`
M8-9"$KA\__]F$+7M``AF"G``3-\$$$Y=3G4@+0`(8/).50``2.<(("1M``@O2
M"DZZ`#(X`+!\__]83V<B,`1(P&`44Y((Z@`#``QP_TS?!!!.74YU8-9*@&?ZI
M68!GY#`$8.I.50``+PHD;0`((%*QZ@`$90PO"F$66$\D7TY=3G4@4E*2$!!(?
M@,!\`/]@[$Y5``!(YP@P)&T`"!`J``S`/``89PIP_TS?#!!.74YU"*H``@`,9
M2JH`"&8(+PI.N@Y:6$\0*@`,2(`(```'9S!![(#,)D@0*P`,2(#`?`"$L'P`0
MA&8,/SS__R\+3KH-$EQ/U_P````60>R"A+?(9=8_*@`0+RH`"!`J``U(@#\`Y
M3KH"=C@`2D!03VX42D1F!'`(8`)P$($J``QP_V``_WHP!$C`)*H`"-"J``@EM
M0``$(%)2DA`02(#`?`#_8`#_6DY5```O"DZZ#8HD0$J`9@AP`"1?3EU.=2\*G
M+RT`#"\M``AA!D_O``Q@Z$Y5``!(YP@@+RT`$$ZZ"_1![(`")$A83TH29A`Y_
M?``%@I9P`$S?!!!.74YU($HB;0`,$!BP&68$2@!F]I`A2(!G!%R*8-(_*@`$E
M+RT`"$ZZ`'@X`+!\__]<3V8$<`!@Q"!M`!`11``-(&T`$!%\``$`#"`M`!!@B
MK$Y5```I;0`(@HY(;0`0+RT`#$AZ``Y.N@<(3^\`#$Y=3G5.50``+RR"CC\M#
M``A.N@JT7$].74YU3E4``#\M``P_/`,!+RT`"&$&4$].74YU3E4``$CG#S`D.
M;0`(3KH.]"9L@IAX`&`.,`3!_``&2K,(`&<.4D2X;(*$;>QZ!F```,0(+0`!U
M``QG,$AX__\O"DZZ$/8L`%!/9R`O!DZZ$58O"DZZ$*9*@%!/9@Y.NA#".@"PV
M?`#-9@``C$AX`^TO"DZZ$-0L`$J&4$]F8`@M````#&8$>@%@;$AX`^XO"DZZ5
M$+8L`%!/9@A.NA"&.@!@5$AX`"%(>@"23KH1BBX`4$]G"B\'3KH1)%A/8!Y(!
M>``!2'H`@B\&3KH0Z$AX__]"IR\&3KH0HD_O`!A@)C`M``S`?`4`L'P%`&88]
M+P9.N@_T>@183SE%@I9P_TS?#/!.74YU,`3!_``&)X8(`#`$P?P`!B!`T<LQ/
M;0`,``0(+0`#``QG$$AX``%"IR\&3KH02$_O``PP!&#"9&]S+FQI8G)A<GD``
M``!.50``2.<,(#@M``A.N@VN,`3!_``&)$#5[(*82D1M"KAL@H1L!$J29A`Y.
M?``"@I9P_TS?!#!.74YU,"H`!,!\``.P?``!9@HY?``%@I9P_V#@<``P+0`.H
M+P`O+0`*+Q).N@_`*@"PO/____]/[P`,9@Q.N@]F.4""EG#_8+0@!6"P87!#5
M[(*.1>R"CK7)9@XR/``4:PAT`"+"4<G__"E/@IPL>``$*4Z"H$CG@(`(+@`$1
M`2EG$$OZ``A.KO_B8`9"I_-?3G-#^@`@3J[^:"E`@J1F#"X\``.`!TZN_Y1@0
M!$ZZ`!I03TYU9&]S+FQI8G)A<GD`2?D``'_^3G5.50``+PI(>0`!```P+(*$S
MP?P`!B\`3KH/D"E`@IA03V840J=(>0`!``!.N@]04$\N;(*<3G4@;(*80F@`Q
M!"!L@I@Q?``!`!`@;(*8,7P``0`*(&R"G"`L@IR0J``$4(`I0(*H(&R"J""\+
M34%.6$*G3KH/2"1`2JH`K%A/9RXO+0`,+RT`""\*3KH`KCE\``&"K"!L@I@`!
M:(````0@;(*8`&B````*3^\`#&!"2&H`7$ZZ#WQ(:@!<3KH/+"E`@JX@;(*NW
M2J@`)%!/9Q`@;(*N(F@`)"\13KH-U%A/+RR"KB\*3KH":"EL@JZ"LE!/3KH-)
MYB!L@I@@@$ZZ#A@@;(*8(4``!F<62'@#[4AZ`"I.N@WT(&R"F"%```Q03R\L6
M@K(_+(*V3KKRMD)G3KH+[E!/)%].74YU*@!.50``2.<,,"1M`!`@;0`(2J@`A
MK&<8(&T`""`H`*SE@"@`($0@*``0Y8`F0&`$)FR"AA`32(!(P-"M``Q4@#E`/
M@KA"IS`L@KA(P"\`3KH.(BE`@KI03V8(3-\,,$Y=3G40$TB`.@`_!2!+4H@O,
M""\L@KI.N@%^,`5(P"!`T>R"ND/Z`400V6;\/RT`#B\*+RR"NDZZ`3H@;(*Z>
M0C!0`#E\``&"MC`%2,#0K(*Z)D!2BR1+3^\`%!`32(`Z`+!\`"!G&+I\``EG_
M$KI\``QG#+I\``UG!KI\``IF!%*+8-@,$P`@;7H,$P`B9BY2BR!+4HL0$$B`^
M.@!G'B!*4HH0A;I\`")F$`P3`")F!%*+8`9"*O__8`)@UF`X($M2BQ`02(`Z:
M`&<FNGP`(&<@NGP`"6<:NGP`#&<4NGP`#6<.NGP`"F<(($I2BA"%8,X@2E**=
M0A!*168"4XM2;(*V8`#_6D(20J<P+(*V4D!(P.6`+P!.N@T`*4""LE!/9@A"6
M;(*V8`#^V'H`)FR"NF`D,`5(P.6`(&R"LB&+"``@2R`(2AAF_)'`4X@P"%)`)
M2,#7P%)%NFR"MFW6,`5(P.6`(&R"LD*P"`!@`/Z4(``P/'__8`0P+P`,(&\`-
M!$H89OQ32")O``A30!#95\C__&<"0A`@+P`$3G5,[P,```0@"#(O``Q@`A#9%
M5\G__&<&4D%@`D(84<G__$YU3E4``$CG#C`D;0`(0J=(>@".3KH,DBE`@KY0P
M3V8(3-\,<$Y=3G4@;0`,(F@`)"\I``1.N@S4*`!83V=22'H`;2!$+R@`-DZZ-
M#*8F0$J`4$]G-$AX`^TO"TZZ"UXL`%!/9R0@!N6`*@`@125H``@`I"5&`)Q(O
M>`/M2'H`.$ZZ"SHE0`"@4$\O!$ZZ#')83R\L@KY.N@NT0JR"OEA/8(!I8V]NS
M+FQI8G)A<GD`5TE.1$]7`"H`3E4``$CG""`D;0`.#&T`!``29@@@;0`(*!!@H
M'$IM``QO#"!M``AP`#`0*`!@"B!M``@P$$C`*`!";0`22FT`#&P01&T`#$J$!
M;`A$A#M\``$`$C(M``Q(P2`$3KH#D$'L@#A3BA2P```R+0`,2,$@!$ZZ`X8H0
M`&;:2FT`$F<&4XH4O``M(`I,WP003EU.=4Y5_R)(YP@P)&T`""9M``Q";?_ZR
M*VT`$/_\($M2BQ`02(`X`&<``NZX?``E9@`"S$(M_S`[?``!__@[?``@__8[#
M?"<0__0@2U*+$!!(@#@`L'P`+68.0FW_^"!+4HL0$$B`.`"X?``P9A`[?``PJ
M__8@2U*+$!!(@#@`N'P`*F88(&W__%2M__P[4/_R($M2BQ`02(`X`&`R0FW_A
M\F`<,"W_\L'\``K01)!\`#`[0/_R($M2BQ`02(`X`#`$4D!![(!*"#```@``>
M9M2X?``N9EH@2U*+$!!(@#@`L'P`*F88(&W__%2M__P[4/_T($M2BQ`02(`X"
M`&`R0FW_]&`<,"W_],'\``K01)!\`#`[0/_T($M2BQ`02(`X`#`$4D!![(!*J
M"#```@``9M0[?``"__"X?`!L9A(@2U*+$!!(@#@`.WP`!/_P8!"X?`!H9@H@B
M2U*+$!!(@#@`,`1(P&!Z.WP`"/_N8!8[?``*_^Y@#CM\`!#_[F`&.WS_]O_N/
M/RW_\$AM_S`_+?_N+RW__$ZZ_>0K0/_J,"W_\$C`T:W__$_O``Q@7"!M__Q8?
MK?_\(E`K2?_J(`E*&6;\D\!3B3M)__!@2B!M__Q4K?_\.!!![?\O*TC_ZA"$)
M8"B0O````&-GXE.`9Y*0O`````MG`/]R68!GLE6`9P#_<%>`9P#_<F#,0>W_@
M,)'M_^H[2/_P,"W_\+!M__1O!CMM__3_\$IM__AG:"!M_^H,$``M9PH@;?_J'
M#!``*V8N#&T`,/_V9B93;?_R(&W_ZE*M_^H0$$B`/P!.DK!\__]43V8*</],3
MWPP03EU.=6`6/RW_]DZ2L'S__U1/9@1P_V#D4FW_^C`M__)3;?_RL&W_\&[<7
M0FW_[F`@(&W_ZE*M_^H0$$B`/P!.DK!\__]43V8$</]@L%)M_^X@;?_J2A!G:
M"C`M_^ZP;?_T;<XP+?_NT6W_^DIM__AF*&`8/SP`($Z2L'S__U1/9@9P_V``7
M_WA2;?_Z,"W_\E-M__*P;?_P;MI@%C\$3I*P?/__5$]F!G#_8`#_4E)M__I@,
M`/T(,"W_^F``_T)(YT@`0H1*@&H$1(!21$J!:@9$@0I$``%A/DI$9P)$@$S??
M`!)*@$YU2.=(`$*$2H!J!$2`4D1*@6H"1(%A&B`!8-@O`6$2(`$B'TJ`3G4O_
M`6$&(A]*@$YU2.<P`$A!2D%F($A!-@$T`$)`2$"`PR(`2$`R`H+#,`%"04A!0
M3-\`#$YU2$$F`2(`0D%(04A`0D!T#]"`TX&V@6($DH-20%'*__),WP`,3G5.A
M50``+P0X+0`(+RT`"C\$3KH`,+A\``I<3V8D(&T`"A`H``Q(@`@```=G%#\\Q
M__\O+0`*3KH`]%Q/*!].74YU8/A.50``+PHD;0`*(%*QZ@`$91@P+0`(P'P`^
M_S\`+PI.N@#(7$\D7TY=3G4@4E*2$"T`"1"`2(#`?`#_8.A.50``+PI![(#,O
M)$@@2M7\````%B\(81!83T'L@H2UR&7J)%].74YU3E4``$CG""`D;0`(>``@G
M"F8*</],WP003EU.=4HJ``QG4`@J``(`#&<,/SS__R\*85(X`%Q/$"H`#4B`7
M/P!.N@4<B$`(*@`!``Q43V<*+RH`"$ZZ`BY83P@J``4`#&<2+RH`$DZZ`L`OC
M*@`23KH"%%!/0I)"J@`$0JH`"$(J``PP!&"03E7__DCG""`D;0`(0?K_1BE(.
M@L((*@`$``QG"G#_3-\$$$Y=3G4(*@`"``QG,"!2D>H`"#@(/P0O*@`($"H`]
M#4B`/P!.N@*`L$103V<0".H`!``,0I)"J@`$</]@P`QM__\`#&80"*H``@`,V
M0I)"J@`$<`!@J$JJ``AF""\*3KH`FEA/#&H``0`09BH;;0`-__\_/``!2&W_"
M_Q`J``U(@#\`3KH"(K!\``%03V:@,"T`#&``_VHDJ@`(,"H`$$C`T*H`""5`L
M``0(Z@`"``P@4E*2$"T`#1"`2(#`?`#_8`#_/DY5```O"D'L@,PD2$HJ``QG\
M&-7\````%D'L@H2UR&4(<``D7TY=3G5@XD*20JH`!$*J``@@"F#J3E7__"\*"
M)&T`"#\\!`!.N@#`*T#__%1/9A@U?``!`!`@2M'\````#B5(``@D7TY=3G4U)
M?`0``!`(Z@`!``PE;?_\``@0*@`-2(`_`$ZZ`.)*0%1/9P8`*@"```Q@SDY5]
M``!(YP`P)&R"DF`4)E(@*@`$4(`O`"\*3KH$PE!/)$L@"F;H0JR"DDS?#`!.0
M74YU3E4``"\*0?K_QBE(@L9"IR`M``A0@"\`3KH$:"1`2H!03V8(<``D7TY=_
M3G4DK(*2)6T`"``$*4J"DB`*4(!@YDY5``!P`#`M``@O`&&R6$].74YU3E4`^
M`$CG`#"7RR1L@I)@#B!M``A1B+'*9Q(F2B12(`IF[G#_3-\,`$Y=3G4@"V<$#
M)I)@!"E2@I(@*@`$4(`O`"\*3KH$%'``4$]@V$Y5```O"C`M``C!_``&)$#55
M[(*82FT`"&T.,"T`"+!L@H1L!$J29@XY?``"@I9P_R1?3EU.=3`M``C!_``&>
M(&R"F"\P"`!.N@+82H!83V<$<`%@`G``8-A.50``+RT`"$ZZ`I!*@%A/9@Y.:
MN@*L.4""EG#_3EU.=7``8/A.50``2.<,(#@M``A.N@!P,`3!_``&)$#5[(*8W
M2D1M"KAL@H1L!$J29A`Y?``"@I9P_TS?!#!.74YU,"H`!,!\``-F"CE\``6"%
MEG#_8.1P`#`M``XO`"\M``HO$DZZ`LXJ`+"\_____T_O``QF#$ZZ`BPY0(*6G
M</]@N"`%8+1.5?_\2'@0`$*G3KH#4"M`__P(```,4$]G$DIL@JQF""`M__Q.L
M74YU3KH`!G``8/1.50``2'@`!$AZ`!Q.N@(4+P!.N@)J/SP``4ZZ``Y/[P`.6
M3EU.=5Y#"@!.50``2JR"PF<&(&R"PDZ0/RT`"$ZZ``A43TY=3G5.5?_\+P0PG
M+0`(2,`K0/_\2JR"F&<H>`!@"C\$3KH`_E1/4D2X;(*$;?`P+(*$P?P`!B\`!
M+RR"F$ZZ`F!03TJL@L9G!B!L@L9.D$JL@HIG"B\L@HI.N@'06$]*K(+*9P@@&
M;(+*(*R"SDJL@M)G"B\L@M).N@'L6$]*K(+69PHO+(+63KH!W%A/2JR"VF<*;
M+RR"VDZZ`<Q83TJL@MYG"B\L@MY.N@&\6$\L>``$""X`!`$I9Q0O#4OZ``I.!
MKO_B*E]@!D*G\U].<TJL@JYF,$JL@KIG*#`L@KA(P"\`+RR"NDZZ`;@P+(*VP
M4D!(P.6`+P`O+(*R3KH!I$_O`!!@#DZZ`8XO+(*N3KH!T%A/("W__"YL@IQ.6
M=2@?3EU.=4Y5``!(YPX@."T`"#`$P?P`!B1`U>R"F$I$;0JX;(*$;`1*DF80^
M.7P``H*6</],WP1P3EU.=0@J``<`!&8(+Q).N@`*6$]"DG``8.(B+P`$+&R"E
MI$[N_]PB+P`$+&R"I$[N_X(B+P`$+&R"I$[N_[A.^@`"3.\`!@`$+&R"I$[N:
M_YHL;(*D3N[_RBQL@J1.[O]\(B\`!"QL@J1.[O\H3OH``DSO``8`!"QL@J1.B
M[O^L3.\`!@`$+&R"I$[N_^(L;(*D3N[_Q"(O``0L;(*D3N[_+DSO``X`!"QL7
M@J1.[O_63.\`#@`$+&R"I$[N_[Y,[P`&``0L;(*D3N[_3$SO``8`!"QL@J1.6
M[O]&3OH``B(O``0L;(*D3N[_IDSO``X`!"QL@J1.[O_02.<!!$SO((``#"QLZ
M@J!.KO^43-\@@$YU3OH``B)O``0L;(*@3N[^8D[Z``),[P`#``0L;(*@3N[_U
M.D[Z``(B;P`$+&R"H$[N_MHL;(*@3N[_?$[Z``(B;P`$("\`""QL@J!.[O\NQ
M3OH``B!O``0L;(*@3N[^C"QL@J`B;P`$("\`"$[N_=A,[P,```0L;(*@3N[^*
MDB)O``0L;(*@3N[^ADSO``,`!"QL@J!.[O[.3OH``B!O``0L;(*@3N[^@$SOQ
M`P``!"QL@KY.[O^@(&\`!"QL@KY.[O^F(&\`!"QL@KY.[O^R``````/L````-
M`0````$```[@`````````_(```/J````HW(``````'(K`````G<````#`7<KC
M```#`F$````)`6$K```)`G@````%`7@K```%`@```````#`Q,C,T-38W.#EA=
M8F-D968````@("`@("`@("`P,#`P,"`@("`@("`@("`@("`@("`@()!`0$!`4
M0$!`0$!`0$!`0$`,#`P,#`P,#`P,0$!`0$!`0`D)"0D)"0$!`0$!`0$!`0$!Y
M`0$!`0$!`0$!0$!`0$!`"@H*"@H*`@("`@("`@("`@("`@("`@("`@)`0$!`M
M(``````````````````!``````$``````````````````````0$````!````E
M``````````````````$"`````0``````````````````````````````````$
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M```````````````````````````````````````````````````4````````4
2``````/R```#ZP````$```/R9
``
end
size 8748
SHAR_EOF
#	End of shell archive
exit 0
-- 
Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
Have five nice days.