ON ERROR VDU4:REPORT:PRINT ERL:END

DIM block% 1023

Menu%=FNswi_number("Director_Menu")
EndMenu%=FNswi_number("Director_EndMenu")
Option%=FNswi_number("Director_Option")
Command%=FNswi_number("Director_Command")
Dash%=FNswi_number("Director_Dash")
XOS_ReadVarVal%=FNswi_number("XOS_ReadVarVal")
XOS_SetVarVal%=FNswi_number("XOS_SetVarVal")

SYS "OS_GetEnv" TO comm%
SYS "OS_ReadArgs","name,quit,menu/k,,",comm%,block%,1023
menu$=FNlcase(FNstring(block%!8))
dir$=FNstring(block%!12):leaf$=""
IF dir$="" leaf$=FNstring(block%!16)
IF dir$="" dir$=FNread("Dir")
IF leaf$="" leaf$=FNread("Leaf")
IF leaf$="" OR leaf$="$" OR RIGHT$(leaf$,2)=":$" path$=dir$ ELSE path$=dir$+"."+leaf$

SYS "XOS_File",17,path$ TO ObjType%,,LoadAddr%,ExecAddr%,Size%,Attrib%;Flags%
IF (Flags% AND 1) OR ObjType%=0 THEN END
CASE ObjType% OF
  WHEN 1:
    IF (LoadAddr% AND &FFF00000)=&FFF00000 THEN
      Type%=(LoadAddr% AND &FFF00) >> 8
      Type$=FNread("File$Type_"+RIGHT$("00"+STR$~(Type%),3))
    ELSE
      Type%=-1
      Type$="File"
    ENDIF
  WHEN 2,3:
    IF LEFT$(leaf$,1)="!" Type%=&2000:Type$="Application" ELSE Type%=&1000:Type$="Directory"
  ENDIF
ENDCASE

CASE menu$ OF
  WHEN "access":PROCaccess
  WHEN "accessdetails":PROCaccessdetails
  WHEN "settype":PROCsettype
  WHEN "info":PROCinfo
  OTHERWISE:PROCfilermenu
ENDCASE
END

DEF PROCfilermenu
PROCset("Director$Menu","Filer")
SYS Menu%, "Filer"
  SYS Option%, "Copy -sub ""Save:"+path$+""""
  SYS Option%, """Copy local"" -sub FileCopyLocal"
  SYS Option%, "Rename -sub FileRename"
  SYS Option%, "Delete -fg <Director$Red>"
    SYS Command%, "/Director:Utils.RunFilerAc 2"
  SYS Option%, "Access -sub ""Dynamic:/Director:Menus.Files.FilerMenu -menu Access"""
  SYS Option%, "Count"
    SYS Command%, "/Director:Utils.RunFilerAc 5"
  IF Type$="Application" AND NOT FNifthereis(path$+".!Help",0) THEN
    SYS Option%, "Help"
      SYS Command%, "Filer_Run "+path$+".!Help"
  ELSE
    SYS Option%, "Help -grey"
  ENDIF
  SYS Option%, "Info -sub ""Dynamic:/Director:Menus.Files.FilerMenu -menu Info"""
  IF ObjType%=1 THEN
  SYS Option%, "Find -grey"
    SYS Option%, "SetType -sub ""Dynamic:/Director:Menus.Files.FilerMenu -menu SetType"""
  ELSE
  SYS Option%, "Find -sub Find"
    SYS Option%, "SetType -grey"
  ENDIF
  SYS Option%, "Stamp"
    SYS Command%, "/Director:Utils.RunFilerAc 8"
SYS EndMenu%


SYS Menu%, """Copy local"" FileCopyLocal"
  SYS Option%, """"+leaf$+""" -len 32"
    SYS Command%, "/Director:Utils.RunFilerAc 7 <MenuText>"
SYS EndMenu%


SYS Menu%, """Rename"" FileRename"
  SYS Option%, """"+leaf$+""" -len 32"
    SYS Command%, "Rename "+path$+" "+dir$+".<MenuText>"
SYS EndMenu%
ENDPROC

DEF PROCaccess
PROCset("Director$Menu","FileAccess")
SYS Menu%,"Access FileAccess"
  IF (Attrib% AND 10)=8 tick$="-tick" ELSE tick$=""
  SYS Option%,"Protected "+tick$
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFF50008 -recurse"
  IF (Attrib% AND 10)=2 tick$="-tick" ELSE tick$=""
  SYS Option%,"Unprotected "+tick$
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFF50002 -recurse"
  SYS Dash%
  IF (Attrib% AND 16)=16 tick$="-tick" ELSE tick$=""
  SYS Option%,"Public "+tick$
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFEF0010 -recurse"
  IF (Attrib% AND 16)=0 tick$="-tick" ELSE tick$=""
  SYS Option%,"Private "+tick$
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFCF0000 -recurse"
  SYS Dash%
  SYS Option%,"""Access details"" -sub ""Dynamic:/Director:Menus.Files.FilerMenu -menu AccessDetails"""
SYS EndMenu%
ENDPROC

