Loading...
Searching...
No Matches
binsearch.h
1/*
2 * SPDX-FileCopyrightText: 2018 Freie Universität Berlin
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
42
43#include <stdint.h>
44#include <errno.h>
45
46#ifdef __cplusplus
47extern "C" {
48#endif
49
53#define _ENSURE_LVALUE(x) ((void)sizeof(&(x)))
54
59#define _ARRAY_STRIDE(arr) ((size_t)((const uint8_t *)((arr) + 1) - (const uint8_t *)(arr)))
60
65#define _ARRAY_MEMBER_OFFS(arr, member) \
66 ((size_t)((const uint8_t *)(&((arr)->member)) - (const uint8_t *)(arr)))
67
78#define BINSEARCH_STR(arr, nmemb, member, str, n) \
79 (_ENSURE_LVALUE(arr), \
80 (binsearch_str((arr), _ARRAY_MEMBER_OFFS(arr, member), _ARRAY_STRIDE(arr), \
81 (nmemb), (str), (n))) \
82 )
83
91#define BINSEARCH_STR_P(arr, nmemb, member, str, n) \
92 (_ENSURE_LVALUE(arr), \
93 (binsearch_str_p((arr), _ARRAY_MEMBER_OFFS(arr, member), _ARRAY_STRIDE(arr), \
94 (nmemb), (str), (n))) \
95 )
96
116int binsearch_str(const void *start, size_t offset, size_t stride, size_t nmemb,
117 const char *str, size_t n);
118
125const void *binsearch_str_p(const void *start, size_t offset, size_t stride,
126 size_t nmemb, const char *str, size_t n);
127
128#ifdef __cplusplus
129}
130#endif
131