home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fish 'n' More 2
/
fishmore-publicdomainlibraryvol.ii1991xetec.iso
/
fish
/
misc_utils
/
utils
/
du
/
du.a
< prev
next >
Wrap
Text File
|
1990-12-16
|
5KB
|
231 lines
;********************************************************************
;
; NAME : Du v1.0
;
; TEMPLATE : Du <dir name>,...
;
; DESCRIPTION : print disk usage for a given set of directories
;
; AUTHOR : Stuart Mitchell
;
; DATE : 25-11-90
;
; NOTES : 1) Du requires the ARP shared library (v39.0+)
;
;********************************************************************
section du,code
opt o+
incdir "include:"
include "libraries/arpbase.i"
include "libraries/dos.i"
include "exec/memory.i"
_LVOOpenLibrary equ -$228
_LVOCloseLibrary equ -$19e
CALL macro (name)
jsr _LVO\1(a6)
endm
r_anchor equr a2
r_finfo equr a3
r_current_arg equr a4
r_flags equr d1
r_files equr d2
r_dirs equr d3
r_size equr d4
r_blocks equr d5
r_num_arg equr d6
r_zero equr d7
; bitdefs for dir scan - should really be picked up from ArpBase.i ...
DIDDIR equ 3
DODIR equ 2
;********************************************************************
start: move.l d0,d2 ; cache command line
move.l a0,a2
moveq.l #0,r_zero
; open ARP library
move.l 4.w,a6
lea arplib(pc),a1
move.l r_zero,d0
CALL OpenLibrary
tst.l d0
beq exit
move.l d0,a6
; parse command line
move.l a2,a0 ; string
move.l d2,d0 ; length
lea help(pc),a1
lea args(pc),a2 ; pointer to arg array
lea tplate(pc),a3
CALL GADS
move.l d0,r_num_arg ; count
; allocate memory for AnchorPath structure - note freed automatically
move.l #ap_SIZEOF,d0
move.l #MEMF_PUBLIC|MEMF_CLEAR,d1
CALL ArpAllocMem
tst.l d0
beq closearp
move.l d0,r_anchor
; set up registers
lea ap_Info(r_anchor),r_finfo
move.l args,r_current_arg ; get base args
; main loop
main_loop: tst.l r_num_arg ; if count==0 then exit
beq closearp
init_regs: move.l r_zero,r_files ; zero results
move.l r_zero,r_dirs
move.l r_zero,r_size
move.l r_zero,r_blocks
move.b #%00100001,ap_Flags(r_anchor) ; DOWILD|DODOT
; find first file/directory
move.l (r_current_arg),d0
move.l r_anchor,a0
CALL FindFirst
tst.l d0
bne.s no_files
; loop around in directory until all subdirectories/files exhausted
; first check if CNTL-C pressed
du_loop: move.l r_zero,a1
CALL CheckAbort
tst.l d0
bne.s break_pressed
move.b ap_Flags(r_anchor),r_flags
; if DirEntryType <0 then we have a file
move.l fib_DirEntryType(r_finfo),d0
blt.s do_file
do_dir: btst #DIDDIR,r_flags ; DIDDIR bit set
beq.s enter_dir ; no ... enter dir
; have just popped out of a directory, mark as finished & increment count
exit_dir: bclr #DIDDIR,r_flags
addq.l #1,r_dirs
bra.s find_next
; found a new directory, so enter it at next FindNext
enter_dir: bset #DODIR,r_flags
bra.s find_next
; this ones a file, so increment count & size
do_file: addq.l #1,r_files
add.l fib_Size(r_finfo),r_size
add.l fib_NumBlocks(r_finfo),r_blocks
; find next file
find_next: move.b r_flags,ap_Flags(r_anchor) ; set directory handling
move.l r_anchor,a0
CALL FindNext
tst.l d0
beq.s du_loop ; if zero then got something
; directory exhausted
bsr.s free_anchor ; free mem
; print out results
print: movem.l r_files/r_dirs/r_size/r_blocks,files ; flush results
move.l (r_current_arg)+,a0 ; print directory name
CALL Printf
lea fmt(pc),a0 ; format string
lea files(pc),a1 ; address ptrs to args
CALL Printf ; print results
; and do it all again
end_loop: subq.l #1,r_num_arg ; decrement arg count
bra.s main_loop ; and do next arg
;********************************************************************
; handle case when directory/file doesn't exist...
no_files: move.l (r_current_arg)+,a0
CALL Printf
lea not_exist(pc),a1
CALL Puts
bsr.s free_anchor ; free mem
bra.s end_loop
;********************************************************************
; called if CNTL-C detected
; NB: 1 - call to CheckAbort sets up a1 to point to break string
; 2 - drop through to end of program
break_pressed: CALL Puts ; output "***BREAK"
bsr.s free_anchor ; free mem
;*******************************************************************
; exit program - close ARP & return to DOS - call frees resources
closearp: move.l a6,a1
move.l 4.w,a6
CALL CloseLibrary
exit: move.l r_zero,d0
rts
;********************************************************************
; free anchorpath
free_anchor: move.l r_anchor,a0 ; free anchor
jmp _LVOFreeAnchorChain(a6)
;********************************************************************
; data
files dc.l 0
dirs dc.l 0
size dc.l 0
blocks dc.l 0
even
fmt dc.b " -- %ld files, %ld directories : %ld bytes (%ld blocks)",$0a,0
even
arplib dc.b "arp.library",0
even
args dc.l 0 ; char *args[]
even
help dc.b "<directory name> [...]",0
even
tplate dc.b "DIR/...",0
even
not_exist dc.b " -- directory does not exist",0
end