stdlib: added getcwd and a convenience function to make relative paths absolute. This will be helpful for #441.
This commit is contained in:
parent
175fd8ee73
commit
a40116b398
@ -1,4 +1,5 @@
|
|||||||
|
|
||||||
|
import os::getcwd;
|
||||||
|
|
||||||
native "rust" mod rustrt {
|
native "rust" mod rustrt {
|
||||||
fn rust_file_is_dir(str path) -> int;
|
fn rust_file_is_dir(str path) -> int;
|
||||||
@ -56,6 +57,23 @@ fn list_dir(path p) -> vec[str] {
|
|||||||
}
|
}
|
||||||
ret full_paths;
|
ret full_paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FIXME: Windows absolute paths can start with \ for C:\ or
|
||||||
|
// whatever... However, we're under MinGW32 so we have the same rules and
|
||||||
|
// posix has.
|
||||||
|
fn path_is_absolute(path p) -> bool {
|
||||||
|
ret p.(0) == '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_absolute(path p) -> path {
|
||||||
|
if(path_is_absolute(p)) {
|
||||||
|
ret p;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ret connect(getcwd(), p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Local Variables:
|
// Local Variables:
|
||||||
// mode: rust;
|
// mode: rust;
|
||||||
// fill-column: 78;
|
// fill-column: 78;
|
||||||
|
@ -72,6 +72,14 @@ fn waitpid(int pid) -> int {
|
|||||||
assert (os::libc::waitpid(pid, vec::buf(status), 0) != -1);
|
assert (os::libc::waitpid(pid, vec::buf(status), 0) != -1);
|
||||||
ret status.(0);
|
ret status.(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
native "rust" mod rustrt {
|
||||||
|
fn rust_getcwd() -> str;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getcwd() -> str { ret rustrt::rust_getcwd(); }
|
||||||
|
|
||||||
|
|
||||||
// Local Variables:
|
// Local Variables:
|
||||||
// mode: rust;
|
// mode: rust;
|
||||||
// fill-column: 78;
|
// fill-column: 78;
|
||||||
|
@ -69,6 +69,14 @@ fn waitpid(int pid) -> int {
|
|||||||
assert (os::libc::waitpid(pid, vec::buf(status), 0) != -1);
|
assert (os::libc::waitpid(pid, vec::buf(status), 0) != -1);
|
||||||
ret status.(0);
|
ret status.(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
native "rust" mod rustrt {
|
||||||
|
fn rust_getcwd() -> str;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getcwd() -> str { ret rustrt::rust_getcwd(); }
|
||||||
|
|
||||||
|
|
||||||
// Local Variables:
|
// Local Variables:
|
||||||
// mode: rust;
|
// mode: rust;
|
||||||
// fill-column: 78;
|
// fill-column: 78;
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
|
|
||||||
|
|
||||||
native "rust" mod rustrt {
|
native "rust" mod rustrt {
|
||||||
fn rust_list_files(str path) -> vec[str];
|
fn rust_list_files(str path) -> vec[str];
|
||||||
fn rust_dirent_filename(os::libc::dirent ent) -> str;
|
fn rust_dirent_filename(os::libc::dirent ent) -> str;
|
||||||
@ -36,6 +35,7 @@ fn list_dir(str path) -> vec[str] {
|
|||||||
const char path_sep = '/';
|
const char path_sep = '/';
|
||||||
|
|
||||||
const char alt_path_sep = '/';
|
const char alt_path_sep = '/';
|
||||||
|
|
||||||
// Local Variables:
|
// Local Variables:
|
||||||
// mode: rust;
|
// mode: rust;
|
||||||
// fill-column: 78;
|
// fill-column: 78;
|
||||||
|
@ -7,7 +7,6 @@ native "rust" mod rustrt {
|
|||||||
|
|
||||||
fn list_dir(str path) -> vec[str] { ret rustrt::rust_list_files(path + "*"); }
|
fn list_dir(str path) -> vec[str] { ret rustrt::rust_list_files(path + "*"); }
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: win32 path handling actually accepts '/' or '\' and has subtly
|
/* FIXME: win32 path handling actually accepts '/' or '\' and has subtly
|
||||||
* different semantics for each. Since we build on mingw, we are usually
|
* different semantics for each. Since we build on mingw, we are usually
|
||||||
* dealing with /-separated paths. But the whole interface to splitting and
|
* dealing with /-separated paths. But the whole interface to splitting and
|
||||||
|
@ -59,9 +59,13 @@ fn fd_FILE(int fd) -> libc::FILE { ret libc::_fdopen(fd, str::buf("r")); }
|
|||||||
|
|
||||||
native "rust" mod rustrt {
|
native "rust" mod rustrt {
|
||||||
fn rust_process_wait(int handle) -> int;
|
fn rust_process_wait(int handle) -> int;
|
||||||
|
fn rust_getcwd() -> str;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn waitpid(int pid) -> int { ret rustrt::rust_process_wait(pid); }
|
fn waitpid(int pid) -> int { ret rustrt::rust_process_wait(pid); }
|
||||||
|
|
||||||
|
fn getcwd() -> str { ret rustrt::rust_getcwd(); }
|
||||||
|
|
||||||
// Local Variables:
|
// Local Variables:
|
||||||
// mode: rust;
|
// mode: rust;
|
||||||
// fill-column: 78;
|
// fill-column: 78;
|
||||||
|
@ -55,6 +55,36 @@ last_os_error(rust_task *task) {
|
|||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" CDECL rust_str *
|
||||||
|
rust_getcwd(rust_task *task) {
|
||||||
|
rust_dom *dom = task->dom;
|
||||||
|
LOG(task, task, "rust_getcwd()");
|
||||||
|
|
||||||
|
char cbuf[BUF_BYTES];
|
||||||
|
|
||||||
|
#if defined(__WIN32__)
|
||||||
|
if (!_getcwd(cbuf, sizeof(cbuf))) {
|
||||||
|
#else
|
||||||
|
if (!getcwd(cbuf, sizeof(cbuf))) {
|
||||||
|
#endif
|
||||||
|
task->fail(1);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t fill = strlen(cbuf) + 1;
|
||||||
|
size_t alloc = next_power_of_two(sizeof(rust_str) + fill);
|
||||||
|
void *mem = dom->malloc(alloc, memory_region::LOCAL);
|
||||||
|
if (!mem) {
|
||||||
|
task->fail(1);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rust_str *st;
|
||||||
|
st = new (mem) rust_str(dom, alloc, fill, (const uint8_t *)cbuf);
|
||||||
|
|
||||||
|
return st;
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" CDECL
|
extern "C" CDECL
|
||||||
void squareroot(rust_task *task, double *input, double *output) {
|
void squareroot(rust_task *task, double *input, double *output) {
|
||||||
*output = sqrt(*input);
|
*output = sqrt(*input);
|
||||||
|
Loading…
Reference in New Issue
Block a user