acid-drop- Hacking the planet from a LilyGo T-Deck using custom firmware |
git clone git://git.acid.vegas/acid-drop.git |
Log | Files | Refs | Archive | README | LICENSE |
lv_utils.c (1879B)
1 /** 2 * @file lv_utils.c 3 * 4 */ 5 6 /********************* 7 * INCLUDES 8 *********************/ 9 #include <stddef.h> 10 11 #include "lv_utils.h" 12 13 /********************* 14 * DEFINES 15 *********************/ 16 17 /********************** 18 * TYPEDEFS 19 **********************/ 20 21 /********************** 22 * STATIC PROTOTYPES 23 **********************/ 24 25 /********************** 26 * STATIC VARIABLES 27 **********************/ 28 29 /********************** 30 * MACROS 31 **********************/ 32 33 /********************** 34 * GLOBAL FUNCTIONS 35 **********************/ 36 37 /** Searches base[0] to base[n - 1] for an item that matches *key. 38 * 39 * @note The function cmp must return negative if its first 40 * argument (the search key) is less than its second (a table entry), 41 * zero if equal, and positive if greater. 42 * 43 * @note Items in the array must be in ascending order. 44 * 45 * @param key Pointer to item being searched for 46 * @param base Pointer to first element to search 47 * @param n Number of elements 48 * @param size Size of each element 49 * @param cmp Pointer to comparison function (see #unicode_list_compare as a comparison function 50 * example) 51 * 52 * @return a pointer to a matching item, or NULL if none exists. 53 */ 54 void * _lv_utils_bsearch(const void * key, const void * base, uint32_t n, uint32_t size, 55 int32_t (*cmp)(const void * pRef, const void * pElement)) 56 { 57 const char * middle; 58 int32_t c; 59 60 for(middle = base; n != 0;) { 61 middle += (n / 2) * size; 62 if((c = (*cmp)(key, middle)) > 0) { 63 n = (n / 2) - ((n & 1) == 0); 64 base = (middle += size); 65 } 66 else if(c < 0) { 67 n /= 2; 68 middle = base; 69 } 70 else { 71 return (char *)middle; 72 } 73 } 74 return NULL; 75 } 76 77 /********************** 78 * STATIC FUNCTIONS 79 **********************/