From 438ab01254d9d05ef8d429487b6cf7c117092737 Mon Sep 17 00:00:00 2001 From: Dave Schmenk Date: Tue, 31 Dec 2019 17:20:20 -0800 Subject: [PATCH] Wildcard filename matching --- src/inc/match.plh | 5 + src/libsrc/apple/hgrsprite.pla | 21 ++-- src/libsrc/lines.pla | 202 +++++++++++++++++---------------- src/libsrc/match.pla | 144 +++++++++++++++++++++++ src/makefile | 7 +- src/mkrel | 2 + src/tftpbld | 1 + src/tftpsys | 1 + src/utilsrc/apple/cat.pla | 179 +++++++++++++++-------------- 9 files changed, 366 insertions(+), 196 deletions(-) create mode 100644 src/inc/match.plh create mode 100644 src/libsrc/match.pla diff --git a/src/inc/match.plh b/src/inc/match.plh new file mode 100644 index 0000000..57b61ee --- /dev/null +++ b/src/inc/match.plh @@ -0,0 +1,5 @@ +import match + predef matchName(src, exp)#1 + predef matchList(pathptr, exp)#2 + predef isWildName(exp)#1 +end diff --git a/src/libsrc/apple/hgrsprite.pla b/src/libsrc/apple/hgrsprite.pla index 5f60ee1..84f2980 100644 --- a/src/libsrc/apple/hgrsprite.pla +++ b/src/libsrc/apple/hgrsprite.pla @@ -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 diff --git a/src/libsrc/lines.pla b/src/libsrc/lines.pla index eec08c9..39750b7 100644 --- a/src/libsrc/lines.pla +++ b/src/libsrc/lines.pla @@ -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 diff --git a/src/libsrc/match.pla b/src/libsrc/match.pla new file mode 100644 index 0000000..5662ea4 --- /dev/null +++ b/src/libsrc/match.pla @@ -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 + diff --git a/src/makefile b/src/makefile index 2220ef1..e96167e 100755 --- a/src/makefile +++ b/src/makefile @@ -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 diff --git a/src/mkrel b/src/mkrel index cb084a0..3789c45 100755 --- a/src/mkrel +++ b/src/mkrel @@ -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 diff --git a/src/tftpbld b/src/tftpbld index 5d40e6c..24e6c70 100755 --- a/src/tftpbld +++ b/src/tftpbld @@ -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 diff --git a/src/tftpsys b/src/tftpsys index 8c986bb..c32e833 100755 --- a/src/tftpsys +++ b/src/tftpsys @@ -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 diff --git a/src/utilsrc/apple/cat.pla b/src/utilsrc/apple/cat.pla index e5467ea..aa9a82a 100644 --- a/src/utilsrc/apple/cat.pla +++ b/src/utilsrc/apple/cat.pla @@ -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