URI: 
       sort_search.h - ltk - GUI toolkit for X11 (WIP)
  HTML git clone git://lumidify.org/ltk.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/ltk.git (encrypted, but very slow)
  HTML git clone git://4kcetb7mo7hj6grozzybxtotsub5bempzo4lirzc3437amof2c2impyd.onion/ltk.git (over tor)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       sort_search.h (4535B)
       ---
            1 /*
            2  * Copyright (c) 2024 lumidify <nobody@lumidify.org>
            3  *
            4  * Permission to use, copy, modify, and/or distribute this software for any
            5  * purpose with or without fee is hereby granted, provided that the above
            6  * copyright notice and this permission notice appear in all copies.
            7  *
            8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
            9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
           10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
           11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
           12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
           13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
           14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
           15  */
           16 
           17 #ifndef LTK_SORT_SEARCH_H
           18 #define LTK_SORT_SEARCH_H
           19 
           20 #include <stdlib.h>
           21 #include <stddef.h>
           22 #include <string.h>
           23 
           24 struct ltk_search_cmp_helper {
           25         const char *text;
           26         size_t len;
           27 };
           28 
           29 /* FIXME: documentation */
           30 #define GEN_SORT_SEARCH_HELPERS(name, typename, cmp_entry)                        \
           31                                                                                   \
           32 /*                                                                                \
           33  * IMPORTANT: The text passed to *_get_entry may not be nul-terminated,           \
           34  * so ltk_search_cmp_helper has to be used for the bsearch comparison             \
           35  * helper.                                                                        \
           36  */                                                                               \
           37                                                                                   \
           38 static int                                                                        \
           39 name##_search_helper(const void *keyv, const void *entryv) {                      \
           40         struct ltk_search_cmp_helper *key = (struct ltk_search_cmp_helper *)keyv; \
           41         typename *entry = (typename *)entryv;                                     \
           42         int ret = strncmp(key->text, entry->cmp_entry, key->len);                 \
           43         if (ret == 0) {                                                           \
           44                 if (entry->cmp_entry[key->len] == '\0')                           \
           45                         return 0;                                                 \
           46                 else                                                              \
           47                         return -1;                                                \
           48         }                                                                         \
           49         return ret;                                                               \
           50 }                                                                                 \
           51                                                                                   \
           52 static int                                                                        \
           53 name##_sort_helper(const void *entry1v, const void *entry2v) {                    \
           54         typename *entry1 = (typename *)entry1v;                                   \
           55         typename *entry2 = (typename *)entry2v;                                   \
           56         return strcmp(entry1->cmp_entry, entry2->cmp_entry);                      \
           57 }                                                                                 \
           58                                                                                   \
           59 static void                                                                       \
           60 name##_sort(typename *arr, size_t arrlen) {                                       \
           61         qsort(                                                                    \
           62             arr, arrlen,                                                          \
           63             sizeof(typename), &name##_sort_helper                                 \
           64         );                                                                        \
           65 }                                                                                 \
           66                                                                                   \
           67 static typename *                                                                 \
           68 name##_get_entry(typename *arr, size_t arrlen, const char *text, size_t len) {    \
           69         struct ltk_search_cmp_helper tmp = {.text = text, .len = len};            \
           70         return bsearch(                                                           \
           71             &tmp, arr, arrlen,                                                    \
           72             sizeof(typename), &name##_search_helper                               \
           73         );                                                                        \
           74 }
           75 
           76 #endif /* LTK_SORT_SEARCH_H */