| ... | ... | @@ -211,8 +211,8 @@ pub struct InStream { |
| 211 | 211 | pub error InvalidChar; |
| 212 | 212 | pub error Overflow; |
| 213 | 213 | |
| 214 | | pub fn parse_u64(buf: []u8, radix: u8) -> %u64 { |
| 215 | | var x : u64 = 0; |
| 214 | pub fn parse_unsigned(T: type)(buf: []u8, radix: u8) -> %T { |
| 215 | var x: T = 0; |
| 216 | 216 | |
| 217 | 217 | for (buf) |c| { |
| 218 | 218 | const digit = char_to_digit(c); |
| ... | ... | @@ -222,12 +222,12 @@ pub fn parse_u64(buf: []u8, radix: u8) -> %u64 { |
| 222 | 222 | } |
| 223 | 223 | |
| 224 | 224 | // x *= radix |
| 225 | | if (@mul_with_overflow(u64, x, radix, &x)) { |
| 225 | if (@mul_with_overflow(T, x, radix, &x)) { |
| 226 | 226 | return error.Overflow; |
| 227 | 227 | } |
| 228 | 228 | |
| 229 | 229 | // x += digit |
| 230 | | if (@add_with_overflow(u64, x, digit, &x)) { |
| 230 | if (@add_with_overflow(T, x, digit, &x)) { |
| 231 | 231 | return error.Overflow; |
| 232 | 232 | } |
| 233 | 233 | } |
| ... | ... | @@ -404,7 +404,7 @@ pub fn buf_print_f64(out_buf: []u8, x: f64, decimals: isize) -> isize { |
| 404 | 404 | |
| 405 | 405 | #attribute("test") |
| 406 | 406 | fn parse_u64_digit_too_big() { |
| 407 | | parse_u64("123a", 10) %% |err| { |
| 407 | parse_unsigned(u64)("123a", 10) %% |err| { |
| 408 | 408 | if (err == error.InvalidChar) return; |
| 409 | 409 | unreachable{}; |
| 410 | 410 | }; |