Path: utzoo!attcan!uunet!cs.utexas.edu!swrinde!zaphod.mps.ohio-state.edu!uakari.primate.wisc.edu!xanth!cs.odu.edu!Amiga-Request From: Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) Newsgroups: comp.sources.amiga Subject: v90i196: ls 4.0k - yet another unix-like ls command, Part02/04 Message-ID: <13040@xanth.cs.odu.edu> Date: 3 Jul 90 19:23:52 GMT Sender: tadguy@cs.odu.edu Reply-To: kim@uts.amdahl.com (Kim E. DeVaughn) Lines: 1223 Approved: tadguy@cs.odu.edu (Tad Guy) X-Mail-Submissions-To: Amiga@cs.odu.edu X-Post-Discussions-To: comp.sys.amiga 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 '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='``$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+PP1] 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`<B(OC XM`!R2@%*!+BW_[%:'2.\``@`@<`R^@&\$4H6>@"M'_^P,A0``!]!L"B`%!(``# XM``=L8`@@!02````'T"X`("H`"'(R3KHL,B]``"0@*@`$P&O-'`)$@N+P`@<%K0? XM@+R`;@1*AFH8+P4O!R\22&P(N"\+3KHAD$_O`!1@``$(+P0O+P`@+PP&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+P4JP)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.L`!$/K`'0O"2](P XM``Q![!$X(F\`#&$`_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)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``<`#VP&_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.``$G XM3J[^SBE``!0(```,9Q1![`HL88P([`````]@!@CL````#RQ?3G5.5?_\2.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*%(```K0/_D8`H@D XM!U2`D:W_Y%*$("W_Y+"';.YP8W(`0>P,)!#!4P,)!#!4P1.")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![` XM"DZZ']@B+P`(T(%R,)"!)(`0$W(PL`%E!G(YL`%CUB`+3-\,`$Y=3G5.5?_<. XM2.2"X`(&P2\")(T\)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``%'[`+@!@!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``<`#VL`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&]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(YRP.X&`$1>P0#$'K``@O2``<(DI.NA34*@`D;P`<""P`!P`-9BQ*S XMA6P*DF$`\SI@3`CL``0`$P@L``4`#V<^0>P*" XMGF$`\R)@-'`,P*P`#&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%.@@+``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. 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(;`3^\`N XM#&`F1^P'+F`,(%-A`.W280#N'%B+""P````/9@1*DV;H<``B`&$`Y1!![!$X] XM80#ML'!X`*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*@&82H``4/L"]!A`/Q*2H!F'B)O`!P@4='%0^@``7#_($EA`.**("P`)'(480#BI XM#BH$8$0N!E*'("W_Z+"';`X94@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@W_>-'`(E!P+;`19EYP`L"L``P`N XM0``,*4``#$*L`!!![`7B*4@'ABE\?____P`@(`?E@$'M_W@B2-/`)%%**@`!J XM9@12AV`D(`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@JZP')V$`9 XMW<`(+``%`!-G``',<'AR%&$`W3Q![`VT3KH%_$J`9R@@!^6`0>W_=-'`(#P`O XM`=3>(%!A`-V,""P`!0`39P`!F'!XP-M"((=/XL;!0X3J[_K"E`K XM``!F)G#_0>P-M&$`W5H(+``%`!-G``%F("P`)'(480#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.`!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``"$##(`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`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#(<```!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.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*$&0````1.KO\63-]L!$YU2.<`-B1()DE.N0``"=Y*@&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*$F1(!*@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^@``+```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,VULF4@("`@("`@("`@($T@($EG;F]RJ XM92!C87-E('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@2`@("`@('H@($]V97)R, XM:61E(&)L:R!C86QC("`@("`@4B`@4F5C=7)S:79E(&QI XM<&5N9"`B+R(@=&\@9&ER'0@87)G/ XM(&ES(&9I;&5N86UE"@`@('(@(%)E=F5R71E- XM)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!M96UO0H``"!&:6QE2!O2!B92!I;F%C0 XM8W5R871E("T@@``!W8`U XM``=R```';@``!VH```=F```'8@``!UX```=:```'5@``!U(```=.```'2@``7 XM!T8```="```'/@``!SH```'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 . Mail comments to the moderator at . Post requests for sources, and general discussion to comp.sys.amiga.