about summary refs log tree commit diff
path: root/src/lib
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2011-09-21 03:00:32 -0400
committerMarijn Haverbeke <marijnh@gmail.com>2011-09-21 09:36:12 +0200
commitce0f054f9d56df4e60291fc2e1b89ce979cf374f (patch)
treec468615e0a4e1ef007a5330fd0b37fb6669de8b9 /src/lib
parente6a84f252ab7a016dd923adbf31e8c86deab1d72 (diff)
downloadrust-ce0f054f9d56df4e60291fc2e1b89ce979cf374f.tar.gz
rust-ce0f054f9d56df4e60291fc2e1b89ce979cf374f.zip
Implement pattern ranges for all numeric types.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/int.rs23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/lib/int.rs b/src/lib/int.rs
index 98d8bb5e157..0a6e69ceadc 100644
--- a/src/lib/int.rs
+++ b/src/lib/int.rs
@@ -41,6 +41,29 @@ iter range(lo: int, hi: int) -> int {
     while lo_ < hi { put lo_; lo_ += 1; }
 }
 
+fn parse_buf(buf: [u8], radix: uint) -> int {
+    if vec::len::<u8>(buf) == 0u {
+        log_err "parse_buf(): buf is empty";
+        fail;
+    }
+    let i = vec::len::<u8>(buf) - 1u;
+    let power = 1;
+    if buf[0] == ('-' as u8) {
+        power = -1;
+        i -= 1u;
+    }
+    let n = 0;
+    while true {
+        n += (buf[i] - ('0' as u8) as int) * power;
+        power *= radix as int;
+        if i == 0u { ret n; }
+        i -= 1u;
+    }
+    fail;
+}
+
+fn from_str(s: str) -> int { parse_buf(str::bytes(s), 10u) }
+
 fn to_str(n: int, radix: uint) -> str {
     assert (0u < radix && radix <= 16u);
     ret if n < 0 {