diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/_int.rs | 20 | ||||
| -rw-r--r-- | src/lib/_io.rs | 36 | ||||
| -rw-r--r-- | src/lib/_str.rs | 23 | ||||
| -rw-r--r-- | src/lib/_u8.rs | 20 | ||||
| -rw-r--r-- | src/lib/_vec.rs | 30 | ||||
| -rw-r--r-- | src/lib/linux_os.rs | 19 | ||||
| -rw-r--r-- | src/lib/macos_os.rs | 19 | ||||
| -rw-r--r-- | src/lib/std.rc | 35 | ||||
| -rw-r--r-- | src/lib/sys.rs | 7 | ||||
| -rw-r--r-- | src/lib/win32_os.rs | 9 |
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"; +} |