diff options
| author | Marijn Haverbeke <[email protected]> | 2011-03-10 15:56:51 +0100 |
|---|---|---|
| committer | Graydon Hoare <[email protected]> | 2011-03-14 14:57:13 -0700 |
| commit | c731d625fe5f7626b41c7241893350b8b27b1dbe (patch) | |
| tree | 9b5c8f5071d44d601914fa9ea1e44e07fe6f23db /src/rt | |
| parent | Split trans' collection in two passes. This allows us to handle tags (diff) | |
| download | rust-c731d625fe5f7626b41c7241893350b8b27b1dbe.tar.xz rust-c731d625fe5f7626b41c7241893350b8b27b1dbe.zip | |
Add basic file-system functionality
std.fs.list_dir will list the files in a directory, std.fs.file_is_dir
will, given a pathname, determine whether it is a directory or not.
Diffstat (limited to 'src/rt')
| -rw-r--r-- | src/rt/rust_builtin.cpp | 64 | ||||
| -rw-r--r-- | src/rt/rust_util.h | 5 | ||||
| -rw-r--r-- | src/rt/util/array_list.h | 6 |
3 files changed, 57 insertions, 18 deletions
diff --git a/src/rt/rust_builtin.cpp b/src/rt/rust_builtin.cpp index a859c7b9..250280f2 100644 --- a/src/rt/rust_builtin.cpp +++ b/src/rt/rust_builtin.cpp @@ -1,4 +1,7 @@ +#include <dirent.h> +#include <sys/types.h> +#include <sys/stat.h> #include "rust_internal.h" /* Native builtins. */ @@ -150,28 +153,27 @@ vec_print_debug_info(rust_task *task, type_desc *ty, rust_vec *v) } /* Helper for str_alloc and str_from_vec. Returns NULL as failure. */ -static rust_str * -str_alloc_with_data(rust_task *task, - size_t n_bytes, +static rust_vec* +vec_alloc_with_data(rust_task *task, + size_t n_elts, size_t fill, - uint8_t const *d) + size_t elt_size, + void *d) { rust_dom *dom = task->dom; - size_t alloc = next_power_of_two(sizeof(rust_str) + n_bytes); + size_t alloc = next_power_of_two(sizeof(rust_vec) + (n_elts * elt_size)); void *mem = dom->malloc(alloc, memory_region::LOCAL); - if (!mem) - return NULL; - rust_str *st = new (mem) rust_str(dom, alloc, fill, d); - return st; + if (!mem) return NULL; + return new (mem) rust_vec(dom, alloc, fill * elt_size, (uint8_t*)d); } extern "C" CDECL rust_str* str_alloc(rust_task *task, size_t n_bytes) { - rust_str *st = str_alloc_with_data(task, + rust_str *st = vec_alloc_with_data(task, n_bytes + 1, // +1 to fit at least "" - 1, - (uint8_t const *)""); + 1, 1, + (void*)""); if (!st) { task->fail(2); return NULL; @@ -195,10 +197,11 @@ extern "C" CDECL rust_str * str_from_vec(rust_task *task, rust_vec *v) { rust_str *st = - str_alloc_with_data(task, + vec_alloc_with_data(task, v->fill + 1, // +1 to fit at least '\0' v->fill, - v->fill ? (uint8_t const *)v->data : NULL); + 1, + v->fill ? (void*)v->data : NULL); if (!st) { task->fail(2); return NULL; @@ -371,6 +374,39 @@ debug_trap(rust_task *task, rust_str *s) __asm__("int3"); } +rust_str* c_str_to_rust(rust_task *task, char const *str) { + size_t len = strlen(str) + 1; + return vec_alloc_with_data(task, len, len, 1, (void*)str); +} + +#if defined(__WIN32__) +extern "C" CDECL rust_vec* +rust_list_files(rust_task *task, rust_str *path) { + array_list<rust_str*> strings; + WIN32_FIND_DATA FindFileData; + HANDLE hFind = FindFirstFile((char*)path->data, &FindFileData); + if (hFind != INVALID_HANDLE_VALUE) { + do { + strings.push(c_str_to_rust(task, FindFileData.cFileName)); + } while (FindNextFile(hFind, &FindFileData)); + FindClose(hFind); + } + return vec_alloc_with_data(task, strings.size(), strings.size(), + sizeof(rust_str*), strings.data()); +} +#else +extern "C" CDECL rust_str * +rust_dirent_filename(rust_task *task, dirent* ent) { + return c_str_to_rust(task, ent->d_name); +} +#endif + +extern "C" CDECL int +rust_file_is_dir(rust_task *task, rust_str *path) { + struct stat buf; + stat((char*)path->data, &buf); + return S_ISDIR(buf.st_mode); +} // // Local Variables: diff --git a/src/rt/rust_util.h b/src/rt/rust_util.h index 03b7766d..5f13a3c8 100644 --- a/src/rt/rust_util.h +++ b/src/rt/rust_util.h @@ -177,11 +177,8 @@ rust_vec : public rc_base<rust_vec> alloc(alloc), fill(fill) { - if (d || fill) { - I(dom, d); - I(dom, fill); + if (d) memcpy(&data[0], d, fill); - } } ~rust_vec() {} }; diff --git a/src/rt/util/array_list.h b/src/rt/util/array_list.h index d44111e8..9ad4b208 100644 --- a/src/rt/util/array_list.h +++ b/src/rt/util/array_list.h @@ -19,6 +19,7 @@ public: bool replace(T old_value, T new_value); int32_t index_of(T value); bool is_empty(); + T* data(); T & operator[](size_t index); }; @@ -101,4 +102,9 @@ array_list<T>::is_empty() { return _size == 0; } +template<typename T> T* +array_list<T>::data() { + return _data; +} + #endif /* ARRAY_LIST_H */ |