root/lib/libc/hidden/db.h
/*      $OpenBSD: db.h,v 1.5 2026/03/09 12:22:44 deraadt Exp $  */
/*
 * Copyright (c) 2015 Philip Guenther <guenther@openbsd.org>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#ifndef _LIBC_DB_H_
#define _LIBC_DB_H_

#include_next <db.h>

/*
 * Little endian <==> big endian 32-bit swap macros.
 *      M_32_SWAP       swap a memory location
 *      P_32_SWAP       swap a referenced memory location
 *      P_32_COPY       swap from one location to another
 */
#define M_32_SWAP(a) {                                                  \
        u_int32_t _tmp = a;                                             \
        ((char *)&a)[0] = ((char *)&_tmp)[3];                           \
        ((char *)&a)[1] = ((char *)&_tmp)[2];                           \
        ((char *)&a)[2] = ((char *)&_tmp)[1];                           \
        ((char *)&a)[3] = ((char *)&_tmp)[0];                           \
}
#define P_32_SWAP(a) {                                                  \
        u_int32_t _tmp = *(u_int32_t *)a;                               \
        ((char *)a)[0] = ((char *)&_tmp)[3];                            \
        ((char *)a)[1] = ((char *)&_tmp)[2];                            \
        ((char *)a)[2] = ((char *)&_tmp)[1];                            \
        ((char *)a)[3] = ((char *)&_tmp)[0];                            \
}
#define P_32_COPY(a, b) {                                               \
        ((char *)&(b))[0] = ((char *)&(a))[3];                          \
        ((char *)&(b))[1] = ((char *)&(a))[2];                          \
        ((char *)&(b))[2] = ((char *)&(a))[1];                          \
        ((char *)&(b))[3] = ((char *)&(a))[0];                          \
}

/*
 * Little endian <==> big endian 16-bit swap macros.
 *      M_16_SWAP       swap a memory location
 *      P_16_SWAP       swap a referenced memory location
 *      P_16_COPY       swap from one location to another
 */
#define M_16_SWAP(a) {                                                  \
        u_int16_t _tmp = a;                                             \
        ((char *)&a)[0] = ((char *)&_tmp)[1];                           \
        ((char *)&a)[1] = ((char *)&_tmp)[0];                           \
}
#define P_16_SWAP(a) {                                                  \
        u_int16_t _tmp = *(u_int16_t *)a;                               \
        ((char *)a)[0] = ((char *)&_tmp)[1];                            \
        ((char *)a)[1] = ((char *)&_tmp)[0];                            \
}
#define P_16_COPY(a, b) {                                               \
        ((char *)&(b))[0] = ((char *)&(a))[1];                          \
        ((char *)&(b))[1] = ((char *)&(a))[0];                          \
}

__BEGIN_HIDDEN_DECLS
DB      *__bt_open(const char *, int, int, int, const BTREEINFO *, int);
DB      *__hash_open(const char *, int, int, int, const HASHINFO *, int);
DB      *__rec_open(const char *, int, int, int, const RECNOINFO *, int);
void    __dbpanic(DB *dbp);

/* Default hash function, from db/hash/hash_func.c */
u_int32_t       __default_hash(const void *, size_t);
__END_HIDDEN_DECLS

PROTO_NORMAL(dbopen);

#endif /* !_LIBC_DB_H_ */