Convert rust_list_files to istrs. Issue #855
This commit is contained in:
parent
82634cd530
commit
f07a328c16
5 changed files with 40 additions and 27 deletions
|
@ -53,8 +53,7 @@ fn list_dir(p: &path) -> [istr] {
|
||||||
let pl = istr::byte_len(p);
|
let pl = istr::byte_len(p);
|
||||||
if pl == 0u || p[pl - 1u] as char != os_fs::path_sep { p += path_sep(); }
|
if pl == 0u || p[pl - 1u] as char != os_fs::path_sep { p += path_sep(); }
|
||||||
let full_paths: [istr] = [];
|
let full_paths: [istr] = [];
|
||||||
for filename: str in os_fs::list_dir(istr::to_estr(p)) {
|
for filename: istr in os_fs::list_dir(p) {
|
||||||
let filename = istr::from_estr(filename);
|
|
||||||
if !istr::eq(filename, ~".") {
|
if !istr::eq(filename, ~".") {
|
||||||
if !istr::eq(filename, ~"..") { full_paths += [p + filename]; }
|
if !istr::eq(filename, ~"..") { full_paths += [p + filename]; }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
|
|
||||||
native "rust" mod rustrt {
|
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 rust_dirent_filename(ent: os::libc::dirent) -> str;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn list_dir(path: str) -> [str] {
|
fn list_dir(path: &istr) -> [istr] {
|
||||||
ret *rustrt::rust_list_files(path);
|
ret rustrt::rust_list_files(path);
|
||||||
// TODO ensure this is always closed
|
|
||||||
|
|
||||||
// FIXME: No idea why, but this appears to corrupt memory on OSX. I
|
// 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
|
// suspect it has to do with the tasking primitives somehow, or perhaps
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
|
|
||||||
|
|
||||||
native "rust" mod rustrt {
|
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 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 {
|
fn path_is_absolute(p: &istr) -> bool {
|
||||||
ret istr::char_at(p, 0u) == '/' ||
|
ret istr::char_at(p, 0u) == '/' ||
|
||||||
|
|
|
@ -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);
|
return vec_alloc_with_data(task, len, len, 1, (void*)str);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" CDECL rust_box*
|
extern "C" CDECL rust_vec*
|
||||||
rust_list_files(rust_task *task, rust_str *path) {
|
rust_list_files(rust_task *task, rust_vec **path) {
|
||||||
array_list<rust_str*> strings;
|
array_list<rust_vec*> strings;
|
||||||
#if defined(__WIN32__)
|
#if defined(__WIN32__)
|
||||||
WIN32_FIND_DATA FindFileData;
|
WIN32_FIND_DATA FindFileData;
|
||||||
HANDLE hFind = FindFirstFile((char*)path->data, &FindFileData);
|
HANDLE hFind = FindFirstFile((char*)(*path)->data, &FindFileData);
|
||||||
if (hFind != INVALID_HANDLE_VALUE) {
|
if (hFind != INVALID_HANDLE_VALUE) {
|
||||||
do {
|
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));
|
} while (FindNextFile(hFind, &FindFileData));
|
||||||
FindClose(hFind);
|
FindClose(hFind);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
DIR *dirp = opendir((char*)path->data);
|
DIR *dirp = opendir((char*)(*path)->data);
|
||||||
if (dirp) {
|
if (dirp) {
|
||||||
struct dirent *dp;
|
struct dirent *dp;
|
||||||
while ((dp = readdir(dirp)))
|
while ((dp = readdir(dirp))) {
|
||||||
strings.push(c_str_to_rust(task, dp->d_name));
|
rust_vec *str = make_istr(task->kernel, dp->d_name,
|
||||||
|
strlen(dp->d_name),
|
||||||
|
"list_files_str");
|
||||||
|
strings.push(str);
|
||||||
|
}
|
||||||
closedir(dirp);
|
closedir(dirp);
|
||||||
}
|
}
|
||||||
#endif
|
#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 *vec = (rust_vec *)
|
||||||
rust_vec** box_content = (rust_vec**)&box->data[0];
|
task->kernel->malloc(vec_size<rust_vec*>(strings.size()),
|
||||||
*box_content = vec;
|
"list_files_vec");
|
||||||
size_t alloc_sz = sizeof(rust_str*) * strings.size();
|
size_t alloc_sz = sizeof(rust_vec*) * strings.size();
|
||||||
vec->fill = vec->alloc = alloc_sz;
|
vec->fill = vec->alloc = alloc_sz;
|
||||||
memcpy(&vec->data[0], strings.data(), alloc_sz);
|
memcpy(&vec->data[0], strings.data(), alloc_sz);
|
||||||
return box;
|
return vec;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__WIN32__)
|
#if defined(__WIN32__)
|
||||||
|
|
|
@ -14,6 +14,17 @@ fn test_connect() {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_list_dir_no_invalid_memory_access() { fs::list_dir(~"."); }
|
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]
|
#[test]
|
||||||
fn file_is_dir() {
|
fn file_is_dir() {
|
||||||
assert fs::file_is_dir(~".");
|
assert fs::file_is_dir(~".");
|
||||||
|
|
Loading…
Reference in a new issue