Loading...
Searching...
No Matches
binsearch.h
1/*
2 * Copyright (C) 2018 Freie Universität Berlin
3 *
4 * This file is subject to the terms and conditions of the GNU Lesser
5 * General Public License v2.1. See the file LICENSE in the top level
6 * directory for more details.
7 */
8
9#pragma once
10
45
46#include <stdint.h>
47#include <errno.h>
48
49#ifdef __cplusplus
50extern "C" {
51#endif
52
56#define _ENSURE_LVALUE(x) ((void)sizeof(&(x)))
57
62#define _ARRAY_STRIDE(arr) ((size_t)((const uint8_t *)((arr) + 1) - (const uint8_t *)(arr)))
63
68#define _ARRAY_MEMBER_OFFS(arr, member) \
69 ((size_t)((const uint8_t *)(&((arr)->member)) - (const uint8_t *)(arr)))
70
81#define BINSEARCH_STR(arr, nmemb, member, str, n) \
82 (_ENSURE_LVALUE(arr), \
83 (binsearch_str((arr), _ARRAY_MEMBER_OFFS(arr, member), _ARRAY_STRIDE(arr), \
84 (nmemb), (str), (n))) \
85 )
86
94#define BINSEARCH_STR_P(arr, nmemb, member, str, n) \
95 (_ENSURE_LVALUE(arr), \
96 (binsearch_str_p((arr), _ARRAY_MEMBER_OFFS(arr, member), _ARRAY_STRIDE(arr), \
97 (nmemb), (str), (n))) \
98 )
99
119int binsearch_str(const void *start, size_t offset, size_t stride, size_t nmemb,
120 const char *str, size_t n);
121
128const void *binsearch_str_p(const void *start, size_t offset, size_t stride,
129 size_t nmemb, const char *str, size_t n);
130
131#ifdef __cplusplus
132}
133#endif
134