3#include "platforms/is_platform.h"
22#if defined(FL_IS_AVR) || defined(FL_IS_ESP8266) || defined(FL_IS_ARM) || defined(FL_IS_APOLLO3)
30 return ::malloc(size);
31#elif defined(FL_IS_WIN)
32 return ::_aligned_malloc(size, alignment);
33#elif defined(FL_IS_ESP32) && !ESP_IDF_VERSION_4_OR_HIGHER
37 return ::malloc(size);
39 fl::size_t aligned_size = (size + alignment - 1) & ~(alignment - 1);
40 return ::aligned_alloc(alignment, aligned_size);
45#if defined(FL_IS_AVR) || defined(FL_IS_ESP8266) || defined(FL_IS_ARM) || defined(FL_IS_APOLLO3)
47#elif defined(FL_IS_WIN)
57 return c >=
'0' && c < (
'0' + base);
59 if (c >=
'0' && c <=
'9') {
62 if (c >=
'a' && c < (
'a' + base - 10)) {
65 if (c >=
'A' && c < (
'A' + base - 10)) {
73 if (c >=
'0' && c <=
'9') {
76 if (c >=
'a' && c <=
'z') {
79 if (c >=
'A' && c <=
'Z') {
85long strtol(
const char* str,
char** endptr,
int base) {
88 *endptr =
const_cast<char*
>(str);
95 bool negative =
false;
98 while (*p ==
' ' || *p ==
'\t' || *p ==
'\n' || *p ==
'\r' || *p ==
'\f' || *p ==
'\v') {
106 }
else if (*p ==
'+') {
113 if (*(p + 1) ==
'x' || *(p + 1) ==
'X') {
123 }
else if (base == 16) {
125 if (*p ==
'0' && (*(p + 1) ==
'x' || *(p + 1) ==
'X')) {
131 if (base < 2 || base > 36) {
133 *endptr =
const_cast<char*
>(str);
139 const char* start = p;
149 *endptr =
const_cast<char*
>(str);
151 *endptr =
const_cast<char*
>(p);
158unsigned long strtoul(
const char* str,
char** endptr,
int base) {
161 *endptr =
const_cast<char*
>(str);
170 while (*p ==
' ' || *p ==
'\t' || *p ==
'\n' || *p ==
'\r' || *p ==
'\f' || *p ==
'\v') {
177 }
else if (*p ==
'-') {
185 if (*(p + 1) ==
'x' || *(p + 1) ==
'X') {
195 }
else if (base == 16) {
197 if (*p ==
'0' && (*(p + 1) ==
'x' || *(p + 1) ==
'X')) {
203 if (base < 2 || base > 36) {
205 *endptr =
const_cast<char*
>(str);
211 const char* start = p;
221 *endptr =
const_cast<char*
>(str);
223 *endptr =
const_cast<char*
>(p);
231 return static_cast<int>(
strtol(str,
nullptr, 10));
235 return strtol(str,
nullptr, 10);
238double strtod(
const char* str,
char** endptr) {
241 *endptr =
const_cast<char*
>(str);
248 bool negative =
false;
251 while (*p ==
' ' || *p ==
'\t' || *p ==
'\n' || *p ==
'\r' || *p ==
'\f' || *p ==
'\v') {
259 }
else if (*p ==
'+') {
263 const char* start = p;
266 while (*p >=
'0' && *p <=
'9') {
274 double fraction = 0.1;
275 while (*p >=
'0' && *p <=
'9') {
276 result += (*p -
'0') * fraction;
283 if (*p ==
'e' || *p ==
'E') {
285 bool expNegative =
false;
289 }
else if (*p ==
'+') {
294 while (*p >=
'0' && *p <=
'9') {
295 exp =
exp * 10 + (*p -
'0');
299 double multiplier = 1.0;
300 for (
int i = 0; i <
exp; i++) {
314 *endptr =
const_cast<char*
>(str);
316 *endptr =
const_cast<char*
>(p);
325 void qsort_swap(
char* a,
char* b,
size_t size);
332 constexpr size_t STACK_BUF_SIZE = 64;
333 if (size <= STACK_BUF_SIZE) {
334 char tmp[STACK_BUF_SIZE];
339 for (
size_t i = 0; i < size; ++i) {
349 for (
size_t i = 1; i < nmemb; ++i) {
352 char* elem_i = base + i * size;
354 if (size <=
sizeof(temp)) {
355 memcpy(temp, elem_i, size);
358 while (j > 0 && compar(temp, base + (j - 1) * size) < 0) {
359 memcpy(base + j * size, base + (j - 1) * size, size);
363 memcpy(base + j * size, temp, size);
367 while (j > 0 && compar(elem_i, base + (j - 1) * size) < 0) {
378 size_t mid = nmemb / 2;
379 size_t last = nmemb - 1;
381 char* first_elem = base;
382 char* mid_elem = base + mid * size;
383 char* last_elem = base + last * size;
386 if (compar(mid_elem, first_elem) < 0) {
389 if (compar(last_elem, first_elem) < 0) {
392 if (compar(last_elem, mid_elem) < 0) {
398 char* pivot = base + (last - 1) * size;
402 for (
size_t j = 0; j < last - 1; ++j) {
403 if (compar(base + j * size, pivot) < 0) {
434 if (pivot_idx + 1 < nmemb) {
435 qsort_impl(base + (pivot_idx + 1) * size, nmemb - pivot_idx - 1, size, compar);
441 if (!base || nmemb <= 1 || size == 0 || !compar) {
445 char* arr =
static_cast<char*
>(base);
450 return static_cast<u32
>(
::rand());
457 return ::getenv(name);
void qsort_impl(char *base, size_t nmemb, size_t size, qsort_compare_fn compar)
void qsort_swap(char *a, char *b, size_t size)
void * memcpy(void *dest, const void *src, size_t n) FL_NOEXCEPT
static int charToDigit(char c)
static size_t qsort_partition(char *base, size_t nmemb, size_t size, qsort_compare_fn compar)
void aligned_free(void *ptr)
long atol(const char *str)
const char * getenv(const char *name)
int(* qsort_compare_fn)(const void *, const void *)
void * aligned_alloc(fl::size_t alignment, fl::size_t size)
void qsort(void *base, size_t nmemb, size_t size, qsort_compare_fn compar)
static bool isDigitInBase(char c, int base)
static void qsort_insertion_sort(char *base, size_t nmemb, size_t size, qsort_compare_fn compar)
expected< T, E > result
Alias for expected (Rust-style naming)
int atoi(const char *str)
double strtod(const char *str, char **endptr)
unsigned long strtoul(const char *str, char **endptr, int base)
enable_if< is_fixed_point< T >::value, T >::type exp(T x) FL_NOEXCEPT
long strtol(const char *str, char **endptr, int base)
Base definition for an LED controller.