REM >%.Biggest
REM By Dave Lawrence
REM For Archimedes only
REM (c) BAU September 1991
:
PROCinit
arg$=FNgetargs
PROCreadargs(arg$)
IF help% THEN
 PRINT"Find large files and directories"'
 PRINT"Keywords:"'
 PRINT"Upper case indicates allowable abbreviation"
 FOR arg%=0 TO args%-1
  PROCp("-"+arg$(arg%,0),arg$(arg%,2))
 NEXT
ELSE
 PROCsetup
 IF verbose% PRINT root$;
 PROCcount(root$)
 IF verbose% PRINT STRING$(LEN root$,CHR$127);
 PROCresults
ENDIF
END
:
DATA 12
DATA Number,/e,"Number of objects to display (default 30)"
DATA Type,=types/k,"Filetype[s] to count (separated by semicolons)"
DATA Exclude,/k,"Filetype[s] to exclude (separated by semicolons)"
DATA Directories,/s,"Count directories rather than files"
DATA Applications,/s,"Count Risc OS applications (identified by !RunImage)"
DATA Root,/k,"Set directory to start from (default $)"
DATA Single,/s,"Only count 'Root' directory (don't recurse)"
DATA Format,/k,"Set file size format (Decimal, Hexadecimal, Textual)"
DATA Path,/s,"Print full pathnames rather than file and path"
DATA SPlit,=sp/s,"Print pathnames on a new line"
DATA Verbose,/s,"Display directories searched"
DATA Help,/s,"Display this help"
:
DEF PROCp(c$,h$)
SYS "OS_PrettyPrint",c$+STRING$(14-LEN c$,CHR$31)+": "+h$+CHR$10+CHR$13+CHR$0
ENDPROC
:
DEF FNgetargs
SYS "OS_GetEnv" TO A$
A$=FNlow(A$)
quit=INSTR(A$,"-quit")
A$=MID$(A$,quit+6)
spc=INSTR(A$," ")
A$=MID$(A$,spc+1)
=A$
:
DEF PROCinit
READ args%
DIM ftypes%(&FFF),arg$(args%-1,2),form$(2),block 256
form$()="decimal","hexadecimal","textual"
dec%=0:hex%=1:text%=2:formats%=3
name=block+&14
key$=""
FOR arg%=0 TO args%-1
 READ arg$(arg%,0),arg$(arg%,1),arg$(arg%,2)
 IF key$<>"" key$+=","
 key$+=(FNlow(arg$(arg%,0))+arg$(arg%,1))
NEXT
ENDPROC
:
DEF PROCreadargs(arg$)
ftypes%()=TRUE
SYS "OS_ReadArgs",key$,arg$,block,&100
number%  = FNval(0)
types%   = FNval(1)
exclude% = FNval(2)
dirs%    = FNval(3)
apps%    = FNval(4)
root%    = FNval(5)
single%  = FNval(6)
format%  = FNval(7)
path%    = FNval(8)
split%   = FNval(9)
verbose% = FNval(10)
help%    = FNval(11)
ENDPROC
:
DEF FNval(arg%)
LOCAL val%
val%=block!(arg%*4)
IF RIGHT$(arg$(arg%,1))="s" THEN =(val%<>0)
=val%
:
DEF PROCsetup
flag%=-(types%>0)-(exclude%>0)-apps%-dirs%
files%=(types%>0) OR (exclude%>0) OR (flag%=0)
IF flag%>1 ERROR 0,"Multiple search parameters"
IF number%=0 number%=30 ELSE number%=number%!1
IF types%>0 THEN
 ftypes%()=FALSE
 PROCextracttypes(FNstr0(types%),TRUE)
ENDIF
IF exclude%>0 THEN
 ftypes%()=TRUE
 PROCextracttypes(FNstr0(exclude%),FALSE)
ENDIF
IF root%=0 THEN
 root$="$"
ELSE
 root$=FNstr0(root%)
ENDIF
IF format%<>0 THEN
 form$=FNlow(FNstr0(format%))
 format%=-1
 FOR i%=0 TO formats%-1
  IF form$=LEFT$(form$(i%),LEN form$) format%=i%
 NEXT
 IF format%<0 ERROR 0,"Unknown output format"
