blob: c8a03a5821b6578443cd0dc1ecad510e03fad6d5 [file] [log] [blame]
Andrew Scull18834872018-10-12 11:48:09 +01001/*
2 * Copyright 2018 Google LLC
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * https://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Andrew Scullfbc938a2018-08-20 14:09:28 +010017#pragma once
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010018
19#include <stddef.h>
20#include <stdint.h>
21
Andrew Scull6386f252018-12-06 13:29:10 +000022#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
23
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010024void *memset(void *s, int c, size_t n);
25void *memcpy(void *dst, const void *src, size_t n);
26void *memmove(void *dst, const void *src, size_t n);
27int memcmp(const void *a, const void *b, size_t n);
28
29size_t strlen(const char *str);
30int strcmp(const char *a, const char *b);
31
Andrew Walbran318f5732018-11-20 16:23:42 +000032#define ctz(x) __builtin_ctz(x)
33
Alfredo Mazzinghieb1997c2019-02-07 18:00:01 +000034/* Compatibility with old compilers */
35#ifndef __has_builtin
36#define __has_builtin(x) 0
37#endif
38
39/**
40 * Check whether the value `v` is aligned to the boundary `a`,
41 * with `a` power of 2.
42 */
43#if __has_builtin(__builtin_is_aligned)
44#define is_aligned(v, a) __builtin_is_aligned((v), (a))
45#else
46#define is_aligned(v, a) (((uintptr_t)(v) & (a - 1)) == 0)
47#endif
48
49/**
50 * Align up the value `v` to the boundary `a`, with `a` power of 2.
51 */
52#if __has_builtin(__builtin_align_up)
53#define align_up(v, a) __builtin_align_up((v), (a))
54#else
55#define align_up(v, a) (((uintptr_t)(v) + (a - 1)) & ~(a - 1))
56#endif
57
58/**
59 * Align down the value `v` to the boundary `a`, with `a` power of 2.
60 */
61#if __has_builtin(__builtin_align_down)
62#define align_down(v, a) __builtin_align_down((v), (a))
63#else
64#define align_down(v, a) ((uintptr_t)(v) & ~(a - 1))
65#endif
66
Andrew Walbran4a53ba62019-03-05 17:26:12 +000067#ifndef be16toh
Andrew Scullf12b35d2018-07-16 12:12:59 +010068#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010069
Andrew Scullf12b35d2018-07-16 12:12:59 +010070#define be16toh(v) __builtin_bswap16(v)
71#define be32toh(v) __builtin_bswap32(v)
72#define be64toh(v) __builtin_bswap64(v)
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010073
Andrew Scullf12b35d2018-07-16 12:12:59 +010074#define htobe16(v) __builtin_bswap16(v)
75#define htobe32(v) __builtin_bswap32(v)
76#define htobe64(v) __builtin_bswap64(v)
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010077
Andrew Scullf12b35d2018-07-16 12:12:59 +010078#define le16toh(v) (v)
79#define le32toh(v) (v)
80#define le64toh(v) (v)
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010081
Andrew Scullf12b35d2018-07-16 12:12:59 +010082#define htole16(v) (v)
83#define htole32(v) (v)
84#define htole64(v) (v)
85
86#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
87
88#define be16toh(v) (v)
89#define be32toh(v) (v)
90#define be64toh(v) (v)
91
92#define htobe16(v) (v)
93#define htobe32(v) (v)
94#define htobe64(v) (v)
95
96#define le16toh(v) __builtin_bswap16(v)
97#define le32toh(v) __builtin_bswap32(v)
98#define le64toh(v) __builtin_bswap64(v)
99
100#define htole16(v) __builtin_bswap16(v)
101#define htole32(v) __builtin_bswap32(v)
102#define htole64(v) __builtin_bswap64(v)
103
Andrew Scullcbefbdb2019-01-11 16:36:26 +0000104#else
105
106/*
107 * __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ &&
108 * __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__
109 */
Andrew Scullf12b35d2018-07-16 12:12:59 +0100110
111#error "Unsupported byte order"
112
113#endif
Andrew Walbran4a53ba62019-03-05 17:26:12 +0000114#endif