Scanning directories on the host filing system.
§1. All of this abstracts the code already found in the platform definitions.
typedef struct scan_directory { void *directory_handle; char directory_name_written_out[4*MAX_FILENAME_LENGTH]; MEMORY_MANAGEMENT } scan_directory;
The structure scan_directory is private to this section.
§2. The directory name going out has to be transcoded from flat Unicode to whatever the locale encoding is; the filenames coming back have to be transcoded the other way.
scan_directory *Directories::open(pathname *P) { scan_directory *D = CREATE(scan_directory); TEMPORARY_TEXT(pn); WRITE_TO(pn, "%p", P); Str::copy_to_locale_string(D->directory_name_written_out, pn, 4*MAX_FILENAME_LENGTH); DISCARD_TEXT(pn); D->directory_handle = Platform::opendir(D->directory_name_written_out); if (D->directory_handle == NULL) return NULL; return D; } int Directories::next(scan_directory *D, text_stream *leafname) { char leafname_Cs[MAX_FILENAME_LENGTH]; int rv = TRUE; while (rv) { rv = Platform::readdir(D->directory_handle, D->directory_name_written_out, leafname_Cs); if (leafname_Cs[0] != '.') break; } Str::clear(leafname); if (rv) Streams::write_locale_string(leafname, leafname_Cs); return rv; } void Directories::close(scan_directory *D) { Platform::closedir(D->directory_handle); }
The function Directories::open appears nowhere else.
The function Directories::next appears nowhere else.
The function Directories::close appears nowhere else.