inweb-bootstrap/foundation-module/Chapter 3/Directories.w
2020-06-27 23:03:14 +01:00

44 lines
1.3 KiB
OpenEdge ABL

[Directories::] Directories.
Scanning directories on the host filing system.
@ 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];
CLASS_DEFINITION
} scan_directory;
@ 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);
}