DEF PROCaccessdetails
PROCset("Director$Menu","FileAccessDetails")
SYS Menu%,"""Access details"" FileAccessDetails"
  IF Attrib% AND 1 tick$="-tick" ELSE tick$=""
  SYS Option%,"Read "+tick$
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFFE0001 -recurse"
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFFE0000 -recurse"
  IF Attrib% AND 2 tick$="-tick" ELSE tick$=""
  SYS Option%,"Write "+tick$
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFFD0002 -recurse"
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFFD0000 -recurse"
  IF Attrib% AND 8 tick$="-tick" ELSE tick$=""
  SYS Option%,"Locked "+tick$
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFF70008 -recurse"
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFF70000 -recurse"
  SYS Dash%
  IF Attrib% AND 16 tick$="-tick" ELSE tick$=""
  SYS Option%,"""Public read"" "+tick$
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFEF0010 -recurse"
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFEF0000 -recurse"
  IF Attrib% AND 32 tick$="-tick" ELSE tick$=""
  SYS Option%,"""Public write"" "+tick$
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFDF0020 -recurse"
    SYS Command%,"/Director:Utils.RunFilerAc 3 -v &FFDF0000 -recurse"
SYS EndMenu%
ENDPROC

DEF PROCsettype
PROCset("Director$Menu","FileSetType")
SYS Menu%, """SetType"" FileSetType"
  SYS Option%,""""+Type$+""" -len 12"
    SYS Command%,"SetType <Path> <MenuText>"
  SYS Dash%
  SYS Option%,"User -sub ""Dynamic:/Director:Menus.Files.FileTypes 0"""
  SYS Option%,"""Public domain"" -sub ""Dynamic:/Director:Menus.Files.FileTypes 321"""
  SYS Option%,"Commercial -sub ""Dynamic:/Director:Menus.Files.FileTypes DCB987654"""
  SYS Option%,"Acorn -sub ""Dynamic:/Director:Menus.Files.FileTypes A"""
  SYS Option%,"Generic -sub ""Dynamic:/Director:Menus.Files.FileTypes FE"""
  SYS Dash%
  SYS Option%,"""Full list"" -sub ""Dynamic:/Director:Menus.Files.FileTypes"""
SYS EndMenu%
ENDPROC

DEF PROCinfo
PROCset("Director$Menu","FileInfo")
SYS Menu%,"Info FileInfo"
SYS Option%,"""Name: "+leaf$+""""
CASE Type% OF
  WHEN &2000: SYS Option%,"""Type: "+Type$+""" -sprite small_app"
  WHEN &1000: SYS Option%,"""Type: "+Type$+""" -sprite small_dir"
  WHEN -1: SYS Option%,"""Type: "+Type$+""" -sprite small_xxx"
       SYS Option%, """Load address: "+RIGHT$("0000000"+STR$~(LoadAddr%),8)+""""
       SYS Option%, """Exec address: "+RIGHT$("0000000"+STR$~(ExecAddr%),8)+""""
  OTHERWISE:  SYS Option%,"""Type: "+Type$+" (&"+RIGHT$("00"+STR$~(Type%),3)+")"" -sprite small_"+RIGHT$("00"+STR$~(Type%),3)
ENDCASE
SYS "OS_ConvertFileSize",Size%,block%,1023 TO ,t%:?t%=13
IF ?(t%-6)=32 OR Size%=1 THEN
  SYS Option%,"""Size: "+$block%+""""
ELSE
  SYS Option%,"""Size: "+$block%+", "+STR$(Size%)+" bytes"""
ENDIF
access$=""
IF Attrib% AND 8 access$+="L"
IF Attrib% AND 2 access$+="W"
IF Attrib% AND 1 access$+="R"
access$+="/"
IF Attrib% AND 32 access$+="w"
IF Attrib% AND 16 access$+="r"
SYS Option%,"""Access: "+access$+""""
DIM time% 5
!time%=ExecAddr%
time%?4=LoadAddr% AND &FF
SYS "OS_ConvertDateAndTime",time%,block%,1023,"%24:%mi:%se %dy %m3 %ce%yr" TO ,t%
?t%=13
SYS Option%,"""Date: "+$block%+""""
SYS EndMenu%
ENDPROC

:

DEF FNswi_number(name$)
  SYS &39,,name$ TO A%
=A%

DEF PROCset(a$,v$)
  SYS XOS_SetVarVal%,a$,v$,LEN v$,0,0
ENDPROC

DEF FNread(a$)
  ?block%=13
  SYS XOS_ReadVarVal%,a$,block%,1023,0,3 TO ,,read%
  block%?read%=13
=$block%

DEF FNifthereis(o$,t%)
SYS "XOS_File", 17, o$ TO s%;f%
IF f% AND 1 THEN =FALSE
=(s%=t%)

DEF FNstring(ptr%)
IF ptr%=0 OR ptr%=-1 THEN =""
LOCAL a$:a$=""
WHILE ?ptr%>31
  a$+=CHR$(?ptr%):ptr%+=1
ENDWHILE:=a$

DEF FNlcase(text$)
LOCAL Loop%,text2$
text2$=""
FOR Loop%=1 TO LEN(text$)
  chr%=ASC(MID$(text$,Loop%,1))
  IF chr%>64 AND chr%<91 chr%=chr%+32
  text2$+=CHR$(chr%)
NEXT
=text2$
