4#include "platforms/is_platform.h"
28 if (alignment <
sizeof(
void *)) {
29 alignment =
sizeof(
void *);
31 if ((alignment & (alignment - 1)) != 0) {
34 const fl::size_t overhead = alignment - 1 +
sizeof(
void *);
35 if (size >
static_cast<fl::size_t>(-1) - overhead) {
38 void *raw =
::malloc(size + overhead);
43 const fl::uptr aligned = (start + alignment - 1) & ~(fl::uptr(alignment) - 1);
51 ::free(
static_cast<void **
>(ptr)[-1]);
62#if defined(FL_IS_AVR) || defined(FL_IS_ESP8266) || defined(FL_IS_ARM) || \
63 defined(FL_IS_APOLLO3) || defined(FL_IS_CI13XX)
69#elif defined(FL_IS_WIN)
70 return ::_aligned_malloc(size, alignment);
71#elif defined(FL_IS_ESP32) && !ESP_IDF_VERSION_4_OR_HIGHER
75 return ::malloc(size);
77 fl::size_t aligned_size = (size + alignment - 1) & ~(alignment - 1);
78 return ::aligned_alloc(alignment, aligned_size);
83#if defined(FL_IS_AVR) || defined(FL_IS_ESP8266) || defined(FL_IS_ARM) || \
84 defined(FL_IS_APOLLO3) || defined(FL_IS_CI13XX)
86#elif defined(FL_IS_WIN)
96 return c >=
'0' && c < (
'0' + base);
98 if (c >=
'0' && c <=
'9') {
101 if (c >=
'a' && c < (
'a' + base - 10)) {
104 if (c >=
'A' && c < (
'A' + base - 10)) {
112 if (c >=
'0' && c <=
'9') {
115 if (c >=
'a' && c <=
'z') {
118 if (c >=
'A' && c <=
'Z') {
127 *endptr =
const_cast<char*
>(str);
134 bool negative =
false;
137 while (*p ==
' ' || *p ==
'\t' || *p ==
'\n' || *p ==
'\r' || *p ==
'\f' || *p ==
'\v') {
145 }
else if (*p ==
'+') {
152 if (*(p + 1) ==
'x' || *(p + 1) ==
'X') {
162 }
else if (base == 16) {
164 if (*p ==
'0' && (*(p + 1) ==
'x' || *(p + 1) ==
'X')) {
170 if (base < 2 || base > 36) {
172 *endptr =
const_cast<char*
>(str);
178 const char* start = p;
188 *endptr =
const_cast<char*
>(str);
190 *endptr =
const_cast<char*
>(p);
200 *endptr =
const_cast<char*
>(str);
209 while (*p ==
' ' || *p ==
'\t' || *p ==
'\n' || *p ==
'\r' || *p ==
'\f' || *p ==
'\v') {
216 }
else if (*p ==
'-') {
224 if (*(p + 1) ==
'x' || *(p + 1) ==
'X') {
234 }
else if (base == 16) {
236 if (*p ==
'0' && (*(p + 1) ==
'x' || *(p + 1) ==
'X')) {
242 if (base < 2 || base > 36) {
244 *endptr =
const_cast<char*
>(str);
250 const char* start = p;
260 *endptr =
const_cast<char*
>(str);
262 *endptr =
const_cast<char*
>(p);
270 return static_cast<int>(
strtol(str,
nullptr, 10));
274 return strtol(str,
nullptr, 10);
280 *endptr =
const_cast<char*
>(str);
287 bool negative =
false;
290 while (*p ==
' ' || *p ==
'\t' || *p ==
'\n' || *p ==
'\r' || *p ==
'\f' || *p ==
'\v') {
298 }
else if (*p ==
'+') {
302 const char* start = p;
305 while (*p >=
'0' && *p <=
'9') {
313 double fraction = 0.1;
314 while (*p >=
'0' && *p <=
'9') {
315 result += (*p -
'0') * fraction;
322 if (*p ==
'e' || *p ==
'E') {
324 bool expNegative =
false;
328 }
else if (*p ==
'+') {
333 while (*p >=
'0' && *p <=
'9') {
334 exp =
exp * 10 + (*p -
'0');
338 double multiplier = 1.0;
339 for (
int i = 0; i <
exp; i++) {
353 *endptr =
const_cast<char*
>(str);
355 *endptr =
const_cast<char*
>(p);
371 constexpr size_t STACK_BUF_SIZE = 64;
372 if (size <= STACK_BUF_SIZE) {
373 char tmp[STACK_BUF_SIZE];
378 for (
size_t i = 0; i < size; ++i) {
388 for (
size_t i = 1; i < nmemb; ++i) {
391 char* elem_i = base + i * size;
393 if (size <=
sizeof(temp)) {
394 memcpy(temp, elem_i, size);
397 while (j > 0 && compar(temp, base + (j - 1) * size) < 0) {
398 memcpy(base + j * size, base + (j - 1) * size, size);
402 memcpy(base + j * size, temp, size);
406 while (j > 0 && compar(elem_i, base + (j - 1) * size) < 0) {
417 size_t mid = nmemb / 2;
418 size_t last = nmemb - 1;
420 char* first_elem = base;
421 char* mid_elem = base + mid * size;
422 char* last_elem = base + last * size;
425 if (compar(mid_elem, first_elem) < 0) {
428 if (compar(last_elem, first_elem) < 0) {
431 if (compar(last_elem, mid_elem) < 0) {
437 char* pivot = base + (last - 1) * size;
441 for (
size_t j = 0; j < last - 1; ++j) {
442 if (compar(base + j * size, pivot) < 0) {
473 if (pivot_idx + 1 < nmemb) {
474 qsort_impl(base + (pivot_idx + 1) * size, nmemb - pivot_idx - 1, size, compar);
480 if (!base || nmemb <= 1 || size == 0 || !compar) {
484 char* arr =
static_cast<char*
>(base);
489 return static_cast<u32
>(
::rand());
496 return ::getenv(name);
void aligned_free_via_malloc(void *ptr) FL_NO_EXCEPT
void * aligned_alloc_via_malloc(fl::size_t alignment, fl::size_t size) FL_NO_EXCEPT
Portable over-allocate-and-align used by aligned_alloc on bare-metal targets; free only with aligned_...
void qsort_swap(char *a, char *b, size_t size) FL_NO_EXCEPT
void qsort_impl(char *base, size_t nmemb, size_t size, qsort_compare_fn compar) FL_NO_EXCEPT
Compile-time linker keep-alive hook for a single fl::Bus.
unsigned long strtoul(const char *str, char **endptr, int base) FL_NO_EXCEPT
long strtol(const char *str, char **endptr, int base) FL_NO_EXCEPT
const char * getenv(const char *name) FL_NO_EXCEPT
void qsort(void *base, size_t nmemb, size_t size, qsort_compare_fn compar) FL_NO_EXCEPT
int atoi(const char *str) FL_NO_EXCEPT
void * aligned_alloc(fl::size_t alignment, fl::size_t size) FL_NO_EXCEPT
double strtod(const char *str, char **endptr) FL_NO_EXCEPT
long atol(const char *str) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
static void qsort_insertion_sort(char *base, size_t nmemb, size_t size, qsort_compare_fn compar) FL_NO_EXCEPT
static int charToDigit(char c) FL_NO_EXCEPT
FASTLED_FORCE_INLINE void free(void *ptr) FL_NO_EXCEPT
FASTLED_FORCE_INLINE u32 rand() FL_NO_EXCEPT
int(* qsort_compare_fn)(const void *, const void *)
FASTLED_FORCE_INLINE void * malloc(size_t size) FL_NO_EXCEPT
To reinterpret_cast_(const From &from) FL_NO_EXCEPT
FASTLED_FORCE_INLINE void * memcpy(void *dest, const void *src, size_t n) FL_NO_EXCEPT
expected< T, E > result
Alias for expected (Rust-style naming)
static bool isDigitInBase(char c, int base) FL_NO_EXCEPT
void aligned_free(void *ptr) FL_NO_EXCEPT
static size_t qsort_partition(char *base, size_t nmemb, size_t size, qsort_compare_fn compar) FL_NO_EXCEPT
enable_if< is_fixed_point< T >::value, T >::type exp(T x) FL_NO_EXCEPT
FASTLED_FORCE_INLINE long strtol(const char *str, char **endptr, int base) FL_NO_EXCEPT
Base definition for an LED controller.