A2osX/SHARED/X.FILEENUM.S.txt

752 lines
13 KiB
Plaintext
Raw Normal View History

NEW
2019-09-19 17:22:14 +02:00
AUTO 3,1
.LIST OFF
*--------------------------------------
X.MAX.RECURSE .EQ 8
*--------------------------------------
* Uses:
* (ZP)
2025-01-19 17:12:51 +01:00
* ZPPtr1 .BS 2
* ZPPtr2 .BS 2
* ZPFileName .BS 2
* ZPFileStat .BS 2
* (pData)
* Index .BS 1
2025-01-19 17:12:51 +01:00
* pDIRs .BS X.MAX.RECURSE*2
* pDIRENTs .BS X.MAX.RECURSE*2
* oDIRENTs .BS X.MAX.RECURSE*2
2021-06-27 15:48:04 +02:00
* STATBUF .BS S.STAT
2025-01-19 17:12:51 +01:00
* pSrcBasePath .BS 2
* pDstBasePath .BS 2 (optional)
* pInclude .BS 2
* pIgnore .BS 2
*--------------------------------------
2025-01-19 17:12:51 +01:00
X.Quit jsr X.LeaveSubDir
bcc X.Quit
.DO X.COPY.TO.DEST=1
ldy #pDstFileName+1
jsr .7
ldy #pDstBasePath+1
jsr .7
.FIN
ldy #pSrcBasePath+1
jsr .7
ldy #pInclude+1
jsr .7
ldy #pIgnore+1
.7 lda (pData),y
beq .9
pha
dey
lda (pData),y
tay
pla
>LIBC Free
.9 clc
rts
*--------------------------------------
* Compare a ZPFileName against pInclude (e.g. '*test?.*')
2018-12-17 16:21:32 +01:00
* CC : match
* CS : no match
*--------------------------------------
X.IncludeMatch >LDA.G index
2019-04-30 18:08:47 +02:00
dec
bne X.FilterMatch.CLCRTS in a subdir, match everything
2019-11-26 22:59:48 +01:00
2020-02-29 15:06:28 +01:00
clc
.HS B0 BCS
X.IgnoreMatch sec
2025-01-19 17:12:51 +01:00
ldy #pInclude+1
bcc .11
2025-01-19 17:12:51 +01:00
iny
iny pIgnore
.11 lda (pData),y
beq X.FilterMatch.RTS No filter....exit with passed carry
2025-01-19 17:12:51 +01:00
sta ZPPtr2+1
dey
lda (pData),y
sta ZPPtr2
2019-10-12 16:20:09 +02:00
2019-11-27 23:04:55 +01:00
ldy #S.STAT.FSID
lda (ZPFileStat),y if 0, Regular ProDOS....
pha save FSID for comparing later
2019-11-29 16:36:54 +01:00
bne .10
2019-11-29 16:36:54 +01:00
>LDYA ZPPtr2 ... so CI compare
2025-01-19 17:12:51 +01:00
>LIBC StrUpr
.10 plx get back FSID
lda (ZPPtr2) Get first pattern byte
2021-03-11 22:40:55 +01:00
beq .8 Match always if empty
2018-12-17 16:21:32 +01:00
2019-10-12 16:20:09 +02:00
ldy #0
bra .2
2018-12-17 16:21:32 +01:00
.1 jsr X.FilterMatch.NextPtr2 get next pattern char
2018-12-17 16:21:32 +01:00
beq .41 end of pattern...
2019-10-12 16:20:09 +02:00
.2 cmp #'*'
2018-12-17 16:21:32 +01:00
beq .5
.3 lda (ZPFileName),y we must match ? or regular char, check if at end of string
beq .9 no char left, exit with error
lda (ZPPtr2) get back pattern char
cmp #'?'
beq .4 no need to compare, any char will match
jsr X.FilterMatch.CmpPtr2CharPtr1Y Regular Char, compare with string at Y
bne .9 no match, exit
.4 iny advance to next char to compare
bra .1 continue if remaining char in pattern
.41 lda (ZPFileName),y end of pattern, but end of string ?
beq .8 yes, string matched entirely
* no, remaining char in string, no match
.9 sec
rts
.5 jsr X.FilterMatch.NextPtr2 we have '*', last char of pattern ?
beq .8 yes, match everything, including empty string
cmp #'*' another '*' ?
beq .5 yes, '**' = '*', go next char
cmp #'?' '*?' ? we must match a least one char
beq .3
.7 lda (ZPFileName),y we need at least one remaining char in string, check if at end of string
beq .9 no chance to match ? or regular char
2018-12-17 16:21:32 +01:00
iny
jsr X.FilterMatch.CmpPtr2CharPtr1Y compare with char in string
bne .7 not equal to next non wildcard in pattern
iny
bra .1 go check remaining char in pattern...
.8
X.FilterMatch.CLCRTS
2020-02-29 15:06:28 +01:00
clc
X.FilterMatch.RTS
rts
2018-12-17 16:21:32 +01:00
*--------------------------------------
X.FilterMatch.CmpPtr2CharPtr1Y
lda (ZPFileName),y
2019-11-29 16:36:54 +01:00
phx
plx
bne .1 Foreign FS or ProDOS.FX : CS compare
2019-11-29 16:36:54 +01:00
jsr X.ToUpper
2019-11-29 16:36:54 +01:00
.1 cmp (ZPPtr2)
rts
*--------------------------------------
X.FilterMatch.NextPtr2
inc ZPPtr2 Make PTR2 advance to next char
bne .1
2019-10-12 16:20:09 +02:00
inc ZPPtr2+1
2019-10-12 16:20:09 +02:00
.1 lda (ZPPtr2)
rts
2019-10-12 16:20:09 +02:00
*--------------------------------------
X.InitSrcDirYA >STYA ZPPtr1
2019-10-12 16:20:09 +02:00
X.InitSrcDirPtr1
jsr X.InitGetBuf Get a 256 buffer to store BasePath
bcs .99
2025-01-19 17:12:51 +01:00
>STYA.G pSrcBasePath
ldy #1
2025-01-19 17:12:51 +01:00
lda (ZPPtr2),y ZPPtr2 = Expand(ZPPtr1)
beq .8 we have '/'
2018-12-20 08:33:10 +01:00
2023-11-25 09:33:04 +01:00
jsr X.Init.Stat
bcs .1 File/DIR does not exists, go extract pattern
2019-04-29 17:47:17 +02:00
.DO X.ENTER.SUBDIR=1
2023-11-25 09:33:04 +01:00
2021-06-27 15:48:04 +02:00
>LDA.G STATBUF+S.STAT.MODE+1
2021-02-17 17:15:43 +01:00
and #$F0
cmp /S.STAT.MODE.DIR
2023-11-25 09:33:04 +01:00
bne .7 Not a dir....
jsr X.GetPtr2Len
dey
lda #'/'
cmp (ZPPtr2),y
beq .8
iny
sta (ZPPtr2),y
iny
lda #0
sta (ZPPtr2),y
bra .8 TYPE=DIR, do not extract pattern
2023-11-25 09:33:04 +01:00
.ELSE
2019-10-12 16:20:09 +02:00
2023-11-25 09:33:04 +01:00
bra .7
.FIN
2021-03-11 22:40:55 +01:00
2023-11-25 09:33:04 +01:00
.1 cmp #MLI.E.INVPATH
bne .98
2023-11-25 09:33:04 +01:00
jsr X.GetPtr2Len TYPE is not DIR, check if wc
2019-10-12 16:20:09 +02:00
dey
2019-10-12 16:20:09 +02:00
ldx #0 Init Wildcard count
2019-10-12 16:20:09 +02:00
.2 lda (ZPPtr2),y search backward for a /
cmp #'/'
2023-11-25 09:33:04 +01:00
beq .6
2019-10-12 16:20:09 +02:00
cmp #'?' Test if some wildcard chars....
2023-11-25 09:33:04 +01:00
beq .3
2019-10-12 16:20:09 +02:00
cmp #'*'
2023-11-25 09:33:04 +01:00
bne .4
2019-10-12 16:20:09 +02:00
2023-11-25 09:33:04 +01:00
.3 inx inc wildcard count
.4 dey
bne .2
2019-10-12 16:20:09 +02:00
2023-11-25 09:33:04 +01:00
.6 txa
beq .97 no wc, file not found....
2023-11-25 09:33:04 +01:00
.7 jsr X.InitSplitBuf
bcs .99
2019-10-12 16:20:09 +02:00
2025-01-19 17:12:51 +01:00
>STYA.G pInclude
2019-10-12 16:20:09 +02:00
.8 >LDYA ZPPtr2
2025-01-19 17:12:51 +01:00
>LIBC OpenDir
bcs .99
2019-10-12 16:20:09 +02:00
2025-01-19 17:12:51 +01:00
phy
ldy #pDIRs+1
sta (pData),y set hDIRs[0] = Src Hdir
2025-01-19 17:12:51 +01:00
dey
pla
sta (pData),y
lda #1
2025-01-19 17:12:51 +01:00
>STA.G index index=hDIRs[0]
2021-03-11 22:40:55 +01:00
* clc
2021-03-11 22:40:55 +01:00
rts
2021-07-25 16:03:41 +02:00
2023-11-25 09:33:04 +01:00
.97 lda #MLI.E.INVPATH
.98 sec
.99 rts
*--------------------------------------
.DO X.RESET.SRC.DIR=1
2025-01-19 17:12:51 +01:00
X.ResetSrcDir jsr X.GetpDIR
2025-01-19 17:12:51 +01:00
>LIBC CloseDir
2025-01-19 17:12:51 +01:00
>LDYA.G pSrcBasePath
>LIBC OpenDir
bcs .9
pha
2025-01-19 17:12:51 +01:00
phy
>LDA.G index
2025-01-19 17:12:51 +01:00
asl
* clc
adc #pDIRs-2
tay
pla
sta (pData),y
2025-01-19 17:12:51 +01:00
iny
pla
sta (pData),y
* clc
.9 rts
.FIN
*--------------------------------------
.DO X.COPY.TO.DEST=1
X.InitDstDirYA >STYA ZPPtr1
X.InitDstDirPtr1
jsr X.InitGetBuf Get a 256 buffer to store BasePath
bcs .99
2025-01-19 17:12:51 +01:00
>STYA.G pDstBasePath
2023-11-25 09:33:04 +01:00
jsr X.Init.Stat
bcs .1 File/DIR does not exists, go extract DstFileName
2019-10-12 16:20:09 +02:00
2021-06-27 15:48:04 +02:00
>LDA.G STATBUF+S.STAT.MODE+1
2021-02-17 17:15:43 +01:00
and #$F0
cmp /S.STAT.MODE.DIR
beq .8 Dst is a directory...no hDstFileName
.1 jsr X.InitSplitBuf
bcs .99
2019-10-12 16:20:09 +02:00
2025-01-19 17:12:51 +01:00
>STYA.G pDstFileName
.8 jmp X.NormalizePtr2
2019-10-12 16:20:09 +02:00
.99 rts
2019-10-12 16:20:09 +02:00
.FIN
*--------------------------------------
X.InitGetBuf >LDYAI 256
2025-01-19 17:12:51 +01:00
>LIBC Malloc Get a 256 buffer to store BasePath
bcs .99
>STYA ZPPtr2
2025-01-19 17:12:51 +01:00
>SS
>PUSHW ZPPtr1
>PUSHW ZPPtr2
2025-01-19 17:12:51 +01:00
>LIBC RealPath
>SR
bcs .98
2025-01-19 17:12:51 +01:00
>LDYA ZPPtr2
* clc
rts
2025-01-19 17:12:51 +01:00
.98 pha
>LDYA ZPPtr2
>LIBC Free
pla
sec
.99 rts
*--------------------------------------
2025-01-19 17:12:51 +01:00
X.Init.Stat >SS
>PUSHW ZPPtr2
>PUSHEA.G STATBUF
2025-01-19 17:12:51 +01:00
>LIBC Stat
>SR
rts
*--------------------------------------
X.InitSplitBuf jsr X.GetPtr2Len Search end of string.....
2019-10-12 16:20:09 +02:00
lda #'/'
2019-10-12 16:20:09 +02:00
.1 dey
cmp (ZPPtr2),y Search backward /
bne .1
2019-10-12 16:20:09 +02:00
tya
sec +1 to skip '/'
adc ZPPtr2
sta ZPPtr1
2019-10-12 16:20:09 +02:00
lda ZPPtr2+1
adc #0
sta ZPPtr1+1
lda (ZPPtr1)
beq .8 path is /dir/
>LDYA ZPPtr1
2025-01-19 17:12:51 +01:00
>LIBC StrDup
bcs .99
2019-10-12 16:20:09 +02:00
2025-01-19 17:12:51 +01:00
pha
lda #0
sta (ZPPtr1)
2025-01-19 17:12:51 +01:00
pla Y,A = pStr
.8 clc
.99 rts
*--------------------------------------
X.GetNextEntry jsr X.GetEntry
bcs .9
jsr X.GetFilenameLen Save actual file len for setting up
2018-12-19 17:45:09 +01:00
pha new offset later
lda ZPFileStat
clc
adc #S.STAT
sta ZPFileName
lda ZPFileStat+1
adc /S.STAT
sta ZPFileName+1 Make nDIRENTs[i] point to next DIRENT
jsr X.GetFilenameLen are we at end of this buffer ?
beq .1 yes, go read next one ...
jsr X.SetFileStatPtr
2025-01-19 17:12:51 +01:00
>LDA.G index
asl
* clc
adc #oDIRENTs-2
tay
pla Get back previous file len
sec
adc (pData),y
sta (pData),y
iny
lda #0
adc (pData),y
sta (pData),y
2025-01-19 17:12:51 +01:00
dey
2025-01-19 17:12:51 +01:00
lda #S.STAT
clc
adc (pData),y
sta (pData),y
iny
lda /S.STAT
adc (pData),y
sta (pData),y
2025-01-19 17:12:51 +01:00
clc
rts
.1 pla
jsr X.GetEntry.ReadDir
bcs .9
jsr X.GetFilenameLen
2025-01-19 17:12:51 +01:00
sec
beq .9
2018-12-19 17:45:09 +01:00
jsr X.SetFileStatPtr
clc
.9 rts
*--------------------------------------
2025-01-19 17:12:51 +01:00
X.GetEntry jsr X.GetpDIRENT
cmp #0
bne .1 we have a buffer to scan
jsr X.GetEntry.ReadDir First run, get first block
bcs .9 ZPFileName = start of buffer
lda (ZPFileName) Empty !!!
bne .8
2018-12-19 17:45:09 +01:00
sec
rts
2025-01-19 17:12:51 +01:00
*--------------------------------------
.1 >STYA ZPFileName
2025-01-19 17:12:51 +01:00
>LDA.G index
asl
* clc
adc #oDIRENTs-2
tay
lda ZPFileName
clc
adc (pData),y
sta ZPFileName
iny
lda ZPFileName+1
adc (pData),y
sta ZPFileName+1 ZPFileName=ZPFileName+oDIRENT
.8 jsr X.GetFilenameLen
jsr X.SetFileStatPtr
clc
.9 rts
*--------------------------------------
X.GetEntry.ReadDir
2025-01-19 17:12:51 +01:00
jsr X.GetpDIRENT
cmp #0
beq .1
2025-01-19 17:12:51 +01:00
>LIBC Free discard previous pDIRENT
jsr X.ResetpDIRENT
2018-11-21 14:08:11 +01:00
2025-01-19 17:12:51 +01:00
.1 jsr X.GetpDIR
2025-01-19 17:12:51 +01:00
>LIBC ReadDir
bcs .9
2020-03-17 17:03:32 +01:00
>STYA ZPFileName
2025-01-19 17:12:51 +01:00
>LDA.G index
asl
* clc
adc #pDIRENTs-2
tay
2025-01-19 17:12:51 +01:00
lda ZPFileName
sta (pData),y
iny
lda ZPFileName+1
sta (pData),y
2025-01-19 17:12:51 +01:00
>LDA.G index
asl
* clc
adc #oDIRENTs-2
tay
2018-11-21 14:08:11 +01:00
lda #0 and reset offset for this buffer
sta (pData),y
iny
sta (pData),y
clc
.9 rts
*--------------------------------------
X.EnterSubDirYA >STYA ZPPtr1 save SUBDIR for StrCat
2019-04-29 17:47:17 +02:00
>LDA.G index
cmp #X.MAX.RECURSE
beq .9
2025-01-19 17:12:51 +01:00
ldy #pSrcBasePath
jsr X.EnterSubDirY
>LDYA ZPPtr2
2025-01-19 17:12:51 +01:00
>LIBC OpenDir
bcs .9
pha
2025-01-19 17:12:51 +01:00
phy
2018-11-21 14:08:11 +01:00
>INC.G index
2025-01-19 17:12:51 +01:00
asl
* clc
adc #pDIRs-2
tay
pla
sta (pData),y
2025-01-19 17:12:51 +01:00
iny
pla
sta (pData),y
2025-01-19 17:12:51 +01:00
jsr X.ResetpDIRENT make sure pDIRENTs[i] is closed
.DO X.COPY.TO.DEST=1
2025-01-19 17:12:51 +01:00
ldy #pDstBasePath
jsr X.EnterSubDirY
.FIN
clc
.9 rts
*--------------------------------------
X.EnterSubDirY lda (pData),y
2025-01-19 17:12:51 +01:00
sta ZPPtr2
iny
lda (pData),y
sta ZPPtr2+1 save full path
2018-11-21 14:08:11 +01:00
2025-01-19 17:12:51 +01:00
>SS
>PUSHW ZPPtr2
>PUSHW ZPPtr1
2025-01-19 17:12:51 +01:00
>LIBC StrCat
>SR
X.NormalizePtr2 jsr X.GetPtr2Len
2019-10-12 16:20:09 +02:00
2018-11-21 14:08:11 +01:00
dey
lda #'/'
cmp (ZPPtr2),y
2018-11-21 14:08:11 +01:00
beq .8
2018-11-21 14:08:11 +01:00
iny
sta (ZPPtr2),y
iny
lda #0
sta (ZPPtr2),y
.8 clc
rts
*--------------------------------------
X.LeaveSubDir >LDA.G index
2025-01-19 17:12:51 +01:00
beq .3
2018-12-20 08:33:10 +01:00
2025-01-19 17:12:51 +01:00
jsr X.GetpDIRENT.A
cmp #0
2021-07-25 16:03:41 +02:00
beq .1
2025-01-19 17:12:51 +01:00
>LIBC Free
jsr X.ResetpDIRENT
2025-01-19 17:12:51 +01:00
.1 jsr X.GetpDIR
cmp #0
beq .2
>LIBC CloseDir
2025-01-19 17:12:51 +01:00
.2 >DEC.G index
bne .8
2025-01-19 17:12:51 +01:00
.3 >LDYA.G pSrcBasePath
cmp #0
beq .4
>LIBC Free
>STZ.G pSrcBasePath+1
2018-12-20 08:33:10 +01:00
2025-01-19 17:12:51 +01:00
.4 .DO X.COPY.TO.DEST=1
>LDYA.G pDstBasePath
cmp #0
beq .5
>LIBC Free
>STZ.G pDstBasePath+1
.FIN
2025-01-19 17:12:51 +01:00
.5 sec
2016-10-30 19:19:43 +01:00
rts
.8 clc
rts
2016-10-30 19:19:43 +01:00
*--------------------------------------
X.BasePath.. .DO X.COPY.TO.DEST=1
2017-10-04 17:12:03 +02:00
2025-01-19 17:12:51 +01:00
ldy #pDstBasePath
jsr X.BasePath..1
.FIN
2025-01-19 17:12:51 +01:00
ldy #pSrcBasePath
X.BasePath..1 lda (pData),y
2025-01-19 17:12:51 +01:00
sta ZPPtr2
iny
lda (pData),y
sta ZPPtr2+1 save full path
2019-10-12 16:20:09 +02:00
jsr X.GetPtr2Len get len
2019-10-12 16:20:09 +02:00
2017-10-04 17:12:03 +02:00
dey discard ending /
.2 dey
lda (ZPPtr2),y
cmp #'/'
bne .2
2019-10-12 16:20:09 +02:00
iny
lda #0
sta (ZPPtr2),y cut DIR2/ from /dir1/DIR2/
rts
*--------------------------------------
X.ToUpper cmp #'a'
bcc .8
2019-10-12 16:20:09 +02:00
cmp #'z'+1
bcs .8
eor #$20
.8 rts
2019-10-12 16:20:09 +02:00
*--------------------------------------
X.GetPtr2Len ldy #$ff
2019-10-12 16:20:09 +02:00
.1 iny
lda (ZPPtr2),y get len
2019-10-12 16:20:09 +02:00
bne .1
rts
2019-10-12 16:20:09 +02:00
*--------------------------------------
X.GetFilenameLen
ldy #$ff
2018-12-19 17:45:09 +01:00
.1 iny
lda (ZPFileName),y
bne .1
2018-12-19 17:45:09 +01:00
tya
rts
*--------------------------------------
X.SetFileStatPtr
sec
2018-12-19 17:45:09 +01:00
adc ZPFileName
sta ZPFileStat
lda ZPFileName+1
adc #0
sta ZPFileStat+1
rts
*--------------------------------------
2025-01-19 17:12:51 +01:00
X.GetpDIR >LDA.G index
2025-01-19 17:12:51 +01:00
asl
* clc
adc #pDIRs-2
2018-11-21 14:08:11 +01:00
tay
lda (pData),y
2025-01-19 17:12:51 +01:00
pha
iny
lda (pData),y
ply
2018-11-21 14:08:11 +01:00
rts
2019-10-03 08:25:27 +02:00
*--------------------------------------
2025-01-19 17:12:51 +01:00
X.GetpDIRENT >LDA.G index
2025-01-19 17:12:51 +01:00
X.GetpDIRENT.A asl
* clc
adc #pDIRENTs-2
2018-11-21 14:08:11 +01:00
tay
lda (pData),y
2025-01-19 17:12:51 +01:00
pha
iny
lda (pData),y
ply
2018-11-21 14:08:11 +01:00
rts
*--------------------------------------
2025-01-19 17:12:51 +01:00
X.ResetpDIRENT >LDA.G index
2018-11-21 14:08:11 +01:00
asl
2025-01-19 17:12:51 +01:00
* clc
adc #pDIRENTs-2
2018-11-21 14:08:11 +01:00
tay
2025-01-19 17:12:51 +01:00
lda #0
sta (pData),y
iny
sta (pData),y
2018-11-21 14:08:11 +01:00
rts
*--------------------------------------
MAN
2020-08-25 16:54:30 +02:00
SAVE usr/src/shared/x.fileenum.s
2025-01-19 17:12:51 +01:00
LOAD usr/src/bin/cp.s
2018-07-20 13:51:08 +02:00
ASM