1
0
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:
Dave Schmenk 2019-12-31 17:20:20 -08:00
parent 81ad97e0bd
commit 438ab01254
9 changed files with 366 additions and 196 deletions

5
src/inc/match.plh Normal file
View File

@ -0,0 +1,5 @@
import match
predef matchName(src, exp)#1
predef matchList(pathptr, exp)#2
predef isWildName(exp)#1
end

View File

@ -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

View File

@ -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
View 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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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