blob: 680ec4830060d72c3e919da766c7b3231ed9ff8a [file] [log] [blame]
//! Tempoary formatting functions until format! is fixed
use alloc::string::String;
pub fn u32_as_decimal(value: u32) -> String {
let mut result = String::new();
write_u32_as_any_base(&mut result, value, 1_000_000_000, 10);
result
}
pub fn i32_as_decimal(value: i32) -> String {
let mut result = String::new();
let mut value = value;
if value < 0 {
result.push_str("-");
value = -value;
}
write_u32_as_any_base(&mut result, value as u32, 1_000_000_000, 10);
result
}
pub fn u32_as_hex(value: u32) -> String {
let mut result = String::new();
result.push_str("0x");
write_u32_as_any_base(&mut result, value, 0x1000_0000, 0x10);
result
}
fn write_u32_as_any_base(result: &mut String, value: u32, start: u32, base: u32) {
let mut scanning = start;
let mut remaining = value;
while scanning > 0 {
let digit = remaining / scanning;
result.push(render_digit(digit as u8));
remaining = remaining % scanning;
scanning = scanning / base;
}
}
fn render_digit(digit: u8) -> char {
if digit < 10 {
('0' as u8 + digit) as char
} else {
('a' as u8 + digit - 10) as char
}
}
pub fn convert_le(number: u16) -> [u8; 2] {
let mut array: [u8; 2] = [0; 2];
array[0] = number as u8;
array[1] = (number >> 8) as u8;
array
}
#[cfg(test)]
mod test {
use fmt::*;
#[test]
pub fn digits_are_correctly_rendered_in_decimal() {
assert_eq!(u32_as_decimal(123), String::from("0000000123"));
assert_eq!(u32_as_decimal(2000000123), String::from("2000000123"));
}
#[test]
pub fn negative_numbers_are_rendered() {
assert_eq!(i32_as_decimal(-123), String::from("-0000000123"));
}
#[test]
pub fn digits_are_correctly_rendered_in_hex() {
assert_eq!(u32_as_hex(0x1000_0000), String::from("0x10000000"));
assert_eq!(u32_as_hex(0x1000_3000), String::from("0x10003000"));
assert_eq!(u32_as_hex(0x0000_0000), String::from("0x00000000"));
}
#[test]
pub fn number_are_rendered_correctly() {
assert_eq!(convert_le(0x00FF), [255, 0]);
assert_eq!(convert_le(0x0100), [0, 1]);
assert_eq!(convert_le(0x01FF), [255, 1]);
}
}