1 | module strconv |
2 | |
3 | import strings |
4 | |
5 | pub fn format_str_sb(s string, p BF_param, mut sb strings.Builder) { |
6 | if p.len0 <= 0 { |
7 | sb.write_string(s) |
8 | return |
9 | } |
10 | |
11 | dif := p.len0 - utf8_str_visible_length(s) |
12 | |
13 | if dif <= 0 { |
14 | sb.write_string(s) |
15 | return |
16 | } |
17 | |
18 | if p.allign == .right { |
19 | for i1 := 0; i1 < dif; i1++ { |
20 | sb.write_u8(p.pad_ch) |
21 | } |
22 | } |
23 | |
24 | sb.write_string(s) |
25 | |
26 | if p.allign == .left { |
27 | for i1 := 0; i1 < dif; i1++ { |
28 | sb.write_u8(p.pad_ch) |
29 | } |
30 | } |
31 | } |
32 | |
33 | const ( |
34 | max_size_f64_char = 32 // the f64 max representation is -36,028,797,018,963,968e1023, 21 chars, 32 is faster for the memory manger |
35 | // digit pairs in reverse order |
36 | digit_pairs = '00102030405060708090011121314151617181910212223242526272829203132333435363738393041424344454647484940515253545556575859506162636465666768696071727374757677787970818283848586878889809192939495969798999' |
37 | ) |
38 | |
39 | // format_dec_sb format a u64 |
40 | [direct_array_access] |
41 | pub fn format_dec_sb(d u64, p BF_param, mut res strings.Builder) { |
42 | mut n_char := dec_digits(d) |
43 | sign_len := if !p.positive || p.sign_flag { 1 } else { 0 } |
44 | number_len := sign_len + n_char |
45 | dif := p.len0 - number_len |
46 | mut sign_written := false |
47 | |
48 | if p.allign == .right { |
49 | if p.pad_ch == `0` { |
50 | if p.positive { |
51 | if p.sign_flag { |
52 | res.write_u8(`+`) |
53 | sign_written = true |
54 | } |
55 | } else { |
56 | res.write_u8(`-`) |
57 | sign_written = true |
58 | } |
59 | } |
60 | // write the pad chars |
61 | for i1 := 0; i1 < dif; i1++ { |
62 | res.write_u8(p.pad_ch) |
63 | } |
64 | } |
65 | |
66 | if !sign_written { |
67 | // no pad char, write the sign before the number |
68 | if p.positive { |
69 | if p.sign_flag { |
70 | res.write_u8(`+`) |
71 | } |
72 | } else { |
73 | res.write_u8(`-`) |
74 | } |
75 | } |
76 | |
77 | // Legacy version |
78 | // max u64 18446744073709551615 => 20 byte |
79 | mut buf := [32]u8{} |
80 | mut i := 20 |
81 | mut d1 := d |
82 | for i >= (21 - n_char) { |
83 | buf[i] = u8(d1 % 10) + `0` |
84 | |
85 | d1 = d1 / 10 |
86 | i-- |
87 | } |
88 | |
89 | for _ in 0 .. n_char { |
90 | i++ |
91 | res.write_u8(buf[i]) |
92 | } |
93 | i++ |
94 | |
95 | //=========================================== |
96 | |
97 | if p.allign == .left { |
98 | for i1 := 0; i1 < dif; i1++ { |
99 | res.write_u8(p.pad_ch) |
100 | } |
101 | } |
102 | return |
103 | } |