1
0
mirror of https://github.com/fumiama/fumidb.git synced 2026-06-10 21:24:12 +08:00
This commit is contained in:
源文雨
2022-05-01 01:19:38 +08:00
parent f4fad55ca4
commit 1463c1f606
8 changed files with 151 additions and 9 deletions

103
include/binary.h Normal file
View File

@@ -0,0 +1,103 @@
#ifndef _BINARY_H_
#define _BINARY_H_
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#ifdef __linux__
# include <endian.h>
#endif
#ifdef __FreeBSD__
# include <sys/endian.h>
#endif
#ifdef __NetBSD__
# include <sys/endian.h>
#endif
#ifdef __OpenBSD__
# include <sys/types.h>
# define be16toh(x) betoh16(x)
# define be32toh(x) betoh32(x)
# define be64toh(x) betoh64(x)
#endif
#ifdef __MAC_10_0
# define be16toh(x) ntohs(x)
# define be32toh(x) ntohl(x)
# define be64toh(x) ntohll(x)
# define htobe16(x) ntohs(x)
# define htobe32(x) htonl(x)
# define htobe64(x) htonll(x)
#endif
#ifdef _WIN64
#ifdef WORDS_BIGENDIAN
# define be16toh(x) (x)
# define be32toh(x) (x)
# define be64toh(x) (x)
# define htobe16(x) (x)
# define htobe32(x) (x)
# define htobe64(x) (x)
#else
# define be16toh(x) _byteswap_ushort(x)
# define be32toh(x) _byteswap_ulong(x)
# define be64toh(x) _byteswap_uint64(x)
# define htobe16(x) _byteswap_ushort(x)
# define htobe32(x) _byteswap_ulong(x)
# define htobe64(x) _byteswap_uint64(x)
#endif
#endif
#ifdef _WIN64
#ifdef WORDS_BIGENDIAN
#define putle16(buf, x) (*(uint16_t*)(buf) = _byteswap_ushort((uint16_t)(x)))
#define putle32(buf, x) (*(uint32_t*)(buf) = _byteswap_ulong((uint32_t)(x)))
#define putle64(buf, x) (*(uint64_t*)(buf) = _byteswap_uint64((uint64_t)(x)))
#define readle16(fd, num) ((~read((fd), &(num), 2))?((num)=_byteswap_ushort((uint16_t)(num))):EOF)
#define readle32(fd, num) ((~read((fd), &(num), 4))?((num)=_byteswap_ulong((uint32_t)(num))):EOF)
#define readle64(fd, num) ((~read((fd), &(num), 8))?((num)=_byteswap_uint64((uint64_t)(num))):EOF)
#define le16(buf) _byteswap_ushort(*(uint16_t*)(buf))
#define le32(buf) _byteswap_ulong(*(uint32_t*)(buf))
#define le64(buf) _byteswap_uint64(*(uint64_t*)(buf))
#else
#define putle16(buf, x) (*(uint16_t*)(buf) = (uint16_t)(x))
#define putle32(buf, x) (*(uint32_t*)(buf) = (uint32_t)(x))
#define putle64(buf, x) (*(uint64_t*)(buf) = (uint64_t)(x))
#define readle16(fd, num) read((fd), &(num), 2)
#define readle32(fd, num) read((fd), &(num), 4)
#define readle64(fd, num) read((fd), &(num), 8)
#define le16(buf) (*(uint16_t*)(buf))
#define le32(buf) (*(uint32_t*)(buf))
#define le64(buf) (*(uint64_t*)(buf))
#endif
#else
#ifdef WORDS_BIGENDIAN
#define putle16(buf, x) (*(uint16_t*)(buf) = __builtin_bswap16((uint16_t)(x)))
#define putle32(buf, x) (*(uint32_t*)(buf) = __builtin_bswap32((uint32_t)(x)))
#define putle64(buf, x) (*(uint64_t*)(buf) = __builtin_bswap64((uint64_t)(x)))
#define readle16(fd, num) ((~read((fd), &(num), 2))?((num)=__builtin_bswap16((uint16_t)(num))):EOF)
#define readle32(fd, num) ((~read((fd), &(num), 4))?((num)=__builtin_bswap32((uint32_t)(num))):EOF)
#define readle64(fd, num) ((~read((fd), &(num), 8))?((num)=__builtin_bswap64((uint64_t)(num))):EOF)
#define le16(buf) __builtin_bswap16(*(uint16_t*)(buf))
#define le32(buf) __builtin_bswap32(*(uint32_t*)(buf))
#define le64(buf) __builtin_bswap64(*(uint64_t*)(buf))
#else
#define putle16(buf, x) (*(uint16_t*)(buf) = (uint16_t)(x))
#define putle32(buf, x) (*(uint32_t*)(buf) = (uint32_t)(x))
#define putle64(buf, x) (*(uint64_t*)(buf) = (uint64_t)(x))
#define readle16(fd, num) read((fd), &(num), 2)
#define readle32(fd, num) read((fd), &(num), 4)
#define readle64(fd, num) read((fd), &(num), 8)
#define le16(buf) (*(uint16_t*)(buf))
#define le32(buf) (*(uint32_t*)(buf))
#define le64(buf) (*(uint64_t*)(buf))
#endif
#endif
#endif

33
include/page.h Normal file
View File

@@ -0,0 +1,33 @@
#ifndef _PAGE_H_
#define _PAGE_H_
#include <stdio.h>
#ifndef PAGESZ
#define PAGESZ 4096
#endif
// 获取文件中的第一个空闲页,并将其 mmap 到内存
// 如果现有空闲均无整页,则新分配一页
// 返回:
// EOF 错误
void* alloc_page(int fd);
// 释放分配的页,将其标记为空闲以备使用
// 返回:
// EOF 错误
int free_page(int fd, void* page);
// 获取文件中的第一个满足 size 大小的块
// 返回:
// EOF 错误
void* alloc_block(int fd, size_t size);
// 释放块,并将其标记为空闲以备使用
// 值得注意的是,只有在本页最后一块
// 也被释放后,这一页才会被真正释放
// 返回:
// EOF 错误
int free_block(int fd, void* page);
#endif