From 7c3dfe2b2ec169f2ff14f4c48aff829a31324534 Mon Sep 17 00:00:00 2001 From: David Schmenk Date: Wed, 1 Jan 2020 13:50:57 -0800 Subject: [PATCH] Wildcard names for file utilities --- src/inc/{match.plh => matchfiles.plh} | 2 +- .../{match.pla => apple/matchfiles.pla} | 38 +-- src/makefile | 10 +- src/mkrel | 4 +- src/tftpbld | 2 +- src/tftpsys | 2 +- src/utilsrc/apple/cat.pla | 25 +- src/utilsrc/apple/copy.pla | 263 +++++++++++------- src/utilsrc/apple/del.pla | 160 +++++++++-- 9 files changed, 333 insertions(+), 173 deletions(-) rename src/inc/{match.plh => matchfiles.plh} (85%) rename src/libsrc/{match.pla => apple/matchfiles.pla} (82%) diff --git a/src/inc/match.plh b/src/inc/matchfiles.plh similarity index 85% rename from src/inc/match.plh rename to src/inc/matchfiles.plh index 57b61ee..9c571d4 100644 --- a/src/inc/match.plh +++ b/src/inc/matchfiles.plh @@ -1,4 +1,4 @@ -import match +import matchfiles predef matchName(src, exp)#1 predef matchList(pathptr, exp)#2 predef isWildName(exp)#1 diff --git a/src/libsrc/match.pla b/src/libsrc/apple/matchfiles.pla similarity index 82% rename from src/libsrc/match.pla rename to src/libsrc/apple/matchfiles.pla index 5662ea4..c14fd7a 100644 --- a/src/libsrc/match.pla +++ b/src/libsrc/apple/matchfiles.pla @@ -3,24 +3,6 @@ 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) @@ -46,34 +28,26 @@ 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) + return matchNext(src, 1, exp, 1) end export def matchList(pathstr, exp)#2 byte refnum + char[64] curpath var firstblk, entrylen, entriesblk, i, entry, filecnt, entrylist, entryptr, entrycnt if not dirbuf dirbuf = heapallocalign(512, 8, 0) fin + if not ^pathstr + fileio:getpfx(@curpath) + pathstr = @curpath + fin if pathstr->[^pathstr] <> '/' // Make sure path ends with a '/' ^pathstr++ pathstr->[^pathstr] = '/' diff --git a/src/makefile b/src/makefile index e96167e..5bda359 100755 --- a/src/makefile +++ b/src/makefile @@ -29,7 +29,7 @@ TYPE = rel/apple/TYPE\#FE1000 SIEVE = rel/SIEVE\#FE1000 PRIMEGAP = rel/PRIMEGAP\#FE1000 ARGS = rel/ARGS\#FE1000 -MATCH = rel/MATCH\#FE1000 +MATCHFILES = rel/apple/MATCHFILES\#FE1000 SPIPORT = rel/apple/SPIPORT\#FE1000 SDFAT = rel/apple/SDFAT\#FE1000 FATCAT = rel/apple/FATCAT\#FE1000 @@ -103,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) $(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) +apple: $(PLVMZP_APL) $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVMJIT) $(PLVM802) $(PLVM03) $(PLVMJIT03) $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(SOSCMDJIT) $(PLASMAPLASM) $(CODEOPT) $(MATCHFILES) $(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 @@ -225,9 +225,9 @@ $(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 +$(MATCHFILES): libsrc/apple/matchfiles.pla $(PLVM02) $(PLASM) + ./$(PLASM) -AMOW < libsrc/apple/matchfiles.pla > libsrc/apple/matchfiles.a + acme --setpc 4094 -o $(MATCHFILES) libsrc/apple/matchfiles.a $(ARGS): libsrc/args.pla $(PLVM02) $(PLASM) ./$(PLASM) -AMOW < libsrc/args.pla > libsrc/args.a diff --git a/src/mkrel b/src/mkrel index 3789c45..48f9f7a 100755 --- a/src/mkrel +++ b/src/mkrel @@ -20,7 +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/apple/MATCHFILES#FE1000 prodos/sys/MATCHFILES.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 @@ -153,7 +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/matchfiles.plh prodos/bld/inc/MATCHFILES.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 24e6c70..5676b2a 100755 --- a/src/tftpbld +++ b/src/tftpbld @@ -6,7 +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/MATCHFILES.PLH"; atftp $1 --put -l inc/matchfiles.plh -r $2/BLD/INC/MATCHFILES.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 c32e833..a54c52a 100755 --- a/src/tftpsys +++ b/src/tftpsys @@ -11,7 +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/MATCHFILES"; atftp $1 --put -l rel/apple/MATCHFILES#FE1000 -r $2/SYS/MATCHFILES#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 aa9a82a..68f3860 100644 --- a/src/utilsrc/apple/cat.pla +++ b/src/utilsrc/apple/cat.pla @@ -1,7 +1,7 @@ include "inc/cmdsys.plh" include "inc/longjmp.plh" include "inc/args.plh" -include "inc/match.plh" +include "inc/matchfiles.plh" include "inc/fileio.plh" include "inc/int32.plh" @@ -28,17 +28,23 @@ def putb(b)#0 fin putc(h) end -def strupper(strptr)#0 +// +// Copy string with upper case conversion +// +def struprcpy(dst, src)#0 byte i, chr - if ^strptr - for i = 1 to ^strptr - chr = strptr->[i] + if ^src + for i = 1 to ^src + chr = src->[i] if chr >= 'a' and chr <= 'z' - strptr->[i] = chr - 'a' + 'A' + dst->[i] = chr - 'a' + 'A' + else + dst->[i] = chr fin next fin + ^dst = ^src end def filefrompath(filestr, pathstr)#0 byte i @@ -87,9 +93,10 @@ def printentry(entryptr)#0 end def printentries(pathstr, entries, num)#0 byte page - page = 20 + puts(pathstr); putln puts("=NAME==========TYPE===AUX====LENGTH=\n") + page = 20 repeat printentry(entries) entries = entries + t_fileentry @@ -152,10 +159,8 @@ if not except(exit) fin arg = argNext(arg) fin - recurse = TRUE if ^arg - strcpy(@path, arg) - strupper(@path) + struprcpy(@path, arg) // // Check if cataloging a directory // diff --git a/src/utilsrc/apple/copy.pla b/src/utilsrc/apple/copy.pla index 881faa9..feee4b1 100644 --- a/src/utilsrc/apple/copy.pla +++ b/src/utilsrc/apple/copy.pla @@ -1,14 +1,31 @@ include "inc/cmdsys.plh" +include "inc/longjmp.plh" include "inc/args.plh" include "inc/fileio.plh" +include "inc/matchfiles.plh" const MAXBUFSIZE = 16384 -var arg, srcref, dstref, copybuff, copysize, copyxfer -char[64] srcfilename, dstfilename +var arg, recurse, exit, srcfilelist, srcfileptr, srccnt +char[64] dstpath res[t_fileinfo] srcfileinfo, dstfileinfo // -// Handy string functions +// Copy string with upper case conversion // +def struprcpy(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 def filefrompath(filestr, pathstr)#0 byte i @@ -21,126 +38,184 @@ def filefrompath(filestr, pathstr)#0 memcpy(filestr + 1, pathstr + 1 + i, ^filestr) end // -// Check destination filename +// Check destination path // -def checkdst - char[17] basefile +def chkdstpath(dstfile) // // Check if destination exists // - if fileio:getfileinfo(@dstfilename, @dstfileinfo) == FILE_ERR_OK + if fileio:getfileinfo(dstfile, @dstfileinfo) == FILE_ERR_OK // // Check if copying into a directory // if dstfileinfo.file_type == $0F - if dstfilename[dstfilename] <> '/' + if dstfile->[^dstfile] <> '/' // // Add path seperator // - dstfilename++ - dstfilename[dstfilename] = '/' + ^dstfile++ + dstfile->[^dstfile] = '/' fin - filefrompath(@basefile, @srcfilename) - strcat(@dstfilename, @basefile) - if fileio:getfileinfo(@dstfilename, @dstfileinfo) == FILE_ERR_OK - // - // Check if *that* is a directory - // - if dstfileinfo.file_type == $0F - puts("Destination is a directory filename\n") - return FALSE + return TRUE + fin + fin + return FALSE +end +def copyfiles(srcfile, dstfile)#0 + var entrylist, entry, entrycnt, srcref, dstref, copybuff, copyrel, copysize, copyxfer + char[64] srcpath + char[64] srcfilepath + char[64] dstfilepath + char[16] wildname + + copysize = MAXBUFSIZE + while isult(heapavail, copysize + 512) + copysize = copysize / 2 + loop + copyrel = heapalloc(copysize) + if copyrel + // + // Round buffer to page boundary for faster transfers + // + copybuff = (copyrel + $FF) & $FF00 + // + // Check if copying a directory + // + strcpy(@srcpath, srcfile) + wildname = 0 + if fileio:getfileinfo(@srcpath, @srcfileinfo) <> FILE_ERR_OK or srcfileinfo.file_type <> $0F + filefrompath(@wildname, @srcpath) + srcpath = srcpath - wildname + fin + entrylist, entrycnt = matchList(@srcpath, @wildname) + if not entrylist + // + // Unable to open source + // + puts("Unable to open: "); puts(@srcpath); putln + throw(exit, TRUE) + fin + entry = entrylist + while entrycnt + strcpy(@srcfilepath, @srcpath) + strcat(@srcfilepath, entry) + strcpy(@dstfilepath, dstfile) + if chkdstpath(@dstfilepath) + strcat(@dstfilepath, entry) + fin + puts(@srcfilepath); puts(" ==> "); puts(@dstfilepath); putln + // + // Check if source is a directory + // + if entry->entry_type == $0F + fileio:create(@dstfilepath, $0F, $0000) + if not chkdstpath(@dstfilepath) + puts("Unable to create: "); puts(@dstfilepath); putln + throw(exit, TRUE) + fin + if recurse + copyfiles(@srcfilepath, @dstfilepath) fin else - return TRUE - fin - fin - // - // Remove existing file - // - fileio:destroy(@dstfilename) - fin - return TRUE -end -// -// Check arguments and file types -// -arg = argNext(argFirst) -if ^arg - strcpy(@srcfilename, arg) - fileio:iobufalloc(2) // Reserve two I/O buffers - if fileio:getfileinfo(@srcfilename, @srcfileinfo) == FILE_ERR_OK - // - // Check that source isn't a directory - can't handle that yet - // - if srcfileinfo.file_type == $0F - puts("Can't copy directories (yet)\n") - return - fin - else - // - // File not found - // - puts("File not found: "); puts(@srcfilename); putln - return - fin - srcref = fileio:open(@srcfilename) - if srcref - arg = argNext(arg) - if ^arg - strcpy(@dstfilename, arg) - if checkdst() + // + // Check if destination exists + // + if fileio:getfileinfo(@dstfilepath, @dstfileinfo) == FILE_ERR_OK + fileio:destroy(@dstfilepath) + fin // // Create the destination file and open for writing // - if fileio:create(@dstfilename, srcfileinfo.file_type, srcfileinfo:aux_type) == FILE_ERR_OK - dstref = fileio:open(@dstfilename) + if fileio:create(@dstfilepath, entry->entry_type, entry=>entry_aux) == FILE_ERR_OK + srcref = fileio:open(@srcfilepath) + dstref = fileio:open(@dstfilepath) if dstref // // Let the copying begin // - copysize = MAXBUFSIZE - while isult(heapavail, copysize + 512) - copysize = copysize / 2 - loop - copybuff = heapalloc(copysize) - if copybuff - // - // Round buffer to page boundary for faster transfers - // - copybuff = (copybuff + $FF) & $FF00 + copyxfer = fileio:read(srcref, copybuff, copysize) + while copyxfer + if fileio:write(dstref, copybuff, copyxfer) <> copyxfer + puts("Error writing: "); puts(@dstfilepath); putln + throw(exit, TRUE) + fin copyxfer = fileio:read(srcref, copybuff, copysize) - while copyxfer - if fileio:write(dstref, copybuff, copyxfer) <> copyxfer - puts("Error writing: "); puts(@dstfilename); putln - break - fin - copyxfer = fileio:read(srcref, copybuff, copysize) - loop - else - puts("No memory available!\n") - fin + loop + fileio:close(dstref) else - puts("Unable to open: "); puts(@dstfilename); putln + puts("Unable to open: "); puts(@dstfilepath); putln + throw(exit, TRUE) fin + fileio:close(srcref) else - puts("Unable to create: "); puts(@dstfilename); putln + puts("Unable to create: "); puts(@dstfilepath); putln + throw(exit, TRUE) fin fin - fileio:close(0) + entry = entry + t_fileentry + entrycnt-- + loop + heaprelease(entrylist) + else + puts("No memory available!\n") + throw(exit, TRUE) + fin + heaprelease(copyrel) +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 + if ^arg + srcfilelist = heapalloc(^arg + 1) + struprcpy(srcfilelist, arg) + srccnt++ + arg = argNext(arg) + if ^arg + struprcpy(@dstpath, arg) + arg = argNext(arg) + while ^arg + // + // Add to source list + // + srcfileptr = heapalloc(dstpath + 1) + strcpy(srcfileptr, @dstpath) + srccnt++ + // + // Set new destination + // + struprcpy(@dstpath, arg) + arg = argNext(arg) + loop + if not chkdstpath(@dstpath) and (srccnt > 1 or isWildName(srcfilelist)) + puts("Destination must be directory: "); puts(@dstpath); putln + throw(exit, TRUE) + fin + fileio:iobufalloc(2) // Reserve two I/O buffers + srcfileptr = srcfilelist + while srccnt + // + // Copy files in list + // + copyfiles(srcfileptr, @dstpath) + srcfileptr = srcfileptr + ^srcfileptr + 1 + srccnt-- + loop return fin - else - // - // Unable to open source - // - puts("Unable to open: "); puts(@srcfilename); putln - return fin - // - // Close all files - // - fileio:close(0) - return + puts("Usage: +COPY + \n") fin -puts("Usage: +COPY SRCFILE DEST\n") +fileio:close(0) done diff --git a/src/utilsrc/apple/del.pla b/src/utilsrc/apple/del.pla index 83a07f9..5501609 100644 --- a/src/utilsrc/apple/del.pla +++ b/src/utilsrc/apple/del.pla @@ -1,62 +1,168 @@ include "inc/cmdsys.plh" +include "inc/longjmp.plh" include "inc/args.plh" include "inc/fileio.plh" +include "inc/matchfiles.plh" -char[64] filename -var arg +var arg, recurse, exit, filelist, fileptr, filecnt +char[64] path +res[t_fileinfo] fileinfo +// +// Copy string with upper case conversion +// +def struprcpy(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 +def filefrompath(filestr, pathstr)#0 + byte i + + for i = ^pathstr downto 1 + if pathstr->[i] == '/' + break + fin + next + ^filestr = ^pathstr - i + memcpy(filestr + 1, pathstr + 1 + i, ^filestr) +end // // Check filename // -def checkfile - var refnum, dirbuf - res[t_fileinfo] fileinfo +def chkfile(file)#1 + var refnum, dirbuf, filecnt // // Check if file exists // - if fileio:getfileinfo(@filename, @fileinfo) == FILE_ERR_OK + if fileio:getfileinfo(file, @fileinfo) == FILE_ERR_OK // // Check if deleting a directory // if fileinfo.file_type == $0F - refnum = fileio:open(@filename) + refnum = fileio:open(file) if refnum // // Check for files inside directory // + filecnt = 0 dirbuf = heapalloc(512) if fileio:read(refnum, dirbuf, 512) == 512 fileio:close(refnum) - if dirbuf=>$25 // File count in directory - puts("Directory not empty: "); puts(@filename); putln - return FALSE - fin + filecnt = dirbuf=>$25 // File count in directory + fin + heaprelease(dirbuf) + if filecnt + puts("Directory not empty: "); puts(file); putln + return FALSE fin fin fin return TRUE fin - puts("File not found: "); puts(@filename); putln + puts("File not found: "); puts(file); putln return FALSE end -// -// Check arguments and file types -// -arg = argNext(argFirst) -if ^arg - strcpy(@filename, arg) - if checkfile() - // - // Remove existing file - // - fileio:destroy(@filename) +def delfiles(delfile)#0 + var entrylist, entry, entrycnt + char[64] delpath + char[64] delfilepath + char[16] wildname + + strcpy(@delpath, delfile) + wildname = 0 + //if fileio:getfileinfo(@delpath, @fileinfo) <> FILE_ERR_OK or fileinfo.file_type <> $0F + if delpath[delpath] <> '/' + filefrompath(@wildname, @delpath) + delpath = delpath - wildname fin // - // Close all files + // Check arguments and file types // - fileio:close(0) - return + entrylist, entrycnt = matchList(@delpath, @wildname) + if entrylist + entry = entrylist + while entrycnt + strcpy(@delfilepath, @delpath) + strcat(@delfilepath, entry) + // + // Check if file is a directory + // + if entry->entry_type == $0F + if recurse + strcat(@delfilepath, "/") + strcat(@delfilepath, @wildname) + delfiles(@delfilepath) + fin + strcpy(@delfilepath, @delpath) + strcat(@delfilepath, entry) + if chkfile(@delfilepath) + puts("Removing: "); puts(@delfilepath); putln + fileio:destroy(@delfilepath) + fin + else + puts("Removing: "); puts(@delfilepath); putln + fileio:destroy(@delfilepath) + fin + entry = entry + t_fileentry + entrycnt-- + loop + elsif not wildname + puts("Not found: "); puts(@delpath); puts("/"); puts(@wildname); putln + 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 + if ^arg + filelist = heapmark() + while ^arg + // + // Add to file list + // + fileptr = heapalloc(^arg + 1) + struprcpy(fileptr, arg) + filecnt++ + arg = argNext(arg) + loop + fileptr = filelist + while filecnt + // + // Delete files in list + // + if recurse and fileio:getfileinfo(fileptr, @fileinfo) == FILE_ERR_OK and fileinfo.file_type == $0F + strcpy(@path,fileptr) + strcat(@path, "/") + delfiles(@path) + fin + delfiles(fileptr) + fileptr = fileptr + ^fileptr + 1 + filecnt-- + loop + else + puts("Usage: +DEL +\n") + fin fin -puts("Usage: +DEL FILE\n") done