nfs@notecnirp.Princeton.EDU (Norbert Schlenker) (01/02/90)
Andy Tanenbaum has asked me to post the most recent version of my string routines for the IBM PC. These routines form the contents of the official 1.5.0 source directory /usr/src/lib/string. A few notes regarding installation: - Read the Readme file. - Edit the makefile to ensure that it points to the right places and uses the appropriate programs and definitions. - If you require your binaries to run on any PC, do not make the library with a target of "i80386". Using that target will result in code for memset() that will fail on 8088's, 8086's, and 80286's. (I use memset() extensively to zero blocks of memory, and thought it would be worthwhile to have a '386 specific version.) The routines have been shar'ed, compress'ed, and uuencode'd. Happy New Year! ----------------------------------- Snip snip -------------------------------- begin 644 string.shar.Z M'YV-9<:@>0,"#X@6(*24"4.F31D%<\J0 7'BA1<L+^:\V'@"A(^$"QN6 <&# M!\47)Q1@05)&SL@T<T#003.231@Z9>;0 >'2#LPT;]R >&,&1)L\('3*2>/F M# @X8<:L"7.F# L0=Y;2P2F4*8@P<R*V$<,&J9DW<E1"&7(B9A@W$\>\:0.5 M3AJR.4'4F</4:1.F:?"X &""AJ8(!#[E$.G3A@V94'(I<NF#,ZO,<V$D8-9 MY<R19.2$,;,SB),I24 ,24KG+9G-$\^\R7FU#)XQ9>#LG'F3M1RYD%&D^ K7 M-QXS<MH(_^I2I9LW.UT^CIR&<AF';G!.1)'&19G!GY%N'BD=,E(U>W<B#[JS M#-S,:'V/H2M<I6O?;L; R2/\JLLY< 1DEQUEE)7"8" \D=](5(7!U%6?@6#% M#<1-)$1+:Q18!E*3U757&FRD04<>*LGQ1AUVN9'7>" \MQ-38[!1!QD2724& MBE])1D8:9A2%&!PF^D3C1&=Q%F$,+M3@ @PD*=67"VCXX!D:O=%H!E-Y?=8& M9B"@\)P;+;@1AD,M !A5&2W \09D*/8U7!M1F3@'@DU<-X9^_ V'F(LJP2CC MD%?QM2 (J8WQEHL@7%F<7&[PI9-[.Y'QQAAU8->:74%Q20=!(F961WZ8NN&" M2BJQY(8<2$T1X()RM*4:3R>FN*)+6*5!8V1[U0@"@:CR5& :8>!U%:](J<E8 ML)6Q8%]Q+"[$5V0=@BA18MD1)-T<02&+5!D]IC%&&I!*]@:-"!JVH61OR11& MABV^81\9=KS56E57$25N'7)$5&]1 8$+!O,"22B@/@^ENA"C?UWU1V'"41H M=@6J!.2D.6&;[U-OA%4QM5_="-=;N'$\$V*&1H1@$D5%*$9.NU&YDUQUL#'1 MRBI)JB)68.48 PPMR !#"8G1%>1UX7H5H9--B4OCP@VC02A6)\HL;J.VMJ22 M9FG($=F(<'AK<)&8B4464F_PJMI5J=T1-1ENG/!R4'S1R)F(4#.&!L/2CHJ% M$#@>Y6M6(G(%:YLJQC3'0'<858?#-LE1U=Q"ETUT=O 9F4?7AK+1IQMPH!@3 M0NMM2<//,A&40PU T[CJCDEG:L:G8X2JMTKF*CT2;SNEK=7M[I$1TZ9Z190C M&] -Q2\=<FQ1F1M\X-D\75TLYYI*#K6Q141T-+]?] <25GMU$Q-H:>4RT22\ MB83/.M(<=8BAD[S_JN3>B6<XC?O3N1HEGL9C16934XZIRJY:PA>XE8LFOL)- M=D! !#2@2B=!>0@6D!0#C.FD+R 0P_YV<K@WW,$M(!@=T&!TK9<(I8$/W-3- M1),BIV3*;]2+RF%N=@<1V<]\Y(D5EF*"@J!$1BEXDEYQ@$B?X; H5Q/YC$L. M1"HLU$XN-$I,9L""$\Z +0PMJM3*.&.O:QF0,$G82:X,%Z!O&8PI2EE<J.;@ MG.)5144LG)8&RS>2U42K,G*X"E3R$!-#N>1U +L)5T)5.E^= 2955 FC!CF' MJXPQ*> +T96F%2(W3(5>>CG5FM@0DS9D;"?$>P,<8A(4W%SE/JW)$!NQP)!X M98<J([&7VN0PD<>DX0QNL!16:$(K-87E+I4YX$BNE*^6N<2$=E@3@:[F(*TA MA2_6^<IK=',3H#3*>"!0E7MPTZJ8V'%<MR-(A)( L4#^YC XB1V^OD,[!-I$ M)S)1&W/6-Q?+5"<OGX)#9< B+P1509.0P6 H1SF40<TA# 2*R<Y:$ /4;<XH MGT171.:P SI^92N0LF8A;8E+71XTH2"800M05]#2P0&;N!.F(L$I11!4)BR2 MV2=GN",4;#E$HK0!01.J, 0DN'1C,5J('(Q8'"K1LB6%I-&-SJ L+-QH)SX; M84P0!;R5)<4-/#+#M&XR.R<B$(HCN4/.1&F7-J1!#]/*%!:ID+'#B &+-=@9 M#)CF+:=1R2U"P0$,9H #&U0HDX82B$14$H,6B)5N[[O,#&200;I5#RUY0% 0 M0/B?F-$!0E]E*9R0@BBKDK4Z!@N*2J##2Z/(<(<G X%MROBBW1#$JG&HP\! M()MQ)2H^,?"K&.@V!"A4H2T+LZ'$6D(E@LXA1/6C@_\V!KZAZ3)3>L4!#H"[ MRY;<#H&"S&BF-F4?Y.:R:#$1ZZ/(T-74C&DHJRKD4GUE+#K@=2+L.T-5+@BW MVT(N?).C0VK/^QAL;:Z*+)N65US27E(6)4!R*!*<!I4ITB(53@(K7+G$Z3+5 MP@5M*J$2@:@5HQE-:V)G$$T;?E?A#J'HNB^)G/C"=<5=;09<(S)>B718N*^@ M:"Y4\9IY*JI/9XWD.@X"6(0JRP;W%O*FCPF*4VHXDZ_4+"=C6(IN-&JO/)R( M,[VMPE\?VZO-""R="?L.&$&@81-V>$A.QH)<]H-2!()8Q*Z*5>?4$Q^_07B& M)K3HE2H# BBTQ PNH$)<80"#':@D-0,)D$6;*[GQ)05Q0E%B6$$$,*MR3<== M96OP4-RB,B0.:4Z!BE1@>17!2J5\O8D0A$T$ BL!9HT7I:-G1-GFD< I0WMF M$*TZ5$V\U*K)5L;7U*YTAH+)CC!"0(J5PF#9IJIZ7=R2%FW=TY*;9,G-?T;+ M@D/&ZZ5@2RA,ON&/\8!(@=Y%-*C2&\I $&P0B.#6)GP?9$2@QZAD:"*\*N U M[35D&N>EAI#)8+Q; QD!NT$EP>9,B,2 [LAZ#X>#DY5;:/6<Q/':+KX.MT5] MJ1T0($E)3*()0PC852<4K[\43K4[)_68]9611]Z*^ [ELTDAPA=YQTF.])J# M!=7U+EP-5F),C.;.<V\&*2@ 8LV'HR*)& YY\X&#<"JJE)PKA^EE<+I*E)*? M_=C<-\L33O=T"NVDK)..XNFE37!32SA,#$C P@EU(DT3E2R\X5U5B<GEL$4Z M*. %"@C(0 IR$-6(,@]+22Y$IE61BV1D(RCQB.'WDW@T[*0D)TD)%H9P^,KO M) 8YP$$.0+#WOF=3(,O+D!PD&W#/Q^0_+2$0>9OXQ,[?TO)D7I/<R&S=.898 M7K^C\$@Z1Y:8#_GVKMUT4SVY(S/DX93%<<F.G/34ZR(&6Z01*ZV0D_6R9/HP MAB,*';3_DIB$KVH3$4'.8"*"O_IQ*7EY#L[D()KLD*TH;T'*&I@R>\ +GB & M@1!- &VYMG@3T7@8H1$<(7D#B&O2AGD5H7DCD$T#$3,3\4>5$3L613R&0DA5 M=F6O B2Y82*X$19HH3>]!04@T ,@\ )[(0<OL' OH!]PT$03. 45*#48*" ; MR'(>6!0)QWLCER_JY@1#P 150 1%L((M^((OX"<>9H,4N#:^8@89V#(UX8-4 M!H0@>'='IS=,D 1"L!HLZ()S (,RN'!CX )A((4X2(4[J($1TAJ.8QFF%6'L MY$1!( 5'4 14P(1I$%TXH!(C0 5[V(=_R(*!" ,RT%>$:(A\Z(> J%=\90-N MF(,7R"U7:%&)%4M%L7"BM@9=@B0SP!JN 1M2Q#XCT72^DRA9 T\1Q$18$(9" M 5!, 1+P(01<8 600(D\ )DT!%\X%)W$8H),(%5(#P\0HQB$(I/ 183E4'_ M(XJ5E!.$2(NVB(M,"(KVE@#>B(S"XV!R4$,1(86U\Q\<A(D"YXHWLWYSHA)$ MD 1&8 13H(O(\R1HX )CT'Q-- 52, 3UV ,)4#T"L7H&09!TX0('>1V>1" * M:137@3T/"41<91! Y$ /R04JD0!$! <3"76;])&_L1\B.08 (BH6B3PM82(& M"7;ND9$;R74=*)+YD9 I*0==%UDW"0<,MP8B>4XMJ10G"9-8P)'(HQ0BN2D^ M>9-6IY!-] 1"H 0!.9!V@I&=9"<)>95MT)#?H942^72_P55@69 N$!,:690= M698T!QEJ"40D.99#"98K>8)@N3QJ>99&B9,S"98UZ9%\B2=MB3P\*0<^"99 M&9CY @>B8I8Q>93(@YA*B9A-N4HJX0)34 7SF 184 13H ,@H)8/Z0($H8^? M22)84)F",0<ZL)$D@ (I.!PMH((M0 2M"8F(.!PDH (/.8RMB8VWN 3#X0.Y M699-] 9BH 8"HIH@T)I0*94IT$0(9@8ZD "B]&<M$IW$\1AY@%8;"03_UYW_ M!P)!("9EH0<8Y!(V,2##EVW) 3*>.!12<Q\J\FGWF#2A"$LQX0+Z"9X"01 = M\7"(@1/PM%GJPBYU<%+ LS-&P10G%GP\\2DNH'D)X)W]V9W5F6 ><:& %BO= MR3G6Z0,>FF"BB2+=^1;:B5;H]6<CNA,ANJ$X,HPX,1)^)J(<^!C%&9W3&9W$ M691W<A $H:%/H:*4B04MFJ-"NIPHT)Q3\)P\.@8^>IW6J:,QP9Q1N:1-9*+E M60:>B:7;^1UCL)$]V@($P:4H2J9>VD1H1'!LX)E4ZIP;61<.8X8P"(4TDA'U M>090XAOXJ(_\6)2;T6IV@*2T. 1O8B=O^8W9M"K<Y"H$R68$MG9RA!35PY4; M^:=:$ZB]*8:$NIP_T$2@5I9&Y9D*P1 WQ7F4AWQDYX!\-J. )FAR%:0BZJ1F M2IJM&8_SN*1(ZH\ R:0<:50@@)>$,:HB,7F(AZH-&&VKJJ*N2FB_NI&$H:.R M2IY=2IK BJ2V2H_#4:VMJ:NXBI<^\*F'LQE-%%1OL9I%F1PIBJ$MFIU9FJXN MRJ(Z&BM]IJ(U"C"ZR4;^UY^$AQ"L&FB#!@,&>!*.IX"1]Q']NJQ, H$HH1)& M #NAXHU.X&DR<4]<@F *-"_OJ7L3ZQ JT0(>^[$@&[(BFP B6[(F>[(HVP+4 M8ZC\,0<Q$"@R<!5ND +3N05NT ,TT 6>21B$(0,VD VVP,R4 ,ZR[,>1P- M>[,[(P,YN[,@< ,)L'50YW4N"[,TZXW7(P,]$ 14\ 1%4+0T@+19N[5=JP5@ M.P-1BP4R2;4OFQ0QVR)7.[9<^P1:P )*"P-%.P,YD+8(*74W8@8V4@=F\+8S M6[,WV[1&ZW$UD+1"2[1.ZW$RP+A+B[B$ ;52^QOT4;5N>[5 *P,J,+=?N[,S M@+9;X+ES:[:BB[:7VY=)U[9S0+AQ>[A%:[0SL+A!.[2SV[-[N[)M4) H<+JE M=A5#&[=CT ,G4 0GD+NY!;3%>P):D+Q.ZS-I>Y%R\+ME6VK$:[S(F[LS /, M:[S/R[TQ,+V"V9,H( *S-!$AHA/TEA0T>ST]T'XBD+M#"[1S$+^_2@=<( =< MX ;SZYFC2[[TY[O *QG9>P)! +T\V[W?>[P*W+,XT,#AZ[3+>[E*8;UT&RAQ M>[_J][\\6P-0"[\BD <>3!@@;+_QNP9LT ;/ 0<>3 .[BP75@STH\+=7,5=P M:[@XF[N$$0,A?+=,F[N+>[EA-P><"[^@.[LS,+Y(7+9*K+KY.G@!"*N ]J6[ M*+ )"'D=\1'02A(F$8&$2*<CP0,ZL2-O "52@@4C(,9-<J=H',;Y\2=C7%;? M$25P?&9C/ =\] )<DQ-OK,9L3,9[3,=S8L>GB1$J0"A<6 =DAE"Q)#5_@54& M(7)RTTCL=B*FQ5E9ET0$X6HW$R%G 1D>]"2$H0* A\@@D 68W$$6N(Y[@4%' M0P=F_(RC)D"IP7'3@@+YY" 3H28A8A>9(TW=8\HJ\0*)/ *>7$=,L 1?0 7: M: -,0LRHW,=6XE)*%E.3L@9?0 <5)<V$F,R$X@1.4 12P 1/\ 1K\015X 1_ M*%< >\C('&TW0P5)T 1%\ 5%L)E#4 7T_ 1.@ )X "'#L0?>F !G21B$C (F M\#Z,D0([4- &K1*$ 3;<L8UO($I? #/945$>FP8>P8*%!@(IX(T'S;,4K09, MF 3B3,[FC,Y#H,[LS-$M@-(^ -(5-=(E;;1D4"E^PX(T10?#@0</7= EG= F MT#L.#=$1C04(S82]XP)T,&)?T"8WA1 ,K5]1/0=33<=#7=)]8(/@# 52H-)4 MT,SU7 0 ?4J.8\DN4@8#3=(271AGC<_ZS,])X,]IK5HV,4H2L<WWE-1+_:Q+ MD1UF<+Y<0 <EH)PE0 ;]V[YM71M[O8M^7=6J11<C\@6O RK6--EEL 6;<09S MT 4.W:Q,#0)??<B)%7,"\:>@NP5=P(0B$ 1CJ(0B8&AJ>RFJ[:NGZ]JP+=M# MH(1&< 1(D 1*L 1,T 1.@,Y1( 530 558 57@ 59H 6U[:FX[:1,T1Z6G0>8 M[;#6E-?/!P)ZP*3971!7$=YZ8-M[$-<ND3!"(=0J<=HQQ!3U@07K7=II)(<C M9HJ,41MP8=N$4=X#E=$GLM%Q'2/9O,V5K1O<G=FQL]ETO 4Y"^#6G#2-0N$( M+A4*7B!AP-=DP-D4GMI.NMJ<X;);L,1=$.+7+1F^^KHGCK<J7DTC[JM_NP63 MF^)Q+>(L_J=_*P,VSH@3SMYE<$B/,C<+E 97H0847MX[O95YL.0+% 9M&P9O M&P8S8-O%G,@?"P)&P'_#<]$GI=$MTQM$9F1>\27WZ!-?X]V9DCE"=D^?X[$@ M(,V$<1T,WMV:'12<O05XRX2%%M=V?MD.'BI['@.O;=-Q3=$#+N9,: ,5%>@- MSN9N4.BO;1)'R,S.O 0OL#,5M>@%OA,KP((RP*1&2\_V3-=%L,_]_,^0CN</ M'A0H(.4I4!O;[>J$'N&&[M!Q;>KWG,^I;M=XW>J#_MU2?DJC3NMW/NQZ'N$R M(-H4SNNHKNIWS>JUKNQN$.M37N4S,.L++NB2ON<SX.QQ?4T^[<Z$!@-,,.?= M'NEY/NG,+MHMV"67WLS:F,B>_BE 3>%P1]CGRP1@?B_9X9F+S0+G?MA4<#DZ MEBB2CBZ0(?#D50(Q,!%[T=A-E0#WGAU7\=-,IQ'NG/'9/1PHX"5S /'G/APK M (U ,IL.F$INN';,P'(>>-BA1;3N=/,=AT4-COQK*M"[,R2[.-[?*$(=9D M;=;VC (SW[H@</*N^[8TP.V$,0-7(0)!F[,B(/1]-M;L;/1HG?2:^[I+[W'" M6P-0+_7N=KM$>_443O1;S^M(S_,VG$&"^[:3R^UF3_5 ;/4NG^4Q;]532_-R M;O/[GO/GZY8MV_1 [[]8S_9E[?:&W_/BV;5%P.UO2_6O2[9>VP5J']>,S_5) M]_>0?[J4/_5RZ\2;__):+N=K"_@((?@XK_.K#_FO^_,Z$/1KK_6-?]:?KY=L M>Q4%O#-V3_J7#[QWJ_E[C\I;WK=]/^>G+-C9K?-]6\."&[B#2_NV']<S;!G2 M#[@@@,-U3^'93P?;_[;>#^2+C_N>'_UQW^-7\?17L<"D+[NG/_3H[_;J/_UR M7_T@,+SO'U+QW[C&[_85/?N'E?P6_F-_'L?\786[%[1NW.GC>UNN(RT_U_?\ M"A_4R5R(K_8I/A4WD@Z?[Y-\YV\ ZKZ.%/I H/ B?:9+\@7 ' ?Z-)?H$X!M M;P1>0*GCLL)>VSI=-G#TG;T42+<"8 * >9^"HZB(B>#-D)_J0QY]:0(VOYM7 M 46 3,* /B^'73_\U@)O8-D*@3'PZ#U!&F@%,U@(*7O_3^_!P-RG!9%@U"F! M7I#_^;^S=[-PUP,T@@B!(#D0)1C7!A_TJTK5JX"-@;&7^.9?UA.!1T\.YL'K M11&0%Q]<@*2O>6TO/]CY"&#O<B 8K&Y1A.=U"-<@U6M>X>L-PKP("'7F8,U; M@G;0 @*E2(B]-" CK'\R<!06, >F R^A]DI>IQ 0HC7J10HGX0EHA5L $\+" MX[<)CZ <&$RBZ!/6P=<G"H$A"N "Z LMJ"]$@@PUF"G$@F1P%I8OPG2^TA<Q M8E]3S]W@PON%#'_5_(J%65 :_D+SE0QIR36D ^VK_1RV_17T3N#9XX;J<!VR MP_Z%#%<@ZEM^2@$HT<'2%@J=(/)0A81P#/1!:.CY\B$!(X0([!:Z0U>8$.TA M_9.%NP\@>D%6N!!SX2MTB'\P'$;$@S@1GQ<NU(7V$ +Z0J6P#YT?O_.'Q600 M>D$C]@S'8$%T3"I1$G:P;=@#D&$8J(?@,!KNO@M6P$;8U:N(\# /X$2"Z/A@ M8BT4 2J,A8F2G[C_A%]-1(HKK(4-12P'!R'2B+%#PI ?$L.==Q7%7]S#885K M"CY$C1C^MM\-:W]0+^J%08S8"'5?6?R*5Z'N(4(VV ,<("],?7Y/:[B'DL@$ M3Z)2*&(#T2461;UX[4 7MVM;E@_S?:V<^!()8R0\C$[Q=(7$TF8;1 0*4'FV M[:M%,0!4>&:5%6,\%B&++:"/X!F]6.;A>V:J,THK%(6>JLF&B4[:QCVA%'D" M:FC9)<D)"4":&3-O1$[F3$M9+0+"X.@9;7/SQL7BB%14S 5XHR*XQN*8AVEC M9NR/$8^D<1/6Q-0!:_)L)#2!(#"+5-H2TBO?+#LF""9 !!+ .XMGBF(DC+,K MD !B0'A,CX7A"CP!0R0$ID![M$1J#)Q1 20@!8J 'Y)M]8AI63<9MRO>@*U0 M+?0'+7R!RBC^?H,&^R\\80S8-A(WYRB*2KAO$RT4EK&5-/7,E,"; Q3/?5$X M!HD"?H/+DV\RS$%<N\^V!YG#&; #Y"W*.0X)J4A\E0KX;'; M:FWN&8$D@ 3 M6$(JP R4+AQ7VBAD-1J26V [=L=Q1B0#W (9*'-@2%*XZ>@4WAV4VPEP('9< MR19!%0-<48AU,Q($A 65(KX !^(:SP+!0C))T >#]UM615@\D7:N"XP]>3 MU1L./8 %.8$JP 32G9E$DX1!36Z!]>@FSP*<Q)%#LD[>R16D)_DD$^!5<TD. M+$AR(_X08S*")5MJ-0X3:5%!<HT,>(->LDN8@:K@7E# D6231(!.ZA3N&(;& MV558DVT23S;*/@D"_F1I,UIAP5"X@<)V*MODU/-WM$;,.3R"1VC:EPF DEL M5<*[,>EQ(&6"E)0DLO+)'TJ&5+P",8$GN<8/+B,U22KG@*G$$H.R"%P!5:DD M6V41>)7A<ES*2M+C*&OEF;R5/"M7O@5>"2X)Y:_\=\(2! R\<V<LD26A' [, M,@8X2Y8T*2VCM"0(U-+()86 $!2(A+0 E7V1\(F AM7NUB$=B%B)@XY5K)9P ML6 )-M%8=$PL1DR=E[)0UF$KF2@S97HLD3DJ+8.W[)6I\BJ42^^(+I4EUL,; M? 8%A "M0A0$I<U\:P4-YB5,8G0SI%D"V)8MLU0>27NY*I?DN4P4Z1+>Y4EV M22MM90+ E3/P6ZJ(9.DKB69G^Y=B$J3QJ@00*0NF^+M[>BP_.)"@<%:JB>L( M,NOD]"4 H<""_J)[T)J=S686GAA@VQ) /RP!+D %S ''=A5@IK@K2MM2*)@$ M*B ?Z:.5*DI^$T60.!1P @[;+>R;B9,D% ;^Z!\=Y]B<,Y.S<M*!R[F1DN;+ M!)?*4F:R2IH)-6UFW\29(T%G\LS"!BM3Y7 P 2; :W+-5,GG#AT+$IVW$ 00 M-)A'(UH#B/":S&\C'<TO:3KQ9M14G4X378+-J;DG^^38))O/TFRB +29!]2F MB< J>L!M"@6L(2-<@MQ<GEW"2]BCWW"2G&?J=#<Z8%'6-)=T[0QG"KB>99-$ MTH"IQQ1\(_F,FR[/&VW++>@^N^;2%)>J4B@P/8 I-I4G]B28)))[>D^V&3X) MR?\TGP$T 40X9<F$JB,;4&B&TV:M@&:702,<H>R@F^*#'LMZB4!%* GMFWY3 M _DT%/"J$ID)1:!A;X.VR1<PZM0=LM2;I\P;):[T.41U:*H<HDA4I/E0,!<E M_R4,_9L,!08$SIA0 F0 8T.',NLJK-"MJ2SGI!Z)'1FT>1I.Z&DN:V:L[)NG M+7+2@=#9OTAG:3MM=8Y27L83^7<"C[Z:8I\J'^TC'A&P$-#C&8UZJBE "3ZU MC!26YE$!B/0SN8!-ER2>D'.L4WDT 1@&1F9R E7WVG\R0 ?$@!B@ VA *0(] MHJ=CR3DYY4CQF)T:;'@*#22 )I IB$! \#@XP./8@$Z:21N1QPD].4 E(-)= MRDM[J0K0I8F4!L0L&E #YMPNC6M?0*S-Q_F8!: 6MMQG$%PJJ1GF?&HQ4[X M @N2_KB!2C'2"EKBPGK)5 HL4RK03)\I7T K"LYNNH&,QRC@"854 =C4B$&T M;TKA5$(( $CH'<L(YCW!9J;UCL"7\"G2+,M)TQ90 V(I2 +F2K3KD5.G2D* M@*85<IJRI&I:WK#I2MJF;:";"E&C!4X7*C-UJ) $G7(0Y+$\V"G<>!DV,IYJ MU*O)4>LI%KBG,&]"_)4+09A"A$&X.!_BER$%:79/[2D^Y1'5[ M,")^*'K$$ MM: 1>"#I8"]O1 N3#K=# 0*12=W3HKI"^(]M4*H&C*G^0]_E5-GI_22J^M0, M^%2B"E2Y!0CX O61"!!5<"8&UDS+<I"M1B?\/*K4N[P."O =0"WCG2&!F/%F MEE3%IVSU#'X]V.6-HE_K>JJOZZGZU;4J'L4 6C$1=U6NPJW"&I&T7V3-J]VO MKW[5EXI/P^I8Y:SY%"[LTT363ZG /PVHR7,S[BNK2);P0!\-C7^T8+%6C&00 M#"G?$X1.B:FI@ 203 ZD"A"$4/6D%DC?:LG*6XL\IV5 P<TLB?9+=6L"4 CN M#82HB>R&5( '*'M%.V%24 KZLTW>DY,*KFZ 5W0<[N)</P5?P"73@L3I";H3 M2XX3#YJN$(.399!G<A6J9[I;1E\B#R7/0^8"DED"^ *"L#+A!#S@=[ @,6# MYFH@E8T$( 8"VH[P1C#OHX &CV8T&U("V!$L $!L)#R %BZL@\4#$#:1+1O+ MXBO81Y%I*?9UORI8.Y QD! LP%W-0WP*C7@8O4 V:24(5:U;(;(P" 30U&@ MFR!-Q38D,9 '@,+H $QEE=96 PK Y(LF)(9&XG J(B89"C$P$92 RKBQHJ( M,&8&JMDBDBX;B4:,@0N;!C;2DG6P95:-%8AR5)3VB8=E 0S%R:I9T2I6L0"# M3+!+%LDUV!R+CM#"A!6R"S8,?-@H:QGJ:'B:8GW+*5TQ/TJPMAAKM4FF$8RA MLD3K6IUK>8M^[70G]%8BJ+DR[7#EM&\+N2I74M=<YUP"X#QT83R0F$U93%H$ M-(T*5<3 6!3CA)QBA_DQD/%5O9@F4UL#[\/K0A#0%5]<D\?**?!/P"%QL): MS)/$0".R@XXY)<S5;V8,$9$&-@Q&W2(^-BE4D!"#,*HKE:@I5:[3G '7N(JT M"%(11^1(OS)'<"8$L@ 5N&=AJ DD@7;FO7Y@(L.O+2582([R 1,6!EH011HG M?<6$(MA?L^-_[5L"UC84V /;N^@"GEVP#3;#UJ"BU#D.!T=*LY'3XNZ(#=MA M!2T+$+0Y=L2>V/8F;']C;+$E,:;"+E@7RP)@;(.=L356R]*!'"M4>"RES+9 MMOL!6A;+%UA DWVY9G;!8E@D"W1Y%%VXN"Q@XQ8EY"1S:>Z.W18W=QG5P*D) M]HQFC" #8.KHLEP5T&[?[1>(M_/VRH:!!)"^"%RJY3D:!">87:C@$A(L@9$@ M+98N6-FEFV4CR!> "CH!P,($.+%&T<";$B5D]N_"@8M+: MLV>TV6FHC":B9 MVW-'P/BRMU_!NVC;DF(-Q4"!>PV]PFBJ 1M;=H7@8#&Z/.G*UET5<7>IB-Z= M WQ7((39@-!B*VWG]2X2X>&R6#(0T%QLCI6P &\G&,W#(0=:+PMPO#D6\=8- MWR&SBD?:S0N:U\8^!D^2=VT&W'V[67?B)@"FNWP_R1=POC&I?2#=$2 #LB^1 MQ;#<-_K.W>D[>I,KWJ4#IS?U^MVE>W1O0OJ]":J7E:PPZ^M\$^SB?;..]\K: M6 9Y9=LO^C4KJ!?^KE^[>W[?;]]-L&*6\!:E!*QTW2\ 5K\)EL/RG2*+!C[N M^EVQ1-;()AT9ZWTS,!M@ 7)V^H:!,B!SP908N /R@U(F6#4Q>)6NM!V\?*'P M&MH[6G@FE>10M*!Q8&DQR6.#'5)M_6(+:](RI!M<:4WMIIUS/;@,H( C+#C; MEJ=EPK,OI"97%D5J>:N!)())#PH[8>$*A4/M69G"<(NY1EM3Q5E>;>Q0MJ%C MUKI7#01?Q^MK>2:,);L)GVA+:]\KKG7#\U7;(@@R#,N@C?F!5%QB&46(@^-< MD>T9OAAM>%I4%3B\;*_EV^@:BGA,R00[AQ:.3K0=#U@$E= $H;!FP(5\C1!U MF W?X4B<AUV6WIAST79&@0 L, .4P":]"C,ODS6R#?,IDEDF,K%F+F4@D%#L M7N@PK]AK5 =&<!K8V)X&Q:IX##$&,:"16X)5KH2NO"Q808*8VOQQ-$:#K1G" M&P:LV)?$L!-RQATH$&S@%*];\=AUX6T]F[<),,?B6\2@;S?,R+!DLP3@VI#A M.W!/667RKPR7*UT%AHLG$BZ!50GY6'*8*WZ\'V0O@PUH?.'V.C)(\E=VQ,Y] MLRXXSTK<H,MB62Z,W1%*=L'V7"2+D2DRF?6Y(=C">MP'"WEQ+Q9QJ]BD!FK> MF,L@G:XS42U1]\<R2IV[>[4OAHW!2Y<$MV3(6W.A+MV0NA6$ZC(6S4MD*P-I MV&9OX MX'LAKE)./Y\FV-= D5-T@&G4^LHL5NR2X*2-EI8Q\F#*W<,JH"K_^ MJ%_<X?:KY]G*3=D@8UB0"WG;&_S9,"HYB):Q2D4&R #2M;V0U\1<!H9A78;" M&C8RO4/%)F"<7&3KLE6NM!>6];K@JLQR1T Y_KKGF I<V97!8/. VJ541>G^ M-M['"_.$8%*X,B$C4U3>RWMT5"R6Y;S*<*J1)V;\>3'PZAVS5QD+E-T@"'O) M )FO0D9\C($] !/@,=HKL6EV6@R8(S+>WTO\(6\7(D>%]^=<'SK,:&5O@T) M!=/=,<M_ 5F7-:M?=A ASOQP<7/LE3 (!TJ:A(:*D1? QE,&'DT9HH 4HPDC M F]1&K)!,Y$EYZ8L.3C#\=VO^923P%WX'"-80 S8P!G9#A#9_XR164",0,[[ MECZ;C?LLS4)KGYJ^1[<Z:^5-P963BUI&<FP9YKEE< &7*XC5A;*@US@_9K K MF9<N93Z^ %9R*%Z6L7TY<R+SS-@"7X1F<*,,,PAISKQ!=/.2W=2,F5WS F:] ML;GL<J4$6YP;LXM6SV%%&;(UXVN9D6\0)3 463H79MA<>T%L2;9#X1EXS.>O M7)_GZV609BAZ2#]GBCQW[^R3M<M\EF7XV5:3-02$1K%"5.$A]]P]VY;5-*W@ M"PV9P@91B4Q[9;!J1;255;^XUD4+6QLM#P[4#\FV"N&NF%N-\!5&PH%Z"3]J MP7D5C&N@^,*C5@P[5U,%+E:MBY$1WK5+, KQ2HK-*VN."T9EO5K7NN-<';&K MK5&PAM_LXK^,,:BK?)TC[TBWVF/K[&4ID2/*C^38W9IC>4L%[B/D7<=NP?*Z M8_#C;PG3KW$:DJ)]5 :!BY_!&6K0 O?L"5@!<C;6E% "< 'W>6FUH$16)$+& M8FDL1J9!6VLDP 2XHY<8:>"Z2=]2J2<#F);=>H]&=0KPQR& !=[UMP[7.8!> MCZY[K6;U,[Z^&2,Z,K='[P7SD'7'V+?ON%G+XR9#K1NT9^6O^#C\^>.%&_Y6 M\%Y0I1%9Z"(Y#?N>5VY PP$AN6QXX):;LF<ODN/('+ADL]B(2Y(UM&4HN?$" M5+<4Y[QT63*.Y<E/%R;_9)D\-:,950;1<7?P;MV$3:PG,PE&T=B#3%/@C\L& M;B^6/BD1@5',#'EM-.\O^#W2GEDTUVC+"YQQM/[=T;3D"WA>K(N6-L7X3<!! M.C6O;7.UQJZSC_#5^%&#LFCP&[ETL^3-%-$:+_SFCV&VEZZ-)0.O]U0W)@_B M?7VO"NB^/2=QHU?;[)%I[\>UTL3S0(6(#C02[K-7F Y>.B_8BR+ '57LM<[6 MVUH*=.LBL)'T=;LN2C34!@3H(CMH9?:;Q<L1=B$S.J.IK_\1[!YU8[HHG>XO MH*VY=1)00HM;2KL&_(NVKK0805 $ 7O\%-+0I9OS0V:Y?;I@L]E>U7N-M-7> M"0)W.8=NGIT H'3;9MQ^B@Q0:0.-N1.9],[2T=L.*6BDPJ!/F8/FHTZE27\! M[.%V<\/B+M,J6/"ZYQ5+NUE @_73=E2*%1Z*)*A?JPX&I P\40-AS1-AH4Y% MBK;OE(%#51O9:85K!@?>NG4,EQ)K(R8$%">Z4[4ZURYBMU505O6/*0ZR6AKO MUMJ8B&_U,T$2P>IFXR3#@228ZZXNN/!Q?UOP @O5%"Y 9N &.>+FYMP-ESW: M?7#(*G?VHEF/W'-)-@%GL@#Z37UL,JN0-PS)Q4F?N@Z,A"B.=)$L7^!548?( M F@6H +>V?35R3\;YO5DH?TB^$4<]M3;-.#4Q@_-M@EX8V8HWMG+!69[$9<Y M[@0VLC;J7.6&*8N6JNQKYN*0MPUG$'L3:_(XP##$543%:F8D=YP[L^2-T;\A MEM!H<TBV"?=.S=&H.6V[53*M$@[OX9E..7:@%!*47+&#*/% W!L)+:SL1#Y] M;2Q7^@+O!/T>7YX<DZU9XKC/15O%0A IK<NG=ABXP*<9;7^X5<Y^!V]U_N7! M_ L<7R+MMN.S>!X*=5F\M80W_*5/F9FVW7,:,?-IQ,R":3<"/[0+O!,:) <N M&F4K]9+@IQ&5W?,BO%LSN#P'K^Z4@U?J!2(0-;6I#;8[W)IUH"VD9[#K4+@3 M^,(E,)BB\%U'=4O P^HUVA*=]8'":[BN30K 5H=?DQ2[C)R4I(@_Q4.[X@MQ M_,/Q,?7:V$=<GB=QA)P&NOCZT--4?&1#9Y5]83^P&8_9!+SG-MDS?J97M$YH MT3D61J-PL4W*;_0I/]ME=Z!LI%L^?M-XD?W 9$!SY&3J1'K/;RX_Y!^8E^OH MYP!@!7 K3\T#!98SY8LFBL"&DZJ\2,$:&LU;+J6MNI'-ZE>6!(^?I.S5BU(S M1^1:O9?/S:2L?L7OU,;K6YT 4Y&OGH$K\#,7O:G\PTEU(D78!7 $[K@!3=#F M= />ODOLIKC3.%V1%]B]7GIUPFT>LSA9L9MV+MNK80"8_=&H'>.*9)I.B-8L MW'6S'C?.$O4Y^Z M;#I/TQ $M*O8]C:#%7A>C#HXF!<]<'L^ _&YI*W@F,LC M\?.CN4!(H*?-X%NX4:#4/R4X03@JWM1S@>U>&XZ.2F^MK?[HO7:(R("0'EW% M.:O!W[SV3DV<E]!L@9F1S1&^A-I:6W,[-_C%MI4.F9PW@-NF8FKO Q91$>-6 M/661L7!NE4BZ9>E-!(ACB?_:D6"Z@>U(,SW#UO22O)#Q]!,/[7Y\BMONF[S3 M>2Z2:[(=><2_[! L@0MXAA:QW(+9C%R1;G(=@TY5L56YY[I@IKN3Y7C0[K% M>29/Y:*>F5GT9D[JG[R",/69X=1-LXW%'@<*F(.YJ3XNQN]?#^N!74=G<Q2] M> V[!D[QY#<KFUXNSS(V4GM6NE >#DAY44*D;3(G[]L1]FIO8\U0Y*P9K9%F M41W,J768)\MG OJH'X'4*<R16D[E<7GZMLM\F[%?=:I]MK>\_N[R(=KCAF L M2X(5Q8=[P&;=KQ]RQP[-W4!D7_/2M\5[7,U>S4LP%K#T!E@@)%B[_H$G?99U M]&H7TF/@1?_8M_.85;JP?@JSC#V?R(H 'F MRBG6L8$4T ,H)"'GFUT"([< M'V#L[;B*E<"-W0)WX$4_Z4>PJ6^Q)S@%BPB#_-OK='"_Z7GZ(6/8V%R^"^V? MCN>_(20-ZAQ<SQVMTF%+/SB?0W?@$(ZG>WE[]Q_TNG/P[![0N7MB->B[%=6* M=T\-:LR["G_#D]?7OBVO@%QP3PS'X!$]7-0K,0,2VCNQS;:QK+POVZKA;#,' MM'6N^5W!7]MJZ=];"K>U-D;BV[HMZ%-+Q"VY7?!;A X[>)B@;J.MR;D,]^,= MYUL0( 2>P!&H O4HDN07\7FI!P6B<61M PM%V^."?%@&LUT(NZ0WF ;4T%* MA""I)$Y!W^((C?,?6$LAF?@0'F.+1R&>[B&#A?<.!+8E" 6R'W5B>ME?4_UW M\+)]NE#<.>-Q)TGK7KFW>\EC^)Q[$)[W>!^#<W#0A]U+C0?GX-Z]U ;\PW/" M46D*Q\.X>N$_4EB&0*J(62GA&,22"_[-D&SSB#45/LQ!-!2+46S#]7 .;^^F MV(='>)?^]RP\VR_('EF);W@F#NX__/46\5=<IV]VF#V[L3B8/[-)%^->7:/. M>#DYV/[DH%F4#U\;7;:?NN&6Y@1N/Q3Z\0M!K#Q89_3/OSJ[\H+LS?L\0:#E M2EK%TG5%#]C/-C8?\TT::+]D(/^)/$CHGLE&.WF3?TX/V:$_-8?0UIQ24@_) M <S1/T[@YL;)FS.$B3 N)L+%K]_:G@X8Y)&LSC6RGNWL?5:XVWXR/NX1,W$_ M]\=]*.5]+!9;W3W4&4KQ_KF[;Z@SE*:[J!VI[%,Q ?3M'DT[N':'J-V=U$9; MA'Y-(L3R. --)H97N/F")?](8*@U@?[Q?UY3N\)KX/VX*^WB9L1P,QQK108" MJ8V_5O6+_?1(X:'.27+]0.0D>6R+VXQB/QR8R!1WBQ/FB@NR9;M&7O'-J/<C M.9<+!] XTK:P$7<$ '+GK1?"W*?K$@QESE,1I (EAX/5E;L)(,FR<3>NHUT6 M,'</9V F'&MGOR=BQ@>.QK["O?V4IM!DCCV.E[OM,<FR<3>NHU&]^CW6SOZN M_)2FT&0BR,*X'64'BW00QD I=.^>-MF</9 7A^5Q!IH,(1_*013:T_K +F7A M[AQPY$7)1;3>1T[N@3_N=M\+>7F<@29#R(?R*7-9H)[7V_F3TJ5K8"C9/TD# M;*C??S./AWR;K?)FGCL?<$V_R[/\_M7_*IYE-Z/9C;T1LY2%NW/ D=-=$NRR M0'W<-_4N"YB[AS,P$W@].U)?[N$,-)EC+^Y'MFPWV9S=D._RP"YEX>X<<.1% MR46TWD=.[BULQ"7W:B!"Z_]3SW_*^@'VYI8^1ZC?;=S=.48AE]G?M]6#^4W^ M>X\_,_[,,EKY#V[,Z_P%>YX7)=/?S'/G Z[I=WF6A^-;%O2N;,3^QDU]GF?S MA5Y*M^<#KNEW>9:'XUL6]*YLQ/[&KWU[/N":/MK7^C=^[>UZ!4;L81[Z3_9S M3L ][@&GN(#7!;=SPNS;X8 !E[[MO!F]<QJ<%R-E<L=BL=7=2]03%.^?N_N6 MJ"=HNOMSE_ L?QJ"Q$G<%. _5Y$N74>QD1A30J'#O9VE8&T0)$N"2&'!8WXJ MU2_VTR.%EZAHX1[?A#:$!=!^%7$#%)Z/? $XXOGW-Q_)IEH#D:B$3[$&*HX; M\$QL: Y\"SU $?[)&J@X0B%2:IXB_H\OO$1%"QG>BEO8B/MS\<#L]K@CX%.L M@8KC!B"OR(T.-!XQB(!_L@8JCE"(E.W':';8B'O EVYEN/95.>+N;S[R!>!( M6EBZ5>':'Y2J'7'SK^WVN/N;CV13K8%(:A@>8%+GO-S[G7.?%^U2WL=BL=7= MD]27%.^?N_LFJ2]INHO:D>H8];V_)[71%J%?DPBQ/,Y DXGA@?[QDV)<'?;O ML<$E^\O#]:O3#%^SW?="AN)[6F1/9!4/DG^_R?Z]#,60[_+ /OP5N6*"NW/ MD1<E%]%Z;R^E00KWZ-0<$I"R/,Y DZ$I9R;SQXQA+YB!=&<O$J3R8>,(2_Z0 M/2ZYE\ATVF9_>S8]W,U] K?[^&$FY7TL%EO=O1FL2)'V[[MO,WC!"_'@UTLW M88/[>WZ_W:-I%!:U5!C@G]H1SA6L34R WZX6DRO;&![H'S\ICOQTN%I8E$&N MB\D[!O'H*]P4$X8@,(F3 U.H)DTAVEIR,YS)V3$;$"M\Y"NXG9]#7DZ_L.7A M8?\>&URRGQ]N@NN723<APR]Q]]WAG7AQ@.)[6NCB?M^N^VVW1<[B*AXD[_:, M"[)GO_M>R%]<*.1L,6Z:?;:(<,DV=VB[VF3.QSWR'S_2EM["3(1C_^RO//8O M]XH)[LX!1P[;![B%M<A9')VO^-V.HM-Z]_]WP ,E6^^Y7N7_-_G'\E1>E'CZ MRJQV)[M@K\ZS/LFR\7K;F<.YY6<*U<3"Q8Q+;E0Z_WX]YT%=SW;V/BO<;3\9 MQ[#9^P6[<]%>]U?K%DSN6"RVNGLS"&D5-73O2XUZM]Y[,T@?]+V_Y_?;/9I& M85%+A0'^J0WOJE8O0&]7B\G1L(G8$AF_+QA\R'_#+[%Z9^_"-B9<?$&,0%" M+^$+8R.+!!S+SQ2L#1DP(O0G#/"12TPK.+Y]_\#X?=J*?/X.E2L(8CCY 5[E M1^'IX5P/_)![^2.?B\Q\DZ'ZQ7YZI/!FD.YC@2+^CR^\&72XL1\A2]^*JTH) M<\4%V1A7U&?VSBYRHT-.(+&(H0R<W!M/QBUR#<,#,!</[-\XGLCF./MWM<F< MC OU&H8'>O^*+[I)&^GN>#@N(ERRS1W:DU<HXWBDO<E_[_%GQI-WR3-_4^[D M.=+-5O.3W>)5>?*/Y1N]_]?U.L'+MWHP3^DMGO_7]3K!D+MXQ RW$;..[O&) M;(ZS?U<[-3UT$#WS:3;-@WJU7*5M>NY5Y@[$.!_I>/RLE7.[8,Y-FGSK:*W2 M=_M_WCV^C9MO?V^]<%+ !IW/Y+(<SZ-U/=_]_YV?IQ].HS8.^O _U\>%\C;, MB5[3[_(L;V-S_38K\Y$^H+GZ2L]_4OT%_NOTO\V".4\/_2<[ ?>X(Z#>PKR+ M_\6%0LX6XUTBW,@K[-%"$H5- &W#(?E>>Z\=T#IY(C,U;3T^C(NM?1EZ0V!. MOM>>(2#Z-W\U+(- Z/]Y=YM+;0V\V_&_Q?/_NEXG7 W^D^K1 *]G<0$!X-9H ML('I^VZD*N=>OM6#>4IO\?R_KM<)4AN17^ SGV9S_3;;]=[<UP-[SR3LB7VS MU[85)<DN^V;/PHTFM'?F%YA]B(&57>WA^);E4=G>S@9PB@MX77 [)\S$_=SG MQ9R4W+%8;'7W9A#O1]J_[[[-8. OQ(.?]_&'PC\U^GTTC<*BE@H#_%/+^.&W MJ\7D:-A$;(F,CT$\^@H'>^35U$:(S2#Z'S\IQM4X7)%QHN0?Z'?V0& ,5L.Y M"GA7B\D)"&8A#T#&JG(170P:6 93$)]5GR$,B6BK<2RY&8ZU)T,7TQ,977XJ MW.- -4*!$QN5SM](HFV$H!$7!/.+9DK3+IASN0TXEI\I6!OR<OJ%+0\/^P=[ M)#!M=+PSU+%,9L?*VOI8LHN_9P!&P W_!)?U\S[35,3_\84W@[#?=BMQZ5MQ M52EAKK@@6[:;;)9==*>OSQ81+MGF#FU7F\S).!8OND%]Q1?=%HNTK?H:;^-Y M/0$06\Q&:8ZUL[\K/Z4I-!EB"R'*#A;I((Q!,N"(KFWDC3^29\:?648K_\&- M>9V_8,<>P-P]G(&9P,IA>^L]VST^D<UQ]N]JIZ:'/F78 YB[AS,P$]1RE;;I MN5>9.Q#C?*3!/RU9TLRY29-O+>__)<CVSP.\WLY#;W'!9@A]FQT7S/SZBW4; MVV== C!W#V=@)JA_FSNTC?G[3^:[=U,P\TTO[=LLF//T]O_PG.T^ZQ* N7LX M S/![OC_Q%ODC[KE[N3R.4%SZ07-M5'YM1^R<=_4]UF7 ,S=PQF8";S>5]RC M,N#%@0Q@2!K+XPPT&9HROH?#[D4#5=M(5RJX@'_=XZ'WO=F;V&(V2L/KO[DE M-\.Q%N<&A(H1G(.HJ,_LB)DQ!S2N*ZPA<],VT228V&KS)KU*]/91_]I(GAFW M&I;!%,0GY1W;33[Y)@!B^P4$[O]^Y+&9V'X!@4ND'8AQ/M(7/WRW"^;<I,FW M^39*Z'M*^U[<[;[E/-B8W_:9:Y\R8JO-F[1J"MY&R3AI>SJP@@&O"V[GA'FV M@^2B6^[]SKG/B\ PN6.QV.KNI^%2BK1_WWU/PZ6T^:.I4C"&^M[?\_OM'DW_ M?0AWK@C]FD0(AC">84H,=T6M%I.?6UU,WC%(#8^V*[P&W@]ES%X#_>,GQ9&? MO0O;F&!?-?J/C=Z+PVE@<J12&75"KMZO]]C@DGU@Z/J5 C#,\%:\XJI2PEQQ M0;9LU\@GOH;A@=Z_XHLN :?9L]]]+^23S/@)^5 ^VGU<U&?VSBYRHP.-S]EB M',6V2ZLK=Q- DF7C;EQ']_A[Z^SORD]I"DV&V"X,70,:(@B.E[OM,<FR<3>N MHU&]^CW6SOZN_)2FT&0BR,*X'64'BW00QD I=.^>-MF_%Y!#7DO_4YI"DR'D M0_E)+W*X.P<<>5%R$:WWD9-[X(^[W?="7AYGH,D0\J%\REP6J.?U=AY!K<TZ M .AK(/"P]*:E[_Z;>3SDVVR5)_]8_FQ7Y]S/V3TR]D;,4A;NS@%'3G=)L,L" M]:P=.PNB1TZ89[N&K^T&N\TNA *NVV/V_:ZS+WB MW/"3-Q//?\IZP?8FUOZ M'*%^MW%WYQB%7&9_WU8/YC?Y[SW^S/@SRVCE/[@QK_,7['E>E$Q_+X_5LSP) M5NT%ECI=?[%N8\EZ89?-:%W/%_JZ+G<7/6)_XQI4;93V DN=KK]8M[%DO;"# MWFB/V-\X5S>_BUW31_M:3WX__60GZQ#8D+MX=@YX77 [)\S$'0N0]O-[VA6P M:J<#=+NLWFW7KIT3<VSWR!X7)^?G[8W; YINC]GWN\Z>\Q<\P-LY82;NYSXO M'J:\C\5BJ[O?JK0UTOY]][U5:>OFCZ8&$1+J>W\_T%\&J8VV_HYS9P:F$%H@ M.G>=Z)*A2^0,4SVYH>EZ#?0@7?6+_?1(X;>J W']!M&!9/B:[;X7,A3?TR)[ M(A>E%F^Y:6_(C?$DMLRAV'89Q:,][Z_<)SX$#W_;_<>/M*6W,!.!D*-PHPGM M:7U@E[)P=PXX\J+D(EKO[:4T2.$>G9I# E*6QQEH,C3ES&3^F#'L!;-BGOV) M3)*_E5/3&RRY&<[D47R7JU+(:^E="A5YZ-M5HH=FBJ[,9=ES9N0<R9'373B^ M97DU=A9$9IX[AVPI'OQKN\%NLPOAS1+HF'V_Z^PY;[$RPYN3*\ZP(US"JQN? M-L$ID'$,2Z=M]K=GTP]Y)"-FXG[N\^)0ROM8++:Z^Z.DF/P^!7??1TDQ->H9 MCJE':F*Z=OK>W_/[[1Y-_WT(=ZX(_9I$B.5Q!II,#*]P\P5+_I' 4&L"_>/_ MO*9VA=? ^X$8X$04"<\QW S'6I&!0&KCKU7]8C\]4OBCI)A<OU!23![;XC:C MV \')C+%W>*$N>*";-FND5=\,^K]2,[EP@$TCK1;?,2ET\0SQI/8+RX4<K88 M;RD7W^K*W0209-FX&]?1/?[>.ON[\E.:0I,AM@M#UX"&"(+CY6Y[3+)LW(WK M:%2/Z?ONL7;V=^6G-(4F$T$6QNTH.UBD@S &2J%[][3)_KV '/):^I_2%)H, M(1_*013:T_K +F7A[AQPY$7)1;3>1T[N@3_N=M\+>7F<@29#R(=R$$W =#K. M/^_WS^C !IW/Y+)<FKDL4,_K[?Q)Z=(U,)3LGZ0!-M3OOYG'0[[-5GDSSYT/ MN*;?Y5E^_^I_%<^RF]'LQMZ(6<K"W3G@R+>ZRP+U<=_4HWI,?X"]N:7/$9B\ M6M:4"G(_]D3QZ.X[=V6W[(],F"WL'W>/BCQ 4-E@\<AK=B*3Y&_EU/0&3-]W M'S+-)L[:5_;GV)'/18J"^DVO1J7S\^QS3L ][@&GN(#7!;=SPNS;X8 !E[[M MO!F]<QJ<%Y%2WL=BL=7=PT2_3\'=-TQLU/W<1OJ&"Z;O_3V_W^[1]-^'<.>* MT*\)%DG$1@+TNVJ5SET'Q48/](__\YK:%5X#[P=B@!-1)#S'<#,<:T4& JF- MOU;UB_WT2.%AHNL72LC#8UO<9A3[X<!$1DO:%T#\7C@OG\N.B9@+V[A>D>^* MJTH)<\4%V;)=(Z_X9M3[D9S+A0.S6_:'W!A/8LO<SO;0>YJG/W,0C)&]LV5P M&*X:DY];9V\T_SK]W^H]_MXZ^ST1,SYP-%ZVSA?'(VT+^\>/M*7_*4VAR1#R MH1Q$H3VM#^Q2%N[. 4=>E%Q$ZWWDY-["]HP:!@=FG>VE_3^E*3090CZ4][3) M_KV '/):^I_2%)H,TTO)'GI/BVP-_YP9.4=RY$7)1;3>QLUR>T8-@P,C#>;Q M 9<UC! "'WA=PXCIM921ST4.3,;@"[OEEW5JTTR9701FN[S'NBCP 9<UC$P" M'WA=?. J'!):?%*><L41]U7:S'-GVON]]<)) 1MT/I/+<N',>@^XVHH!H/ZT M>]BS[2(PV^4U\]SY@(/>:%_#\,",S;(N"]3G6/FC?DN*J\;D2 4A( _QX")* M"QG'L"X7#LSN=.Z166[/J&%P@%=!7] [?BD]1XH!H#[NFWH7@=DN[V7OO1'W M@-O9 &Z[/>X!I[B UP6W<\+LV^& 9>^[;P9O7,:G!<C4]['8K'5W2./R!3O MG[O[1AZ1:;K[<\;P!M; !O?W_'Z[1]-_'\*=*T*_)E@D$1L)T"\"5 2!;3]* M:2]Z!5/L/=Y AK@F+"+:WHKJ,#"VMD7!Y,IVHP?ZQT^*(W_8O\<&E^PKI7M\ M$]J0VM*5T\D%I"_SZ/J5@E+RV!:W&<5^.#"1*>X6)\P5%V0+?Z1M82,NT84# MO*K#1EPZW;#Y1=BDFDS@*FA>3\^19 P=P]G8"9 7L+PC?E;-^XT],GQDW$E MKBN_^D'F[.JX*&BLVF@;J$1ZT!7)M^E"WCA*-^:X-'M=P-P]G(&9P.O9D?IR M#V>@R1#RH;RG13;+;D:S^X^[QZ($[6E]8)>R<'<../*BY"):[R,G]SH:U& V MP' X),*Q=O9WY:<TA29#;!>&K@$-$43<5VF;_E.:0I,AY$-Y5P=U/8N86WS$ MI=,VV[V%\?)#-=.=-+L5U0'4\WHV#2 RQGO:)ZS#*=R*ZC P+L9<K_+D'\N? M;5"#V0##X6C-$MGEPH'9C;T1LY2%NW/ D6_U6U$=0'T3L7@+X2##V?]\QNNT M>POCY8>_9=>4\08RA%"09DK)/8!Z7L^.)L(@3QEO($,(A;E>Y<D_EC_;H :S M 8;#T9HELLN% [,;>R-F*0MWYX CI[MZ_0UDB$DWV6>];I>Q;)QAV]"6</FM M3>G($$*!C,\!7:GAO[=>."E@0T406(9GKW)TA-;_MPV58C; <#AB+Q77E;^W MWLKQ1G%V4NP7[PKC$T6<'6EVS@FXQSW@%!?PNN!V3IA].QPPX-*WG3>C=TZ# M\V)3ROM8++:Z>YR#'-J WZ?@[AOG((<VT*AG.*8>J7+ ZFQP?\_OMWLTC<*B ME@H#?$E:?^: @B'X'9WTH_<X7"U,?V% (-Q"JV@@HA!MYU#]F0,*1GRV%"U= M=DB@$9%#".2@W)3M4G_F@(+YO/%=X^<,?+\<3CHI8:]#(?$P!8-1\-F[L%VU MT79YG($F$\-E0OV9 PIF6GPJ@)\ ;OYU43G*&(3T_)\?]*V#I2#ZD,3HSV+W MX#9DC7-E^LG%Z5<-+,(PI/YI2 T_@H4H%PRB]<'W/.[Z/ @]LYQ@$FW#2(VO MMBUG@;CP5P%6S-5W-[7W'N<@!^50^"%J=Q_H5#C:8LC=2AABWV#]>0!NMQ*& M+UY32.K=3*P ;K?"48(+SLB^U3G["E?MG]75MX_5J=NW.AD>0.38V.(M1-&' M9PP< G0#C]@W'(QFQ56E+A</\*J*JTJ)+A[@5157E?Y</(#&IP.%-X/2_]!S M)#CP>_-VQ56E1!</=%.8%\J(QS?>VCG"S142=;H<K.YTH/ DU3W09;L,('XO 'Y"[W?@?P %6E end
hall@cod.NOSC.MIL (Robert R. Hall) (01/14/90)
My system (an XT with 640k memory) must be what some people are referring to as small systems, because I was unable have all the files required by Makefile for /usr/src/lib/string to fit in memory all at the same time. To get the makfile to run I had to split the pipe string into separate statements. See enclosed patch for Makefile. Robert R. Hall hall@nosc.mil echo x - makefile.dif sed '/^X/s///' > makefile.dif << '/' X*** Makefile Sat Jan 13 12:13:57 1990 X--- /usr/src/lib/string/Makefile Sat Jan 13 12:11:22 1990 X*************** X*** 32,38 **** X .SUFFIXES: .s .x .o .c .y X X .x.s: X! $(CPP) -P -D$(TARGET) $*.x | $(LIBPACK) >$*.s X X objects: $(OBJS) X X--- 32,42 ---- X .SUFFIXES: .s .x .o .c .y X X .x.s: X! @echo ------------------------ $* ------------------------- X! @$(CPP) -P -D$(TARGET) $*.x > $*.i X! @sed '/^$$/d' < $*.i >$*.k X! @libpack < $*.k > $*.s X! @rm $*.i $*.k X X objects: $(OBJS) X /
nfs@notecnirp.Princeton.EDU (Norbert Schlenker) (01/17/90)
In article <1753@cod.NOSC.MIL> hall@cod.NOSC.MIL (Robert R. Hall) writes: >My system (an XT with 640k memory) must be what some people are referring >to as small systems, because I was unable have all the files required by >Makefile for /usr/src/lib/string to fit in memory all at the same time. >To get the makfile to run I had to split the pipe string into separate >statements. See enclosed patch for Makefile. > >Robert R. Hall >hall@nosc.mil I have had a few email comments about this, so thought I should post this. The /usr/src/lib/string Makefile was written to use sed because (1) the existing libpack doesn't remove blank lines from the files it packs and (2) the 1.3 grep binary (direct from P-H) is broken with respect to blank lines (i.e. regular expressions of the form '^$' don't necessarily work - this problem disappears if grep.c is recompiled). With large binaries in the pipeline (both /usr/lib/cpp and /usr/bin/sed qualify), the pipe is a bit hard to run on a small system. Here is an alternative: a version of libpack that gets rid of its own blank lines. With this version, the sed can be pulled out of the pipeline (the Makefile has provision for using this version of libpack - look at its macros). This libpack has the following advantages as well: - it deletes trailing spaces on lines, making .s files slightly smaller - if you specify a filename, libpack writes into it rather than onto standard output (particularly useful for people like me who always type "libpack file" instead of "libpack >file" - it uses <stdio>, so there is no limit on the size of the file being packed, and all that crufty buffering code has disappeared It has the following disadvantage: - it uses <stdio>: if you are using the vanilla <stdio>, performance will be much poorer than the existing version. Upgrade to either Earl Chew's or my package. --------------------------------- Cut here ------------------------------- /* libpack - pack ASCII assembly code */ /* Packs common strings found in PC Minix assembly code into single */ /* byte abbreviations. The abbreviations all have their high bit set. */ /* Do not alter the order of the entries in "table"; asld depends on it.*/ /* External interfaces */ #include <ctype.h> #include <errno.h> #include <stdio.h> #include <string.h> /* Constants */ #define MAXLINE 256 /* maximum input line length */ #define ABBREVS 128 /* number of abbreviations */ #define COMMENT '|' /* comment character */ /* Structures and types */ struct node { char *string; /* pointer to original string */ size_t length; /* length of original string */ struct node *next; /* next node with same hash value */ }; typedef unsigned short TWOBYTES; /* CHEAT - used to return two bytes */ /* Local interfaces */ static void error_exit(/* int rc, char *msg */); static void hash_init(/* void */); /* initializes hash table */ static void pack_line(/* char *line */); /* packs an input line */ static TWOBYTES abbreviate_string(/* char *s */); /* abbreviates a string */ /* Macros */ #define HASH(word) ((*(word) + *((word) + 1)) & 0x7f) #define HIBYTE(n) ((n) >> 8) #define LOBYTE(n) ((n) & 0xff) #define MAKETWOBYTES(hi, lo) ((((hi) & 0xff) << 8) | ((lo) & 0xff)) /* Static storage */ static char *table[] = { "push ax", "ret", "mov bp,sp", "push bp", "pop bp", "mov sp,bp", ".text", "xor ax,ax", "push 4(bp)", "pop bx", "pop si", "cbw", "movb al,(bx)", "pop ax", "xorb ah,ah", "mov ax,#1", "call _callm1", "add sp,#16", "mov bx,4(bp)", "push 6(bp)", "mov -2(bp),ax", "I0013:", "call .cuu", "mov ax,-2(bp)", "add 4(bp),#1", "or ax,ax", "jmp I0011", "mov bx,8(bp)", "push dx", "mov cx,#2", "mov bx,#2", "I0011:", "I0012:", "push -2(bp)", "mov ax,4(bp)", "mov ax,-4(bp)", "add sp,#6", "and ax,#255", "push bx", "mov bx,-2(bp)", "loop 2b", "jcxz 1f", ".word 4112", "mov ax,(bx)", "mov -4(bp),ax", "jmp I0013", ".data", "mov bx,6(bp)", "mov (bx),ax", "je I0012", ".word 8224", ".bss", "mov ax,#2", "call _len", "call _callx", ".word 28494", ".word 0", "push -4(bp)", "movb (bx),al", "mov bx,ax", "mov -2(bp),#0", "I0016:", ".word 514", ".word 257", "mov ", "push ", ".word ", "pop ", "add ", "4(bp)", "-2(bp)", "(bx)", ".define ", ".globl ", "movb ", "xor ", "jmp ", "cmp ", "6(bp)", "-4(bp)", "-6(bp)", "#16", "_callm1", "call ", "8(bp)", "xorb ", "and ", "sub ", "-8(bp)", "jne ", ".cuu", "lea ", "inc ", "_M+10", "#255", "loop", "jcxz", "ax,#", "bx,#", "cx,#", "ax,", "bx,", "cx,", "dx,", "si,", "di,", "bp,", "ax", "bx", "cx", "dx", "si", "di", "bp", "sp", "dec ", "neg ", "_execve", ",#0", NULL }; /* This table is used to look up strings. */ struct node node[ABBREVS]; struct node *hash[ABBREVS]; /* hash table */ /* Code */ int main(argc, argv) int argc; char *argv[]; { char line[MAXLINE]; switch (argc) { case 1: break; case 2: if (freopen(argv[1], "r", stdin) == NULL) error_exit(ENOENT, "libpack: could not open file\n"); break; default: error_exit(EINVAL, "Usage: libpack [file]\n"); } hash_init(); while (fgets(line, MAXLINE, stdin) != NULL) { pack_line(line); fputs(line, stdout); } exit(0); } static void error_exit(rc, msg) int rc; char *msg; { fputs(msg, stderr); exit(rc); } static void hash_init() { int i; register char **p; register struct node *np; for (i = 0, p = table; i < ABBREVS && *p != NULL; i++, p++) { if (hash[HASH(*p)] == NULL) { hash[HASH(*p)] = &node[i]; } else { for (np = hash[HASH(*p)]; np->next != NULL; np = np->next) ; np->next = &node[i]; } np = &node[i]; np->string = *p; np->length = strlen(*p); np->next = NULL; } } static void pack_line(line) char *line; { register char *ip; register char *op; int in_white; TWOBYTES n; for (ip = line; *ip != '\0'; ++ip) /* translate tabs */ if (*ip == '\t') *ip = ' '; op = line; in_white = 1; for (ip = line; *ip != '\0'; ++ip) { /* pack strings in line */ if (*ip == COMMENT) break; if (isspace(*ip)) { if (!in_white) { *op++ = ' '; in_white = 1; } continue; } in_white = 0; n = abbreviate_string(ip); *op++ = LOBYTE(n); ip += HIBYTE(n); } if (op != line) { /* finish nicely */ if (op[-1] == ' ') --op; *op++ = '\n'; } *op = '\0'; } static TWOBYTES abbreviate_string(ip) register char *ip; { register struct node *np; for (np = hash[HASH(ip)]; np != NULL; np = np->next) if (strncmp(ip, np->string, np->length) == 0) return MAKETWOBYTES(np->length - 1, 128 + (np - node)); return MAKETWOBYTES(0, *ip); }