aboutsummaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-06-23 21:03:09 -0700
committerGraydon Hoare <[email protected]>2010-06-23 21:03:09 -0700
commitd6b7c96c3eb29b9244ece0c046d3f372ff432d04 (patch)
treeb425187e232966063ffc2f0d14c04a55d8f004ef /src/lib
parentInitial git commit. (diff)
downloadrust-d6b7c96c3eb29b9244ece0c046d3f372ff432d04.tar.xz
rust-d6b7c96c3eb29b9244ece0c046d3f372ff432d04.zip
Populate tree.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/_int.rs20
-rw-r--r--src/lib/_io.rs36
-rw-r--r--src/lib/_str.rs23
-rw-r--r--src/lib/_u8.rs20
-rw-r--r--src/lib/_vec.rs30
-rw-r--r--src/lib/linux_os.rs19
-rw-r--r--src/lib/macos_os.rs19
-rw-r--r--src/lib/std.rc35
-rw-r--r--src/lib/sys.rs7
-rw-r--r--src/lib/win32_os.rs9
10 files changed, 218 insertions, 0 deletions
diff --git a/src/lib/_int.rs b/src/lib/_int.rs
new file mode 100644
index 00000000..1bb6cb45
--- /dev/null
+++ b/src/lib/_int.rs
@@ -0,0 +1,20 @@
+fn add(int x, int y) -> int { ret x + y; }
+fn sub(int x, int y) -> int { ret x - y; }
+fn mul(int x, int y) -> int { ret x * y; }
+fn div(int x, int y) -> int { ret x / y; }
+fn rem(int x, int y) -> int { ret x % y; }
+
+fn lt(int x, int y) -> bool { ret x < y; }
+fn le(int x, int y) -> bool { ret x <= y; }
+fn eq(int x, int y) -> bool { ret x == y; }
+fn ne(int x, int y) -> bool { ret x != y; }
+fn ge(int x, int y) -> bool { ret x >= y; }
+fn gt(int x, int y) -> bool { ret x > y; }
+
+iter range(mutable int lo, int hi) -> int {
+ while (lo < hi) {
+ put lo;
+ lo += 1;
+ }
+}
+
diff --git a/src/lib/_io.rs b/src/lib/_io.rs
new file mode 100644
index 00000000..1f01c3b3
--- /dev/null
+++ b/src/lib/_io.rs
@@ -0,0 +1,36 @@
+type buf_reader = obj {
+ fn read(vec[u8] buf) -> uint;
+};
+
+type buf_writer = obj {
+ fn write(vec[u8] buf) -> uint;
+};
+
+fn mk_buf_reader(str s) -> buf_reader {
+
+ obj fd_reader(int fd) {
+ fn read(vec[u8] v) -> uint {
+ auto len = _vec.len[u8](v);
+ auto buf = _vec.buf[u8](v);
+ auto count = os.libc.read(fd, buf, len);
+ if (count < 0) {
+ log "error filling buffer";
+ log sys.rustrt.last_os_error();
+ fail;
+ } else {
+ ret uint(count);
+ }
+ }
+ drop {
+ os.libc.close(fd);
+ }
+ }
+
+ auto fd = os.libc.open(_str.buf(s), 0);
+ if (fd < 0) {
+ log "error opening file";
+ log sys.rustrt.last_os_error();
+ fail;
+ }
+ ret fd_reader(fd);
+}
diff --git a/src/lib/_str.rs b/src/lib/_str.rs
new file mode 100644
index 00000000..ac27f294
--- /dev/null
+++ b/src/lib/_str.rs
@@ -0,0 +1,23 @@
+import rustrt.sbuf;
+
+native "rust" mod rustrt {
+ type sbuf;
+ fn str_buf(str s) -> sbuf;
+ fn str_len(str s) -> uint;
+ fn str_alloc(int n_bytes) -> str;
+}
+
+fn is_utf8(vec[u8] v) -> bool {
+}
+
+fn alloc(int n_bytes) -> str {
+ ret rustrt.str_alloc(n_bytes);
+}
+
+fn len(str s) -> uint {
+ ret rustrt.str_len(s);
+}
+
+fn buf(str s) -> sbuf {
+ ret rustrt.str_buf(s);
+}
diff --git a/src/lib/_u8.rs b/src/lib/_u8.rs
new file mode 100644
index 00000000..e1f671e7
--- /dev/null
+++ b/src/lib/_u8.rs
@@ -0,0 +1,20 @@
+fn add(u8 x, u8 y) -> u8 { ret x + y; }
+fn sub(u8 x, u8 y) -> u8 { ret x - y; }
+fn mul(u8 x, u8 y) -> u8 { ret x * y; }
+fn div(u8 x, u8 y) -> u8 { ret x / y; }
+fn rem(u8 x, u8 y) -> u8 { ret x % y; }
+
+fn lt(u8 x, u8 y) -> bool { ret x < y; }
+fn le(u8 x, u8 y) -> bool { ret x <= y; }
+fn eq(u8 x, u8 y) -> bool { ret x == y; }
+fn ne(u8 x, u8 y) -> bool { ret x != y; }
+fn ge(u8 x, u8 y) -> bool { ret x >= y; }
+fn gt(u8 x, u8 y) -> bool { ret x > y; }
+
+iter range(mutable u8 lo, u8 hi) -> u8 {
+ while (lo < hi) {
+ put lo;
+ lo += u8(1);
+ }
+}
+
diff --git a/src/lib/_vec.rs b/src/lib/_vec.rs
new file mode 100644
index 00000000..c938e6fb
--- /dev/null
+++ b/src/lib/_vec.rs
@@ -0,0 +1,30 @@
+import vbuf = rustrt.vbuf;
+
+native "rust" mod rustrt {
+ type vbuf;
+ fn vec_buf[T](vec[T] v) -> vbuf;
+ fn vec_len[T](vec[T] v) -> uint;
+ fn vec_alloc[T](int n_elts) -> vec[T];
+}
+
+fn alloc[T](int n_elts) -> vec[T] {
+ ret rustrt.vec_alloc[T](n_elts);
+}
+
+fn init[T](&T t, int n_elts) -> vec[T] {
+ let vec[T] v = alloc[T](n_elts);
+ let int i = n_elts;
+ while (i > 0) {
+ i -= 1;
+ v += vec(t);
+ }
+ ret v;
+}
+
+fn len[T](vec[T] v) -> uint {
+ ret rustrt.vec_len[T](v);
+}
+
+fn buf[T](vec[T] v) -> vbuf {
+ ret rustrt.vec_buf[T](v);
+}
diff --git a/src/lib/linux_os.rs b/src/lib/linux_os.rs
new file mode 100644
index 00000000..a775a97a
--- /dev/null
+++ b/src/lib/linux_os.rs
@@ -0,0 +1,19 @@
+import _str.sbuf;
+import _vec.vbuf;
+
+native mod libc = "libc.so.6" {
+
+ fn open(sbuf s, int flags) -> int;
+ fn read(int fd, vbuf buf, uint count) -> int;
+ fn write(int fd, vbuf buf, uint count) -> int;
+ fn close(int fd) -> int;
+
+ type dir;
+ // readdir is a mess; handle via wrapper function in rustrt.
+ fn opendir(sbuf d) -> dir;
+ fn closedir(dir d) -> int;
+
+ fn getenv(sbuf n) -> sbuf;
+ fn setenv(sbuf n, sbuf v, int overwrite) -> int;
+ fn unsetenv(sbuf n) -> int;
+}
diff --git a/src/lib/macos_os.rs b/src/lib/macos_os.rs
new file mode 100644
index 00000000..8b30c8bc
--- /dev/null
+++ b/src/lib/macos_os.rs
@@ -0,0 +1,19 @@
+import _str.sbuf;
+import _vec.vbuf;
+
+native mod libc = "libc.dylib" {
+
+ fn open(sbuf s, int flags) -> int;
+ fn read(int fd, vbuf buf, uint count) -> int;
+ fn write(int fd, vbuf buf, uint count) -> int;
+ fn close(int fd) -> int;
+
+ type dir;
+ // readdir is a mess; handle via wrapper function in rustrt.
+ fn opendir(sbuf d) -> dir;
+ fn closedir(dir d) -> int;
+
+ fn getenv(sbuf n) -> sbuf;
+ fn setenv(sbuf n, sbuf v, int overwrite) -> int;
+ fn unsetenv(sbuf n) -> int;
+}
diff --git a/src/lib/std.rc b/src/lib/std.rc
new file mode 100644
index 00000000..3ddfc04c
--- /dev/null
+++ b/src/lib/std.rc
@@ -0,0 +1,35 @@
+meta (name = "std",
+ desc = "Rust standard library",
+ uuid = "122bed0b-c19b-4b82-b0b7-7ae8aead7297",
+ url = "http://rust-lang.org/src/std",
+ ver = "0.0.1");
+
+// Built-in types support modules.
+
+mod _int;
+mod _u8;
+mod _vec;
+mod _str;
+
+// General IO and system-services modules.
+
+mod _io;
+mod sys;
+
+// Authorize various rule-bendings.
+
+auth _io = unsafe;
+auth _str = unsafe;
+auth _vec = unsafe;
+
+// Target-OS module.
+
+alt (target_os) {
+ case ("win32") {
+ mod os = "win32_os.rs";
+ } case ("macos") {
+ mod os = "macos_os.rs";
+ } else {
+ mod os = "linux_os.rs";
+ }
+}
diff --git a/src/lib/sys.rs b/src/lib/sys.rs
new file mode 100644
index 00000000..84da28f7
--- /dev/null
+++ b/src/lib/sys.rs
@@ -0,0 +1,7 @@
+native "rust" mod rustrt {
+ fn last_os_error() -> str;
+ fn size_of[T]() -> uint;
+ fn align_of[T]() -> uint;
+ fn refcount[T](@T t) -> uint;
+}
+
diff --git a/src/lib/win32_os.rs b/src/lib/win32_os.rs
new file mode 100644
index 00000000..f770a5de
--- /dev/null
+++ b/src/lib/win32_os.rs
@@ -0,0 +1,9 @@
+import _str.sbuf;
+import _vec.vbuf;
+
+native mod libc = "msvcrt.dll" {
+ fn open(sbuf s, int flags) -> int = "_open";
+ fn read(int fd, vbuf buf, uint count) -> int = "_read";
+ fn write(int fd, vbuf buf, uint count) -> int = "_write";
+ fn close(int fd) -> int = "_close";
+}