lib/std/fmt.rad 3.8 KiB raw
1
//! Formatting utilities for converting values to strings.
2
use super::mem;
3
4
/// Maximum string length for a formatted u32 (eg. "4294967295").
5
pub const U32_STR_LEN: u32 = 10;
6
/// Maximum string length for a formatted i32 (eg. "-2147483648").
7
pub const I32_STR_LEN: u32 = U32_STR_LEN + 1;
8
/// Maximum string length for a formatted u64 (eg. "18446744073709551615").
9
pub const U64_STR_LEN: u32 = 20;
10
/// Maximum string length for a formatted i64 (eg. "-9223372036854775808").
11
pub const I64_STR_LEN: u32 = 20;
12
/// Maximum string length for a formatted bool (eg. "false").
13
pub const BOOL_STR_LEN: u32 = 5;
14
15
/// Format a u32 by writing it to the provided buffer.
16
pub fn formatU32(val: u32, buffer: *mut [u8]) -> *[u8] {
17
    assert buffer.len >= U32_STR_LEN;
18
19
    let mut x: u32 = val;
20
    let mut i: u32 = buffer.len;
21
22
    // Handle the zero case separately to ensure a single '0' is written.
23
    if x == 0 {
24
        i -= 1;
25
        buffer[i] = '0';
26
    } else {
27
        // Write digits backwards from the end of the buffer.
28
        while x != 0 {
29
            i -= 1;
30
            buffer[i] = ('0' + (x % 10) as u8);
31
            x /= 10;
32
        }
33
    }
34
    // Return the slice from the start of the written number to
35
    // the end of the buffer.
36
    return &buffer[i..];
37
}
38
39
/// Format a i32 by writing it to the provided buffer.
40
pub fn formatI32(val: i32, buffer: *mut [u8]) -> *[u8] {
41
    assert buffer.len >= I32_STR_LEN;
42
43
    let neg: bool = val < 0;
44
    let mut x: u32 = -val as u32 if neg else val as u32;
45
    let mut i: u32 = buffer.len;
46
    // Handle the zero case separately to ensure a single '0' is written.
47
    if x == 0 {
48
        i -= 1;
49
        buffer[i] = '0';
50
    } else {
51
        // Write digits backwards from the end of the buffer.
52
        while x != 0 {
53
            i -= 1;
54
            buffer[i] = '0' + (x % 10) as u8;
55
            x /= 10;
56
        }
57
        // Add the negative sign if needed.
58
        if neg {
59
            i -= 1;
60
            buffer[i] = '-';
61
        }
62
    }
63
    return &buffer[i..];
64
}
65
66
/// Format a u64 by writing it to the provided buffer.
67
pub fn formatU64(val: u64, buffer: *mut [u8]) -> *[u8] {
68
    assert buffer.len >= U64_STR_LEN;
69
70
    let mut x: u64 = val;
71
    let mut i: u32 = buffer.len;
72
73
    if x == 0 {
74
        i -= 1;
75
        buffer[i] = '0';
76
    } else {
77
        while x != 0 {
78
            i -= 1;
79
            buffer[i] = ('0' + (x % 10) as u8);
80
            x /= 10;
81
        }
82
    }
83
    return &buffer[i..];
84
}
85
86
/// Format a i64 by writing it to the provided buffer.
87
pub fn formatI64(val: i64, buffer: *mut [u8]) -> *[u8] {
88
    assert buffer.len >= I64_STR_LEN;
89
90
    let neg: bool = val < 0;
91
    let mut x: u64 = -val as u64 if neg else val as u64;
92
    let mut i: u32 = buffer.len;
93
    if x == 0 {
94
        i -= 1;
95
        buffer[i] = '0';
96
    } else {
97
        while x != 0 {
98
            i -= 1;
99
            buffer[i] = '0' + (x % 10) as u8;
100
            x /= 10;
101
        }
102
        if neg {
103
            i -= 1;
104
            buffer[i] = '-';
105
        }
106
    }
107
    return &buffer[i..];
108
}
109
110
/// Format a i8 by writing it to the provided buffer.
111
pub fn formatI8(val: i8, buffer: *mut [u8]) -> *[u8] {
112
    return formatI32(val as i32, buffer);
113
}
114
115
/// Format a i16 by writing it to the provided buffer.
116
pub fn formatI16(val: i16, buffer: *mut [u8]) -> *[u8] {
117
    return formatI32(val as i32, buffer);
118
}
119
120
/// Format a u8 by writing it to the provided buffer.
121
pub fn formatU8(val: u8, buffer: *mut [u8]) -> *[u8] {
122
    return formatU32(val as u32, buffer);
123
}
124
125
/// Format a u16 by writing it to the provided buffer.
126
pub fn formatU16(val: u16, buffer: *mut [u8]) -> *[u8] {
127
    return formatU32(val as u32, buffer);
128
}
129
130
/// Format a bool by writing it to the provided buffer.
131
pub fn formatBool(val: bool, buffer: *mut [u8]) -> *[u8] {
132
    if val {
133
        try! mem::copy(buffer, "true");
134
        return &buffer[..4];
135
    } else {
136
        try! mem::copy(buffer, "false");
137
        return &buffer[..5];
138
    }
139
}