ENDIF
IF dirs% single%=TRUE
DIM file$(number%+1),path$(number%+1),type$(number%+1),size%(number%+1)
ENDPROC
:
DEF FNstr0(a%)
a$=""
WHILE ?a%<>0
 a$+=CHR$(?a%)
 a%+=1
ENDWHILE
=a$
:
DEF PROCextracttypes(a$,flag%)
LOCAL semi,type$,type
a$+=";"
REPEAT
 semi=INSTR(a$,";")
 type$=LEFT$(a$,semi-1)
 IF LEFT$(type$,1)="&" THEN
  type=EVAL(type$)
 ELSE
  SYS "OS_FSControl",31,type$ TO ,,type
 ENDIF
 ftypes%(type)=flag%
 a$=MID$(a$,semi+1)
UNTIL a$=""
ENDPROC
:
DEF FNfiletype(t%)
LOCAL a,b,blk
DIM blk 8
SYS "OS_FSControl",18,,t% TO ,,a,b
!blk=a:blk!4=b:blk?8=13
=$blk
:
DEF FNlow(i$)
LOCAL i%,c%,o$
FOR i%=1 TO LEN(i$)
 c%=ASC MID$(i$,i%,1)
 IF c%>=ASC"A" AND c%<=ASC"Z" c%=c%+32
 o$+=CHR$ c%
NEXT
=o$
:
DEF PROCcount(dir$)
LOCAL ptr,len
ptr=0
REPEAT
 SYS "OS_GBPB",10,dir$,block,1,ptr,50 TO ,,,,ptr
 IF ptr>=0 THEN
  name$=FNstr0(name)
  CASE block!&10 OF
   WHEN 1:
    IF files% THEN
     ftype%=(!block AND &000FFF00)>>8
     IF ftypes%(ftype%) THEN
      len%=block!&8
      PROCinsert(name$,dir$,FNfiletype(ftype%),len%)
     ENDIF
    ENDIF
   WHEN 2:
    IF dirs% OR apps% THEN
     IF apps% THEN
      SYS "OS_File",5,dir$+"."+name$+".!RunImage" TO count%
     ELSE
      count%=TRUE
     ENDIF
     IF count% THEN
      SYS "OS_FSControl",28,dir$+"."+name$,,1 TO ,,bytes,files
      PROCinsert(name$,dir$,"",bytes)
     ENDIF
    ENDIF
    IF NOT single% THEN
     IF verbose% PRINT".";name$;:len=LEN name$
     PROCcount(dir$+"."+name$)
     IF verbose% PRINT STRING$(len+1,CHR$127);
    ENDIF
  ENDCASE
 ENDIF
UNTIL ptr=-1
ENDPROC
:
DEF PROCinsert(file$,path$,type$,size)
IF size>size%(number%) THEN
 pos%=number%
 REPEAT
  pos%-=1
 UNTIL pos%=0 OR size<size%(pos%)
 pos%+=1
 FOR i%=number% TO pos% STEP -1
  file$(i%+1)=file$(i%)
  path$(i%+1)=path$(i%)
  type$(i%+1)=type$(i%)
  size%(i%+1)=size%(i%)
 NEXT
 file$(pos%)=file$
 path$(pos%)=path$
 type$(pos%)=type$
 size%(pos%)=size
ENDIF
ENDPROC
:
DEF PROCresults
i%=1
WHILE i%<=number% AND file$(i%)<>""
 CASE format% OF
  WHEN dec%:
   size$=STR$ size%(i%)
  WHEN hex%:
   size$="&"+RIGHT$(STRING$(8,"0")+STR$~size%(i%),8)
  WHEN text%:
   SYS "OS_ConvertFixedFileSize",size%(i%),block,256
   size$=FNstr0(block)
 ENDCASE
 size$=RIGHT$(STRING$(12," ")+size$,12)+"  "
 IF files% THEN
  type$=type$(i%)+"  "
 ELSE
  type$=""
 ENDIF
 IF path% THEN
  path$=path$(i%)+"."+file$(i%)
  file$=""
 ELSE
  file$=LEFT$(file$(i%)+STRING$(12," "),12)
  path$=path$(i%)
 ENDIF
 IF split% AND files% THEN
  PRINT size$;type$'SPC14;file$;path$
 ELSE
  PRINT size$;file$;type$;path$
 ENDIF
 i%+=1
ENDWHILE
ENDPROC
