Davex/src/xtn/2/ffind.asm

502 lines
7.8 KiB
NASM

;*********************************************
; Bugs: wildcards should be allowed (weren't working)
;
; Should deal with insufficent access and bad
; pathnames (for AppleShare)
;*********************************************
;
; External command for Davex
;
; ffind -- locate files by name, type, auxtype, etc
;
; ffind [<pathname>] [-n <name>] [-f <filetype>]
; [-x <integer>] [-e] [-q] [-p] [-d] [-b y|n]
; [-o <string>] [-s <integer>] [-i y|n]
;
; path --where to look (omit-->scan all volumes)
; -n --name to match
; -f --filetype to match
; -x --auxiliary type to match
; -e --name match must be exact
; -q --query "continue searching?"
; -p --set prefix to dir containing match
; -d --detail (print type, auxtype)
; -o --output string template
; -b y|n --find if backup bit set
; -i y|n --find if invisible
; -s<int> --find specific storage type
;
;*********************************************
;
; 11-Jun-89 DAL ==> v1.2
; -i and -s options added
; -d sense reversed (now means NO detail)
;
;*********************************************
;
; Converted to MPW IIgs 20-Sep-92 DAL
;
;*********************************************
.include "Common/2/Globals2.asm"
.include "Common/2/Apple.Globals2.asm"
.include "Common/2/Mli.globals2.asm"
.include "Common/Macros.asm"
;
.segment "CODE_A000"
OrgAdr = $A000 ;change as necessary (end below $B000)
; org OrgAdr
MyVersion = $12
MinVersion = $12
MinVerAux = $05 ;v1.25+
;*********************************************
rts
.byte $ee,$ee
.byte MyVersion,MinVersion
.byte %00000000 ;hardware req
.addr descr
.addr OrgAdr
.addr start
.byte MinVerAux,0,0,0
; parameters here
.byte 0,t_path ;where to look
.byte $80+'n',t_string ;what to look for
.byte $80+'p',t_nil ;set prefix when found
.byte $80+'e',t_nil ;exact matches only
.byte $80+'f',t_ftype ;certain filetype only
.byte $80+'x',t_int2 ;certain auxtype only
.byte $80+'q',t_nil ;query
.byte $80+'o',t_string ;output string format
.byte $80+'d',t_nil ;detail
.byte $80+'b',t_yesno
.byte $80+'i',t_yesno
.byte $80+'s',t_int1
.byte 0,0
descr: pstr "locate files by name/type/auxtype/etc"
;*********************************************
; dum xczpage ;32 locations
str = xczpage ;ds 2
path = str+2 ;ds 2
out = path+2 ;ds 2
no_exact = out+2 ;ds 1 ;exact-match flag
no_query = no_exact+1 ;ds 1 ;query flag
temp_ch = no_query+1 ;ds 1
str_len = temp_ch+1 ;ds 1
startpos = str_len+1 ;ds 1
count = startpos+1 ;ds 1
exit_flag = count+1 ;ds 1
specialMark = exit_flag+1 ;ds 1
; dend
pathbuff = OrgAdr-$100
;*******************************
start:
sta path+1
sty path
lda #'q'+$80
jsr xgetparm_ch
ror no_query
lda #'e'+$80
jsr xgetparm_ch
ror no_exact
lda #0
sta direcpath
sta exit_flag
ldy #0
lda (path),y
beq all_units
lda path+1
ldy path
jmp find_ay
all_units:
ldx #0
one_u: txa
pha
lda unit_list,x
jsr find_on_unit
pla
tax
inx
cpx #$0E
bcc one_u
rts
unit_list: .byte $10,$90,$20,$A0,$30,$B0,$40,$C0
.byte $50,$D0,$60,$E0,$70,$F0
find_on_unit:
sta onl_unit
jsr mli
.byte mli_online
.addr online_parms
bcc good_unit
rts
online_parms: .byte 2
onl_unit: .res 1
.addr pathbuff+1
good_unit:
lda pathbuff+1
and #$0f
tax
inx
stx pathbuff
lda #'/'
sta pathbuff+1
;
jsr xpmgr
.byte pm_downcase
.addr pathbuff
;
lda #>pathbuff
ldy #<pathbuff
find_ay:
pha
tya
pha
jsr xpush_level
pla
tay
pla
jsr xdir_setup2
bcc find1
jmp xProDOS_err
find1: bit exit_flag
bmi did_read
jsr chkabort
jsr xread1dir
bcs did_read
ldx #' '+$80
lda catbuff
and #$f0
cmp #$50
bne notExtended
ldx #'+'+$80
notExtended: stx specialMark
jsr test_entry
bcs try_next
jsr found_match
; query?
bit no_query
bmi try_next
jsr xmess
asc "Continue searching"
.byte 0
lda #'y'+$80
jsr xyesno2
bne try_next
sec
ror exit_flag
try_next:
bit exit_flag
bmi did_read
lda catbuff+16
cmp #tDIR
bne no_recurse
lda catbuff
and #$0f
sta catbuff
lda #>catbuff
ldy #<catbuff
jsr find_ay
no_recurse: jmp find1
did_read: jmp xdir_finish
;
; found a match--print it, etc.
;
found_match:
jsr detail
jsr showpath
jsr setpfx
jsr xcheck_wait
bcs abort9
rts
abort9: jmp abort
detail: lda #'d'+$80
jsr xgetparm_ch
bcc detail_x ;11-Jun-89
lda specialMark
jsr cout
lda catbuff+16
jsr xprint_ftype
jsr xmess
asc " $"
.byte 0
lda catbuff+$20
jsr prbyte
lda catbuff+$1f
jsr prbyte
jsr xmess
asc " "
.byte 0
lda catbuff+$22
ldy catbuff+$21
jsr xpr_date_ay
lda catbuff+$24
ldy catbuff+$23
jsr xpr_time_ay
jsr xmess
asc " "
.byte 0
detail_x: rts
showpath: jsr showpath2
jmp crout
showpath2: lda #'o'+$80
jsr xgetparm_ch
bcs plainpath
sta out+1
sty out
ldy #0
lda (out),y
sta count
beq spath_x
spath1: iny
lda (out),y
ora #$80
cmp #'='+$80
bne plainch
tya
pha
jsr plainpath
pla
tay
bne nextch
plainch: jsr cout
nextch: dec count
bne spath1
spath_x: rts
plainpath:
lda #>direcpath
ldy #<direcpath
jsr xprint_path
lda #>catbuff
ldy #<catbuff
jmp xprint_path
abort0: sta kbdstrb
abort: lda #der_abort
jmp xProDOS_err
chkabort: lda $c000
bpl chka_ok
and #$7f
cmp #$1b
beq abort0
cmp #$03
beq abort0
cmp #'.'
bne chka_ok
bit $c061
bmi abort0
chka_ok: rts
;
; test entry in catbuff against -n, -x, -f, -b, -i, -s
;
test_entry:
jsr test_strg
bcs match_no
lda catbuff
and #$0f
sta catbuff
jsr test_name
bcs match_no
jsr test_type
bcs match_no
jsr test_aux
bcs match_no
jsr test_bkup
bcs match_no
jsr test_invis
match_no: rts
test_type:
lda #'f'+$80
jsr xgetparm_ch
bcs type_ok
cmp catbuff+16
bne type_no
type_ok: clc
rts
type_no: sec
rts
test_strg:
lda #'s'+$80
jsr xgetparm_ch
bcs type_ok
sty strgCheat+1
lda catbuff
lsr a
lsr a
lsr a
lsr a
strgCheat: cmp #$77 ;modified
beq type_ok
bne type_no
test_aux:
lda #'x'+$80
jsr xgetparm_ch
bcs type_ok
cpx catbuff+$20
bne type_no
cpy catbuff+$1f
bne type_no
clc
rts
test_bkup:
lda #'b'+$80
jsr xgetparm_ch
bcs bkup_ok
cmp #0
beq test_bn
; test_by
lda catbuff+$1E
and #$20
beq bkup_no
bkup_ok: clc
rts
test_bn: lda catbuff+$1e
and #$20
beq bkup_ok
bkup_no: sec
rts
test_invis:
lda #'i'+$80
jsr xgetparm_ch
bcs invis_ok
cmp #0
beq test_in
; test_iy
lda catbuff+$1E
and #$04
beq invis_no
invis_ok: clc
rts
test_in: lda catbuff+$1e
and #$04
beq invis_ok
invis_no: sec
rts
test_name: lda #'n'+$80
jsr xgetparm_ch
bcs null_match
sta str+1
sty str
bit no_exact
bmi not_exact
; check for exact name match
ldy catbuff
exact1: lda catbuff,y
jsr xdowncase
sta temp_ch
lda (str),y
jsr xdowncase
cmp temp_ch
bne exact_no
dey
cpy #<-1
bne exact1
clc
rts
exact_no: sec
rts
;
; check if str contained in catbuff
;
null_match: clc
rts
not_exact:
ldy #0
lda (str),y
sta str_len
beq null_match
cmp catbuff
beq ne_maybe
bcs ne_no
ne_maybe:
lda catbuff
clc
adc #1
sec
sbc str_len
sta startpos
chk_here: ldx startpos
lda str_len
sta count
ldy #1
chkh1: lda (str),y
jsr xdowncase
sta temp_ch
lda catbuff,x
jsr xdowncase
cmp temp_ch
bne chk_next
inx
iny
dec count
bne chkh1
clc
rts
chk_next: dec startpos
bpl chk_here
ne_no: sec
rts
;
; set prefix to directory containing the
; entry we found (if -p was given)
;
setpfx: lda #'p'+$80
jsr xgetparm_ch
bcs setpfx_x
jsr mli
.byte mli_setpfx
.addr setp_parms
bcc setpfx_x
jmp xProDOS_err
setpfx_x: rts
setp_parms:
.byte 1
.addr direcpath
;*********************************************