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.