blob: 6e5e82a0a9f4027713e521136f5a81e90b26566d [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
Andrew Scullf12b35d2018-07-16 12:12:59 +010034#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010035
Andrew Scullf12b35d2018-07-16 12:12:59 +010036#define be16toh(v) __builtin_bswap16(v)
37#define be32toh(v) __builtin_bswap32(v)
38#define be64toh(v) __builtin_bswap64(v)
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010039
Andrew Scullf12b35d2018-07-16 12:12:59 +010040#define htobe16(v) __builtin_bswap16(v)
41#define htobe32(v) __builtin_bswap32(v)
42#define htobe64(v) __builtin_bswap64(v)
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010043
Andrew Scullf12b35d2018-07-16 12:12:59 +010044#define le16toh(v) (v)
45#define le32toh(v) (v)
46#define le64toh(v) (v)
Wedson Almeida Filho987c0ff2018-06-20 16:34:38 +010047
Andrew Scullf12b35d2018-07-16 12:12:59 +010048#define htole16(v) (v)
49#define htole32(v) (v)
50#define htole64(v) (v)
51
52#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
53
54#define be16toh(v) (v)
55#define be32toh(v) (v)
56#define be64toh(v) (v)
57
58#define htobe16(v) (v)
59#define htobe32(v) (v)
60#define htobe64(v) (v)
61
62#define le16toh(v) __builtin_bswap16(v)
63#define le32toh(v) __builtin_bswap32(v)
64#define le64toh(v) __builtin_bswap64(v)
65
66#define htole16(v) __builtin_bswap16(v)
67#define htole32(v) __builtin_bswap32(v)
68#define htole64(v) __builtin_bswap64(v)
69
Andrew Scullcbefbdb2019-01-11 16:36:26 +000070#else
71
72/*
73 * __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ &&
74 * __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__
75 */
Andrew Scullf12b35d2018-07-16 12:12:59 +010076
77#error "Unsupported byte order"
78
79#endif