diff options
Diffstat (limited to 'src/libs/lvgl/src/lv_misc/lv_utils.c')
-rw-r--r-- | src/libs/lvgl/src/lv_misc/lv_utils.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/libs/lvgl/src/lv_misc/lv_utils.c b/src/libs/lvgl/src/lv_misc/lv_utils.c new file mode 100644 index 00000000..3f189560 --- /dev/null +++ b/src/libs/lvgl/src/lv_misc/lv_utils.c @@ -0,0 +1,115 @@ +/** + * @file lv_utils.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include <stdbool.h> + +#include "lv_utils.h" +#include "lv_math.h" + +/********************* + * DEFINES + *********************/ + +/********************** + * TYPEDEFS + **********************/ + +/********************** + * STATIC PROTOTYPES + **********************/ + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/** + * Convert a number to string + * @param num a number + * @param buf pointer to a `char` buffer. The result will be stored here (max 10 elements) + * @return same as `buf` (just for convenience) + */ +char * lv_utils_num_to_str(int32_t num, char * buf) +{ + if(num == 0) { + buf[0] = '0'; + buf[1] = '\0'; + return buf; + } + int8_t digitCount = 0; + int8_t i = 0; + if(num < 0) { + buf[digitCount++] = '-'; + num = LV_MATH_ABS(num); + ++i; + } + while(num) { + char digit = num % 10; + buf[digitCount++] = digit + 48; + num /= 10; + } + buf[digitCount] = '\0'; + digitCount--; + while(digitCount > i) { + char temp = buf[i]; + buf[i] = buf[digitCount]; + buf[digitCount] = temp; + digitCount--; + i++; + } + return buf; +} + +/** Searches base[0] to base[n - 1] for an item that matches *key. + * + * @note The function cmp must return negative if its first + * argument (the search key) is less that its second (a table entry), + * zero if equal, and positive if greater. + * + * @note Items in the array must be in ascending order. + * + * @param key Pointer to item being searched for + * @param base Pointer to first element to search + * @param n Number of elements + * @param size Size of each element + * @param cmp Pointer to comparison function (see #lv_font_codeCompare as a comparison function + * example) + * + * @return a pointer to a matching item, or NULL if none exists. + */ +void * lv_utils_bsearch(const void * key, const void * base, uint32_t n, uint32_t size, + int32_t (*cmp)(const void * pRef, const void * pElement)) +{ + const char * middle; + int32_t c; + + for(middle = base; n != 0;) { + middle += (n / 2) * size; + if((c = (*cmp)(key, middle)) > 0) { + n = (n / 2) - ((n & 1) == 0); + base = (middle += size); + } else if(c < 0) { + n /= 2; + middle = base; + } else { + return (char *)middle; + } + } + return NULL; +} + +/********************** + * STATIC FUNCTIONS + **********************/ |