fs.rs 1.7 KB
Newer Older
1 2 3 4 5
native "rust" mod rustrt {
  fn rust_file_is_dir(str path) -> int;
}

fn path_sep() -> str {
6
    ret str::from_char(os_fs::path_sep);
7 8 9 10 11
}

type path = str;

fn dirname(path p) -> path {
12
    let int i = str::rindex(p, os_fs::path_sep as u8);
13
    if (i == -1) {
14
        i = str::rindex(p, os_fs::alt_path_sep as u8);
15 16 17
        if (i == -1) {
            ret p;
        }
18
    }
19
    ret str::substr(p, 0u, i as uint);
20 21
}

22 23 24 25 26 27 28 29 30 31 32 33 34 35
fn basename(path p) -> path {
    let int i = str::rindex(p, os_fs::path_sep as u8);
    if (i == -1) {
        i = str::rindex(p, os_fs::alt_path_sep as u8);
        if (i == -1) {
            ret p;
        }
    }
    auto len = str::byte_len(p);
    if ((i+1) as uint >= len) { ret p; }

    ret str::slice(p, i+1 as uint, len);
}

36
// FIXME: Need some typestate to avoid bounds check when len(pre) == 0
37
fn connect(path pre, path post) -> path {
38
    auto len = str::byte_len(pre);
39 40 41 42 43
    ret if (pre.(len - 1u) == (os_fs::path_sep as u8)) { // Trailing '/'?
        pre + post
    } else {
        pre + path_sep() + post
    };
44 45
}

G
Graydon Hoare 已提交
46
fn file_is_dir(path p) -> bool {
47
  ret rustrt::rust_file_is_dir(p) != 0;
48 49
}

G
Graydon Hoare 已提交
50
fn list_dir(path p) -> vec[str] {
51
  auto pl = str::byte_len(p);
52
  if (pl == 0u || p.(pl - 1u) as char != os_fs::path_sep) {
53 54
    p += path_sep();
  }
55
  let vec[str] full_paths = [];
56
  for (str filename in os_fs::list_dir(p)) {
57 58
    if (!str::eq(filename, ".")) {if (!str::eq(filename, "..")) {
      vec::push[str](full_paths, p + filename);
59 60 61 62
    }}
  }
  ret full_paths;
}
63 64 65 66 67 68 69 70


// Local Variables:
// mode: rust;
// fill-column: 78;
// indent-tabs-mode: nil
// c-basic-offset: 4
// buffer-file-coding-system: utf-8-unix
71
// compile-command: "make -k -C $RBUILD 2>&1 | sed -e 's/\\/x\\//x:\\//g'";
72
// End: