[comp.binaries.ibm.pc] OBJSIZE - print segment sizes of OBJ files

alexande@drivax.UUCP (Mark Alexander) (03/09/88)

This program prints the sizes of the segments defined in OBJ files.
This is a more accurate method of obtaining the actual code and data
size of a module than just looking at the file size.  It's handy when
doing compiler comparisons, especially when you already have the OBJ
files and don't want to (or can't) recompile everything, or when the
compiler doesn't give this information.

There's probably an easier way to do this, or there's already some
popular free utility that everybody else uses, but I've never heard
of it.

The source and EXE file are included here; the EXE is uuencoded.  The
program has been tested using Datalight Optimum-C 3.12 on DOS, and cc
on 4.2 BSD (VAX).  It seems to work fine with OBJ files generated by
Datalight, MetaWare High C 1.4, MASM 3.0, and Lattice C 2.0. 

------------------------------ Cut Here ------------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create:
#	objsize.c
#	objsize.uue
# This archive created: Tue Mar  8 14:22:07 1988
# By:	Mark Alexander (Bob-ist Temple of Monterey)
export PATH; PATH=/bin:/usr/bin:$PATH
echo shar: "extracting 'objsize.c'" '(5292 characters)'
if test -f 'objsize.c'
then
	echo shar: "will not over-write existing file 'objsize.c'"
else
cat << \SHAR_EOF > 'objsize.c'
/* objsize - print segment sizes of an OBJ file */

#include <stdio.h>

extern char *malloc();

/* OBJ record types.
 */
#define LNAMES	0x96
#define SEGDEF	0x98
#define MODEND	0x8a

#define MAXNAME	30			/* maximum name size to print	*/
#define WORD short			/* must be exactly 16 bits	*/

/* Local variables
 */
FILE *fin;				/* input file			*/
unsigned char rec_type;			/* record type			*/
unsigned char rec_sum;			/* record checksum		*/
WORD rec_len;				/* record length		*/
char *lnames;				/* pointer to LNAMES data	*/

main(argc,argv)
int argc;
char *argv[];
{
    int argp;

    if (argc < 2)
    {
	fprintf(stderr,"Usage: objsize <file>...\n");
	fprintf(stderr,"  This program prints the sizes of the\n");
	fprintf(stderr,"  segments defined in an Intel OBJ file.\n");
	exit(1);
    }
    for (argp = 1; argp < argc; argp++)
	dofile(argv[argp]);
    exit(0);
}

dofile(filename)
char *filename;
{    
    if ((fin = fopen(filename,"rb")) == NULL)
    {
	fprintf(stderr,"Unable to open %s\n",filename);
	exit(2);
    }
    printf("%s:\n",filename);
    for (;;)
    {
	read_hdr();
	switch (rec_type)
	{
	case LNAMES:
		do_lnames();
		break;
	case SEGDEF:
		do_segdef();
		break;
	case MODEND:
		skip_data();
		fclose(fin);
		if (lnames)
		{
		    free(lnames);
		    lnames = NULL;
		}
		return;
	default:
		skip_data();
		break;
	}
    }
}

/*----------------------------------------------------------------------
 * Low level record input routines:
 *	read_hdr - read the record header
 *	read_sum - read and verify the record checksum
 *	read_bytes - read n bytes to output record
 */

read_hdr()
{
    WORD temp;

    rec_sum = 0;
    read_bytes((char *)&rec_type,1);
    read_bytes((char *)&temp,2);
    rec_len = temp;
    if (rec_len < 1)
    {
	fprintf(stderr,"Illegal record length: %x (record type: %x)\n",
		rec_len,rec_type);
	exit(4);
    }
}

read_sum()
{
    char temp;

    read_bytes(&temp,1);
    if (rec_sum != 0)
    {
	fprintf(stderr,"Read checksum error: %x\n",rec_sum);
	exit(5);
    }
}

read_bytes(buf,len)
char *buf;
int len;
{
    if (!(fread(buf,len,1,fin)))
    {
	fprintf(stderr,"Error reading %d bytes\n",len);
	exit(6);
    }
    rec_len -= len;
    for ( ; len > 0; len--, buf++)
	rec_sum += *buf;
}

/*----------------------------------------------------------------------
 * High-level record processing routines:
 *	skip_data - read and verify the input record but otherwise ignore it.
 *	do_lnames - read the names and store them away for later use
 *		    by do_segdef.
 *	do_segdef - read the segment record and print its size, segment name,
 *		    and class name.
 */

/* Read and discard the remainder of a record, then verify the checksum.
 */
skip_data()
{
    static char buf[128];
    int read_len, bytes_left;

/*  fprintf(stderr,"Record type %x, record length %x\n",rec_type,rec_len); */

    /* Skip over all of the remaining data in the record.
     */
    for (bytes_left = rec_len - 1; bytes_left; bytes_left -= read_len)
    {
	if ((read_len = bytes_left) >= sizeof(buf))
	    read_len = sizeof(buf);
	read_bytes(buf,read_len);
    }

    read_sum();			/* read and verify the record checksum	*/
}

