1c0abf9e6Sopenharmony_ci// SPDX-License-Identifier: MIT
2c0abf9e6Sopenharmony_ci/*
3c0abf9e6Sopenharmony_ci * Copyright © 2013 Red Hat, Inc.
4c0abf9e6Sopenharmony_ci */
5c0abf9e6Sopenharmony_ci
6c0abf9e6Sopenharmony_ci#ifndef _UTIL_H_
7c0abf9e6Sopenharmony_ci#define _UTIL_H_
8c0abf9e6Sopenharmony_ci
9c0abf9e6Sopenharmony_ci#include "config.h"
10c0abf9e6Sopenharmony_ci#include <stdbool.h>
11c0abf9e6Sopenharmony_ci#include <string.h>
12c0abf9e6Sopenharmony_ci
13c0abf9e6Sopenharmony_ci#define LONG_BITS (sizeof(long) * 8)
14c0abf9e6Sopenharmony_ci#define NLONGS(x) (((x) + LONG_BITS - 1) / LONG_BITS)
15c0abf9e6Sopenharmony_ci#define ARRAY_LENGTH(a) (sizeof(a) / (sizeof((a)[0])))
16c0abf9e6Sopenharmony_ci#define unlikely(x) (__builtin_expect(!!(x),0))
17c0abf9e6Sopenharmony_ci
18c0abf9e6Sopenharmony_ci#undef min
19c0abf9e6Sopenharmony_ci#undef max
20c0abf9e6Sopenharmony_ci#ifdef __GNUC__
21c0abf9e6Sopenharmony_ci#define min(a,b) \
22c0abf9e6Sopenharmony_ci		({ __typeof__ (a) _a = (a); \
23c0abf9e6Sopenharmony_ci	          __typeof__ (b) _b = (b); \
24c0abf9e6Sopenharmony_ci		_a > _b ? _b : _a; \
25c0abf9e6Sopenharmony_ci		})
26c0abf9e6Sopenharmony_ci#define max(a,b) \
27c0abf9e6Sopenharmony_ci		({ __typeof__ (a) _a = (a); \
28c0abf9e6Sopenharmony_ci	          __typeof__ (b) _b = (b); \
29c0abf9e6Sopenharmony_ci		_a > _b ? _a : _b; \
30c0abf9e6Sopenharmony_ci		})
31c0abf9e6Sopenharmony_ci#else
32c0abf9e6Sopenharmony_ci#define min(a,b) ((a) > (b) ? (b) : (a))
33c0abf9e6Sopenharmony_ci#define max(a,b) ((a) > (b) ? (a) : (b))
34c0abf9e6Sopenharmony_ci#endif
35c0abf9e6Sopenharmony_ci
36c0abf9e6Sopenharmony_cistatic inline bool
37c0abf9e6Sopenharmony_cistartswith(const char *str, size_t len, const char *prefix, size_t plen)
38c0abf9e6Sopenharmony_ci{
39c0abf9e6Sopenharmony_ci	return len >= plen && !strncmp(str, prefix, plen);
40c0abf9e6Sopenharmony_ci}
41c0abf9e6Sopenharmony_ci
42c0abf9e6Sopenharmony_cistatic inline int
43c0abf9e6Sopenharmony_cibit_is_set(const unsigned long *array, int bit)
44c0abf9e6Sopenharmony_ci{
45c0abf9e6Sopenharmony_ci    return !!(array[bit / LONG_BITS] & (1LL << (bit % LONG_BITS)));
46c0abf9e6Sopenharmony_ci}
47c0abf9e6Sopenharmony_ci
48c0abf9e6Sopenharmony_cistatic inline void
49c0abf9e6Sopenharmony_ciset_bit(unsigned long *array, int bit)
50c0abf9e6Sopenharmony_ci{
51c0abf9e6Sopenharmony_ci    array[bit / LONG_BITS] |= (1LL << (bit % LONG_BITS));
52c0abf9e6Sopenharmony_ci}
53c0abf9e6Sopenharmony_ci
54c0abf9e6Sopenharmony_cistatic inline void
55c0abf9e6Sopenharmony_ciclear_bit(unsigned long *array, int bit)
56c0abf9e6Sopenharmony_ci{
57c0abf9e6Sopenharmony_ci    array[bit / LONG_BITS] &= ~(1LL << (bit % LONG_BITS));
58c0abf9e6Sopenharmony_ci}
59c0abf9e6Sopenharmony_ci
60c0abf9e6Sopenharmony_cistatic inline void
61c0abf9e6Sopenharmony_ciset_bit_state(unsigned long *array, int bit, int state)
62c0abf9e6Sopenharmony_ci{
63c0abf9e6Sopenharmony_ci	if (state)
64c0abf9e6Sopenharmony_ci		set_bit(array, bit);
65c0abf9e6Sopenharmony_ci	else
66c0abf9e6Sopenharmony_ci		clear_bit(array, bit);
67c0abf9e6Sopenharmony_ci}
68c0abf9e6Sopenharmony_ci
69c0abf9e6Sopenharmony_ci#endif
70