home *** CD-ROM | disk | FTP | other *** search
- Rem ****************************************
- Rem * Shell3a external command - du.opl
- Rem * ╕ Nick Murray May 1996
- Rem *
- Rem * du - Display the usage of a filesystem
- Rem * by directory
- Rem ****************************************
- PROC du%:(n%)
- LOCAL i%,buf$(128),ret%,flag%,tot&
- ONERR ErrTrap::
- i%=2
- WHILE i%<=n%
- buf$=PEEK$(argv%(i%))
- IF buf$="-s"
- flag%=1
- ELSE
- BREAK
- ENDIF
- i%=i%+1
- ENDWH
- SHesc%=0
- IF i%>n% Rem no directories given
- buf$=SHcwd$
- ENDIF
- DO
- ret%=Fparse%:(ADDR(buf$),buf$)
- IF ret%<0
- PRINT PrPath$:(buf$),"-",err$:(ret%)
- RETURN
- ELSEIF ret% AND 16
- tot&=SHdu&:(buf$,flag%)
- IF flag%
- fprint%:(NUM$(tot&,-9)+" "+PrPath$:(buf$))
- ENDIF
- ENDIF
- IF SHesc% OR KEY=27
- GIPRINT ERR$(-114)
- SHesc%=1
- BREAK
- ENDIF
- i%=i%+1
- IF i%<=n%
- buf$=PEEK$(argv%(i%))
- ENDIF
- UNTIL i%>n%
- RETURN
- ErrTrap::
- ONERR off
- PRINT err$:(ERR)
- ENDP
-
- PROC SHdu&:(d$,flag%)
- LOCAL Fformat%,Fattr%,Fsize&,Mtime&,Spare&
- LOCAL i$(128),in$(128),size%(8),h%,ret%,tot&
- ret%=IOOPEN(h%,d$,$0030)
- IF ret%<0
- RAISE ret%
- ENDIF
- WHILE (IOW(h%,1,#(UADD(ADDR(i$),1)),size%()) >=0)
- POKEB ADDR(i$),CALL($B9,0,0,0,0,UADD(ADDR(i$),1))
- IF i$="." OR i$=".." Rem ignore . and .. on UNIX filesystems
- CONTINUE
- ENDIF
- IF KEY=27
- SHesc%=1
- GOTO End::
- ENDIF
- i$=d$+i$
- in$=i$+CHR$(0)
- CALL($0887,UADD(ADDR(in$),1),ADDR(Fformat%),0,0,0)
- IF (Fattr% AND $10) Rem directory
- Rem if this was done properly we'd call Fparse% to get the actual
- Rem directory component separator (it's not always '\'!). This
- Rem however is SLOW, so assume a backslash.
- tot&=tot&+SHdu&:(i$+"\",flag%)
- IF SHesc%
- GOTO End::
- ENDIF
- CONTINUE
- ELSE
- tot&=tot&+Fsize&
- ENDIF
- ENDWH
- IF flag%=0
- fprint%:(NUM$(tot&,-9)+" "+PrPath$:(d$))
- ENDIF
- End::
- IOCLOSE(h%)
- RETURN tot&
- ErrTrap::
- ONERR off
- IOCLOSE(h%)
- PRINT err$:(ERR)
- ENDP
-