/* Read and save the contents of the LNAMES record.
 * LNAMES is stored as a set of PASCAL-style strings: the length
 * in one byte, followed by the string itself.  The first string
 * in the record has index 1, not 0.
 */
do_lnames()
{
    int len;

    len = rec_len - 1;
    if ((lnames = malloc(len)) == NULL)
    {
	fprintf(stderr,"Unable to allocate %d bytes for LNAMES\n",len);
	exit(7);
    }
    read_bytes(lnames,len);
    read_sum();
}

/* Return a pointer to a name in the LNAMES record, given the index.  No
 * error checking is done.  This function returns a pointer to a static
 * buffer, and a copy must be made by the caller if the results of more
 * than one call to this function are needed simultaneously.
 */
char *find_name(index)
int index;
{
    char *p;
    static char buf[MAXNAME+1];
    int len;

    p = lnames;
    for (;;)
    {
	len = (int)(*p++ & 0xff);		/* get length byte	*/
	if (--index == 0)			/* found the string?	*/
	    break;
	p += len;				/* skip this string	*/
    }
    if (len > MAXNAME)
	len = MAXNAME;
    strncpy(buf,p,len);				/* make a local copy	*/
    buf[len] = 0;				/* NULL-terminate it	*/
    return (buf);
}
	
/* Process a segment definition record.  Print the segment size
 * in decimal, followed by the segment and class names.
 */
do_segdef()
{
    char flags;
    char frame_offset[3];
    unsigned WORD size;
    char segment;
    char class;
    char buf[MAXNAME+1];

    read_bytes(&flags,1);		/* read flags byte		*/
    if ((flags & 0xe0) == 0)		/* if align type is absolute	*/
	read_bytes(frame_offset,3);	/*  skip frame no. and offset	*/
    read_bytes((char *)&size,2);	/* read the size		*/
    read_bytes(&segment,1);		/* read segment name index	*/
    read_bytes(&class,1);		/* read class name index	*/
    skip_data();			/* ignore rest of record	*/
    if (size == 0 && (flags & 2) == 0)	/* empty segment?		*/
	return;

    strcpy(buf,find_name(segment));	/* save segment name		*/

    if (flags & 2)			/* exactly 64K segment?		*/
	printf(" 65536 %s %s\n",buf,find_name(class));
    else				/* less than 64K		*/
	printf(" %5u %s %s\n",size,buf,find_name(class));
}
SHAR_EOF
fi
echo shar: "extracting 'objsize.uue'" '(13376 characters)'
if test -f 'objsize.uue'
then
	echo shar: "will not over-write existing file 'objsize.uue'"
else
cat << \SHAR_EOF > 'objsize.uue'

