> TCopy/src v1.60 # > TreeCopy/s 1.58 29-Jun-2009 I v1.52 23-May-2005: Does multiple files, reads params, memory bugfix (& v1.55 15-Aug-2006: Added -?, fx1 29 v1.56 19-Nov-2006: *MOUNT on ADFS leaves files open <2 v1.57 15-Jan-2007: GetEnv works on ARM CoPro F= v1.58 29-Jun-2009: Patched for DFS-like non-DFS systems P: Z debug%= dK&87:23;2,53;0;0;0:A$=OS_GetEnv+" ": 11"TreeCopy 1.60"'1114,"=")' n9OSGBPB=&FFD1:OSFILE=&FFDD: OSWORD=&FFF1:OSARGS=&FFDA x- X% 127,name% 127,inf% 31:Y%=X%256:*FX1 >maxlen%=(-P-2500+1000*(>&7FFF))&FFFF00: data% maxlen% maxlen%=maxlen%-256: Bugfix end%=data%+maxlen% ? Syntax: (fs:)src (fs:)dest CPREAS (-dest) (-quit (*)name) GQ$="":S$="":D$="":pa%=1:cf%=1:rc%=1:exp%=1:d_all%=1:d_sub%=1:dst%= 3 I%=0: A$,6)="-quit ":Q$=A$,7, A$-7):A$="" + A$,2)="-d":dst%=:A$=A$,A$," ")+1) H A$<>"" S$="" A$,1)<>"-":I%=A$," "):S$=A$,I%-1):A$=A$,I%+1) H A$<>"" D$="" A$,1)<>"-":I%=A$," "):D$=A$,I%-1):A$=A$,I%+1) 2 S$<>"" D$<>"":I%=A$,1)="~": I%:A$=A$,2) * S$<>"" D$<>"": A$,1)="C":cf%=I% * S$<>"" D$<>"": A$,1)="P":pa%=I% * S$<>"" D$<>"": A$,1)="R":rc%=I% + S$<>"" D$<>"": A$,1)="E":exp%=I% - S$<>"" D$<>"": A$,1)="A":d_all%=I% - S$<>"" D$<>"": A$,1)="S":d_sub%=I% "% " ACDEFPRSU",A$,1)):A$=A$,2) ,\ A$="-? "::"Syntax: TreeCopy (fs:)src (fs:)dest CPREAS (-dest) (-quit (*)name)":q: 6 A$="" @"Caution - This program does not check"'"for circular pathnames - Eg Copying"'"$.FRED into $.FRED.JIM will repeatedly"'"create $.FRED.JIM.JIM.JIM.JIM...etc."''"Buffer length: &";~maxlen% J< S$<>"":I%=S$,":"): I%>1:FS1$=S$,I%-1):D1$=S$,I%+1) T( : -1:Q$=13: "FX1,"+ß:q ^" S$<>"": I%<2:FS1$="":D1$=S$ hQ S$=""::FS1$=inp("Source filing system: "): FS1$:D1$=inp("Source dir: ") r$fs1%=fs:file("$",5)<>2:fs1%=4 |Xup%=(file("^",5)=2): fs1%=4:type%=(file(D1$+".$",5)):type%=2 type%=file(D1$,5) ( type%=0: D1$" does not exist.":q - type%<>2: D1$" is not a directory.":q . pa%>0:'"Pause to change disks";:pa%=yn ; D$<>"":I%=D$,":"): I%>1:FS2$=D$,I%-1):d$=D$,I%+1) ! D$<>"": I%<2:FS2$="":d$=D$ H D$="":':FS2$=inp("Dest. filing system: "):d$=inp("Dest. dir: ")  FS2$="":FS2$=FS1$ Jmnt1$="":mnt2$="":d2$="":Dest:fs2%=fs:d2$=d$:file("$",5)<>2:fs2%=4 ֗ fs2%>4 d2$,"$")+d2$,"%")+d2$,"&")+d2$,":")+d2$,"@")=0:"Dest. dir must be an absolute pathname, ie it must contain one of $,%,&,@ or :":q  fs1%=fs2%:FS1$="":FS2$="" ' fs1%<>fs2% fs1%=8:mnt1$="Mount" ' fs1%<>fs2% fs2%=8:mnt2$="Mount" | fs1%=fs2% pa% (fs1%=8 fs1%=16):mnt1$="Mount "+drv:mnt2$=mnt1$: mnt2$: D1$,1)<>"$" D1$,1)<>":":D1$="$."+D1$  fs2%>4:cd(d2$) *DIR$ # cf%>0:pr:"Confirm";:cf%=yn 1 rc%>0:rc%=: fs1%>4 '"Recurse";:rc%=yn: && fs1%=5:mask%=&FFFFFF3B mask%= 0> exp%>0:exp%=: fs2%=4 "Expand into DFS dirs";:exp%=yn :) exp%d2$,2)=".$":d2$=d2$, d2$-2) D*dcd%=:dest$=d2$+".":ddir$="":dpfx$="" NK fs1%<>fs2%: file("^",5)=2:ddir$="DIR ":dest$="":oldpath$=Path_Name Xj fs1%=fs2% fs1%>4 up% pa%: file("%",5)=2:ddir$="LIB ":dpfx$="%.":dest$="%.":oldpath$=Path_Lib b ddir$<>"": ddir$+d2$ l.Src::olddir$="": up%:olddir$=Path_Name vfd_all%=:d_sub%=: fs=4:"Do all DFS dirs";:d_all%=yn: d_all%:'"Put in subdirs";:d_sub%=yn:  d_sub%:sub$="." sub$="/" -rd:" Dir. ";D1$:"DIR "+D1$:d2$=d2$+"."  Cur.Dir=D1$, src SZ%=0:Ptr%=data%:done%=:?Ptr%=0:F$="":index%=0:level%=0:dir%=33: d_all%:*DIR !  err:"FX1,"+ß:q " Do: done% Z%=0:end::q : q: dst%:Dest  Q$="":Q$=13:  Q$,1)="*": Q$:Q$=13:  Q$ :  end & ddir$<>"":Dest: ddir$+oldpath$   fs<>fs1%:Src ! olddir$<>"":"DIR "+olddir$   *: 4/ݤinp(A$): A$;: ""B$: B$,1)="*": B$ > B$,1)<>"*":=B$ H: R%ݤerr:pr:11:: ;: <128::= \p =195 (Z%&C)=4:". Overwrite";:ov%=yn: ov%:Ptr%=P%+length%:= =195 (Z%&C)=4:"ACCESS "+d$::= f%". Skip";:sk%=yn: sk% Z%=0: p# Z%=0 sk%:F$=file$:T%=A%:= z)(Z%&C)=4:: sk%:Ptr%=P%+length%:= 8(Z%&C)=12 sk%::Ptr%=data%:?Ptr%=0:F$="":ErrGBPB 8debug%:(Z%&C)=12:"d$:"d$'"in$:"in$'"file$:"file$ :debug%:"Type: ";T%;" File: ";file$'"Operation: ";Z% F$="":=<128 -1 : XErrGBPB:db("ErrGBPB"): mnt2$="":(Z%&100)=0:Z%=0:#c1%:Dest:#c2%:Src:rd:: , mnt2$="":Z%=0:#c2%:Src:#c1%:rd:: (Z%&100)=0:Z%=0:#c1%: Z%=0:#c2%:Src:rd:: : !Do:db("Do"): Z%=0:Read: "(Z%&C)=0 ?data%=0:Z%=Z%+12 /(Z%&C)=0::Dest:Z%=Z%+4:Ptr%=data%:wr: (Z%&C)=4:Write: Z%<8: 3(Z%&C)=8:Src:Z%=Z%+4:Ptr%=data%:rd: pa%: (Z%3)<>1:Z%=0:?Ptr%=0: $3(Z%&C)=12:GBPB:Z%=0:F$="":Ptr%=data%:?Ptr%=0 . 8: BKRead:db("Read"): F$<>"":file$=F$:A%=f_info(file$):F$="":DoFile2: LDfile$=s(gbpb8(index%)):index%=X%!9:ret%=file$:ret%:DoFile1 V ret%=0 Z%<>0: ret%<>0: `: j; REPEAT:X%!1=name%:X%!5=1:X%!9=index%:A%=8:CALL OSGBPB t1 ret%=X%!5:index%=X%!9:IF ret%=0:PROCDoFile1 ~. UNTIL ret%<>0 OR Z%<>0:IF ret%=0:ENDPROC : & d_all%:A%=3:file$="":DoFile2: Rindex%=0:dir%=dir%+1: dir%=34 dir%=":" dir%="*" dir%="|":dir%=dir%+1  dir%="a":dir%="{" 4 dir%<127:"DIR "+ dir% A%=3:DoFile2:*DIR $  : DoFile1:db("DoFile1") ؃ ?(name%+?name%+1)=13:file$=$(name%+1):IF RIGHT$(file$,1)=" ":REPEAT:file$=LEFT$(file$,LEN file$-1):UNTIL RIGHT$(file$,1)<>" " b A%=FNfile(file$,5):IF A%=2 ANDNOTrc%:ENDPROC ELSE PRINT SPC(level%*2);:IF A%=2:PRINT"Dir. "; FA%=f_info(file$): A%=2 rc%: (level%*2);: A%=2:"Dir. "; : & A%<1 A%>2:" not recognised":  " d_all% dir%<>"$": dir%,46  file$;: cf%: yna:: DoFile2: (: 2DoFile2:db("DoFile2") maxlen%:F$=file$:T%=A%:Z%=1: : Bigger than whole buffer x Ptr%+4+file$+sz%+48>end%:F$=file$:T%=A%:Z%=2: : Bigger than remaining space : 4 load%=X%!2:exec%=X%!6:length%=X%!10 AND (A%=1) 7 IF length%>maxlen%-48:F$=file$:T%=A%:Z%=1:ENDPROC ^ IF fs1%=5:$(name%+8)=file$:PROCoswD(&14,&12002000,&40000000):IF name%?2=0:X%!15=name%!10 > attr%=X%!14:$(Ptr%+1)=FNin(file$):P%=Ptr%+2+LEN$(Ptr%+1) -$(Ptr%+1)=in(file$):P%=Ptr%+2+$(Ptr%+1) : 7 IF P%+length%+48>end%:F$=file$:T%=A%:Z%=2:ENDPROC 2 A%=3 end%=data%+maxlen%:done%=:Z%=2:11: : A%=3:DirUp:index%=!end%:end%=end%+4:level%=level%-1 :  Check no 'R' L !P%=load%:P%!4=exec%:P%!8=length%:P%!12=attr%:P%=P%+16:IF A%<>3:PROCpr L !P%=load%:P%!4=exec%:P%!8=length%:P%!12=attr%:P%=P%+32:IF A%<>3:PROCpr : B%=0 31 4:P%!B%=X%!(B%+2)::P%=P%+32: A%<>3:pr : "} A%=1:"LOAD "+file$+" "+~P% A%=2:"DIR "+file$:end%=end%-4:!end%=index%:index%=0:D1$=D1$+"."+file$:level%=level%+1 , Reset no 'R' 6"?Ptr%=A%:Ptr%=P%+sz%:?Ptr%=0: @: Jݤin(F$): fs1%>4:=F$ T. d_all% dir%<>"$":= dir%+sub$+F$ :=F$ ^: hLDirUp:db("DirUp")::D1$=D1$, D1$-1): D1$,1)=".":D1$=D1$, D1$-1) r up%:"DIR ^" "DIR "+D1$ | : LDest:db("Dest"): pa% pr:"Insert dest. and press SPACE";: <65:  FS2$<>"": FS2$ 7 mnt2$<>"": mnt2$: d2$<>"":"DIR "+d2$, d2$-1) F(mnt2$<>"" d2$<>"")(FS1$+FS2$="" up%):"DIR "+d2$, d2$-1)  : GSrc:db("Src"): pa%:"Insert source and press SPACE";: <65:  FS1$<>"": FS1$ # mnt1$<>"": mnt1$:"DIR "+D1$ 3 mnt1$<>"" (FS1$+FS2$="" up%):"DIR "+D1$  : +Write:db("Write"):?Ptr%=0:Z%=Z%+4: i A%=?Ptr%:file$=$(Ptr%+1):P%=Ptr%+2+LEN file$:load%=!P%:exec%=P%!4:length%=P%!8:attr%=P%!12:P%=P%+16 eA%=?Ptr%:file$=$(Ptr%+1):P%=Ptr%+2+ file$:load%=!P%:exec%=P%!4:length%=P%!8:attr%=P%!12:P%=P%+32 & A%=3:DUp:Ptr%=P%: 0 A%=2:DDir:Ptr%=P%: :@Check: d2$;file$;: dpfx$="":d$=d2$+file$ d$=dpfx$+file$ D["SAVE "+d$+" "+~P%+"+"+~length%+" "+~exec%+" "+~load%:SetAttr:Ptr%=P%+length%:: N: X'SetAttr:db("SetAttr"): fs2%<4: b#db("SetAttr:"+fs1%+":"+fs2%) l* fs1%=4:attr%=(attr%1)((attr%8)4) v fs2%=4:attr%=attr%8  fs2%=8: mnt2$ 4 ddir$="":$name%=d2$+file$ $name%=dpfx$+file$ db("SetAttr:"+$name%) C!X%=name%:X%!2=load%:X%!6=exec%:X%!14=attr%mask%:A%=1: OSFILE db("SetAttr:OSFILE")  fs2%<>5:  fs1%<>16 fs1%<>5: db("SetAttr:NetFS") ]$(name%+11)=$(name%+1):name%!7=attr%mask%:name%?10=?name%:oswD(&14,&13002000,&05000000) db("SetAttr:T&D") $(name%+18)=$(name%+10):name%!7=attr%mask%:name%!10=0:name%!12=attr%mask%:name%?12=0:name%?16=0:name%?17=0:oswD(&14,&13002000,&40000000): : Check:db("Check") 8 exp%file$,2,1)="/":file$=file$,1)+"."+file$,3)  @ fs2%=4:file$=file$,7-2*(file$,2,1)=".")):attr%=attr%&33 Q d_all%d_sub%dcd%<> file$file$,2,1)=".":cd(d2$+file$,1)):dcd%= file$   fs1%=4:attr%=attr%&33 * 4: >6DUp:db("DUp"): d2$=d2$, d2$-1): d2$,1)="." HH ddir$<>"": ddir$+dpfx$+"^": ELSE OSCLI"DIR "+LEFT$(d2$,LENd2$-1) R \: fCDDir:db("DDir"): dpfx$="":cd(d2$+file$) cd(dpfx$+file$) pQSetAttr:d2$=d2$+file$: ddir$<>"": ddir$+dpfx$+file$: ELSE OSCLI"DIR "+d2$ zd2$=d2$+".": : +GBPB:db("GBPB"):file$=in(F$):in$=F$ F A%=FNfile(in$,5):load%=X%!2:exec%=X%!6:length%=X%!10:attr%=X%!14 CA%=f_info(in$):load%=X%!2:exec%=X%!6:length%=X%!10:attr%=X%!14 : 5c2%=0:c1%=(in$): c1%=0:"No input available.": ymax%=(end%-data%-32)&FFFF00:gbpb(4,c1%,data%,max%,0):#c1%:Dest:wr:Z%=Z%&100:Check: dpfx$="":d$=d2$ d$=dpfx$ 'd2$;file$; Ԫd$=d$+file$:$name%=d$:!X%=name%:X%!2=load%:X%!6=exec%:X%!10=0:X%!14=length%:A%=7:A%=( OSFILE)&FF:c2%=(d$): c2%=0:c2%=(d$): c2%=0:'"No output available.":Src: 7gbpb(2,c2%,data%,max%,0):ptr%=max%:b%=max%::#c2% .:Src:rd:Z%=Z%&FF:c1%=(in$):#c1%=ptr% ' ptr%+max%>length%:b%=length%-ptr% Igbpb(4,c1%,data%,b%,0):#c1%::Dest:Z%=Z%&100:c2%=(d$):#c2%=ptr% 2wr:gbpb(2,c2%,data%,b%,0)::ptr%=#c2%:#c2%  ptr%>=length%:SetAttr Src:Z%=Z%&FF:rd:: $: .;cd(F$):db("cd"): fs>4: file(F$,5)<>2:"CDIR "+F$ 8 B: L'rd:db("rd"):pr:"Reading...";: V'wr:db("wr"):pr:"Writing...";: `pr: >0: j t: ~ ݤyn: A% *"? (Y/N)";::A%= &DF: A%=89 A%=78 1 5,8);: A%=89:"Yes ";:= "No ";:= : ݤyna: A% 3"? (Y/N/A)";::A%= &DF: A%=89 A%=78 A%=65 P 7,127);: A%=89:"Yes ";:= A%=78:"No ";:= "All ";:cf%=:= : "ݤdrv:A%=6:X%!1=data%: OSGBPB $?(data%+1+?data%)=13:=$(data%+1) : SoswD(A%,D%,E%):db("oswD"): X%,Y%:X%=name%:Y%=X%256:!X%=D%:X%!4=E%:&FFF1: : db(A$):debug%:A$