FastLED 3.9.15
Loading...
Searching...
No Matches
charconv.cpp.hpp
Go to the documentation of this file.
1
2// FastLED Character Conversion Functions Implementation
4
5#include "fl/stl/charconv.h"
6#include "fl/stl/string.h"
7#include "fl/stl/stdio.h"
8
9namespace fl {
10namespace detail {
11
12fl::string hex(u64 value, HexIntWidth width, bool is_negative, bool uppercase, bool pad_to_width) {
13 // Determine target width in hex characters based on integer bit width
14 size_t target_width = 0;
15 switch (width) {
16 case HexIntWidth::Width8: target_width = 2; break; // 8 bits = 2 hex chars
17 case HexIntWidth::Width16: target_width = 4; break; // 16 bits = 4 hex chars
18 case HexIntWidth::Width32: target_width = 8; break; // 32 bits = 8 hex chars
19 case HexIntWidth::Width64: target_width = 16; break; // 64 bits = 16 hex chars
20 }
21
23 const char* digits = uppercase ? "0123456789ABCDEF" : "0123456789abcdef";
24
25 // Convert value to hex string (minimal representation)
26 u64 temp_value = value;
27 if (temp_value == 0) {
28 // Special case: zero should be "0" not empty string
29 result = fl::string("0");
30 } else {
31 while (temp_value > 0) {
32 char ch = digits[temp_value % 16];
33 // Convert char to string since fl::string::append treats char as number
34 char temp_ch_str[2] = {ch, '\0'};
35 fl::string digit_str(temp_ch_str);
36 // Use += since + operator is not defined for fl::string
37 fl::string temp = digit_str;
38 temp += result;
39 result = temp;
40 temp_value /= 16;
41 }
42 }
43
44 // Pad with leading zeros to target width (only if padding is requested)
45 if (pad_to_width) {
46 while (result.size() < target_width) {
47 fl::string zero_str("0");
48 zero_str += result;
49 result = zero_str;
50 }
51 }
52
53 // Add negative sign if needed
54 if (is_negative) {
55 fl::string minus_str("-");
56 minus_str += result;
57 result = minus_str;
58 }
59
60 return result;
61}
62
63} // namespace detail
64
65// Public API implementations for integer to string conversion
66// Moved from string_functions namespace in str.cpp for better organization
67
68int itoa(i32 value, char *sp, int radix) {
69 char tmp[16]; // be careful with the length of the buffer
70 char *tp = tmp;
71 int i;
72 u32 v;
73
74 int sign = (radix == 10 && value < 0);
75 if (sign)
76 v = -static_cast<u32>(value);
77 else
78 v = static_cast<u32>(value);
79
80 while (v || tp == tmp) {
81 i = v % radix;
82 v = radix ? v / radix : 0;
83 if (i < 10)
84 *tp++ = i + '0';
85 else
86 *tp++ = i + 'a' - 10;
87 }
88
89 int len = tp - tmp;
90
91 if (sign) {
92 *sp++ = '-';
93 len++;
94 }
95
96 while (tp > tmp)
97 *sp++ = *--tp;
98
99 *sp = '\0'; // Null-terminate the string
100 return len;
101}
102
103int itoa64(i64 value, char *sp, int radix) {
104 char tmp[32]; // Buffer for 64-bit integer (max 65 chars for base 2 + sign)
105 char *tp = tmp;
106 int i;
107 u64 v;
108
109 int sign = (radix == 10 && value < 0);
110 if (sign)
111 v = -static_cast<u64>(value);
112 else
113 v = static_cast<u64>(value);
114
115 while (v || tp == tmp) {
116 i = v % radix;
117 v = radix ? v / radix : 0;
118 if (i < 10)
119 *tp++ = i + '0';
120 else
121 *tp++ = i + 'a' - 10;
122 }
123
124 int len = tp - tmp;
125
126 if (sign) {
127 *sp++ = '-';
128 len++;
129 }
130
131 while (tp > tmp)
132 *sp++ = *--tp;
133
134 *sp = '\0'; // Null-terminate the string
135 return len;
136}
137
138int utoa32(u32 value, char *sp, int radix) {
139 char tmp[16]; // be careful with the length of the buffer
140 char *tp = tmp;
141 int i;
142 u32 v = value;
143
144 while (v || tp == tmp) {
145 i = v % radix;
146 v = radix ? v / radix : 0;
147 if (i < 10)
148 *tp++ = i + '0';
149 else
150 *tp++ = i + 'a' - 10;
151 }
152
153 int len = tp - tmp;
154
155 while (tp > tmp)
156 *sp++ = *--tp;
157
158 *sp = '\0'; // Null-terminate the string
159 return len;
160}
161
162int utoa64(u64 value, char *sp, int radix) {
163 char tmp[32]; // larger buffer for 64-bit values
164 char *tp = tmp;
165 int i;
166 u64 v = value;
167
168 while (v || tp == tmp) {
169 i = v % radix;
170 v = radix ? v / radix : 0;
171 if (i < 10)
172 *tp++ = i + '0';
173 else
174 *tp++ = i + 'a' - 10;
175 }
176
177 int len = tp - tmp;
178
179 while (tp > tmp)
180 *sp++ = *--tp;
181
182 *sp = '\0'; // Null-terminate the string
183 return len;
184}
185
186void ftoa(float value, char *buffer, int precision) {
187 // Forward to printf_detail for now - implementation in str.cpp will be updated
188 // to use this function instead of duplicating the logic
190 fl::size len = result.length();
191 if (len > 63) len = 63; // Leave room for null terminator
192 for (fl::size i = 0; i < len; ++i) {
193 buffer[i] = result[i];
194 }
195 buffer[len] = '\0';
196}
197
198// Parse functions - moved from StringFormatter
199float parseFloat(const char *str, fl::size len) {
200 float result = 0.0f; // The resulting number
201 float sign = 1.0f; // Positive or negative
202 float fraction = 0.0f; // Fractional part
203 float divisor = 1.0f; // Divisor for the fractional part
204 int isFractional = 0; // Whether the current part is fractional
205
206 fl::size pos = 0; // Current position in the string
207
208 // Handle empty input
209 if (len == 0) {
210 return 0.0f;
211 }
212
213 // Skip leading whitespace (manual check instead of isspace)
214 while (pos < len &&
215 (str[pos] == ' ' || str[pos] == '\t' || str[pos] == '\n' ||
216 str[pos] == '\r' || str[pos] == '\f' || str[pos] == '\v')) {
217 pos++;
218 }
219
220 // Handle optional sign
221 if (pos < len && str[pos] == '-') {
222 sign = -1.0f;
223 pos++;
224 } else if (pos < len && str[pos] == '+') {
225 pos++;
226 }
227
228 // Main parsing loop
229 while (pos < len) {
230 if (str[pos] >= '0' && str[pos] <= '9') {
231 if (isFractional) {
232 divisor *= 10.0f;
233 fraction += (str[pos] - '0') / divisor;
234 } else {
235 result = result * 10.0f + (str[pos] - '0');
236 }
237 } else if (str[pos] == '.' && !isFractional) {
238 isFractional = 1;
239 } else {
240 // Stop parsing at invalid characters
241 break;
242 }
243 pos++;
244 }
245
246 // Combine integer and fractional parts
247 result = result + fraction;
248
249 // Apply the sign
250 return sign * result;
251}
252
253int parseInt(const char *str, fl::size len) {
254 int result = 0;
255 int sign = 1;
256 fl::size pos = 0;
257
258 // Handle empty input
259 if (len == 0) {
260 return 0;
261 }
262
263 // Skip leading whitespace
264 while (pos < len &&
265 (str[pos] == ' ' || str[pos] == '\t' || str[pos] == '\n' ||
266 str[pos] == '\r' || str[pos] == '\f' || str[pos] == '\v')) {
267 pos++;
268 }
269
270 // Handle optional sign
271 if (pos < len && str[pos] == '-') {
272 sign = -1;
273 pos++;
274 } else if (pos < len && str[pos] == '+') {
275 pos++;
276 }
277
278 // Parse digits
279 while (pos < len && str[pos] >= '0' && str[pos] <= '9') {
280 result = result * 10 + (str[pos] - '0');
281 pos++;
282 }
283
284 return sign * result;
285}
286
287int parseInt(const char *str) {
288 // Calculate length manually to avoid strlen dependency
289 fl::size len = 0;
290 while (str[len] != '\0') {
291 len++;
292 }
293 return parseInt(str, len);
294}
295
296} // namespace fl
uint8_t pos
Definition Blur.ino:11
HexIntWidth
Integer width classification for hex conversion.
Definition charconv.h:42
Compile-time linker keep-alive hook for a single fl::Bus.
Definition bus_traits.h:48
fl::string format_float(float value, int precision) FL_NOEXCEPT
Definition stdio.h:282
constexpr int type_rank< T >::value
int itoa(i32 value, char *sp, int radix)
Convert signed 32-bit integer to string buffer in given radix.
int utoa64(u64 value, char *sp, int radix)
Convert unsigned 64-bit integer to string buffer in given radix.
int parseInt(const char *str, fl::size len)
Parse an integer from a character buffer.
int utoa32(u32 value, char *sp, int radix)
Convert unsigned 32-bit integer to string buffer in given radix.
constexpr enable_if< is_fixed_point< T >::value, int >::type sign(T x) FL_NOEXCEPT
const hex_t hex
Definition ios.cpp.hpp:6
fl::i64 i64
Definition s16x16x4.h:222
u8 width
Definition blur.h:186
int itoa64(i64 value, char *sp, int radix)
Convert signed 64-bit integer to string buffer in given radix.
expected< T, E > result
Alias for expected (Rust-style naming)
Definition result.h:31
constexpr int numeric_limits< char >::digits
float parseFloat(const char *str, fl::size len)
Parse a floating point number from a character buffer.
fl::u64 u64
Definition s16x16x4.h:221
void ftoa(float value, char *buffer, int precision)
Convert floating point number to string buffer.
Base definition for an LED controller.
Definition crgb.hpp:179