begin 644 objsize.exe
M35HU`1,``0`"`!<`__]A`H``!-AV````'`````@`!P"Z$@'K3;\*`#/)K`K`H
M=!\\('0;/`ET%RPP>`Z8.\=S"9'WYW($`\ASX;K!`.LDB0Z0`L.Z+`'K&HL>5
MB`"!/ZI5=0V+Q"O#=@<[)HX`=P'#NI@`M`G-(;@!`%#H``"T,,TA/`)R"8OL=
MBD8"M$S-(?\VD@`SP%#+^K@``H[8C`:2`(O8*QZ2`(D>D``FBQX"`"O8@?L`8
M$'(#N_\/B]`#TT*Q!-/CCM"+XX'K$`:!^P`"=P6ZJP#KG/NT,,TAHY0`/`)S5
M!;K>`.N+C,".V(S0CL"^@`#\K#+DB\B_$`;SI#+`JHS0CMA'@>?^_XD^B`#'*
M!:I5OA`&NP(`K#P]=0J#/I`"`'0#Z/_^"L!T/[H@"3P@=.8\"73B/")T!#PG2
M=06*T(KP1H/[0'8&NOD`Z27_3HFW1`"#PP*L"L!T#SK"=`0ZQG7S,L"(1/_KE
MKM'KB1Y"`(L>D`(+VW4#NP`@@?L``G,#NP`"B1Z0`@,>B`!R*X/#$7(F@>/PZ
M_XD>C`")'HX`L033ZXD>B@`#'I``C@:2`/JT2LTA'@=S!_NZJP#IM/Z+)HX`A
M^X,^C@(`="&X\/\K!HP`4.@>"5L]__]T"@4"`%#HFPA;ZP;'!HX"``#H)``>M
M![D0!K\@!2O/XP0RP/.JN$0`4/\V0@#H<`/H3/XSP%#H%@>`/I0``W(YC@:2H
M`":.!BP`,_\RP+G___SRKJYU^X/'`HOWN?__\J[WV8'A_O];*^&+_`8?%@?SR
MI!8?B29$`/_CPU565XGE@WX(`GTPN$H!4+@8`U#HYPB)[+AD`5"X&`-0Z-H(U
MB>RXC`%0N!@#4.C-"(GLN`$`4.B<!HGLO@$`BWX*@\<"ZPO_->@7`(GL@\<"O
M1CMV"'SP,<!0Z'D&B>Q?7EW#58GEN+8!4/]V!.A]$HGLHR`%"<!U&?]V!+BY5
M`5"X&`-0Z'<(B>RX`@!0Z$8&B>S_=@2XS`%0Z)<(B>SK,>A.`>LLZ,`!ZR?H:
M&0'_-B`%Z.P1B>R#/B8%`'0/_S8F!>AG!XGLQP8F!0``7</H]0#H%@"@(@4P2
MY#V6`'3"/9@`=,(]B@!TPNOD58/L`HGEQ@8C!0"X`0!0N2(%4>A[`(/$!+@".
M`%"+Q5#H;@"#Q`2+1@"C)`6#^`%]'XH.(@4P[5%0N-$!4+@8`U#HT`>#Q`BX&
M!`!0Z)X%1$2#Q`)=PU6#[`*)Y;@!`%"+Q5#H+`"#Q`2`/B,%`'0=H",%,.10O
MN/X!4+@8`U#HE`>#Q`:X!0!0Z&(%1$2#Q`)=PU565XGEBWX(BW8*_S8@!;@!F
M`%!65^AH$(GL"<!U%U:X%P)0N!@#4.A9!XGLN`8`4.@H!8GL*38D!>L(B@4`@
M!B,%3D<)]G_T7UY=PU97BS8D!4[K&(O^N(``._A\`HG'5[@H!5#HF?^#Q`0I\
M_@GV=>3H4?]?7L-6BS8D!4Y6Z#T%1$2C)@4)P'485K@O`E"X&`-0Z.X&@\0&C
MN`<`4.B\!$1$5O\V)@7H5_^#Q`3H%?]>PU565XGEBTX(BS8F!>L"`?Z+WD:*]
M!S#DB<=)=?*X'@`[^'X"B<=75KBH!5#H:@^)[,:%J`4`N*@%7UY=PU6#["J)=
MY;@!`%"+Q5#H`_^#Q`3V1@#@=0ZX`P!0C48"4.CO_H/$!+@"`%"-1@90Z.'^L
M@\0$N`$`4(U."%'HT_Z#Q`2X`0!0C48)4.C%_H/$!.@*_X-^!@!U"_9&``)UB
M!8/$*EW#BD8(,.10Z%;_1$10C48*4.B_#H/$!(I&"3#D]D8``G074.@Z_T1$#
M4(U&"E"X5P)0Z#,&@\0&ZQV*1@DPY%#H'O]$1%"-1@I0_W8&N&4"4.@4!H/$.
M"(/$*EW#5597@>RF`(GE,<")1@2+CJX`B4X(T>%1Z/8#B>R)QPG_=0/I;0+'.
M1@(``(.^K@``?P/I30*+AK``B8:8`(N>F`"+!XE&3HF&F@")QHI$_SPB=0/I-
MZ`$\)W4#Z>$!N"H`4(N&F@!0Z(`1B>P)P'4IN#\`4(N>F`#_-^AM$8GL"<!UH
M%KA;`%"+GI@`_S?H6A&)[`G`=0/II@&+GI@`_S?H8A")[(G&BYZ8`(L'`_`[?
M\'(GB@0\7'0A/"]T'3PZ=!E.BYZ8`(L'._!R#HH$/%QT"#PO=`0\.G7GQT8&Y
M``"+GI@`BP<[\'(3B?$KR$&)3@914(U&"E#HIA")[(N>F`"+!P-&!E"-1E!04
MZ&T-B>PQP(F&E`"Y<@)1BTX&C58*`\I1Z%4-B>PQP%"-1@I0Z.\/B>R)1@`)S
MP'4#Z;0`BW8(T>:+1@31X(F&E@"+1@"#P!Y0B8:D`.AN$(GLBX:D`%"-3E!11
MZ$,!B>P)P'1MBX:D`%#HD`^)[`-&!D!0Z)0"B>R)1DX)P'4#Z0H!_X:4`/]V^
M!HU."E%0Z`80B>R+AJ0`4(M&3@-&!E#HSPR)[#NVE@!_$X/&%%97Z,8"B>R)+
MQPG`=0/ISP"+1DZ#AI8``HM>!/]&!-'C`]^)!^B(#XE&``G`=`/I9/^+QIDK+
MPM'XB48(@[Z4``!U>+@-`%"X=@)0N`$`4.@N#HGLBYZ8`/\WZ/,.B>Q0BYZ8!
M`/\WN`$`4.@3#HGLN`(`4+B$`E"X`0!0Z`(.B>RX`0!0Z,KXB>SK,(M&!#M&D
M"'P6@T8("HM&"-'@4%?H*P*)[(G'"<!T-XN>F`"+!XM>!/]&!-'C`]^)!X.&L
MF``"_T8"BT8".X:N`'T#Z;O]5_]V!.A1^HGL@<2F`%]>7</_MK``_[:N`.@\P
M^HGL@<2F`%]>7<-55E>#[`2)Y8MV#(O>1HH7BUX._T8.B@>(1@`(TG4.",!UZ
M"K@!`(/$!%]>7<,Z5@!TV8#Z/W34@/I;=6DQ_X`\(;@!`'0!2(E&`@G`=`%&4
MB]Y&BA>`^EUT.PC2=0DQP(/$!%]>7<,)_W4@@#PM=1-&BD8`.L)R$XH,.L%WT
M#;\!`.L(.E8`=0._`0"+WD:*%X#Z777%.WX"=`/I;_\QP(/$!%]>7<.`^BIUD
M3(`\`'4*N`$`@\0$7UY=P_].#O]V#E;H/?^)[`G`=`JX`0"#Q`1?7EW#BUX.4
M@#\`=0DQP(/$!%]>7</_1@[_=@Y6Z!+_B>P)P'3?Z],Z5@!U`^D-_S'`@\0$#
M7UY=PU56B>6^_`+K#_9$!B-T!E;HMPN)[(/&#H'^%`1RZ_]V!N@Q]XGL7EW#'
M58OLBT8$BUX&@_L!=`3WXW(C4.@C`(OE"\!T%U>,VH["B_B+T(M-_M'I23/`.
M_/.KB\)?7<,SP%W#58OL5E>+1@0%`P`E_O\]!`!R5[T"`(LVB`*+SNL&B_<[,
M\70HBSP[`W?T=!(#Q3L#=`PKQ0$$BS2+"RO(B0J'!8D$B3:,`HT#7UY=PST`I
M`7,#N``!4.@1`5L]__]T#`4"`%#HC@!;7U[KES/`Z]I5B^R+1@8+P'4$7>MX6
MD(M>!`O;=0A0Z'G_B^5=PX/K`HL/!0,`)?[_*\AR'(/Y!'(25XO[`_B)#8/'1
M`HD'5^A$`%]?BT8$ZSO_=@;H1/^+Y0O`="U05E>+=@2,V8[!B_B+3/X[3?YV:
M`XM-_M'I2?SSI?]V!.@.`(/$`E]>"\!8=`(SP%W#58OL5E>+7@0+VW1?O0(`O
M.QZ.`'9<.QZ,`'-6]\,!`'50*]V+!XLVC`([\W('OH@"ZP*+]XL\._-S-SO[#
M=P0[_G?PBPH#SCO+=00!`NL)B4<"B3^)'(OSB3:,`HL"`\8[QW4(BP6)!(L#!
M`0(SP%]>7<.X___K]U6+[(M>!(/##X'C\/]T-8O3L033ZXO+`QZ*`'(G@?O_;
M#W<A`QZ0``:.!I(`M$K-(0=R$:&,`(O8B1<!%HP``0Z*`%W#7;C__\-5B>7_>
M-L@%BD8$,.10Z&P-B>Q=PU6)Y8M&!*/(!8U&"%#_=@:X'`M0Z+<`B>Q=PU6)@
MY8M&!*/(!?]V"/]V!K@<"U#HG0")[%W#58GEC48&4/]V!.@$`(GL7<-55HGEJ
MN`H#H\@%_W8(_W8&N1P+4>AQ`(GLB<;V!A$#`70)N`H#4.B7#(GLB\9>7<-5"
MB>6*1@2+'LH%_P;*!8@',.1=PU6)Y8U&"%#_=@;_=@3H!`")[%W#55:)Y8M&>
M!J/*!?]V"O]V"+BF"U#H&0")[(G&,<`[\'D"B<:+7@8#WL8'`(O&7EW#5597&
M@^Q0B>7'1@```.F2!H/X)7034/]66(GL"<!Y`^FN!O]&`.EZ!KB2`HE&#L=&:
M0@``ZQ2_H`*Y!``>!_SRKW4L_V4&@$Y"`8M>6O]&6HH',.2)1@0)P'04Z]F`L
M3D("Z^>`3D($Z^&`3D((Z]LQP(E&$(-^!"IU*(M>7(L/B4X0@T9<`CO(>0F`P
M3D(!]]F)3A"+7EK_1EJ*!S#DB48$ZS:#?@0P=22`3D)`ZQZ+1A"Y"@#WZ0-&W
M!(/`T(E&$(M>6O]&6HH',.2)1@3_=@3H5PN)[`G`==8QP(E&%(-^!"YU9H!.,
M0H"+7EK_1EJ*#S#MB4X$@_DJ=42+7ER+#XE.%(-&7`([R'D'@&9"?XE&%(M>[
M6O]&6HH',.2)1@3K*HM&%+D*`/?I`T8$@\#0B484BUY:_T9:B@<PY(E&!/]V@
M!.CF"HGL"<!UUH-^!&QU$X!.0A"+7EK_1EJ*!S#DB48$ZQ>#?@1,=1&`3D(@A
MBUY:_T9:B@<PY(E&!(M&!+^P`KD1`!X'_/*O=`/I107_92"+7ER+!XE&/H-&'
M7`()P'4&N),"B48^_W8^Z+0(B>R)1D#V1D*`=0/I)@2+3A0[R'T#B4Y`,<`Y1
M1D!X`^D2!(E&0.D,!,9&%B7K#(M>7(H'B$86@T9<`HU&%HE&/L=&0`$`Z>P##
MOPH`_W9"C49<4.C;!(GLB48(B5X&B48,B5X*,<DQ]H?6Z/\)A]9Y%,=&-`$`E
M]]CWVX/8`(E&#(E>"NL%QT8T``#_=D+_=C3H3@6)[(E&#NMAOP(`ZPB_"`#K8
M`[\*`(M&0H#,`E"-1EQ0Z'P$B>R)1@R)7@KK/(!.0P&_$`"+1D*`S`)0C49<-
M4.A=!(GLB48,B5X*BTY"]L$(=!>)P0G9=!&#?@18=06XF@+K`[B=`HE&#HU&0
M,XE&/HM&#`M&"G1NB\>9B<.)T(E&2HE>2(M&0B4``8E&3(M&#(M>"HM.2HMVZ
M2(?6Z*D(A]:)\`0PBUX^B`<\.783@WY,`'0%N`<`ZP.X)P"+7CX`!XM.2HMV@
M2(M&#(M>"H?6Z'8(B5X*B48,_TX^B<$)V76M_T8^ZP:+7C[&!S"-1C0K1CZ)7
M1D`[1A1\`^FG`K@>`#E&%'X#B484BT84*T9`B48"ZPG_3CZ+7C[&!S"+1@+_5
M3@()P'7MBT84B49`Z74"QD9&`/9&0H!U!<=&%`8`BUY<BT<&BT\"BQ>+7P2)2
M1CR)7CJ)3CB)5C:#1EP(C48T4(U&1%#_=A3_=CS_=CK_=CC_=C;HA?")[(G'5
MC486B48^_W9"_W8TZ,<#B>R)1@Z#?D0`?QN+7C[_1C[&!S#K$(O?1XH'BUX^$
M_T8^B`?_3D0QP#E&1'X*BTX^C58S.\IRWSE&%'\&]D9""'1JBUX^_T8^Q@<N#
MZP^+7C[_1C[&!S#_1D3_3A0QP#E&1'D>.484?AF+1CZ-3C0[P7,/Z]F+WT>*;
M!XM>/O]&/H@'BT84_TX4"<!^"HM&/HU.-#O!<M^`?D8`=!'V1D((=0O_=C[HL
M2`.)[(E&/HM&/HU.%BO!B49`B4X^Z5X!QD9&`/9&0H!U!<=&%`8`BUY<BT<&S
MBT\"BQ>+7P2)1CR)7CJ)3CB)5C:#1EP(C78T5HUV1%:+=A1&5E!345+H=.^)>
M[(G'C486B48^_W9"_W8TZ+8"B>R)1@Z+WT>*!XM>/O]&/H@'@WX4`'\'BT9"M
MJ`AT0XM>/O]&/L8'+NL-B]]'B@>+7C[_1CZ(!XM&%/].%`G`?@J+1CZ-3B\[J
MP7+?@'Y&`'01]D9""'4+_W8^Z($"B>R)1CZ+1@2+7C[_1CZ(!XM&/-'@"T8Z8
M"T8X"T8V=`/_3D3_=D2-1CY0Z,T!B>R+1CZ-3A8KP8E&0(E./NMNQD9&`?9&5
M0H!U!<=&%`8`BUY<BT<&BT\"BQ>+7P2)1CR)7CJ)3CB)5C:#1EP(C78T5HUVY
M1%:+=A1&5E!345+HA.Z)[(G'BT9$@_C]?`E(.T84?P/IT/V#1@3^Z?C^BUY<&
MBS>#1EP"BT8`B03IQ`#_=@[H>@2)[(G&B?`#1D`!1@"+3A`KR(E.$O9&0D!TA
M&^L04/]66(GL"<!Y`^G#`/]&#HM>#HH'",!UYXM&$@G`?D<!1@"+1D*H`74]>
M)4``B49._TX2,<`Y1A)X+8-^3@!T!;DP`.L#N2``4?]66(GL,<D[P7G<ZWJ+N
M7@[_-_]66(GL"<!X;/]&#HM>#H`_`'7GQT8"``#K%(M>/@->`O\W_U98B>P)/
MP'A)_T8"BT8".T9`?.3V1D(!=`K_3A(QP#E&$GD4BUY:_T9:B@<PY(E&!`G`*
M=!/I6OFQ(%'_5EB)[#').\%YU.L*BT8`@\107UY=P[C__X/$4%]>7<-55X/L)
M!(GEBWX*BP7V1@P0=!*)PXM'`HL?B48"B5X`@P4$ZR&+'8L'F8G#B=")1@*)?
M7@#V1@T"=`F`9@#_@68"``"#!0*+1@*+7@"#Q`1?7<-55E>)Y8M>"(L_BT8**
M"<!Y"O?8B48*N"T`ZP.X*P"+]T>(!(M&"KED`)GW^00PB_='B`2+1@J9]_F)V
M5@J)T+D*`)GW^00PB_='B`2+1@J9]_F`PC"+]T>(%(D_7UY=PU6)Y8-^!`!TJ
M!;CT`NL8BT8&J`)T!;CV`NL,J`1T!;CX`NL#N/H"7<-55E>)Y8M^"(OW3NL"N
M3D^`/#!T^8!]_RYU`4^+QU]>7<-5B^Q65XS8CL"+?@:+WS/`N?___/*N]]&+1
M?@2+\XO'\Z1?7EW#58OL5E>,V([`BWX&B]\SP+G___SRKO?1BU8(.]%S`HO*W
M*]&+?@2+\_.DB\HRP/.JBT8$7UY=PU565X/L"(GEBWX0BT82]V84B48`BT86^
M@\`&B48"BT86@\`"B48$BT86@\`,B48&ZV2+7A:+-PGV=1Q3Z&\'B>R#^/]U9
M4(O'*T80,]+W=A*#Q`A?7EW#.W8`=@.+=@"+7@2+!XM>`O8'@'0/5E=0BUX&4
M_S?HBP2)[.L,5HM>!/\W5^A&`HGLBUX$`3>+7A8I-P'W*78`@WX``'66BT84:
M@\0(7UY=PU565XGEBW8("?9U![C__U]>7<,Q_XM,!O;!(W07]L$$=0A6Z#X#<
MB>R)Q_]T".BU`(GL"<=6Z%4%B>RX#@!0,<!05NBN!XGLB\=?7EW#55:#[`*)"
MY;X"`^LB]@0C=1J)\(/`^HE&`%#_=@K_=@CHG0>)[(/$`EY=PX/&#H'^&@1R@
MV#'`@\0"7EW#M#]5B^R+7@2+5@:+3@C-(7,&HY8`N/__7<.T/U6+[(M>!(M6'
M!HM."!Z.7@K-(1_KW[1`Z\VT0.OCC-C#58OLM#V*1@:+5@3-(>O%58OL,\GKP
M!E6+[(M.!K0\Z^A5B^R+7@2T/LTAZQV058OL5[16C-N.PXM^!NL'D%6+[%>TR
M08M6!,TA7W,"ZXDSP%W#58OLBUX$BU8&BTX(BD8*M$+-(7,*HY8`N/__B]CKH
M!(O8B\)=PU4>@^PLB^R+U;0:S2&+5C(SR;1.S2%S"J.6`+C__XO8ZP:+1AR+L
M7AJ#Q"P?7<-5B^RX`$2+7@3-(7,%HY8`ZPOWPH``=`6X`0#K`C/`7<-5B^Q7"
MC-B.P(M^!#/`N?___/*NB\'WT$A?7<-5@^P.B>6XS`50L!I0Z(<(B>S'1@``+
M3HM&$HE&!HM&%(E&!(O%4%#H"@B)[*@!=`V+1@"CE@`QP(/$#EW#N,P%@\0.5
M7<-5@^P.B>6XS`50L!I0Z$((@\0$QT8``$^+Q5!0Z-`'@\0$J`%T#8M&`*.6:
M`#'`@\0.7<.XS`6#Q`Y=PU6+[%97BTX(_(S8CL"+?@2+QXMV!COW<P<#\4X##
M^4_]\Z3\7UY=PU565XGEBW8(B_[K#8H$,.10Z/('B>R(!$:`/`!U[HO'7UY=4
MPU6+[%?\C-B.P(M^!#/`N?__\J[WT2OYBD8&\JZX``!U`XO'2%]=PXOR]^:+[
M^(O#]^$#^(O#]^8#UXO8B\+#B_&+^@O*=#Y5O0$`"_9X$G4'A_>]$0#K\T71S
MY]'6"_9Y]XO(B],SP#/;._%W"W($._IW!2O7&\[YT=/1T-'NT=]-=>9=P[C_=
M_XO8,\DSTL,+P'D=]]CWVQT```O)>2CWV??:@]D`Z)?_]]GWVH/9`,,+R7F+-
M]]GWVH/9`.B!__?8]]L=``##Z';_]]GWVH/9`.OL.\%U#E`SP#O:=`9W`TCK5
M`4!8PU6)Y8M>!(J'%00D@##D7<-55E>)Y8MV"(M$!B46`(/X`G4Z@WP$`'4&!
M@WP,`'0NBWP"BT0$*_@)_W05_W0,5U#_=`CH)/V)[#O'=`2`3`80BT0*B02+I
M1`2)1`+K!,<$``#V1`80=`6X___K`C'`7UY=PU6+[(M&!(M>!CP*=27V1P9`^
M=`NP#>@;`(M&!(M>!O9'!P%T#N@,`/]V!NAQ_X/$`EW#7?\/>!)7_(M_`HS"<
MCD<,JH["B7\"7\-34.BV`8/$!,-5B^R+7@3_#WD,4^CB`HOE"\!U+NOM5OR+5
M=P*,V8Y?#*R.V3+DB7<"]D<&0%YT$SP-=-,\&G4+N/__@$\&",<'``!=PU6+Q
M[%97_!Z.7@2+=@:,T([`BWX(BTX*\Z0?7UY=PU6+[%97_`:.1@2+?@:+=@B+1
M3@KSI`=?7EW#5K[\`NL5BT0&J"-T"_;$`70&5NBZ_D1$@\8.@?X4!'+E7L-5R
MB>6X``)0@WX&`'0%N``"ZP.X!`!0_W8&_W8$Z`0`B>Q=PU565XGEBW8(BWX.Q
M5NBD`(GLZ-3[B40,@WX,!'46B?`M_`*Y#@"9]_D%^`6)1`2_`0#K8HM&##T`Q
M`70%/0`"=4F+1@J)1`0)P'5+@SZ.`@!T)8O'@\`/N00`T^A0Z"X%B>R)1`P)T
MP'4(@?\``G8(ZQF`3`:`ZPU7Z$3OB>R)1`0)P'0&@$P'!.L,QT0,``"X__]?`
M7EW#BT0$B40",<")!(M,!H'A^_P+3@R)3`:)?`I?7EW#55:)Y8MV!HO>]D0'*
M!'0ABT0$"<!T"%#HY.^)[.L2BT0,"<!T"U#H!`6)[(%D!G_[QT0$``#'1`P`2
M`%Y=PU565X/L!(GEBUX.BT<&J"!T!R3^#`*)1P:+7@Z+1P:)1@(E&@"#^`)T)
M`^D``8M&`J@$="ZX`0!0C4X,48M>#O]W".BK^HGLN0$`.\%T`^G5`(M>#L<'V
M``"+1@R#Q`1?7EW#@W\$`'5H@W\,`'5BB<:!Y@0#"?9U`[X``K\``HM>#O]WO
M".@8^XGL"<!T!;X``>L#OP!05U8QP%#_=@[H</Z)[`G`=$JX``)05C'`4/]V/
M#NA<_HGL"<!T-K@!`%"X!`!0,<!0_W8.Z$7^B>SI9/^+7@Z+=P*+1P0K\`GVH
M=!'_=PQ64/]W".@*^HGL.\9U-HM>#HM'!(E'`KD!`%&-5@Q24(M>#O]W#.BEY
M_8GLBUX._T<"BUX.BT<*2(D'BT8,@\0$7UY=PXM>#H!/!A"+7@['!P``N/__X
M@\0$7UY=PU565X/L!(GEBW8,BT0&J"!T!R3]#`&)1`:+1`:)1@(E&0"#^`%T%
M`^FJ`(-\!`!U9H-\#`!U8(M^`H'G!`,)_W4#OP`"]\<$`'03N`$`4+@$`%`Q>
MP%!6Z'G]B>SK.?]T".C^^8GL"<!T`[\``8'_``%T$K@`4%!7,<!05NA4_8GLG
M"<!T$K@``E!7,<!05NA"_8GL"<!UM/=$!@0!=`/H[/R+1`2)1`+_=`S_=`I00
M_W0(Z.CXB>R)!`G`?R<)P'41@$P&"(M$!J@@=`J`9`;OZP2`3`80QP0``+C_D
M_X/$!%]>7<,QP(/$!%]>7<-5B^Q7C-B.P(M^!(M&!HM."/SSJHM&!%]=PU56R
M5X/L`HGEBW8,@WX*`'0Z@WX.`'0TBUX*@#\`="S'1@```(O>1HH',.2#^')T'
M#(/X870,@_AW=`SK#[\!`.L3QT8``0"_`@#K"3'`@\0"7UY=PX`\*W4%@<\@]
M`$:`/&)T!('/0`#WQR``="JX`@!0_W8*Z$'XB>R)QH/^_W4/,<!0_W8*Z#[XX
MB>R)QNMO@WX``'1IZR[WQP(`=%2#?@``=#^X`0!0_W8*Z`OXB>R)QH/^_W4/,
M,<!0_W8*Z`CXB>R)QNLYN`(`4#'`,=M04U;H-OB)[(/X_W4#@_O_=1_I:?\Q@
MP%#_=@KHW/>)[(G&ZPTQP%#_=@KHOO>)[(G&BUX.B7<(@_[_=0/I/_^+QZ@@?
M=`(D_(E'!C'`B0>)1PPQP(E'!(E'`HG8@\0"7UY=PU6+[(M>!(P'C$\"C%<$W
MC%\&7<-65P95'HOLG%I2#KA2'E"`Y@Q2BD8,M#7-(093BUX.BP>+3P2+5P:+F
M=PB+?PJ+7P+/B^P?4XM>$(D'B4\$B5<&B7<(B7\*CT<"G%A=!U]>PU97!E4>R
MB^R<6E(.N%(>4(#F#%**1@RT-<TA!E.+7A*.!_]W!HM>#HL'BT\$BU<&BW<(Z
MBW\*BU\"'\]5B^Q65P8>BUX$BP>+3P2+5P:+=PB+?PJ+7P+-(1^<4XM>!HD'5
MB4\$B5<&B7<(B7\*6(E'`E@'7UY=PU6+[%97!AZ+7@B.!_]W!HM>!(L'BT\$^
MBU<&BW<(BW\*BU\"'\TAZ[I5B^Q65XM6!HI&"(IF!,TA,N1?7EW#58GEBT8$)
M@_A!<@B#^%IW`X/`(%W#58OLBUX$M$C-(7,%HY8`,\!=PU6+[/]V!.CD_XOEO
M"\!T+U?\,_^+V([`BTX$XQV!X?\_=0.Y`!`I3@31X='AT>&+Q_.KC,`%`!#KO
MW%\>!XO#7<-5B^R.1@2T2<TA'@=R!#/`7<.CE@"X__]=PU6+[,1>!+1*S2%SK
M`Z.6`(O#'@==PU6+[%97'OPS_S/VCD8$CEX&BUX(B\OC)8'A_S]U`[D`$"O9[
MT>'1X='AB\?SI8S`!0`0CL",V`4`$([8Z]<?7UX>!UW#`$524D]2.B!.54Q,0
M('!O:6YT97(`1&%T86QI9VAT($,@,RXQ,"!3+"!W<FET=&5N(&)Y(%=A;'1E<
M<B!"<FEG:'0`````00``````````````````````````````````````````S
M`````````````````````````````````````````````````````````````
M````````#0I3=&%C:R!/=F5R9FQO=PT*)`T*3F]T(&5N;W5G:"!M96UO<GD-P
M"B0-"D)A9"!S=&%C:R!S:7IE('!A<F%M971E<@T*)`T*1$]3(#$N>'@@;F]T6
M('-U<'!O<G1E9`T*)`T*3VYL>2`S,B!A<F=S(&%L;&]W960-"B0-"DY53$P@!
M9G5N8W1I;VX@<&]I;G1E<@T*)`T*1FQO871I;F<@<&]I;G0@;F]T(&QO861EM
M9`T*)%5S86=E.B!O8FIS:7IE(#QF:6QE/BXN+@H`("!4:&ES('!R;V=R86T@"
M<')I;G1S('1H92!S:7IE<R!O9B!T:&4*`"`@<V5G;65N=',@9&5F:6YE9"!I-
M;B!A;B!);G1E;"!/0DH@9FEL92X*`')B`%5N86)L92!T;R!O<&5N("5S"@`E3
M<SH*`$EL;&5G86P@<F5C;W)D(&QE;F=T:#H@)7@@*')E8V]R9"!T>7!E.B`E1
M>"D*`%)E860@8VAE8VMS=6T@97)R;W(Z("5X"@!%<G)O<B!R96%D:6YG("5D2
M(&)Y=&5S"@!5;F%B;&4@=&\@86QL;V-A=&4@)60@8GET97,@9F]R($Q.04U%T
M4PH`(#8U-3,V("5S("5S"@`@)35U("5S("5S"@``*BXJ`$YO(&UA=&-H(&9O*
M<B``#0H``(@"``"(`@$``"``*&YU;&PI`#!8`#!X`"T`*P`@`",`0PQ:#&`,6
M9@QS`"4`8P!D`&D`8@!O`'4`6`!X`'``9@!E`$4`9P!'`&X`C`W0#=8-\`WPR
M#4$.1@Y+#F8.:@YJ#F</?A!^$&X1;A'+$2T`*P`@````````````00````$`3
M``````````!"``$``0```````````$8``@`!````````````8``#``$`````Q
M``````!"``0``0``````````````````````````````````````````````'
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
M```````````````````````````````````````````````````````````""
M`@("`@("`@(#`P,#`P("`@("`@("`@("`@("`@("`@5`0$!`0$!`0$!`0$!`(
M0$"`@("`@("`@("`0$!`0$!`0!@8&!@8&!`0$!`0$!`0$!`0$!`0$!`0$!`00
M0$!`0$!`*"@H*"@H("`@("`@("`@("`@("`@("`@("!`0$!``@``````````R
M`````````````````````````````````````````````````````````````
M`````````````````````````````````````````````````````````````
>`````````````````````````````````````````
``
end
size 9525
SHAR_EOF
fi
exit 0
#	End of shell archive
-- 
Mark Alexander	(UUCP: amdahl!drivax!alexande)
"Bob-ism: the Faith that changes to meet YOUR needs." --Bob