mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-03-27 18:35:06 +00:00
Wildcard filename matching
This commit is contained in:
parent
81ad97e0bd
commit
438ab01254
5
src/inc/match.plh
Normal file
5
src/inc/match.plh
Normal file
@ -0,0 +1,5 @@
|
||||
import match
|
||||
predef matchName(src, exp)#1
|
||||
predef matchList(pathptr, exp)#2
|
||||
predef isWildName(exp)#1
|
||||
end
|
@ -107,8 +107,10 @@ BLTDONE INX
|
||||
end
|
||||
def spriteBLTMask(x, y, w, h, srcptr)#0
|
||||
word i, j
|
||||
byte c
|
||||
byte pitch
|
||||
// byte c
|
||||
|
||||
pitch = (w + 1) / 2
|
||||
for j = y to y + h - 1
|
||||
scanMask(x, j, w, srcptr)
|
||||
// for i = 0 to w - 1
|
||||
@ -120,7 +122,7 @@ def spriteBLTMask(x, y, w, h, srcptr)#0
|
||||
// fin
|
||||
// hgrPlot(x + i, j)
|
||||
// next
|
||||
srcptr = srcptr + (w + 1) / 2
|
||||
srcptr = srcptr + pitch
|
||||
next
|
||||
end
|
||||
export def spriteCompile(w, h, xcenter, ycenter, srcptr)#1
|
||||
@ -154,20 +156,11 @@ export def spriteDup(sprtsrc)#1
|
||||
var sprtdup, spritesize
|
||||
byte i
|
||||
|
||||
sprtdup = heapalloc(t_sprite)
|
||||
spritesize = sprtsrc=>s_size
|
||||
sprtdup=>s_size = spritesize
|
||||
sprtdup->s_pitch = sprtsrc->s_pitch
|
||||
sprtdup->s_height = sprtsrc->s_height
|
||||
sprtdup->s_height = sprtsrc->s_height
|
||||
sprtdup->s_xcenter = sprtsrc->s_xcenter
|
||||
sprtdup->s_ycenter = sprtsrc->s_ycenter
|
||||
sprtdup = heapalloc(t_sprite)
|
||||
memcpy(sprtdup, sprtsrc, t_sprite)
|
||||
spritesize = sprtdup=>s_size
|
||||
sprtdup=>s_under[0] = heapalloc(spritesize)
|
||||
sprtdup=>s_under[1] = heapalloc(spritesize)
|
||||
for i = 0 to 13
|
||||
sprtdup=>s_map[i] = sprtsrc=>s_map[i]
|
||||
sprtdup=>s_mask[i] = sprtsrc=>s_mask[i]
|
||||
next
|
||||
return sprtdup
|
||||
end
|
||||
export def spriteRead(filestr)#1
|
||||
|
@ -10,7 +10,7 @@ var err, shorterr, shortlen, longerr, longlen
|
||||
|
||||
//def nopLin(a, b, c)#0
|
||||
//end
|
||||
//def majorline(majorstart, major, majorend, minor, dir, majorspan)#0
|
||||
//def majorspans(majorstart, major, majorend, minor, dir, majorspan)#0
|
||||
// //
|
||||
// // Initial half-span step
|
||||
// //
|
||||
@ -32,7 +32,7 @@ var err, shorterr, shortlen, longerr, longlen
|
||||
// //
|
||||
// majorspan(majorstart, majorend, minor)#0
|
||||
//end
|
||||
asm majorline(majorstart, major, majorend, minor, dir, majorspan)#0
|
||||
asm majorspans(majorstart, major, majorend, minor, dir, majorspan)#0
|
||||
!SOURCE "vmsrc/plvmzp.inc"
|
||||
LDA $1000 ; ERRL
|
||||
CLC
|
||||
@ -48,7 +48,7 @@ asm majorline(majorstart, major, majorend, minor, dir, majorspan)#0
|
||||
STA $A001
|
||||
STA $B001
|
||||
end
|
||||
asm _majorlineA
|
||||
asm _majorspansA
|
||||
- DEX
|
||||
DEX
|
||||
DEX
|
||||
@ -82,11 +82,11 @@ asm _majorlineA
|
||||
ADC #$00
|
||||
STA ESTKH+5,X ; MAJORSTARTH
|
||||
end
|
||||
asm _majorlineB
|
||||
asm _majorspansB
|
||||
LDY $1001 ; ERRH
|
||||
BMI +
|
||||
end
|
||||
asm _majorlineC
|
||||
asm _majorspansC
|
||||
LDA $1000 ; ERRL
|
||||
CLC
|
||||
ADC $2000 ; SHORTERRL
|
||||
@ -101,10 +101,14 @@ asm _majorlineC
|
||||
LDA ESTKH+4,X ; MAJORH
|
||||
ADC $3001 ; SHORTLENH
|
||||
STA ESTKH+4,X
|
||||
BCC ++
|
||||
LDA ESTKL+4,X ; MAJORL
|
||||
CMP ESTKL+3,X ; MAJORENDL
|
||||
LDA ESTKH+4,X ; MAJORH
|
||||
SBC ESTKH+3,X ; MAJORENDH
|
||||
BCC -
|
||||
BCS ++
|
||||
end
|
||||
asm _majorlineD
|
||||
asm _majorspansD
|
||||
+ LDA $1000 ; ERRL
|
||||
CLC
|
||||
ADC $4000 ; LONGERRL
|
||||
@ -119,16 +123,15 @@ asm _majorlineD
|
||||
LDA ESTKH+4,X ; MAJORH
|
||||
ADC $5001 ; LONGLENH
|
||||
STA ESTKH+4,X
|
||||
|
||||
++ LDA ESTKL+4,X ; MAJORL
|
||||
LDA ESTKL+4,X ; MAJORL
|
||||
CMP ESTKL+3,X ; MAJORENDL
|
||||
LDA ESTKH+4,X ; MAJORH
|
||||
SBC ESTKH+3,X ; MAJORENDH
|
||||
BCS +
|
||||
BCS ++
|
||||
end
|
||||
asm _majorlineE
|
||||
asm _majorspansE
|
||||
JMP $6000
|
||||
+ DEX
|
||||
++ DEX
|
||||
DEX
|
||||
DEX
|
||||
LDA ESTKL+8,X ; MAJORSTARTL
|
||||
@ -335,6 +338,52 @@ export def setlinespans(h, v)#0
|
||||
hspan = h
|
||||
vspan = v
|
||||
end
|
||||
def hmajorspans(x1, y1, x2, y2, dx, dy, sy)#0
|
||||
var dy2, halflen, rem
|
||||
//
|
||||
// Half-span length and error
|
||||
//
|
||||
dy2 = dy * 2
|
||||
halflen, rem = divmod(dx, dy2)
|
||||
err = dy2 - rem
|
||||
//
|
||||
// Long-span length = half-span length * 2
|
||||
//
|
||||
longlen = (halflen + 1) * 2
|
||||
longerr = err * 2
|
||||
if longerr >= dy2
|
||||
longerr = longerr - dy2
|
||||
longlen--
|
||||
fin
|
||||
//
|
||||
// Short-span length = long-span length - 1
|
||||
//
|
||||
shortlen = longlen - 1
|
||||
shorterr = longerr - dy2
|
||||
majorspans(x1, x1 + halflen, x2, y1, sy, hspan)
|
||||
end
|
||||
def vmajorspans(x1, y1, x2, y2, dx, dy, sx)#0
|
||||
var dx2, halflen, rem
|
||||
|
||||
//
|
||||
// Half-span length and error
|
||||
//
|
||||
dx2 = dx * 2
|
||||
halflen, rem = divmod(dy, dx2)
|
||||
err = dx2 - rem
|
||||
//
|
||||
// Long-span length = half-span length * 2
|
||||
//
|
||||
longlen = (halflen + 1) * 2
|
||||
longerr = err * 2
|
||||
if longerr >= dx2
|
||||
longerr = longerr - dx2
|
||||
longlen--
|
||||
fin
|
||||
shortlen = longlen - 1
|
||||
shorterr = longerr - dx2
|
||||
majorspans(y1, y1 + halflen, y2, x1, sx, vspan)
|
||||
end
|
||||
export def linespans(x1, y1, x2, y2)#0
|
||||
var dx, dy, dx2, dy2, halflen, rem, sx, sy
|
||||
|
||||
@ -358,29 +407,9 @@ export def linespans(x1, y1, x2, y2)#0
|
||||
hspan(x1, x2, y1)#0; return
|
||||
fin
|
||||
//
|
||||
// Half-span length and error
|
||||
// JIT optimize setup
|
||||
//
|
||||
dy2 = dy * 2
|
||||
halflen, rem = divmod(dx, dy2)
|
||||
err = dy2 - rem
|
||||
//
|
||||
// Long-span length = half-span length * 2
|
||||
//
|
||||
longlen = (halflen + 1) * 2
|
||||
longerr = err * 2
|
||||
if longerr >= dy2
|
||||
longerr = longerr - dy2
|
||||
longlen--
|
||||
fin
|
||||
//
|
||||
// Short-span length = long-span length - 1
|
||||
//
|
||||
shortlen = longlen - 1
|
||||
shorterr = longerr - dy2
|
||||
//
|
||||
// JIT optimize inner loop
|
||||
//
|
||||
majorline(x1, x1 + halflen, x2, y1, sy, hspan)
|
||||
hmajorspans(x1, y1, x2, y2, dx, dy, sy)
|
||||
else
|
||||
if sy < 0
|
||||
x1, x2 = x2, x1
|
||||
@ -391,26 +420,9 @@ export def linespans(x1, y1, x2, y2)#0
|
||||
vspan(y1, y2, x1)#0; return
|
||||
fin
|
||||
//
|
||||
// Half-span length and error
|
||||
// JIT optimize inner setup
|
||||
//
|
||||
dx2 = dx * 2
|
||||
halflen, rem = divmod(dy, dx2)
|
||||
err = dx2 - rem
|
||||
//
|
||||
// Long-span length = half-span length * 2
|
||||
//
|
||||
longlen = (halflen + 1) * 2
|
||||
longerr = err * 2
|
||||
if longerr >= dx2
|
||||
longerr = longerr - dx2
|
||||
longlen--
|
||||
fin
|
||||
shortlen = longlen - 1
|
||||
shorterr = longerr - dx2
|
||||
//
|
||||
// JIT optimize inner loop
|
||||
//
|
||||
majorline(y1, y1 + halflen, y2, x1, sx, vspan)
|
||||
vmajorspans(x1, y1, x2, y2, dx, dy, sx)
|
||||
fin
|
||||
end
|
||||
export def setlineplot(p)#0
|
||||
@ -449,46 +461,46 @@ export def line(x1, y1, x2, y2)#0
|
||||
//
|
||||
// Assembly fixups
|
||||
//
|
||||
majorline:1 = @err
|
||||
majorline:5 = @shorterr
|
||||
majorline:8 = @err
|
||||
majorline:11 = @err.1
|
||||
majorline:14 = @shorterr.1
|
||||
majorline:17 = @err.1
|
||||
majorline:22 = @_majorlineA.28
|
||||
majorline:25 = @_majorlineE.31
|
||||
majorline:30 = @_majorlineA.29
|
||||
majorline:33 = @_majorlineE.32
|
||||
_majorlineB:1 = @err.1
|
||||
_majorlineC:1 = @err
|
||||
_majorlineC:5 = @shorterr
|
||||
_majorlineC:8 = @err
|
||||
_majorlineC:12 = @shorterr.1
|
||||
_majorlineC:15 = @err.1
|
||||
_majorlineC:21 = @shortlen
|
||||
_majorlineC:28 = @shortlen.1
|
||||
_majorlineD:1 = @err
|
||||
_majorlineD:5 = @longerr
|
||||
_majorlineD:8 = @err
|
||||
_majorlineD:12 = @longerr.1
|
||||
_majorlineD:15 = @err.1
|
||||
_majorlineD:21 = @longlen
|
||||
_majorlineD:28 = @longlen.1
|
||||
_majorlineE:1 = @_majorlineA
|
||||
hline:16 = @err
|
||||
hline:23 = @err.1
|
||||
_hlineA:1 = @jmpplot
|
||||
_hlineA:4 = @err.1
|
||||
_hlineB:6 = @err
|
||||
_hlineB:9 = @err
|
||||
_hlineB:13 = @err.1
|
||||
_hlineB:16 = @err.1
|
||||
vline:16 = @err
|
||||
vline:23 = @err.1
|
||||
_vlineA:1 = @jmpplot
|
||||
_vlineA:4 = @err.1
|
||||
_vlineB:6 = @err
|
||||
_vlineB:9 = @err
|
||||
_vlineB:13 = @err.1
|
||||
_vlineB:16 = @err.1
|
||||
majorspans:1 = @err
|
||||
majorspans:5 = @shorterr
|
||||
majorspans:8 = @err
|
||||
majorspans:11 = @err.1
|
||||
majorspans:14 = @shorterr.1
|
||||
majorspans:17 = @err.1
|
||||
majorspans:22 = @_majorspansA.28
|
||||
majorspans:25 = @_majorspansE.31
|
||||
majorspans:30 = @_majorspansA.29
|
||||
majorspans:33 = @_majorspansE.32
|
||||
_majorspansB:1 = @err.1
|
||||
_majorspansC:1 = @err
|
||||
_majorspansC:5 = @shorterr
|
||||
_majorspansC:8 = @err
|
||||
_majorspansC:12 = @shorterr.1
|
||||
_majorspansC:15 = @err.1
|
||||
_majorspansC:21 = @shortlen
|
||||
_majorspansC:28 = @shortlen.1
|
||||
_majorspansD:1 = @err
|
||||
_majorspansD:5 = @longerr
|
||||
_majorspansD:8 = @err
|
||||
_majorspansD:12 = @longerr.1
|
||||
_majorspansD:15 = @err.1
|
||||
_majorspansD:21 = @longlen
|
||||
_majorspansD:28 = @longlen.1
|
||||
_majorspansE:1 = @_majorspansA
|
||||
hline:16 = @err
|
||||
hline:23 = @err.1
|
||||
_hlineA:1 = @jmpplot
|
||||
_hlineA:4 = @err.1
|
||||
_hlineB:6 = @err
|
||||
_hlineB:9 = @err
|
||||
_hlineB:13 = @err.1
|
||||
_hlineB:16 = @err.1
|
||||
vline:16 = @err
|
||||
vline:23 = @err.1
|
||||
_vlineA:1 = @jmpplot
|
||||
_vlineA:4 = @err.1
|
||||
_vlineB:6 = @err
|
||||
_vlineB:9 = @err
|
||||
_vlineB:13 = @err.1
|
||||
_vlineB:16 = @err.1
|
||||
done
|
||||
|
144
src/libsrc/match.pla
Normal file
144
src/libsrc/match.pla
Normal file
@ -0,0 +1,144 @@
|
||||
include "inc/cmdsys.plh"
|
||||
include "inc/fileio.plh"
|
||||
|
||||
var dirbuf
|
||||
//
|
||||
// Copy string with upper case conversion
|
||||
//
|
||||
def cpyuprstr(dst, src)#0
|
||||
byte i, chr
|
||||
|
||||
if ^src
|
||||
for i = 1 to ^src
|
||||
chr = src->[i]
|
||||
if chr >= 'a' and chr <= 'z'
|
||||
dst->[i] = chr - 'a' + 'A'
|
||||
else
|
||||
dst->[i] = chr
|
||||
fin
|
||||
next
|
||||
fin
|
||||
^dst = ^src
|
||||
end
|
||||
//
|
||||
// Match next section of source and expression
|
||||
//
|
||||
def matchNext(src, srcofst, exp, expofst)
|
||||
if ^src >= srcofst and ^exp >= expofst
|
||||
when exp->[expofst]
|
||||
is '*' // Multi-char wildcard
|
||||
if matchNext(src, srcofst + 1, exp, expofst + 1)
|
||||
return TRUE
|
||||
fin
|
||||
return matchNext(src, srcofst + 1, exp, expofst)
|
||||
is '?' // Single char wildcard
|
||||
return matchNext(src, srcofst + 1, exp, expofst + 1)
|
||||
otherwise // verbatim match
|
||||
if src->[srcofst] == exp->[expofst]
|
||||
return matchNext(src, srcofst + 1, exp, expofst + 1)
|
||||
fin
|
||||
return FALSE
|
||||
wend
|
||||
fin
|
||||
return ^src < srcofst and ^exp < expofst // Return TRUE if at the end of both
|
||||
end
|
||||
//
|
||||
// Start off matching process
|
||||
//
|
||||
export def matchName(src, exp)#1
|
||||
char matchSrc[16], matchExp[16]
|
||||
|
||||
//
|
||||
// Ensure valid filename lengths
|
||||
//
|
||||
if ^src > 15 or ^exp > 15
|
||||
return FALSE
|
||||
fin
|
||||
//
|
||||
// Match on empty wildcard name (same as '*')
|
||||
//
|
||||
if not ^exp
|
||||
return TRUE
|
||||
fin
|
||||
//
|
||||
// Convert strings to upper case
|
||||
//
|
||||
cpyuprstr(@matchSrc, src)
|
||||
cpyuprstr(@matchExp, exp)
|
||||
return matchNext(@matchSrc, 1, @matchExp, 1)
|
||||
end
|
||||
export def matchList(pathstr, exp)#2
|
||||
byte refnum
|
||||
var firstblk, entrylen, entriesblk, i, entry, filecnt, entrylist, entryptr, entrycnt
|
||||
|
||||
if not dirbuf
|
||||
dirbuf = heapallocalign(512, 8, 0)
|
||||
fin
|
||||
if pathstr->[^pathstr] <> '/' // Make sure path ends with a '/'
|
||||
^pathstr++
|
||||
pathstr->[^pathstr] = '/'
|
||||
fin
|
||||
entrylist = 0
|
||||
entrycnt = 0
|
||||
filecnt = 0
|
||||
firstblk = 1
|
||||
refnum = fileio:open(pathstr)
|
||||
repeat
|
||||
if fileio:read(refnum, dirbuf, 512) == 512
|
||||
//
|
||||
// Skip block pointers
|
||||
//
|
||||
entry = dirbuf + 4
|
||||
if firstblk
|
||||
//
|
||||
// Pull out revelant details from the first block
|
||||
//
|
||||
entrylen = dirbuf->$23
|
||||
entriesblk = dirbuf->$24
|
||||
filecnt = dirbuf=>$25
|
||||
entry = entry + entrylen
|
||||
fin
|
||||
for i = firstblk to entriesblk
|
||||
//
|
||||
// Print directory entry details
|
||||
//
|
||||
^entry = ^entry & $0F
|
||||
if ^entry
|
||||
//
|
||||
// Match wildcard filename
|
||||
//
|
||||
if matchName(entry, exp)
|
||||
entryptr = heapalloc(t_fileentry)
|
||||
memcpy(entryptr, entry, t_fileentry)
|
||||
entrycnt++
|
||||
if not entrylist
|
||||
entrylist = entryptr
|
||||
fin
|
||||
fin
|
||||
filecnt--
|
||||
fin
|
||||
entry = entry + entrylen
|
||||
next
|
||||
firstblk = 0
|
||||
fin
|
||||
until filecnt == 0
|
||||
fileio:close(refnum)
|
||||
return entrylist, entrycnt
|
||||
end
|
||||
//
|
||||
// Is this a wildcard name?
|
||||
//
|
||||
export def isWildName(exp)#1
|
||||
byte i
|
||||
|
||||
if ^exp
|
||||
for i = 1 to ^exp
|
||||
if exp->[i] == '*' or exp->[i] == '?'
|
||||
return TRUE
|
||||
fin
|
||||
next
|
||||
fin
|
||||
return FALSE
|
||||
end
|
||||
done
|
||||
|
@ -29,6 +29,7 @@ TYPE = rel/apple/TYPE\#FE1000
|
||||
SIEVE = rel/SIEVE\#FE1000
|
||||
PRIMEGAP = rel/PRIMEGAP\#FE1000
|
||||
ARGS = rel/ARGS\#FE1000
|
||||
MATCH = rel/MATCH\#FE1000
|
||||
SPIPORT = rel/apple/SPIPORT\#FE1000
|
||||
SDFAT = rel/apple/SDFAT\#FE1000
|
||||
FATCAT = rel/apple/FATCAT\#FE1000
|
||||
@ -102,7 +103,7 @@ TXTTYPE = .TXT
|
||||
#SYSTYPE = \#FF2000
|
||||
#TXTTYPE = \#040000
|
||||
|
||||
apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVMJIT) $(PLVM802) $(PLVM03) $(PLVMJIT03) $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(SOSCMDJIT) $(PLASMAPLASM) $(CODEOPT) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(COPY) $(DEL) $(REN) $(CAT) $(NEWDIR) $(TYPE) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(GRAFIX) $(GFXDEMO) $(LINES) $(HGRSPRITE) $(HGRLIB) $(HGRTEST) $(GRLIB) $(DGRLIB) $(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ)
|
||||
apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVMJIT) $(PLVM802) $(PLVM03) $(PLVMJIT03) $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(SOSCMDJIT) $(PLASMAPLASM) $(CODEOPT) $(MATCH) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(COPY) $(DEL) $(REN) $(CAT) $(NEWDIR) $(TYPE) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(GRAFIX) $(GFXDEMO) $(LINES) $(HGRSPRITE) $(HGRLIB) $(HGRTEST) $(GRLIB) $(DGRLIB) $(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ)
|
||||
|
||||
-rm vmsrc/plvmzp.inc
|
||||
|
||||
@ -224,6 +225,10 @@ $(ED): toolsrc/ed.pla $(PLVM02) $(PLASM) toolsrc/ed.pla
|
||||
./$(PLASM) -AMOW < toolsrc/ed.pla > toolsrc/ed.a
|
||||
acme --setpc 4094 -o $(ED) toolsrc/ed.a
|
||||
|
||||
$(MATCH): libsrc/match.pla $(PLVM02) $(PLASM)
|
||||
./$(PLASM) -AMOW < libsrc/match.pla > libsrc/match.a
|
||||
acme --setpc 4094 -o $(MATCH) libsrc/match.a
|
||||
|
||||
$(ARGS): libsrc/args.pla $(PLVM02) $(PLASM)
|
||||
./$(PLASM) -AMOW < libsrc/args.pla > libsrc/args.a
|
||||
acme --setpc 4094 -o $(ARGS) libsrc/args.a
|
||||
|
@ -20,6 +20,7 @@ cp rel/apple/REN#FE1000 prodos/sys/REN.REL
|
||||
cp rel/apple/CAT#FE1000 prodos/sys/CAT.REL
|
||||
cp rel/apple/NEWDIR#FE1000 prodos/sys/NEWDIR.REL
|
||||
cp rel/apple/TYPE#FE1000 prodos/sys/TYPE.REL
|
||||
cp rel/MATCH#FE1000 prodos/sys/MATCH.REL
|
||||
cp rel/ARGS#FE1000 prodos/sys/ARGS.REL
|
||||
cp rel/ED#FE1000 prodos/sys/ED.REL
|
||||
cp rel/FIBER#FE1000 prodos/sys/FIBER.REL
|
||||
@ -152,6 +153,7 @@ cp samplesrc/lz4cat.pla prodos/bld/samples/Z4CAT.PLA.TXT
|
||||
|
||||
mkdir prodos/bld/inc
|
||||
cp inc/args.plh prodos/bld/inc/ARGS.PLH.TXT
|
||||
cp inc/match.plh prodos/bld/inc/MATCH.PLH.TXT
|
||||
cp inc/cmdsys.plh prodos/bld/inc/CMDSYS.PLH.TXT
|
||||
cp inc/conio.plh prodos/bld/inc/CONIO.PLH.TXT
|
||||
cp inc/lines.plh prodos/bld/inc/LINES.PLH.TXT
|
||||
|
@ -6,6 +6,7 @@ echo "BLD/CODEOPT"; atftp $1 --put -l rel/CODEOPT#FE1000 -r $2/BLD/CODEOPT#FE10
|
||||
|
||||
#Build incs
|
||||
echo "BLD/INC/ARGS.PLH"; atftp $1 --put -l inc/args.plh -r $2/BLD/INC/ARGS.PLH#040000
|
||||
echo "BLD/INC/MATCH.PLH"; atftp $1 --put -l inc/match.plh -r $2/BLD/INC/MATCH.PLH#040000
|
||||
echo "BLD/INC/CMDSYS.PLH"; atftp $1 --put -l inc/cmdsys.plh -r $2/BLD/INC/CMDSYS.PLH#040000
|
||||
echo "BLD/INC/CONIO.PLH"; atftp $1 --put -l inc/conio.plh -r $2/BLD/INC/CONIO.PLH#040000
|
||||
echo "BLD/INC/LINES.PLH"; atftp $1 --put -l inc/lines.plh -r $2/BLD/INC/LINES.PLH#040000
|
||||
|
@ -11,6 +11,7 @@ echo "SYS/JIT16"; atftp $1 --put -l rel/apple/JIT16#FE1000 -r $2/SYS/JIT16#F
|
||||
echo "SYS/JITUNE"; atftp $1 --put -l rel/apple/JITUNE#FE1000 -r $2/SYS/JITUNE#FE1000
|
||||
|
||||
# Core libraries
|
||||
echo "SYS/MATCH"; atftp $1 --put -l rel/MATCH#FE1000 -r $2/SYS/MATCH#FE1000
|
||||
echo "SYS/ARGS"; atftp $1 --put -l rel/ARGS#FE1000 -r $2/SYS/ARGS#FE1000
|
||||
echo "SYS/INT32"; atftp $1 --put -l rel/INT32#FE1000 -r $2/SYS/INT32#FE1000
|
||||
echo "SYS/DHCP"; atftp $1 --put -l rel/DHCP#FE1000 -r $2/SYS/DHCP#FE1000
|
||||
|
@ -1,11 +1,14 @@
|
||||
include "inc/cmdsys.plh"
|
||||
include "inc/longjmp.plh"
|
||||
include "inc/args.plh"
|
||||
include "inc/match.plh"
|
||||
include "inc/fileio.plh"
|
||||
include "inc/int32.plh"
|
||||
|
||||
var arg, refnum, dirbuf
|
||||
var page, firstblk, entrylen, entriesblk, i, entry, filecnt
|
||||
char[64] path, filename
|
||||
predef catalog(pathstr)#0
|
||||
|
||||
var arg, recurse, exit
|
||||
char[64] path, wildname
|
||||
res[t_fileinfo] fileinfo
|
||||
res[t_fileentry] fileentry
|
||||
//
|
||||
@ -82,91 +85,95 @@ def printentry(entryptr)#0
|
||||
puts(@eofstr)
|
||||
putln
|
||||
end
|
||||
//
|
||||
// Check arguments and file types
|
||||
//
|
||||
arg = argNext(argFirst)
|
||||
if ^arg
|
||||
strcpy(@path, arg)
|
||||
strupper(@path)
|
||||
else
|
||||
fileio:getpfx(@path)
|
||||
fin
|
||||
//
|
||||
// Check if file exists
|
||||
//
|
||||
if fileio:getfileinfo(@path, @fileinfo) == FILE_ERR_OK
|
||||
def printentries(pathstr, entries, num)#0
|
||||
byte page
|
||||
page = 20
|
||||
puts(pathstr); putln
|
||||
puts("=NAME==========TYPE===AUX====LENGTH=\n")
|
||||
//
|
||||
// Check if cataloging a directory
|
||||
//
|
||||
if fileinfo.file_type == $0F
|
||||
fileio:iobufalloc(2) // Reserve two I/O buffers
|
||||
if path[path] <> '/' // Make sure path ends with a '/'
|
||||
path++
|
||||
path[path] = '/'
|
||||
fin
|
||||
page = 21
|
||||
filecnt = 0
|
||||
firstblk = 1
|
||||
dirbuf = heapallocalign(512, 8, 0)
|
||||
refnum = fileio:open(@path)
|
||||
repeat
|
||||
if fileio:read(refnum, dirbuf, 512) == 512
|
||||
//
|
||||
// Skip block pointers
|
||||
//
|
||||
entry = dirbuf + 4
|
||||
if firstblk
|
||||
//
|
||||
// Pull out revelant details from the first block
|
||||
//
|
||||
entrylen = dirbuf->$23
|
||||
entriesblk = dirbuf->$24
|
||||
filecnt = dirbuf=>$25
|
||||
entry = entry + entrylen
|
||||
fin
|
||||
for i = firstblk to entriesblk
|
||||
//
|
||||
// Print directory entry details
|
||||
//
|
||||
^entry = ^entry & $0F
|
||||
if ^entry
|
||||
printentry(entry)
|
||||
filecnt--
|
||||
//
|
||||
// Pause display every screenfull
|
||||
//
|
||||
if not page
|
||||
getc
|
||||
page = 22
|
||||
else
|
||||
page--
|
||||
fin
|
||||
fin
|
||||
entry = entry + entrylen
|
||||
next
|
||||
firstblk = 0
|
||||
repeat
|
||||
printentry(entries)
|
||||
entries = entries + t_fileentry
|
||||
//
|
||||
// Pause display every screenfull
|
||||
//
|
||||
if not page
|
||||
if toupper(getc()) == 'Q'
|
||||
throw(exit, TRUE)
|
||||
fin
|
||||
until filecnt == 0
|
||||
else
|
||||
//
|
||||
// Create file entry from file info
|
||||
//
|
||||
filefrompath(@fileentry, @path)
|
||||
fileentry.entry_access = fileinfo.file_access
|
||||
fileentry.entry_type = fileinfo.file_type
|
||||
fileentry:entry_create:0 = fileinfo:create_date
|
||||
fileentry:entry_create:2 = fileinfo:create_time
|
||||
fileentry:entry_aux = fileinfo:aux_type
|
||||
fileentry:entry_mod:0 = fileinfo:mod_date
|
||||
fileentry:entry_mod:2 = fileinfo:mod_time
|
||||
refnum = fileio:open(@path)
|
||||
fileentry:entry_EOFL, fileentry.entry_EOFH = fileio:geteof(refnum)#2
|
||||
printentry(@fileentry)
|
||||
page = 22
|
||||
else
|
||||
page--
|
||||
fin
|
||||
num--
|
||||
until not num
|
||||
end
|
||||
def catalog(pathstr)#0
|
||||
char recursepath[64]
|
||||
var entrylist, entryptr, entrycnt
|
||||
|
||||
entrylist, entrycnt = matchList(pathstr, @wildname)
|
||||
if entrylist
|
||||
printentries(pathstr, entrylist, entrycnt)
|
||||
if recurse
|
||||
entryptr = entrylist
|
||||
repeat
|
||||
if entryptr->entry_type == $0F
|
||||
//
|
||||
// A directory, so recurse
|
||||
//
|
||||
strcpy(@recursepath, pathstr)
|
||||
strcat(@recursepath, entryptr)
|
||||
recursepath++
|
||||
recursepath[recursepath] = '/'
|
||||
if toupper(getc()) == 'Q'
|
||||
throw(exit, TRUE)
|
||||
fin
|
||||
catalog(@recursepath)
|
||||
fin
|
||||
entryptr = entryptr + t_fileentry
|
||||
entrycnt--
|
||||
until not entrycnt
|
||||
fin
|
||||
heaprelease(entrylist)
|
||||
fin
|
||||
end
|
||||
//
|
||||
// Install error exit
|
||||
//
|
||||
exit = heapalloc(t_except)
|
||||
if not except(exit)
|
||||
//
|
||||
// Check arguments and file types
|
||||
//
|
||||
arg = argNext(argFirst)
|
||||
if ^arg and arg->[1] == '-'
|
||||
if ^arg > 1 and toupper(arg->[2]) == 'R'
|
||||
recurse = TRUE
|
||||
fin
|
||||
arg = argNext(arg)
|
||||
fin
|
||||
recurse = TRUE
|
||||
if ^arg
|
||||
strcpy(@path, arg)
|
||||
strupper(@path)
|
||||
//
|
||||
// Check if cataloging a directory
|
||||
//
|
||||
if fileio:getfileinfo(@path, @fileinfo) <> FILE_ERR_OK or fileinfo.file_type <> $0F
|
||||
filefrompath(@wildname, @path)
|
||||
fin
|
||||
path = path - wildname
|
||||
fin
|
||||
if not path
|
||||
fileio:getpfx(@path)
|
||||
fin
|
||||
//
|
||||
// Check if directory exists
|
||||
//
|
||||
if fileio:getfileinfo(@path, @fileinfo) == FILE_ERR_OK
|
||||
catalog(@path)
|
||||
else
|
||||
puts("Unable to open: "); puts(@path); putln
|
||||
fin
|
||||
fileio:close(0)
|
||||
else
|
||||
puts("Unable to open: "); puts(@path); putln
|
||||
fin
|
||||
done
|
||||
|
Loading…
x
Reference in New Issue
Block a user