From 7080ac15fb13c472985da692ca92c4a48b1f5575 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Sun, 30 Oct 2011 07:29:15 -0700 Subject: [PATCH] Fix int::parse_buf for negative numbers (#1102) --- src/lib/int.rs | 6 ++++-- src/test/stdtest/int.rs | 17 ++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/lib/int.rs b/src/lib/int.rs index e0c0a97f0ba0..41d166fe3fc1 100644 --- a/src/lib/int.rs +++ b/src/lib/int.rs @@ -103,16 +103,18 @@ fn parse_buf(buf: [u8], radix: uint) -> int { fail; } let i = vec::len::(buf) - 1u; + let start = 0u; let power = 1; + if buf[0] == ('-' as u8) { power = -1; - i -= 1u; + start = 1u; } let n = 0; while true { n += (buf[i] - ('0' as u8) as int) * power; power *= radix as int; - if i == 0u { ret n; } + if i <= start { ret n; } i -= 1u; } fail; diff --git a/src/test/stdtest/int.rs b/src/test/stdtest/int.rs index 4a87908e5a64..282e16daf08a 100644 --- a/src/test/stdtest/int.rs +++ b/src/test/stdtest/int.rs @@ -3,6 +3,21 @@ use std; import std::int; import std::str::eq; +#[test] +fn test_from_str() { + assert(int::from_str("0") == 0); + assert(int::from_str("3") == 3); + assert(int::from_str("10") == 10); + assert(int::from_str("123456789") == 123456789); + assert(int::from_str("00100") == 100); + + assert(int::from_str("-1") == -1); + assert(int::from_str("-3") == -3); + assert(int::from_str("-10") == -10); + assert(int::from_str("-123456789") == -123456789); + assert(int::from_str("-00100") == -100); +} + #[test] fn test_to_str() { assert (eq(int::to_str(0, 10u), "0")); @@ -29,4 +44,4 @@ fn test_overflows() { assert (int::max_value() > 0); assert (int::min_value() <= 0); assert (int::min_value() + int::max_value() + 1 == 0); -} \ No newline at end of file +}