Convert rust_list_files to istrs. Issue #855

This commit is contained in:
Brian Anderson 2011-09-01 15:51:27 -07:00
parent 82634cd530
commit f07a328c16
5 changed files with 40 additions and 27 deletions

View file

@ -53,8 +53,7 @@ fn list_dir(p: &path) -> [istr] {
let pl = istr::byte_len(p);
if pl == 0u || p[pl - 1u] as char != os_fs::path_sep { p += path_sep(); }
let full_paths: [istr] = [];
for filename: str in os_fs::list_dir(istr::to_estr(p)) {
let filename = istr::from_estr(filename);
for filename: istr in os_fs::list_dir(p) {
if !istr::eq(filename, ~".") {
if !istr::eq(filename, ~"..") { full_paths += [p + filename]; }
}

View file

@ -1,12 +1,11 @@
native "rust" mod rustrt {
fn rust_list_files(path: str) -> @[str];
fn rust_list_files(path: &istr) -> [istr];
fn rust_dirent_filename(ent: os::libc::dirent) -> str;
}
fn list_dir(path: str) -> [str] {
ret *rustrt::rust_list_files(path);
// TODO ensure this is always closed
fn list_dir(path: &istr) -> [istr] {
ret rustrt::rust_list_files(path);
// FIXME: No idea why, but this appears to corrupt memory on OSX. I
// suspect it has to do with the tasking primitives somehow, or perhaps

View file

@ -1,11 +1,14 @@
native "rust" mod rustrt {
fn rust_list_files(path: str) -> @[str];
fn rust_list_files(path: &istr) -> [istr];
fn rust_file_is_dir(path: str) -> int;
}
fn list_dir(path: str) -> [str] { ret *rustrt::rust_list_files(path + "*"); }
fn list_dir(path: &istr) -> [istr] {
let path = path + ~"*";
ret rustrt::rust_list_files(path);
}
fn path_is_absolute(p: &istr) -> bool {
ret istr::char_at(p, 0u) == '/' ||

View file

@ -383,41 +383,42 @@ rust_str* c_str_to_rust(rust_task *task, char const *str) {
return vec_alloc_with_data(task, len, len, 1, (void*)str);
}
extern "C" CDECL rust_box*
rust_list_files(rust_task *task, rust_str *path) {
array_list<rust_str*> strings;
extern "C" CDECL rust_vec*
rust_list_files(rust_task *task, rust_vec **path) {
array_list<rust_vec*> strings;
#if defined(__WIN32__)
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile((char*)path->data, &FindFileData);
HANDLE hFind = FindFirstFile((char*)(*path)->data, &FindFileData);
if (hFind != INVALID_HANDLE_VALUE) {
do {
strings.push(c_str_to_rust(task, FindFileData.cFileName));
rust_vec *str = make_istr(task->kernel, FindFileData.cFileName,
strlen(FindFileData.cFileName),
"list_files_str");
strings.push(str);
} while (FindNextFile(hFind, &FindFileData));
FindClose(hFind);
}
#else
DIR *dirp = opendir((char*)path->data);
DIR *dirp = opendir((char*)(*path)->data);
if (dirp) {
struct dirent *dp;
while ((dp = readdir(dirp)))
strings.push(c_str_to_rust(task, dp->d_name));
while ((dp = readdir(dirp))) {
rust_vec *str = make_istr(task->kernel, dp->d_name,
strlen(dp->d_name),
"list_files_str");
strings.push(str);
}
closedir(dirp);
}
#endif
rust_box *box =
(rust_box *)task->malloc(sizeof(rust_box) + sizeof(rust_vec*),
"rust_box(list_files_vec)");
rust_vec* vec =
(rust_vec*)task->kernel->malloc(vec_size<rust_str*>(strings.size()),
"list_files_vec");
box->ref_count = 1;
rust_vec** box_content = (rust_vec**)&box->data[0];
*box_content = vec;
size_t alloc_sz = sizeof(rust_str*) * strings.size();
rust_vec *vec = (rust_vec *)
task->kernel->malloc(vec_size<rust_vec*>(strings.size()),
"list_files_vec");
size_t alloc_sz = sizeof(rust_vec*) * strings.size();
vec->fill = vec->alloc = alloc_sz;
memcpy(&vec->data[0], strings.data(), alloc_sz);
return box;
return vec;
}
#if defined(__WIN32__)

View file

@ -14,6 +14,17 @@ fn test_connect() {
#[test]
fn test_list_dir_no_invalid_memory_access() { fs::list_dir(~"."); }
#[test]
fn list_dir() {
let dirs = fs::list_dir(~".");
// Just assuming that we've got some contents in the current directory
assert std::vec::len(dirs) > 0u;
for dir in dirs {
log dir;
}
}
#[test]
fn file_is_dir() {
assert fs::file_is_dir(~".");