diff options
| author | Josh Matthews <josh@joshmatthews.net> | 2011-09-21 03:00:32 -0400 |
|---|---|---|
| committer | Marijn Haverbeke <marijnh@gmail.com> | 2011-09-21 09:36:12 +0200 |
| commit | ce0f054f9d56df4e60291fc2e1b89ce979cf374f (patch) | |
| tree | c468615e0a4e1ef007a5330fd0b37fb6669de8b9 /src/lib | |
| parent | e6a84f252ab7a016dd923adbf31e8c86deab1d72 (diff) | |
| download | rust-ce0f054f9d56df4e60291fc2e1b89ce979cf374f.tar.gz rust-ce0f054f9d56df4e60291fc2e1b89ce979cf374f.zip | |
Implement pattern ranges for all numeric types.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/int.rs | 23 |
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 { |
