API change: diskio.list_files doesn't have an internal buffer anymore, you now have to supply a buffer + size yourself. Renamed to list_filenames

This commit is contained in:
Irmen de Jong 2022-11-20 23:27:22 +01:00
parent 08275c406a
commit 77e956a29f
3 changed files with 15 additions and 14 deletions

View File

@ -114,30 +114,31 @@ io_error:
; ----- get a list of files (uses iteration functions internally) ----- ; ----- get a list of files (uses iteration functions internally) -----
sub list_files(ubyte drivenumber, uword pattern_ptr, uword name_ptrs, ubyte max_names) -> ubyte { sub list_filenames(ubyte drivenumber, uword pattern_ptr, uword filenames_buffer, uword filenames_buf_size) -> ubyte {
; -- fill the array 'name_ptrs' with (pointers to) the names of the files requested. ; -- fill the provided buffer with the names of the files on the disk (until buffer is full).
; Returns number of files. Skips 'dir' entries (subdirs). ; Files in the buffer are separeted by a 0 byte. You can provide an optional pattern to match against.
const uword filenames_buf_size = 800 ; After the last filename one additional 0 byte is placed to indicate the end of the list.
uword filenames_buffer = memory("filenames", filenames_buf_size, 0) ; Returns number of files (it skips 'dir' entries i.e. subdirectories).
; Also sets carry on exit: Carry clear = all files returned, Carry set = directory has more files that didn't fit in the buffer.
uword buffer_start = filenames_buffer uword buffer_start = filenames_buffer
ubyte files_found = 0 ubyte files_found = 0
if lf_start_list(drivenumber, pattern_ptr) { if lf_start_list(drivenumber, pattern_ptr) {
while lf_next_entry() { while lf_next_entry() {
if list_filetype!="dir" { if list_filetype!="dir" {
@(name_ptrs) = lsb(filenames_buffer)
name_ptrs++
@(name_ptrs) = msb(filenames_buffer)
name_ptrs++
filenames_buffer += string.copy(diskio.list_filename, filenames_buffer) + 1 filenames_buffer += string.copy(diskio.list_filename, filenames_buffer) + 1
files_found++ files_found++
if filenames_buffer - buffer_start > filenames_buf_size-18 if filenames_buffer - buffer_start > filenames_buf_size-20 {
break @(filenames_buffer)=0
if files_found == max_names lf_end_list()
break sys.set_carry()
return files_found
}
} }
} }
lf_end_list() lf_end_list()
} }
@(filenames_buffer)=0
sys.clear_carry()
return files_found return files_found
} }

View File

@ -364,6 +364,7 @@ diskio module, to deal with loading of potentially large files in to banked ram
Routines to directly load data into video ram are also present (vload and vload_raw). Routines to directly load data into video ram are also present (vload and vload_raw).
Also contains a helper function to calculate the file size of a loaded file (although that is truncated Also contains a helper function to calculate the file size of a loaded file (although that is truncated
to 16 bits, 64Kb) to 16 bits, 64Kb)
Als contains routines for operating on subdirectories (chdir, mkdir, rmdir) and to relabel the disk.
psg (cx16 only) psg (cx16 only)

View File

@ -3,7 +3,6 @@ TODO
For next release For next release
^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^
- make diskio.list_files not use an internal buffer itself but change names_ptr meaning to user supplied buffer.
- ir/vm: allow label in block scope (correct order of block nodes!) - ir/vm: allow label in block scope (correct order of block nodes!)
- regression test the various projects - regression test the various projects
- attempt to fix the expression codegen bug with reused temp vars (github #89) - attempt to fix the expression codegen bug with reused temp vars (github #89)