[comp.sources.amiga] v90i196: ls 4.0k - yet another unix-like ls command, Part02/04

Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (07/04/90)

Submitted-by: kim@uts.amdahl.com (Kim E. DeVaughn)
Posting-number: Volume 90, Issue 196
Archive-name: unix/ls-4.0k/part02

#!/bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 2 (of 4)."
# Contents:  ls.uu src/ls.c.ab
# Wrapped by tadguy@xanth on Tue Jul  3 15:22:11 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'ls.uu' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'ls.uu'\"
else
echo shar: Extracting \"'ls.uu'\" \(22474 characters\)
sed "s/^X//" >'ls.uu' <<'END_OF_FILE'
Xbegin 755 ls
XM```#\P`````````"``````````$```Q9```#%P```^D```Q9)$@D`$GY````;
XM`$CGP."9_``````@/```%#PB/``!``$L>``$3J[_.DJ`9@``"$S?!P-.=2!`=
XM)$`B0"`\```"\2#<4X!F^B`<9PX@2='<U=`@BB1)4X!@\"A)V?P`````3-\'B
XM`RQX``0I3@O(*4\+S"9N`11P`"(\```P`$ZN_LY*JP"L9B1!ZP!<3J[^@$'K,
XM`%Q.KOZ,)`!G``":3J[_?")"3J[^AF```(Q#^@"H<`!.KOW8*4`4.&8$<&1@'
XM7B9K`*S7R]?+)FL`$-?+U\L@`G(`$AO0@5*`3KD``"8(2H!G1BE`"\0B2R!`9
XM<``0*___3KD``"SJ#$(``F4.$/P`("`"(DI.N0``+.H@;`O$3KD``"'X<`!@K
XM!"`O``0O`"!L"\1.N0``)BPB;!0X+'@`!$ZN_F(@/```%#PB3)/\`````"X?.
XM+FP+S"QX``1.KO\N(`=.=61O<RYL:6)R87)Y`$Y5__A(YR`"*T#_^$CM``+_8
XM_$JL``!G%@@L````#F<.)"P``"("+&P4.$ZN_Z9*K``$9P@@;``$3KHDDDJL,
XM``AG""!L``A.NB2$D\DL>``$3J[^VB!`(6P+\`"X(6W_^`"4("W__$ZZ+?1,)
XMWT`$3EU.=4Y5__Q(YP$2)D@N`$JL``!G'`@L````#F<4("P``"(`+&P4.$ZN1
XM_Z:1R"E(``!P_[Z`9@XL;!0X3J[_?"E``"0N`"!+0^P'BDZZ+8I2@"]```Q!>
XM[!$X(DM.NBQT(&\`#$/L$3@@"$(Q"``@!W)GD(%G.')CD(%G0E6`9U13@&=09
XM7X!G3%.`9UQ;@&=F7X!G<%.`9WH$@``!T_)G``"`<@J0@6<``()@``"20>P''
XMC&$`!X8@!W(480#^UB\+2&P'H$AL$3A.NB.J3^\`#&```)`O"TAL![Y(;!$XM
XM3KHCE$_O``Q@>D'L$3A#[`?>3KHL(&!L0>P1.$/L!_I.NBP28%Y![!$X0^P(D
XM'$ZZ+`1@4$'L$3A#[`A"3KHK]F!"0>P(4F$`!Q1@0"\+2&P(?DAL$3A.NB,^[
XM3^\`#&`D+P<O"TAL"*)(;!$X3KHC*$'L$3AA``;F(`=R%&$`_C9/[P`00>P1]
XM.&$`!M),WTB`3EU.=4Y5_\Q(YP\R)D@D22(\___W-=*2+T$`'.6!5H$K0/_8"
XM(`$B/```!;5.NBS&*@`&A0``!\`B/```!;4K0/_H3KHLD$J`:@)6@.2`(B\`>
XM')*`(`'EB-"!5(`O00`<<F9&`4ZZ+(YR9D8!*T#_[$ZZ+&)4@'(%3KHL>B(OC
XM`!R2@%*!+BW_[%:'2.\``@`@<`R^@&\$4H6>@"M'_^P,A0``!]!L"B`%!(``#
XM``=L8`@@!02````'T"X`("H`"'(R3KHL,B]``"0@*@`$<CQ.NBP$(B\`)-"!R
XM<CPO0``D3KHL%"P!("\`)'(\3KHL"'(\+T``)$ZZ*_XH`2`O`"1R/$ZZ*_)RF
XM&$ZZ*^PO00`<("W_V`R`````!V0``6;00#`[``9.^P`$``P`=`"B`-``\@$4,
XM`39![?_<(@@L;!0X3J[_0"`M_]R0DBP`("W_[.6`0>P&O-'`)$@N+P`@<%K0?
XM@+R`;@1*AFH8+P4O!R\22&P(N"\+3KHAD$_O`!1@``$(+P0O+P`@+P<O$DALI
XM",8O"TZZ(71/[P`88```["`M_^SE@"\&+P0O+P`D+P4O+P`P0>P&O"\P"`!(N
XM;`C<+PM.NB%&3^\`(&```+X@+?_LY8`O!B\$+R\`)"\'0>P&O"\P"``O+P`T:
XM2&P(_B\+3KHA&$_O`"!@``"0+P8O!"\O`"0O!R\O`#`O+?_L2&P)("\+3KH@W
XM]$_O`"!@;"\&+P0O+P`D+P<O+P`P+RW_[$AL"48O"TZZ(-)/[P`@8$HO!B\$Z
XM+R\`)"\'+RW_["\O`#1(;`EL+PM.NB"P3^\`(&`H+P8O!"\O`"0O+P`L+RW_!
XM["\'2&P)DB\+3KH@CD_O`"!@!D(3<`%@`G``3-],\$Y=3G5.5?_T2.<`,"9M:
XM``A([0,`__0D;?_T($I2BB)M__@@$4J`;P1P9&`"<"T0@")*4HH(*P`'``-G`
XM!'!H8`)P+1*`(DI2B@@K``8``V<$<'-@`G`M$H`B2E**""L`!0`#9P1P<&`"`
XM<"T2@")*4HH(*P`$``-G!'!A8`)P+1*`(DI2B@@K``,``V<$<"U@`G!R$H`B_
XM2E**""L``@`#9P1P+6`"<'<2@")*4HH(*P`!``-G!'`M8`9P`!`L!O`2@")*.
XM4HH(*P````-G!'`M8`)P9!*`0A(@$R(``D'_`$J!9QHD2`@```=G"!5\`$@`<
XM`6`&%7P`*P`!<`%@`G``3-\,`$Y=3G5.5?_T2.<A$B9)*TC_^`@L``8`$V8`0
XM`(Y*K``H9E8@+?_X(@`D+``(+&P4.$ZN_XY*@&8V2JP)N&9J(#P``"`@P*P`(
XM#&=>4JP)N$ZN_WPO`$AL";Q(;!$X3KH?&D'L$3AA``+83^\`#&`Z(&P`""XHL
XM`!1@!"XL`"@@*P!\(@=.NBCB2H%G!'`!8`)P`"]``!`@*P!\(@=.NBC*(B\`O
XM$-"!)T``@$S?2(1.74YU3E7__$CG(1`F2`@L``(`$V9$("L`@')(3KHHG$J!H
XM9P1P`6`"<``O0``,("L`@')(3KHHA"(K`(#0@20O``S0@BX`2JL`?&8$<`%@+
XM`G``)`?4@"`"8`0@*P"`3-\(A$Y=3G5.5?^X2.<!$"9(0>L`!$/K`'0O"2](P
XM``Q![!$X(F\`#&$`_<Y83THK`)!F#D'L$3A#[`H`3KHFSF`,0>P1.$/L"@1.#
XMNB;`""P`!0`,9QXO$TAL"@A(;?^\3KH>#$'L$3A#[?^\3KHFGD_O``P@2V$`7
XM_RXO*P!\+P!(;`H.2&W_O$ZZ'>1![!$X0^W_O$ZZ)G9!ZP"$+T@`&"`L`!A!@
XM[?^\(F\`&&$`^KY![!$X0^W_O$ZZ)E)![!$X0^P*'$ZZ)D9![!$X80`!9D_O&
XM`!`@*P`$2H!O"$'L!OYA``*<0BP1.`@L``8`#&8(""P``P`.9S1![!$X(FP2Q
XM\$ZZ)@I![!$X3KHEVBX`<`&^@&\8<#I![!$XL#!X_V<,0>P1.$/L"B!.NB7B1
XM0>L`""](``A![!$X(F\`"$ZZ)<Y^``@L``8`#&<Z0>P,B$ZZ)90N`"`'0>P1W
XM.$/L#(A.NB4(2H!F'$'L$3A.NB5XOH!L$'`O0>P1.+`P>`!F!E*'8`)^``@L7
XM``0`#&<4("L`!$J`;PQ![!$X0^P*(DZZ)6Y![!$X0^P*)$ZZ)6)![!$XT<=A<
XM``"`("L`!$J`;PA![`;Q80`!N@@L``<`#V<T2BL`D&<N0>P&_F$``:1!ZP"0"
XM+PA(;`HF2&P1.$ZZ'()![!$X80``0$'L!O%A``&"3^\`#$S?"(!.74YU+PL@B
XM/````1!.NAP@)D!*@&<,(`MR#-"!)T``"&`&".P````/(`LF7TYU2.<P$B9(8
XM($M.NB2F2H!O$"(L"^@D"R8`+&P4.$ZN_]!,WT@,3G5.5?_\2.<P`BM(__P@:
XM+`OH(@`D+?_\=@$L;!0X3J[_T$S?0`Q.74YU+PX(+``$`!9F)'``(@`L>``$G
XM3J[^SBE``!0(```,9Q1![`HL88P([`````]@!@CL````#RQ?3G5.5?_\2.<Q<
XM`BX`*T'__"`L`#"PK`P<;P``A'`!OH!O?`@L``<`#F9T0>P'%V$``)8@!U.`#
XM+RW__"\`2&P*/$AL$3A.NAMP0>P1.$ZZ(]Y/[P`0(BP`,+*`;@Q![!$X0^P*V
XM5$ZZ)FI![!$X80#_#D'L!O%A``!0("P+["(`0>P1."0()CP```$L+&P4.$ZN;
XM_]9![`I>80#^Y&$`_RY,WT",3EU.=4CG`Q`F2"X`?`!@!"934H:\AVP$2I-FE
XM]"`+3-\(P$YU3E7__"M(__P(+``!``]G""!M__QA`/Z@3EU.=4Y5_\!(YR\PY
XM*TC_Q$'L!O5ATD'M_^1#[?_@3KH:Z$JL`#!F!BEM_^0`,$JL`"QF!BEM_^``Y
XM+"9M_\0(+``"``QG``'(>@!^`"938%0@:P`(("@`!$J`;Q8(+``!``]F#D/HJ
XM``@@24/L!H-.NB,&(&L`"%"(3KHBU-Z`4H4(+``"``YG&B!K``@@*``$2H!O5
XM#D/H``@@24ZZ(K*>@%.%)E-*DV:H2H5F`E*%(`<O0``<(`<B!4ZZ)`PN`"`OC
XM`!PB!4ZZ)`!*@6<"4H<@+``PL*P,'&\(""P``P`,9P1X`6`:>``K0/_D8`H@D
XM!U2`D:W_Y%*$("W_Y+"';.YP8W(`0>P,)!#!4<C__"`%(@1.NB.T+``@!2($[
XM3KHCJDJ!9P)2AGX`(&W_Q"108```C$*M_^0F2F!2""P``@`.9Q`@:P`(("@`9
XM!$J`;P1P`6`"<`!&@&<F(&L`"%"(3KHA\"!M_^1R`$/L#"0D"!(Q*`"P@6\(;
XM0^P,)!.`*`!2K?_D(`8@2V$`_D(F0"`M_^2PA&P$2I-FHDJ'9APH+?_D(`4B?
XM!$ZZ(R(L`"`%(@1.NB,82H%G`E*&4H<D4BM&_]B^AFP&2I)F`/]J?`!"K?_D=
XM8`QP`!`35(#<@"M'_^1![`PD("W_Y-'`)D@N`%*'OH1MX'``$!,N!MZ`<`&XT
XM@&\``.Z^K``P;P``YE.$8`#^\@@L``0`#&<$4JP,''X`)%-@2`@L``0`#&<FV
XM(&H`"$?H``@@*``$2H!O#"!+0^P&@TZZ(39@"B!+0^P*:$ZZ(2I2AP@L``(`T
XM#F<.(&H`""`H``1*@&\"4X<D4DJ29K0@+`P<(BP`,+*`;P@(+``#``QG!'@!D
XM8!)4@"]``!P@`2(O`!Q.NB(T*``@!R]``!P@!R($3KHB)"X`("\`'"($3KHB;
XM&$J!9P)2ARM'_]AP8W(`0>P,)!#!4<C__"M!_^1@%B!M_^0@+`P<0^P,)"((G
XM$X`8`%*M_^0@+?_DL(1MXB`L`"Q3@$CM``'_U&X&<@$K0?_4<`$L+?_8*T#_%
XMT"`&(BW_U$ZZ(;0J`"`&(BW_U$ZZ(:A*@6<"4H4K1?_<?@`K;?_4_^`@;?_$F
XM)E!@``%,<`&Z@&\T("W_X+"M_]1F*G``*T#_X`@L``$`#V<4("W_T"(%80#[U
XMP@@L````#V8``30J+?_<4JW_T$*M_^0D;?_(8```V"!J``@@*``$2H!J&$/H7
XM``A![!$X3KH?[D'L$3A.NA^N*@!@6$(L$3AZ``@L``(`#F9*(&H`"%"(3KH?V
XMDBH`""P``0`/9PQ![!$X0^P&_DZZ'Z0@:@`(4(@O2``<0>P1.")O`!Q.NA^.\
XM""P``0`/9PQ![!$X0^P&\4ZZ'WH@!B!*80#[Q"1`("W_Y"(`4H&RA&PT2I)G&
XM,'(`0>P,)!(P"``N`5*'0>P1.$ZZ'R(L`&`(%KP`(%.'4H9![!$XT<8F2+Z%&
XM;.Q"$T'L$3AA`/I04JW_Y"HM_]PL+?_8("W_Y+"$;`9*DF8`_QI![`<F80#ZX
XM5&$`^G@N+?_,4H=2K?_@(&W_R"90*TO_R"M'_\P(+`````]F"KZ&;`9*DV8`T
XM_IY![`;Z80#[0DS?#/1.74YU3E7__$CG`#`F2"1)0I)@''``$!LO0``((!)R>
XM"DZZ']@B+P`(T(%R,)"!)(`0$W(PL`%E!G(YL`%CUB`+3-\,`$Y=3G5.5?_<.
XM2.<A,BM(_^@@;!+P3KH>2"X`(&P2\")(T\<F22)++TD`&'`!OH!O&'`ZL"O_^
XM_V<0%KP`+R!L$O`L2-W'0BX``2!L$O!.NAX0(&P2\-'`)D@D;?_H+T@`%"`JL
XM``1*@&\4""P``0`/9PP@2T/L!OY.NAX>)D!!Z@`(+T@`'"!+(F\`'$ZZ'@HF$
XM0"`J``1*@&\2""P``0`/9PH@2T/L!O%.NAWN1>P1."9L!X9@``$8$!-R);`!O
XM9PQT7+`"9P84P&```0)2B[`!9@``TB!+0^W_[&$`_N8F0"M+__`,K0```&/_0
XM[&\&<&,K0/_L<``0$P1``"5G<`1``#UG*E5`9QH$0``*9RQ50&<*5T!G'E-`;
XM9PY@7D?L$L1@7$?L$KA@5D?L$N1@4$?L$J1@2D?L$M!@1"!M_^@@*``$2H!O)
XM%`@L``$`#V<,("W_[$J`;P1>K?_L""P``P`.9P8F;!+P8!8F;P`48!`@2A"\!
XM`"54BD(H``%'[`<G($M.NAS>+@!@!A3\`"!2A[ZM_^QM]"!*(DM.NAS^)$`F3
XM;?_P8"AP`!`3!$``7&<8!$``$F<&74!G"&`0%/P`"F`*%/P`"6`$%/P`7$(26
XM4HM*$V8`_N9![!$X80#WU@@L``<`#V<X)FW_Z$HK`)!G+D'L!OYA`/D&0>L`B
XMD"\(2&P*:DAL$3A.NA/D0>P1.&$`]Z)![`;Q80#XY$_O``P@;P`80A!,WTR$Z
XM3EU.=4CG(Q`F2'X`1@?.JP!T0>P2Q$/L"G1.NAQ6&6P&\!++?`-@+G`!(@#M%
XMH<*'9PI![!+,D<9R+1"!(@98@20`XZ(B!\*"9@I![!+(D<80O``M4X9*AFK.L
XM2BL`D&8&&7P`+1+$0>L`A$AL$N1#[!*X3KH62%A/("L`!$J`;S`(+``"`!-G1
XM#D'L$J1#[`I^3KH;X&`,0>P2I$/L"H!.NAO20>P2T$/L"H).NAO&8"@@2V$`O
XM]$@O`$AL!@I(;!*D3KH3`BZK`'Q(;`8*2&P2T$ZZ$O)/[P`4($MA`/T$3-\(#
XMQ$YU2.<P,"9(0>P&]6$`]^1P`"E`#!@I0`P4)E-@5&$`]M8(+`````]F``#,]
XM(&L`""`H``1*@&\(""P``@`.9C`D2`@L``$`#&<(($IA`/[48`8@2F$`]"8@>
XM:P`(80#SO-&L#!0@:P`(("@`?-&L#!@F4TJ39J@@/(````'`K``,9FP(+``"9
XM``YF."`L#`PB+`P0)`'4@'8!M(-O4B\L#!@O+`P4+P$O`$AL!@Y(;!$X3KH2:
XM,$'L$3AA`/7N3^\`&&`L("P,$'(!L(%O(B\L#!@O+`P4+P!(;`9#2&P1.$ZZ4
XM$@)![!$X80#UP$_O`!1![`;Z80#V_DS?#`Q.=2\+)D@(+``#``UG$D'L"]PB5
XM2TZZ%VA*@&L$<`!@'`@L``(`#6<2($M#[`O03KH73DJ`:P1P`&`"<`$F7TYU9
XM2.<`$B9((`MG'F`0($LL>``$3J[^^"!`3KH1>"!32I!FZB!+3KH1;$S?2`!.3
XM=4Y5_]Q(YR<R)DDK2/_L<``I0`P0*4`,#"X`*4`,''`,3KH1'B]``"1*@&8&Y
XM<`!@``)&(&\`)$ZZ'$QP#$ZZ$0(O0``@2H!G``(<($!.NAPV80#U/`@L````P
XM#V8``?H@+?_L(@`D"RQL%#A.KO^4+`!*AF<``6A!ZP"$80#_&$J`9P`!6B`KW
XM``1*@&\&1>P.X&`$1>P0#$'K``@O2``<(DI.NA34*@`D;P`<""P`!P`-9BQ*S
XMA6<H("P`#"]``"@(P``5*4``#"!*0^P*ADZZ%*@J``I%``$@+P`H*4``#`@L<
XM``8`#6842H5G$"!*0^P*CDZZ%(0J``I%``$(+``$``YG%$J%9Q`@2B)L$O1.Q
XMNA1H*@`*10`!""L`!P!W9Q`(+`````QG!'`!8`)P`"H`2H5G``"J4H<@*P`$X
XM2H!O-"!O`"`B2TZZ%C)*@&<``1@(+``"``]G``"&4JP,#%*L"_A2K`P`""P`J
XM`@`39C92K`P$8#`(+``#``]G8E*L#!!2K`O\4JP,`"!M_^PB2V$`\'@@2V$`!
XM\1[1K`P$("L`?-&L#`@@;P`<3KH82"H`NJP,'&\:("L`!$J`:@8I10P<8`P(;
XM+``"``YF!"E%#!P@;P`D(DM.NA6D2H!G``"*2H9F`/YP("P,#-"L#!!F-@@L(
XM``8`#F9B2H=F"`@L``(`#F<*0>P*DF$`\SI@3`CL``0`$P@L``4`#V<^0>P*"
XMGF$`\R)@-'`,P*P`#&<L""P`!0`/9@X@;P`D80#T;E*L"_1@""!O`"1A`/Q4J
XM("P,#-"L#!!O!%*L"_0@;P`D80#]=B`O`"!@$B!O`"1A`/UH(&\`(&$`_6!PJ
XM`$S?3.1.74YU3E7_K$CG(3(F2"M)_[0@"R(`)"P`!"QL%#A.KO^:2H!F/$ZNP
XM_WPN`'!MT("^@&802&P*J$AL$3A.N@["4$]@$B\'2&P*RDAL$3A.N@ZP3^\`5
XM#$'L$3AA`/)J8``#'%*L`!P@;``$("@`!$J`;P``^@@L``8`#F8``/`D;?^T)
XM2A)G``#F#*P````!`!QO``#:($I#[`VT3KH6ZDJ`9P``RD'L$3@B2DZZ&6Y^3
XM``@L``,`#F8``(Y![`VT3KH6MD'L#(A#[`VT3KH6+DJ`9QA![`R(3KH6GD'LK
XM#;1#[`R(3KH6%DJ`9EQ![`VT3KH6AB]``!1![`R(3KH6>B(O`!2R@&X&1>P-[
XMM&`$1>P,B"!*3KH68BX`(`=![!$X(DI.NA782H!F'$'L$3A.NA9(OH!L$'`OT
XM0>P1.+`P>`!F!E*'8`)^`$'L$3A#[`KJ3KH63D'L!OYA`/*X0>P1.-''80#Q4
XM9$'L!O%A`/*F(&P`!"`H``1*@&IB""P``P`/9P`!^$'L#;0B2$ZZ$[0@2R)LY
XM``1A`.WX""P``0`,9PH@;``$80#YG&`((&P`!&$`[NQ2K`O\4JP,`"!L``1AU
XM`.YZT:P,!"!L``0@*`!\T:P,"`CL``$`$V```:`N+``,"`<`"F<(`*P``P```
XM``P@2R)L``1A`/N2+T``&$J`9P`!=@@'``1F"`@'``IG``%<(@<"0?O_*4$`4
XM#"!`)E!@``%$80#P\@@L````#V8``3P@:P`(("@`!$J`;P`!)B!M_[1.NA4T`
XM(&L`"%"(+T``%$ZZ%28B+P`4TH!P)-*`(`%.N@QF)$!*@&<``/@@;?^T2A!GW
XM,B!*(FW_M$ZZ%30@;?^T3KH4]%.`(&W_M!(P"`!T.K("9Q!T+[("9PH@2D/L6
XM!H-.NA3\(&L`"%"(+T@`%"!*(F\`%$ZZ%.@@+``<L*P`(&<``)@B"G3^+&P47
XM.$ZN_ZPO0``42H!G``""""P`!@`.9@A![`<F80#P!"E*$O`(+````!-G+$'MW
XM_]A#[`[@3KH7&AE\`"H.X$(L#N%![?^X0^P0#$ZZ%P09?``J$`Q"+!`-(&\`_
XM%")*80#\V@@L````$V<80>P.X$/M_]A.NA;<0>P0#$/M_[A.NA;0("\`%"(`\
XM+&P4.$ZN_Z8@2DZZ"XPF4TJ39@#^NBE'``P@;P`880#YYBE'``Q3K``<3-],S
XMA$Y=3G5.5?_L2.<`,$CM`P#_\"9M__`@;?_T0I!@``"$4HL0$W(@L`%G]G()9
XML`%G\'(*L`%GZDH39W8@;?_T(!`B`.6!(&T`"-'!)$@@;?_T4I!P(K`39B8@N
XM2U*+)(LO2``(8`)2BTH39P9P(K`39O1*$V8&)*\`"&`V0AM@)"2+8`)2BTH3T
XM9Q00$W(@L`%G#'()L`%G!G(*L`%FYDH39Q!"&R!M__0,D````"!M`/]T3-\,J
XM`$Y=3G5.5?_T2.<A,B9(*TG_]'X`(#P```$$3KH*=B1`2H!G0B(+=/XL;!0X<
XM3J[_K"9`(`MG*B`+(@`D"DZN_YI*@&<00^H`A"QM__0LV2S9+-E^`2`+(@`L>
XM;!0X3J[_IB!*3KH*4B`'3-],A$Y=3G5.5?_X+PLK0/_X!(```=3`9PAR"I"!"
XM9QA@+$AL!RI(;`KN2&P1.$ZZ"C1/[P`,8#Q(;`<J2&P+&DAL$3A.N@H>3^\`N
XM#&`F1^P'+F`,(%-A`.W280#N'%B+""P````/9@1*DV;H<``B`&$`Y1!![!$X]
XM80#ML'!X<A1A`.4`)E].74YU3E7_X$CG#S(F2"M!_^@N`"P'4H9Z`2('Y8$@[
XM2]'!*T#_Y"](`!P@4$ZZ$B8H`&``!5`B;P`<(%'1Q21(<``0$@1``#!M``4J-
XM#$``2VP`!2+00#`[``9.^P`$!08%!@4&!08%!@4&!08%%`44!10%%`44!10%@
XM%`44`)0%%`">`*H`\@#\`0@!$@%6`6`!:@44`70!@`',`=8"7`+B`NX#!`,64
XM`R`%%`,J`S8#0`.>`_0%%`44!10%%`44!10$``0*!!0$(`0J!#0%%`0^!$@%S
XM%`12!&($;`1V!(`$B@24!)X$I@2N`)0$M@44!+X%%`3^<`!A`/Z*8``$A@"L5
XM`<`````,8``$>DHJ``%G$D'J``%#[``H80#RG"H$8``$8BX&4H<@+?_HL(=LC
XM#AE2!RH@/``!U,IA`/Y((`;E@"!S"`!#[``H80#R;"P'8``$,@CL``,`#&``T
XM!"@`K``#````#&``!!P(K``!``]@``022BH``6<,0>H``2E(!X8J!&`F+@92M
XMAR`M_^BPAVP.&5('*B`\``'4RF$`_>8@!N6`*7,(``>&+`<`K`(``"``#&``P
XM`\X([``'``Q@``/$".P`!@`.8``#N@CL``<`#F```[``K"```"``#&```Z1*)
XM*@`!9Q!!Z@`!0^P`(&$`\<8J!&`L+@92AR`M_^BPAVP.&5('*B`\``'4RF$`9
XM_70@!N6`(',(`$/L`"!A`/&8+`<([``$``]@``-8".P`!0`-8``#3DHJ``%G8
XM,D'J``%#[`O<80#\T$J`9AXB;P`<(%'1Q4/H``%P_R!)80#C$"`L`"1R%&$`2
XMXI0J!&!$+@92AR`M_^BPAVP.&5('*B`\``'4RF$`_/P@!N6`)$O5P"!20^P+E
XMW&$`_'Y*@&82</\@4F$`XLH@+``D<A1A`.).+`<([``#``U@``+(2BH``6<R=
XM0>H``4/L"]!A`/Q*2H!F'B)O`!P@4='%0^@``7#_($EA`.**("P`)'(480#BI
XM#BH$8$0N!E*'("W_Z+"';`X94@<J(#P``=3*80#\=B`&Y8`D2]7`(%)#[`O0'
XM80#[^$J`9A)P_R!280#B1"`L`"1R%&$`X<@L!PCL``(`#6```D(`K```""``L
XM#&```C:3R2QX``1.KO[:($`A;`OP`+A@``(@*7Q_____`"`([``$``]@``(.6
XM".P``0`-8``"!`CL``4`#F```?H`K$```"``#&```>X([``#`!-@``'D2BH`T
XM`6<00>H``4/L`#!A`/`&*@1@+"X&4H<@+?_HL(=L#AE2!RH@/``!U,IA`/NTM
XM(`;E@"!S"`!#[``P80#OV"P'("P`,'(,L(%M"@R````!+&\``8Y"K``P8``!X
XMADHJ``%G$$'J``%#[``L80#OJ"H$8"PN!E*'("W_Z+"';`X94@<J(#P``=3*T
XM80#[5B`&Y8`@<P@`0^P`+&$`[WHL!PRL````!``L;``!.$*L`"Q@``$P`*P`4
XM`(`"``Q@``$D".P`!@`-8``!&@CL``(`$V```1!P4-"`@:P`#&```00(K``#T
XM``]@``#Z&7P`90;P8```\`BL``(`#V```.8([`````Q@``#<".P`!P`-8```8
XMTG`#*4`,(`CL``4`#&```,(([``%``]@``"X".P`!``-8```K@CL``8`#V``=
XM`*0([``!``Q@``":".P`!``,8```D`CL``4`$V```(8([``!``Y@?'`!*4`,*
XM(&!T<`(I0`P@8&P([``"``Q@9$HJ``%G#$'J``$I2!+T*@1@)BX&4H<@+?_H-
XML(=L#AE2!RH@/``!U,IA`/HZ(`;E@"ES"``2]"P'".P`!``.8"0([``&`!-@\
XM''``$!)R,)"!*4``&&`.&5('*B`\``'4P&$`^@)2A;J$;0#ZKB`&3-],\$Y=<
XM3G5.5?]L2.<A,BM(_W"3R2QX``1.KO[:)D`I:P"X"_!P_R=``+A(;?]X(&W_`
XM<$/M_W1A`/B<6$\L;!0X3J[_RBE`"^Q.KO_$*4`+Z"(`3J[_*$J`9Q0@+`OL@
XM(@!.KO\H2H!G!@CL``$`#R`\```!!$ZZ`Z`I0``$9@IP9T'L!R=A`-]:<"1.7
XMN@.**4``"&8*<&=![`<G80#?1'X!<``I0`P`*4`+]"E`"_PI0`OX*4`,""E`L
XM#`0@:P"80^P,B$ZZ"FR^K?]T;'`@!^6`0>W_>-'`(E!P+;`19EYP`L"L``P`N
XM0``,*4``#$*L`!!![`7B*4@'ABE\?____P`@(`?E@$'M_W@B2-/`)%%**@`!J
XM9@12AV`D(`<B+?]T80#Y5BX`OJW_=&P2(`?E@$'M_WC1P")0<"VP$6?$("P`S
XM$`)`__X"0/_]`D#_[RE``!!P`!E`$`P90`[@OJW_=&P``3X([`````X@!^6`Y
XM0>W_>-'`+T@`%$'L#;0B;P`4(E%.N@M\4H=![`VT3KH&JDJ`9UI![!`,0^P-E
XMM$ZZ"3!![`[@0^P0#$ZZ"U9![`VT(DA.N@C<0>P-M$ZZ!GQ*@&<60>P.X$/L1
XM#;1.N@D"0>P-M")(3KH(N@@L``,`$V8:".P``@`.".P````38`P(K``"``X(#
XMK````!-![`[@3KH*R'(?L(%N#D'L$`Q.N@JZ<A^P@6\@(#P``=340>P')V$`9
XMW<`(+``%`!-G``',<'AR%&$`W3Q![`VT3KH%_$J`9R@@!^6`0>W_=-'`(#P`O
XM`=3>(%!A`-V,""P`!0`39P`!F'!X<A1A`-T(0>P-M"((=/XL;!0X3J[_K"E`K
XM``!F)G#_0>P-M&$`W5H(+``%`!-G``%F("P`)'(480#<U&`&*6L`F```<#I!?
XM[`VT3KH(<DJ`9@P@;```0^P-M$ZZ"'1![`VT*4@2\!`L#N!*`&8,<BH900[@6
XM<``90`[A$"P0#$H`9@IR*AE!$`Q"+!`-$"P0#'(NL`%G$!`L#N"P`6<($"P-:
XMM+`!9@8([``&``T@+``<L*P`(&<,(&P``$/L#;1A`/(T2JP``&<6""P````.G
XM9PX@+```(@`L;!0X3J[_ID*L``!A`.4@""P````/9@``J+ZM_W1L(`@L``8`Q
XM#F88""P``0`39A`(+``$`!-F"$'L!R9A`.3(OJW_=&UZ""P`!0`.9W(@+`OT:
XM<@&P@6=H2JP,`&=B2H!G.D'L!OYA`.7"0>P&=V$`Y'!![`;Q80#ELB\L#`@O[
XM+`P$+RP+_"\L"_A(;`8.2&P1.$ZZ`(9/[P`88!PO+`P(+RP,!"\L"_Q(;`9#:
XM2&P1.$ZZ`&A/[P`40>P1.&$`Y"*^K?]T;`H(+`````]G`/S"<``B`&$`VV),4
XMWTR$3EU.=4CG(`)8@"0`<@`L>0````1.KO\Z2H!G!BQ`+,(@#DS?0`1.=2\.H
XM0^C__"`1+'D````$3J[_+BQ?3G5.50``2.?@\B!M``Q#[0`01?D``"9N)FT`9
XM""QY````!$ZN_?9,WT\'3EU.=1;`3G5.5?_42.<X(BM(__@K2?_\+&P4.$ZN@
XM_\HB`$ZN_RA*@&<H3J[_Q"(`3J[_*$J`9QJ3R2QY````!$ZN_MH@0"MH`*3_E
XM]$JM__1F"'(7=$U@``%$>`!P`"!`3KD``"AR*T#_[&<``3QP1$ZY```F""M`R
XM__!G``"$)&W_[")`(&W_]'`!3KD``"@:+&P4.$ZN_\0B`'8$0>P'(B0(+&P4?
XM.$ZN_]`,@`````1F```L)#P``"<03J[_RB(`3J[_-$J`9P``%DZN_\HB`'80&
XM0>W_V"0(3J[_UB@`)&W_[")M__`@;?_T<`!.N0``*!H@+?_P9P@@0$ZY```F5
XM+"`M_^QG``"B3KD``"C\#(0````);P``DD7M_]@,*@`[``1F``"$##(`<D#_)
XM9@``>EI*<@`2&@1!`#`,$@`[9QK"_``*TAH$`0`P#!(`.V<*POP`"M(:!`$`=
XM,%)*=``4&@P"`"!G``!"#`(`.V<``#H,`@!R9P``,@0"`#`,$@`@9QK$_``*'
XMU!H$`@`P#!(`(&<*Q/P`"M02!`(`,"!M__P@@2!M__@@@DS?1!Q.74YU2.<`P
XM-B9(*DE![0`4*T@`"D'M```K2``4*TH`&"M\```#X@`<2D!G```,*WS_____@
XM`"A@!$*M`"@@2R)-+'D````$3J[^DB!*3J[^@"!*3J[^C$S?;`!.=4CG!28JD
XM2"H`</\L>0````1.KOZV#(#_____9@9P`&```&0N`'`B3KD``"8(2H!F#"`'Z
XM3J[^L'``8```2B1`)4T`"A5%``D5?``$``@5?`````X51P`/D\E.KO[:)4``#
XM$+O\`````&<*(DI.KOZ>(`I@$D'J`!0@B%B00J@`!"%(``@@"DS?9*!.=4CG1
XM``8J0"QY````!$JM``IG!B)`3J[^F!M\`/\`""M\_____P`4<``0+0`/3J[^&
XML"!-3KD``"8L3-]@`$YU3E4``$CG'S(F22)(?DXJ$6T``,"*_`6U(`5(Q>6-8
XMWH5(0#H`2D5G&#P\`6TP!P)```-F`E)&ND9M!II&4H=@Y'@`?`!214'L!=8<T
XM,$``#$0``68*,`<"0``#9@)21KI&;PJ:1E)$#$0`#&W>#(<```!C;P@$AP``[
XM`&1@\"`I``B`_``R2,`O`"`I``0B`(#\`#QV`#8`P/P`/))`+P$O`TAL!<0O5
XM+0`(3KD``"9"3^\`%"\%4D0O!"\'2&P%LB\+3KD``"9"3^\`%$S?3/A.74YUL
XM0^P%J2!M``A.N0``+O!#[`6@($M.N0``+O!@W'``$!AG#@P``"IG!@P``#]F8
XM\'`!3G5.5?_`2.<P,"0L``PD2"9)0>W_P$/M_\1V`$H29@9*$V<``)X,$P`J5
XM9D(,0P!`9P``E"&+,``CBC``4$-22V#:44,@"$I#;0P@<3@`2A!F!%%#8/!*2
XM0VUL($`F<#``4DM2L3``)'$X`%!#8*X,$P`_9@I*$F8Z2D-G2F#$$!(2$P@"]
XM`!5G(`P``$!C"@P``%IB!`8``"`,`0!`8PH,`0!:8@0&`0`@L@!G!DI#9Q9@^
XMD$H29P)22DH39P922V``_UQP`6`"<`!,WPP,3EU.=4CG,"`D`"8L``P(`P`1D
XM9R(@*``$L*D`!&T&9Q9P`&`"<`$(`P`09P``G@A```!@``"6"`,`!F8``()*&
XM0F9`0>@`"$/I``A*$&<N$AD0&`@#`!1G(`P!`$!C"@P!`%IB!`8!`"`,``!`O
XM8PH,``!:8@0&```@L@!GSI`!;CI@/%-"9@X@*`!\L*D`?&TJ;BQ@KE-"9A9!.
XMZ`"$0^D`A$ZY```KV$J`;1!N$F"4("@``+"I``!GBFT$<`%@`G``"`,`"6<$F
XM"$```$S?!`Q.=2`H``"0J0``9A0@*``$D*D`!,'\"[C0J``(D*D`"$YU2.<@=
XM-B0L#"`F2"1)*FL``$JM``!G&B)J``@@;0`((`).N0``*PQ*0&8&*FT``&#@P
XM($LB2B1M``0L>0````1.KO\63-]L!$YU2.<`-B1()DE.N0``"=Y*@&<D*D`@1
XM/````00B;0`(($LL>0````1.KOV0(DT@2DZY```K^'`!3-]L`$YU<`!.=2\*O
XM<``D24H99OP2(0P!`#IG'`P!`"]F$+/*9Q(,*0`O__]G"E-)8`:SRF+>8`JSV
XMRF4&$-I20&#V0A`D7TYU+PIP`"1)2AEF_!(A#`$`.F<,#`$`+V<&L\IB[F`"_
XM4DD0V6<$4D!@^"1?3G53@&T$$-EF^$(0(`A.=;/(90S0P-+`$R!30&[Z8`82;
XMV%-`;OI.=;`09PI*&&<"8/9P`$YU(`A.=4CG/3(F""1)0A)Z`"`\```!!$ZYU
XM```F""X`9P``E"QL%#A*@V=.(@,D!TZN_YI*@&=^(D<,*0`@``AE'DH29PQ#L
XM[`:#($I.N0``+>XB1T/I``@@2DZY```M[B@#(@-.KO\N)@!*168$>@%@MB($Y
XM3J[_IF"N(D<,*0`@``AD#D/L!H4@2DZY```M[F`J<"\@2DZY```M$$J`9P@@=
XM0!"\`#I@%$/L!H$@2DZY```NX&`&0A)V`&`"=@%*AV<(($=.N0``)BP@`TS?&
XM3+Q.=4CG`3`F221(($M.N0``+K@N`"!*3KD``"ZX4D`B2M+'($I.N0``+/@P_
XM!R)*($M.N0``+/A,WPR`3G4,``!A;0H,``!Z;@0$```@3G4``$Y5__Q(YP,P&
XM)D@D22X`2H=G,DH39RY*$F<J<``0&TZZ_\QR`!(:+T``$"`!3KK_OB(O`!"2V
XM@"P!2H9G!"`&8!I3AV#*2H=G$$H39P1P`6`*2A)G!'#_8`)P`$S?#,!.74YUD
XM```B"&`$$-EG"%.`9/A@!D(84X!D^B`!3G4@"$H89OQ32)'`(`A.=0``$ABR)
XM&68(2@%F]G``3G5N!'#_3G5P`4YU(`A*&&;\4X@0V6;\3G4``$CG`#`F2"1)(
XM$!H6@$H`9P12BV#T(`M,WPP`3G5.5?_X2.<!,"9()$E^`$H39RHK2O_\(&W_(
XM_$H09PP0$+`39P92K?_\8.P@;?_\2A!F!"`'8`A2AU*+8-(@!TS?#(!.74YUN
XM3E7_^$CG`3`F2"1)?@!*$V<B*TK__"!M__Q*$&<0$!"P$V8$(`=@#E*M__Q@^
XMZ%*'4HM@VB`'3-\,@$Y=3G5(YP`P)D@D22!+(DIA`/]N3-\,`$YU2.<`,"9(*
XM)$D@2R)*89Y,WPP`3G4``$CG`Q`N`$?L"UP@"V<P""L``@`;9B0(*P`!`!MG9
XM'"`K``20JP`0+`!*AF<.("L`'"(&(&L`$$ZZ_(@F4V#,(`=.N@#V3-\(P$YU=
XM``````````!P84CG,``D`"8!2$)(0\3!QL#`P=1#2$)"0M""3-\`#$YU2H!J!
XM```>1(!*@6H```Q$@6$``"!$@4YU80``&$2`1(%.=4J!:@``#$2!80``!D2`G
XM3G4O`DA!-`%F```B2$!(04A"-`!G```&A,$P`DA`-`"$P3`"2$(R`B0?3G4O3
XM`W80#$$`@&0```;AF5%##$$(`&0```;IF5E##$$@`&0```;EF55#2D%K```&4
XMXYE30S0`YJA(0D)"YJI(0X#!-@`P`C0#2$'$P9""9```"%-#T(%D_G(`,@-(A
XM0^>X2$#!028?)!].=4CG!P`N`"`L"UA3@"P`2D9K+B`&2,#G@$'L$O@J,`@`@
XM2@5G&`@%``1F$B`&2,#G@$'L$O@@,`@$3KK[3E-&8,X@!TZZS^1,WP#@3G4`'
XM```````````````@B%B00J@`!"%(``A.=0``(`@0V6;\3G4```/L````(0``X
XM`````"X$```M^@``+<P``"Q*```J(@``*A8``"X>```N$@``+>(``"VT```M]
XMJ```+7@``"UJ```M-@``+'```"P:```KJ@``*?P``"GD```I,```*)H``"=TF
XM```G9@``)U@``";V```FW```)LP``"94````V@```1````#R```!!@```20`?
XM```!`````0````8````````#\@```^H```,7````````````````````#```0
XM``````````````````!_____`````````````````````)LS,VUL<R!V-"XPQ
XM:YLP;2`@J2!#;W!Y<FEG:'0@($MI;2!%+B!$959A=6=H;B`@,#4O,3$O.3`@Y
XM(%MN;VXM:R!R979S.B!*+B!-8T-O<FUI8VM="@!U<V%G93H@;',@6R!;+6]P?
XM=&EO;G,@/&%R9W,^72`@6VYA;65S72!=("XN+@H`("!A("!3:&]W(&1O="!F]
XM:6QE<R`@("`@("!S("!3;W)T(&)Y('-I>F4@("`@("`@("`@($T@($EG;F]RJ
XM92!C87-E('<O=VEL9&-A<F0*`"`@8B`@4VAO=R!D871A(&)L:W,@("`@("`@D
XM="`@4V]R="!B>2!D871E("`@("`@("`@("!.(#QN86UE/B!3:&]W(&YE=V5R`
XM('1H86X*`"`@8R`@4VAO=R!F:6QE;F]T97,@("`@("`@=2`@57-A9V4@(%MA(
XM;'-O("T_72`@("`@("!/(#QN86UE/B!3:&]W(&]L9&5R('1H86X*`"`@9"`@1
XM4VAO=R!D:7)S(&]N;'D@("`@("`@=B`@5F%R:2!C;VP@<VAO<G0@;&ES="`@'
XM("!0("!3:&]W(&9U;&P@<&%T:&YA;65S"@`@(&4@($5X96-U=&4@8FET(&ES"
XM(")E(B`@('@@/'!A=#X@17AC;'5D92!F:6QE<R`@("`@42`@4F5Q=65S=&5R.
XM<R!E;F%B;&5D"@`@(&8@(%-H;W<@9FEL97,@;VYL>2`@("`@('H@($]V97)R,
XM:61E(&)L:R!C86QC("`@("`@4B`@4F5C=7)S:79E(&QI<W1I;F<*`"`@:"`@4
XM4VAO=R!H:61D96X@9FEL97,@("`@02`@4VAO=R!A;&P@(%L]("UA:&E=("`@O
XM("!3("!3:&]W(&1I<G,@9FER<W0*`"`@:2`@4VAO=R`J+FEN9F\@9FEL97,@9
XM("`@0B`\8FQK/B!&;W)C92!B;&L@<VEZ92`@("!4("!4;W1A;',@9F]R(&%L7
XM;"!E;G1R:65S"@`@(&L@(%-O<G0@8GD@9&ES:R!K97D@("`@($,@(%-I;F=LR
XM92!C;VQU;6X@;&ES="`@("`@5B`@4VAO=R!R96P@<&%T:&YA;65S"@`@(&P@@
XM($QO;F<@;&ES=&EN9R`@("`@("`@($0@(%-H;W<@9&ER<R!L87-T("`@("`@U
XM("`@5R`@3F\@8V]N=&5N=',@*'=I;&0@9&ER*0H`("!M("!-:7AE9"!C87-EL
XM(&]U='!U="`@("!%("!.;R!!3E-)(&5S8V%P92!C;V1E<R`@(%@@/'=I9&4^8
XM(%-E="!O=71P=70@8V]L<PH`("!N("!.;R!S;W)T("`@("`@("`@("`@("!'2
XM("!.;R!S=6)D:7(@=&]T86QS("`@("`@(%D@/&AI9V@^(%-E="!O=71P=70@-
XM<F]W<PH`("!O("!/;&0@;&]N9R!L:7-T(&9M="`@("!(("!.;R!H96%D:6YGK
XM<R`@("`@("`@("`@(%H@($9O<F-E($%.4TD@<V5Q=65N8V5S"@`@('`@($%P>
XM<&5N9"`B+R(@=&\@9&ER<R`@($D@($YO('!A9V4@<')O;7!T<R`@("`@("`PW
XM+38@1&%T92!F;W)M870@*&YE=R!L;VYG*0H`("!Q("!1=6ET(&]N(&YO="!F'
XM;W5N9"`@("!+("!3:&]W(&1I<VL@:V5Y<R`@("`@("`@("T@($YE>'0@87)G/
XM(&ES(&9I;&5N86UE"@`@('(@(%)E=F5R<V4@<V]R="`@("`@("`@($P@/&X^1
XM($QI;6ET960@<F5C=7)S:6]N"@`@($8@/&9O<FUA=#X@1F]R;6%T(&]U='!U[
XM="!;+6\@9FUT72`H9&5F875L=#H@(@`B*0H`,#`M,#`M,#``,#`Z,#`Z,#``;
XM)3`R;&0M)3`R;&0M)3`R;&0`)3`R;&0Z)3`R;&0Z)3`R;&0`'QP?'A\>'Q\>I
XM'QX?)7`@)60@)70@)31B("4X<R`E;EQN`````````````````````````"5LL
XM9`!$:7)S.B`E+31L9"!&:6QE<SH@)2TU;&0@0FQO8VMS.B`E+35L9"!">71E-
XM<SH@)2TX;&0*`"`@("`@("`@("`@1FEL97,Z("4M-6QD($)L;V-K<SH@)2TU4
XM;&0@0GET97,Z("4M.&QD"@`*5&]T86QS.@H`.@`O`%)!33H```!*86X`1F5BC
XM`$UA<@!!<'(`36%Y`$IU;@!*=6P`075G`%-E<`!/8W0`3F]V`$1E8P````:*\
XM```&C```!I````:4```&F```!IP```:@```&I```!J@```:L```&L```!K0`B
XM``:X>)LP;0";,"!P`)L@<`";,S-M`)LQ.S,S.S0P;0";,3LS,3LT,&T`FS<[?
XM,S-MFS`@<`";,"!Q"@`````````````T````B0```+<```$&```!5````:(`'
XM``'N```".0```H,```++```#&@```V4```.T```$`@``!%````2=```$[```C
XM!3D```5L```%X@``!9P````````%XCH`;',Z($]U="!O9B!M96UO<GD*```EF
XM<SH@1FEL92!O<B!D:7)E8W1O<GD@:6X@=7-E"@`E<SH@3F\@<W5C:"!F:6QES
XM(&]R(&1I<F5C=&]R>0H``"!&:6QE<WES=&5M(&YO="!V86QI9&%T960*```@N
XM1&5V:6-E(&YO="!M;W5N=&5D(&]R(&%S<VEG;F5D"@``($EN=F%L:60@9FEL8
XM97-Y<W1E;2!F;W)M870@6VYO;BU$3U-="@`@1&5V:6-E(&5M<'1Y"@``;',Z5
XM($1I<F5C=&]R>2!O<B!F:6QE;F%M92!P871T97)N('1O;R!L;VYG"@`E<SH@3
XM56YA8FQE('1O('!A='1E<FX@;6%T8V@@<&%T:',*``!L<SH@)7,Z($5R<F]RD
XM("T@)6QD"@``)7,@)3)L9"`E-6QD```E<R`E,FQD("4P,FQD.B4P,FQD````\
XM)7,@)3`R;&0@)31L9"`@)3`R;&0Z)3`R;&0Z)3`R;&0``"4P,FQD+25S+24PO
XM,FQD("4P,FQD.B4P,FQD.B4P,FQD```E,#)L9"TE,#)L9"TE,#)L9"`E,#)L-
XM9#HE,#)L9#HE,#)L9````"4P,FQD+R4P,FQD+R4P,FQD("4P,FQD.B4P,FQDQ
XM.B4P,FQD````)3`R;&0O)3`R;&0O)3`R;&0@)3`R;&0Z)3`R;&0Z)3`R;&0`-
XM```E,#)L9"XE,#)L9"XE,#)L9"`E,#)L9#HE,#)L9#HE,#)L9``````````*$
XM;',Z('=A<FYI;F<@*"5L9"DZ(&)L;V-K(&-O=6YT*',I(&UA>2!B92!I;F%C0
XM8W5R871E("T@<V5E(&QS+F1O8PH*`"`@```@8P``("4V;&0`("4U;&0@)3ALF
XM9"`@```@(```+P`O``H`(B5S(@H`FS!MFR!P*BI"4D5!2PH``"!-;W)E("@EX
XM;&0@;V8@)6QD*2`N+BX@`$UO<F4@+BXN(`";,"!PFT:;2P``(``O*B`E<R`J'
XM+PH`8VAS<&%R=S=D`#``,0!$:7(`*BYI;F9O```N*@``3F\@;6%T8V@N"@``*
XM=&]T86P@,`H``&QS.B!$979I8V4@96UP='D@;W(@;F]T(&UO=6YT960*``!L:
XM<SH@17AA;6EN92!F86EL960@+2!);T5R<B`E;&0*`#H*``!L<SH@:6QL96=AQ
XM;"!O<'1I;VX@+2T@)7,@("`@6RUU(&9O<B!U<V%G95T*`&QS.B!R97%U:7)E-
XM9"!A<F<@;6ES<VEN9R!O;B!O<'1I;VX@+2T@)7,@("`@6RUU(&9O<B!U<V%GT
XM95T*````````*```"WX`````````````````````````````````````````]
XM``N@````````````````````````````````````````````````````````K
XM````````````````````````````````````)0``!X8```=^```'>@``!W8`U
XM``=R```';@``!VH```=F```'8@``!UX```=:```'5@``!U(```=.```'2@``7
XM!T8```="```'/@``!SH```<V```',@``!RX```;L```&Z```!N0```;@```&]
XMW```!M@```;4```&T```!LP```;(```&Q```!L````:\```+?@``"UP```/L[
X(`````````_+4)
X``
Xend
Xsize 16028
END_OF_FILE
if test 22474 -ne `wc -c <'ls.uu'`; then
    echo shar: \"'ls.uu'\" unpacked with wrong size!
fi
# end of 'ls.uu'
fi
if test -f 'src/ls.c.ab' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'src/ls.c.ab'\"
else
echo shar: Extracting \"'src/ls.c.ab'\" \(20364 characters\)
sed "s/^X//" >'src/ls.c.ab' <<'END_OF_FILE'
X
XGOODRET:
X  FreeAllFibs (fibhead);
X  return (dirhead);
X
XBADALLOC:
X  FreeAllFibs (fibhead);
X  FreeAllFibs (dirhead);
X  return (0L);
X}
X
X
X/* --------------------------------------------------------------------
X * Given a directory name and a lock on that directory, create a list
X * of entries.	Recursively decends into subdirectories if flaged.
X * -------------------------------------------------------------------- */
XVOID DirIt (curlock, dirname)
X  struct FileLock *curlock;
X  BYTE *dirname;
X{
X  BYTE *matchpath;
X  BYTE *subdir;
X  LONG dnamlen;
X  LONG errcode;
X  LONG len;
X  LONG tmpflags;
X  BYTE tmpdpat[MAXFNLEN+2];
X  BYTE tmpfpat[MAXFNLEN+2];
X  struct FibEntry *tfibp;
X  struct FileLock *sublock;
X  struct List *fibheadp;
X
X/* Try to fill FileInfoBlock, bomb if not readable for some reason */
X  if (Examine((BPTR)curlock, GFibp) == 0)
X  {
X    if ((errcode = IoErr()) == ERROR_DEVICE_NOT_MOUNTED)
X      asprintf(workstr, "ls: Device empty or not mounted\n");
X    else
X      asprintf(workstr, "ls: Examine failed - IoErr %ld\n", errcode);
X    WSTR(workstr);
X    return;
X  }
X
X  recurlevel++;
X
X/* Put directory header for each listing, if headers on and we know the name */
X  if ((GFibp->fib_DirEntryType > 0) && ((LSFlags & NOHEADERS) == 0) && (dirname[0] != 0))
X  {
X  /* Put directory header for each listing, if	recursive and not top dir */
X    if ((recurlevel > 1) && (strcmp(dirname, thePath) != 0))
X    {
X      strcpy(workstr, dirname);
X
X      len = 0;
X      if ((LSFlags & FULLPATHNAMES) == 0)
X      {
X	if ((strnicmp(initialpath, thePath, strlen(thePath)) == 0) ||
X	    (strnicmp(thePath, initialpath, strlen(initialpath)) == 0))
X	{
X	  if (strlen(thePath) <= strlen(initialpath))
X	    matchpath = thePath;
X	  else
X	    matchpath = initialpath;
X	  len = strlen(matchpath);
X	  if ((strnicmp(workstr, matchpath, len) == 0) && (len < strlen(workstr)))
X	  {
X	    if (*(workstr + len) == '/')
X	      len++;
X	  }
X	  else
X	    len = 0;
X	}
X      }
X      strcat(workstr, ":\n");
X
X      SetConPen(penstr3);
X      WSTR(workstr + len);
X      SetConPen(penstr0);
X    }
X  }
X
X/* If this is a single file list it verbosely */
X  if (GFibp->fib_DirEntryType < 0)
X  {
X    if ((LSFlags & SHOWFILES) != 0)
X    {
X      GetPathString(thePath, thePath);
X      fixNumBlocks(curlock, GFibp);
X
X      if ((LSFlags & OLDLONGFORMAT) != 0)
X	LListEntry(GFibp);
X      else
X	llistentry(GFibp);
X
X      gfilecount++; gitemcnt++;
X      gtotblocks += blkalloc(GFibp);
X      gtotbytes  += GFibp->fib_Size;
X
X      LSFlagsX |= SINGLEFILEFLAG;
X    }
X  }
X  else /* It is a directory entry */
X  {
X    tmpflags = LSFlags;
X    if ((LSFlags & WILDPATH) != 0)
X      LSFlags |= SEPFILESDIRS | FILESFIRST;
X
X  /* Allocate, fill, and display a dir of entries, check for no ram or abort */
X    if ((fibheadp = GetDir (curlock, GFibp)) != 0)
X    {
X
X    /* Recursively descend any subdirs in this list, if wanted or a wild path */
X      LSFlags = tmpflags;
X      if (((LSFlags & LISTALL) != 0) || ((LSFlags & WILDPATH) != 0))
X      {
X	LSFlags &= ~WILDPATH;
X	for (tfibp = (struct FibEntry *)fibheadp->lh_Head;
X	      tfibp->fe_Node.mln_Succ != 0;
X	      tfibp = (struct FibEntry *)tfibp->fe_Node.mln_Succ)
X	{
X	  TestBreak ();
X	  if ((LSFlags & BREAKFLAG) != 0)
X	    break;
X
X	  if (tfibp->fe_Fib->fib_DirEntryType > 0)
X	  {
X	  /* Alloc length of path + 1 + newdir name +1 + length of maxname + 1 for NULL
X	   * + 1 for null + 3 for rounding.
X	   */
X	    dnamlen = (LONG)(strlen (dirname) + strlen (tfibp->fe_Fib->fib_FileName) + 36);
X	    if ((subdir = myalloc ((LONG)dnamlen)) != 0)
X	    {
X	      if (dirname[0] != 0)
X	      {
X		(VOID) stpcpy (subdir, dirname);
X		dnamlen = strlen (dirname) - 1;
X		if (dirname[dnamlen] != ':' && dirname[dnamlen] != '/')
X		{
X		  (VOID) strcat (subdir, SlashStr);
X		}
X	      }
X	      (VOID) strcat (subdir, tfibp->fe_Fib->fib_FileName);
X
X	      if ((recurlevel != recurlimit) &&
X		  ((sublock = (struct FileLock *)Lock(subdir, (LONG)ACCESS_READ)) != 0))
X	      {
X		if ((LSFlags & NOHEADERS) == 0)
X		  WCHR(NLine);                  /* Put a blank line between directories */
X
X		curpath = subdir;
X
X		if ((LSFlagsX & WILDPATHFLAG) != 0)
X		{
X		  strcpy(tmpdpat, theDirPat);
X		  theDirPat[0] = '*'; theDirPat[1] = '\0';
X		  strcpy(tmpfpat, theFilePat);
X		  theFilePat[0] = '*'; theFilePat[1] = '\0';
X		}
X
X		DirIt(sublock, subdir); /* Recurse into this subdirectory */
X
X		if ((LSFlagsX & WILDPATHFLAG) != 0)
X		{
X		  strcpy(theDirPat, tmpdpat);
X		  strcpy(theFilePat, tmpfpat);
X		}
X
X		UnLock((BPTR)sublock);  /* Unlock our sublock */
X	      }
X	      myfree(subdir);           /* Free the current namespace */
X	    }
X	  }
X	}
X      }
X      LSFlags = tmpflags;
X    /* Free up this fib list */
X      FreeAllFibs(fibheadp);
X    }
X    LSFlags = tmpflags;
X  }
X  recurlevel--;
X}
X
X
X/* -------------------------------------------------------------------- */
XVOID GetCLIArgs (line, argc, argv)
X  BYTE *line;
X  LONG *argc;
X  BYTE **argv;
X{
X  BYTE **pargv, *qarg;
X
X  *argc = 0;
X  while (*argc < MAXARG)
X  {
X    while (*line == ' ' || *line == '\t' || *line == '\n')
X      line++;
X    if (*line == 0)
X      break;
X    pargv = &argv[*argc];
X    *argc += 1;
X
X    if (*line == '"')
X    {
X      qarg = line;
X      line += 1;
X      *pargv = line;		     /* ptr inside quoted string */
X      while (*line != 0 && *line != '"')
X	line++;
X      if (*line == 0)                /* Hit end of string without quote! */
X      {
X	*pargv = qarg;		     /* Must be okay */
X	break;
X      }
X      else
X	*line++ = 0;		     /* terminate arg ontopof quote */
X    }
X    else			     /* non-quoted arg */
X    {
X      *pargv = line;
X      while (*line != 0 && !(*line == ' ' || *line == '\t' || *line == '\n'))
X	line++;
X      if (*line == 0)
X	break;
X      else
X	*line++ = 0;		     /* terminate arg */
X    }
X  }				     /* while */
X}
X
X
X/* -------------------------------------------------------------------- */
XLONG GetFileDate(name, ptime)
X  char *name;
X  struct DateStamp *ptime;
X{
X  LONG status;
X  struct FileLock *flock;
X  struct FileInfoBlock *fib;
X
X  status = 0;
X  if ((fib = myalloc ((LONG)sizeof(struct FileInfoBlock))) != 0)
X  {
X    if ((flock = (struct FileLock *)Lock(name, (LONG)ACCESS_READ)) != 0)
X    {
X      if (Examine((BPTR)flock, fib) != 0)
X      {
X	*ptime = fib->fib_Date; 	/* Copy the Date structure */
X	status = 1;
X      }
X      UnLock((BPTR)flock);
X    }
X    myfree(fib);
X  }
X  return(status);
X}
X
X
X/* --------------------------------------------------------------------
X * Trap for bad args, and/or explain how to use.
X * -------------------------------------------------------------------- */
XVOID Usage(errcode)
X  LONG errcode;
X{
X  LONG i;
X
X  switch(errcode)
X  {
X    case ILLEGAL_ARG:
X      asprintf(workstr, "ls: illegal option -- %s    [-u for usage]\n", badopt);
X      break;
X    case MISSING_ARG:
X      asprintf(workstr, "ls: required arg missing on option -- %s    [-u for usage]\n", badopt);
X      break;
X    default:
X      for (i = 0; ((LSFlags & BREAKFLAG) == 0) && (usagestrs[i] != 0); TestBreak(), i++)
X	WSTR(usagestrs[i]);
X      cleanup(0, 0);
X  }
X  WSTR(workstr);
X  cleanup(120L, 20L);
X}
X
X
X/* -------------------------------------------------------------------- */
XLONG ParseCmdOptions(ncnt, argc, argv)
X  LONG ncnt, argc;
X  BYTE **argv;
X{
X  LONG i, cnt, len;
X  struct Process *procp;
X
X  cnt = ncnt;	   /* Current arg number that contains the options */
X  ncnt += 1;	   /* Advance to next arg */
X
X  for (i = 1, len = strlen (argv[cnt]); i < len; i++)
X  {
X    switch (argv[cnt][i])
X    {
X      case '?':
X      case 'u':
X	Usage(SYNTAX);
X	break;
X      case 'A':
X	LSFlags |= MATCHDOTFILES | MATCHINFOFILES | SHOWHIDDEN;
X	break;
X      case 'B':
X	if (argv[cnt][i+1] != 0)        /* Blocksize tail of same arg?  */
X	{
X	  (VOID) GetDecNum(&argv[cnt][i+1], &blksize);        /* Yes */
X	  i = len;			/* Blow off rest of this arg */
X	}
X	else
X	{
X	  if (argc < (ncnt + 1))     /* Missing required blocksize number */
X	  {
X	    badopt[0] = argv[cnt][i];
X	    Usage(MISSING_ARG);
X	  }
X	  (VOID) GetDecNum(argv[ncnt], &blksize);
X	  ncnt += 1;		     /* Bump arg counter */
X	}
X	break;
X      case 'C':
X	LSFlags |= ONECOLFORMAT;
X	break;
X      case 'D':
X	LSFlags |= SEPFILESDIRS | FILESFIRST;
X	break;
X      case 'E':
X	LSFlags &= ~CONSOLE;
X	break;
X      case 'F':
X	if (argv[cnt][i+1] != 0)        /* Format string tail of same arg? */
X	{
X	  thefmtstr = &argv[cnt][i+1];	/* Yes */
X	  i = len;			/* Blow off rest of this arg */
X	}
X	else
X	{
X	  if (argc < (ncnt + 1))     /* Missing required format string */
X	  {
X	    badopt[0] = argv[cnt][i];
X	    Usage(MISSING_ARG);
X	  }
X	  thefmtstr = argv[ncnt];    /* Else our format string is the next arg */
X	  ncnt += 1;		     /* Bump arg counter */
X	}
X	LSFlags |= LONGLIST | OLDLONGFORMAT;
X	break;
X      case 'G':
X	LSFlags |= NODIRTOTAL;
X	break;
X      case 'H':
X	LSFlags |= NOHEADERS;
X	break;
X      case 'I':
X	LSFlags |= NOINTERACT;
X	break;
X      case 'K':
X	LSFlags |= SHOWDISKKEYS | LONGLIST;
X	break;
X      case 'L':
X	if (argv[cnt][i+1] != 0)        /* Depth limit tail of same arg?   */
X	{
X	  (VOID) GetDecNum(&argv[cnt][i+1], &recurlimit);     /* Yes */
X	  i = len;			/* Blow off rest of this arg */
X	}
X	else
X	{
X	  if (argc < (ncnt + 1))     /* Missing required depth number */
X	  {
X	    badopt[0] = argv[cnt][i];
X	    Usage(MISSING_ARG);
X	  }
X	  (VOID) GetDecNum(argv[ncnt], &recurlimit);
X	  ncnt += 1;		     /* Bump arg counter */
X	}
X	LSFlags |= LISTALL;
X	break;
X      case 'M':
X	LSFlags |= IGNORECASEWILD;
X	break;
X      case 'N':
X	if (argv[cnt][i+1] != 0)        /* Filename string tail of same arg? */
X	{
X	  if (GetFileDate(&argv[cnt][i+1], &thenewdate) == 0)
X	  {
X	    errmsg(&argv[cnt][i+1], -1L);
X	    cleanup(ioerrcode, 20L);
X	  }
X	  i = len;			/* Blow off rest of this arg */
X	}
X	else
X	{
X	  if (argc < (ncnt + 1))     /* Missing required name string */
X	  {
X	    badopt[0] = argv[cnt][i];
X	    Usage(MISSING_ARG);
X	  }
X	  if (GetFileDate(argv[ncnt], &thenewdate) == 0)
X	  {
X	    errmsg(argv[ncnt], -1L);
X	    cleanup(ioerrcode, 20L);
X	  }
X	  ncnt += 1;		     /* Bump arg counter */
X	}
X	LSFlags |= SHOWNEWERTHAN;
X	break;
X      case 'O':
X	if (argv[cnt][i+1] != 0)        /* Filename string tail of same arg? */
X	{
X	  if (GetFileDate(&argv[cnt][i+1], &theolddate) == 0)
X	  {
X	    errmsg(&argv[cnt][i+1], -1L);
X	    cleanup(ioerrcode, 20L);
X	  }
X	  i = len;			/* Blow off rest of this arg */
X	}
X	else
X	{
X	  if (argc < (ncnt + 1))     /* Missing required name string */
X	  {
X	    badopt[0] = argv[cnt][i];
X	    Usage(MISSING_ARG);
X	  }
X	  if (GetFileDate(argv[ncnt], &theolddate) == 0)
X	  {
X	    errmsg(argv[ncnt], -1L);
X	    cleanup(ioerrcode, 20L);
X	  }
X	  ncnt += 1;		     /* Bump arg counter */
X	}
X	LSFlags |= SHOWOLDERTHAN;
X	break;
X      case 'P':
X	LSFlags |= FULLPATHNAMES | LONGLIST;
X	break;
X      case 'Q':
X	procp = (struct Process *)FindTask(0L);
X	procp->pr_WindowPtr = OldWindowPtr;
X	break;
X      case 'R':
X	recurlimit = MAXDEPTH;
X	LSFlags |= LISTALL;
X	break;
X      case 'S':
X	LSFlags |= SEPFILESDIRS;
X	break;
X      case 'T':
X	LSFlags |= TOTALIZE;
X	break;
X      case 'V':
X	LSFlags |= RELPATHNAMES | LONGLIST;
X	break;
X      case 'W':
X	LSFlagsX |= NOWILDPATHDIRS;
X	break;
X      case 'X':
X	if (argv[cnt][i+1] != 0)        /* Width tail of same arg?   */
X	{
X	  (VOID) GetDecNum(&argv[cnt][i+1], &CurWinCols);     /* Yes */
X	  i = len;			/* Blow off rest of this arg */
X	}
X	else
X	{
X	  if (argc < (ncnt + 1))     /* Missing required width number */
X	  {
X	    badopt[0] = argv[cnt][i];
X	    Usage(MISSING_ARG);
X	  }
X	  (VOID) GetDecNum(argv[ncnt], &CurWinCols);
X	  ncnt += 1;		     /* Bump arg counter */
X	}
X	if ((CurWinCols < 12) || (CurWinCols > WORKSIZE)) CurWinCols = 0;
X	break;
X      case 'Y':
X	if (argv[cnt][i+1] != 0)        /* Height tail of same arg?  */
X	{
X	  (VOID) GetDecNum(&argv[cnt][i+1], &CurWinRows);     /* Yes */
X	  i = len;			/* Blow off rest of this arg */
X	}
X	else
X	{
X	  if (argc < (ncnt + 1))     /* Missing required height number */
X	  {
X	    badopt[0] = argv[cnt][i];
X	    Usage(MISSING_ARG);
X	  }
X	  (VOID) GetDecNum(argv[ncnt], &CurWinRows);
X	  ncnt += 1;		     /* Bump arg counter */
X	}
X	if (CurWinRows < 4) CurWinRows = 0;
X	break;
X      case 'Z':
X	LSFlags |= CONSOLE | NOINTERACT; /* special purpose hack - see docs */
X	break;
X      case 'a':
X	LSFlags |= MATCHDOTFILES;
X	break;
X      case 'b':
X	LSFlagsX |= DATABLKSONLY;
X	break;
X      case 'c':
X	LSFlags |= NOTEFLAG | LONGLIST;
X	break;
X      case 'd':
X	LSFlags &= ~SHOWFILES;
X	break;
X      case 'e':
X	exbit = 'e';
X	break;
X      case 'f':
X	LSFlags &= ~SHOWDIRS;
X	break;
X      case 'h':
X	LSFlags |= SHOWHIDDEN;
X	break;
X      case 'i':
X	LSFlags |= MATCHINFOFILES;
X	break;
X      case 'k':
X	sortkey = 3;
X	LSFlags |= SHOWDISKKEYS;
X	break;
X      case 'l':
X	LSFlags |= LONGLIST;
X	break;
X      case 'm':
X	LSFlags |= IGNORECASELIST;
X	break;
X      case 'n':
X	LSFlags |= NOSORTFLAG;
X	break;
X      case 'o':
X	LSFlags |= OLDLONGFORMAT;
X	break;
X      case 'p':
X	LSFlags |= ADDDIRSLASH;
X	break;
X      case 'q':
X	LSFlagsX |= NOTFOUNDHALT;
X	break;
X      case 'r':
X	LSFlags |= REVFLAG;
X	break;
X      case 's':
X	sortkey = 1;
X	break;
X      case 't':
X	sortkey = 2;
X	break;
X      case 'v':
X	LSFlags |= VARCOLSFORMAT;
X	break;
X      case 'x':
X	if (argv[cnt][i+1] != 0)        /* Pattern tail of same arg? */
X	{
X	  theAntiPat = &argv[cnt][i+1]; /* Yup */
X	  i = len;			/* Blow off rest of this arg */
X	}
X	else
X	{
X	  if (argc < (ncnt + 1))        /* Missing required pattern string */
X	  {
X	    badopt[0] = argv[cnt][i];
X	    Usage(MISSING_ARG);
X	  }
X	  theAntiPat = argv[ncnt];	/* Point to pattern area */
X	  ncnt += 1;			/* Skip over arg */
X	}
X	LSFlags |= ANTIMATCH;		/* Set flag to use antipat */
X	break;
X      case 'z':
X	LSFlagsX |= NOFIXNUMBLOCKS;  /* special purpose hack - see docs */
X	break;
X      case '0':     /*  AGE_TO_YEARS:  MMM dD HH:MM   or   MMM dD  YYYY  */
X      case '1':     /*  FULL_FORM:     MMM DD YYYY  HH:MM:SS             */
X      case '2':     /*  DASHA_FORM:    DD-MMM-YY HH:MM:SS                */
X      case '3':     /*  DASHN_FORM:    MM-DD-YY HH:MM:SS                 */
X      case '4':     /*  SLASH_FORM:    MM/DD/YY HH:MM:SS                 */
X      case '5':     /*  EURO_FORM:     DD/MM/YY HH:MM:SS                 */
X      case '6':     /*  DOT_FORM:      YY.MM.DD HH:MM:SS                 */
X	datefmt = argv[cnt][i] - '0';
X	break;
X      default:
X	badopt[0] = argv[cnt][i];
X	Usage(ILLEGAL_ARG);
X    }
X  }
X  return(ncnt);
X}
X
X
X/* -------------------------------------------------------------------- */
XVOID _main (line)
X  BYTE *line;
X{
X  BYTE *argv[MAXARG];		  /* arg pointers */
X  LONG	argc;			  /* arg count */
X  LONG	cnt;
X  struct Process *procp;
X
X/* Prevent system request from occuring by default */
X  procp = (struct Process *)FindTask(0L);
X  OldWindowPtr = procp->pr_WindowPtr;
X  procp->pr_WindowPtr = SUPPRESS_ERR_REQ;
X
X/* Construct list of args */
X  GetCLIArgs(line, &argc, argv);
X
X/* Grab FileHandles for input and output to console (or redirection file) */
X  ConIn  = (struct FileHandle *)Input();
X  ConOut = (struct FileHandle *)Output();
X
X/* Is this a CLI? Set a flag */
X  if ((IsInteractive((BPTR)ConOut) != 0) && (IsInteractive((BPTR)ConIn) != 0))
X    LSFlags |= CONSOLE;
X
X/* Allocate a global FileInfoBlock for ExNext() */
X  if ((GFibp = myalloc((LONG)sizeof(struct FileInfoBlock))) == 0)
X    errmsg(NULLSTR, ERROR_NO_FREE_STORE);
X
X/* Allocate a global ID for Info() */
X  if ((CurID = myalloc((LONG)sizeof(struct InfoData))) == 0)
X    errmsg(NULLSTR, ERROR_NO_FREE_STORE);
X
X/* Initialize arg count, zero grand totals */
X  cnt = 1;
X  gtotblocks = gtotbytes = gdircount = gfilecount = gentrycnt = gitemcnt= 0;
X
X/* Get the path of the dir we were in when invoked [NO ERROR CHECKING] */
X  MakePathString((struct FileLock *)procp->pr_CurrentDir, initialpath);
X
X/* Parse command line arguments, if any */
X  do
X  {
X    if ((cnt < argc) && (argv[cnt][0] == '-'))
X    {
X    /* Reset for next arg */
X      LSFlags	&= CONSOLE;
X      LSFlags	|= SHOWDIRS | SHOWFILES;
X      LSFlagsX	 = 0;
X      thefmtstr  = deffmtstr;
X      recurlimit = MAXDEPTH;
X
X      do
X      {
X	if (argv[cnt][1] == 0)
X	{
X	  cnt++;
X	  break;
X	}
X	cnt = ParseCmdOptions(cnt, argc, argv);
X      } while ((cnt < argc) && (argv[cnt][0] == '-'));
X    }
X
X    LSFlagsX &= ~WILDPATHFLAG;
X    LSFlagsX &= ~SINGLEFILEFLAG;
X    LSFlagsX &= ~EMPTYDIRFLAG;
X
X    theFilePat[0] = 0;			     /* Terminate pattern strings */
X    theDirPat[0]  = 0;
X
X  /* Is there an named path arg to do? */
X    if (cnt < argc)
X    {
X      LSFlags |= PATHNAMED;		     /* Flag that we have a name */
X      stpcpy(thePath, argv[cnt]);            /* Copy this arg to work space */
X      cnt++;				     /* Advance arg counter */
X
X    /* Wild pathname? Separate into components until we find a non-wild path */
X      if (iswild(thePath) != 0)
X      {
X	(VOID) GetFileString(theFilePat, thePath);
X	(VOID) stpcpy(theDirPat, theFilePat);
X	(VOID) GetPathString(thePath, thePath);
X
X      /* Still wild?  First part must be wild filename to match */
X	if (iswild (thePath) != 0)
X	{
X	  (VOID) GetFileString(theDirPat, thePath);
X	  (VOID) GetPathString(thePath, thePath);
X	}
X
X	if ((LSFlagsX & NOWILDPATHDIRS) == 0)
X	{
X	  LSFlags  |= WILDPATH;
X	  LSFlagsX |= WILDPATHFLAG;
X	}
X      }
X      else
X      {
X	LSFlags  &= ~WILDPATH;
X	LSFlagsX &= ~WILDPATHFLAG;
X      }
X
X#ifdef DEBUGIT
X      asprintf(workstr, "   thePath: %s\n", thePath);    WSTR(workstr);
X      asprintf(workstr, " theDirPat: %s\n", theDirPat);  WSTR(workstr);
X      asprintf(workstr, "theFilePat: %s\n", theFilePat); WSTR(workstr);
X#endif
X
X    /* Filenames and dir nodes currently limited to 30 chars under AmigaDOS */
X      if ((strlen(theDirPat) > MAXFNLEN+1) || (strlen(theFilePat) > MAXFNLEN+1))
X      {
X	errmsg(NULLSTR, PATTERN_ERR);
X	if ((LSFlagsX & NOTFOUNDHALT) != 0)
X	  cleanup(120L, 20L);
X	else
X	  continue;
X      }
X
X    /* No wildcards allowed in the final pathname! */
X      if (iswild(thePath) != 0)
X      {
X	errmsg(argv[cnt-1], WILDSPEC_ERR);
X	if ((LSFlagsX & NOTFOUNDHALT) != 0)
X	  cleanup(120L, 20L);
X	else
X	  continue;
X      }
X
X    /* Now try to lock the dir (or file) */
X      if ((CurFLock = (struct FileLock *)Lock(thePath, (LONG)ACCESS_READ)) == 0)
X      {
X	errmsg(thePath, -1L);
X	if ((LSFlagsX & NOTFOUNDHALT) != 0)
X	  cleanup(ioerrcode, 20L);
X	else
X	  continue;
X      }
X    }
X    else
X    {
X    /*
X     * If no filename was specified, steal Lock on current directory from
X     * CLI process task info.  We durn well better get something useful back;
X     * since we don't do any error checking on the "borrowed" Lock.
X     */
X      CurFLock = (struct FileLock *)procp->pr_CurrentDir;
X    }
X
X  /* Make a full pathname string from given CurFLock if no colon in path */
X    if (aindex(thePath, ':') == 0)
X      MakePathString(CurFLock, thePath);
X    curpath = thePath;
X
X#ifdef DEBUGIT
X    asprintf(workstr, "Final path: %s\n", thePath); WSTR(workstr);
X#endif
X
X  /* If there isn't a dir pattern or file pattern specified, match everything */
X    if (theDirPat[0] == 0)
X    {
X      theDirPat[0] = '*';               /* "*" default matchall dir pattern */
X      theDirPat[1] = 0; 		/* Null terminate string */
X    }
X
X    if (theFilePat[0] == 0)
X    {
X      theFilePat[0] = '*';
X      theFilePat[1] = 0;
X    }
X
X  /* Auto enable display of dot files, if explicitally specified as filespec */
X    if ((theFilePat[0] == '.') || (theDirPat[0] == '.') || (thePath[0] == '.'))
X      LSFlags |= MATCHDOTFILES;
X
X  /* Get the directory for this path, display it */
X    if (recurlevel != recurlimit)
X      DirIt(CurFLock, thePath);
X
X  /* Release the lock if we locked it */
X    if ((CurFLock != 0) && ((LSFlags & PATHNAMED) != 0))
X      UnLock((BPTR)CurFLock);
X    CurFLock = 0;
X
X    TestBreak();
X    if ((LSFlags & BREAKFLAG) == 0)
X    {
X    /* Still more args and previous not a single file or empty dir?  Put linefeed between listing outputs */
X      if ((cnt < argc) && ((LSFlags & NOHEADERS) == 0) && ((LSFlagsX & SINGLEFILEFLAG) == 0) &&
X	  ((LSFlagsX & EMPTYDIRFLAG) == 0))
X	WCHR(NLine);
X
X      if ((cnt >= argc) && ((LSFlags & TOTALIZE) != 0) && (gentrycnt != 1) && (gitemcnt != 0))
X      {
X	if (gentrycnt != 0)
X	{
X	  SetConPen(penstr3);
X	  WSTR(TotHeaderMsg);
X	  SetConPen(penstr0);
X	  asprintf(workstr, totalfmtstr, gdircount, gfilecount, gtotblocks, gtotbytes);
X	}
X	else
X	  asprintf (workstr, filefmtstr, gfilecount, gtotblocks, gtotbytes);
X	WSTR(workstr);
X      }
X    }
X  } while ((cnt < argc) && ((LSFlags & BREAKFLAG) == 0));
X
X/* All done!  Clean exit */
X  cleanup(0, 0);
X}
END_OF_FILE
if test 20364 -ne `wc -c <'src/ls.c.ab'`; then
    echo shar: \"'src/ls.c.ab'\" unpacked with wrong size!
fi
# end of 'src/ls.c.ab'
fi
echo shar: End of archive 2 \(of 4\).
cp /dev/null ark2isdone
MISSING=""
for I in 1 2 3 4 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 4 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Mail submissions (sources or binaries) to <amiga@cs.odu.edu>.
Mail comments to the moderator at <amiga-request@cs.odu.edu>.
Post requests for sources, and general discussion to comp.sys.amiga.