From 80a525dbdbfe344c627a43d6ba098cf6dcff5c6e Mon Sep 17 00:00:00 2001 From: Luna Date: Sat, 28 Jun 2025 04:53:06 +0200 Subject: [PATCH] First commit --- .idea/.gitignore | 8 +++++ CMakeLists.txt | 10 +++++++ buffer.cpp | 32 ++++++++++++++++++++ buffer.h | 20 +++++++++++++ file_deserialising.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++ file_deserialising.h | 25 ++++++++++++++++ file_read.cpp | 8 +++++ file_read.h | 3 ++ 8 files changed, 172 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 CMakeLists.txt create mode 100644 buffer.cpp create mode 100644 buffer.h create mode 100644 file_deserialising.cpp create mode 100644 file_deserialising.h create mode 100644 file_read.cpp create mode 100644 file_read.h diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..15c1e44 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.31) +project(file_read) + +set(CMAKE_CXX_STANDARD 23) + +add_library(file_read STATIC file_read.cpp + file_deserialising.cpp + file_deserialising.h + buffer.cpp + buffer.h) diff --git a/buffer.cpp b/buffer.cpp new file mode 100644 index 0000000..04651d0 --- /dev/null +++ b/buffer.cpp @@ -0,0 +1,32 @@ +#include "buffer.h" + +void buffer::write(char *data_in, int data_size) +{ + if (data_size > allocated - size) + { + allocated = allocated + (allocated - (size + data_size)) + BUFFER_SIZE; + data = (char *)realloc(data, allocated); + if (!data) + { + throw std::runtime_error("Allocation failed"); + } + std::memcpy(&data[size], data_in, data_size); + size += data_size; + } +} + +void buffer::remove(int offset, int remove_size) +{ + if (offset + remove_size > size) + return ; + char *new_data = (char *)calloc(allocated, sizeof(char)); + if (offset > 0) + { + std::memcpy(new_data, data, offset); + } + int new_size = size - remove_size; + std::memcpy(&new_data[offset], &data[offset + remove_size], new_size - offset); + free(data); + data = new_data; + size = new_size; +} diff --git a/buffer.h b/buffer.h new file mode 100644 index 0000000..a9e9d46 --- /dev/null +++ b/buffer.h @@ -0,0 +1,20 @@ +#pragma once +#include +#include +#include +#define BUFFER_SIZE 1092 + +struct buffer +{ + char *data; + int size; + int allocated; + + void write(char *data_in, int data_size); + void remove(int offset, int remove_size); + + ~buffer() + { + free(data); + } +}; diff --git a/file_deserialising.cpp b/file_deserialising.cpp new file mode 100644 index 0000000..ed812fc --- /dev/null +++ b/file_deserialising.cpp @@ -0,0 +1,66 @@ +#include "file_deserialising.h" + + +template +T read_type(char *data) +{ + T a; + + std::memcpy(&a, data, sizeof(T)); + + switch (sizeof(T)) + { + case 1: + break; + case 2: + a = be16toh(a); + break; + case 4: + a = be32toh(a); + break; + case 8: + a = be64toh(a); + break; + default: + std::println("This integer is not supported!"); + } + return a; +} + +template <> +float read_type(char *data) +{ + uint32_t num_as_uint32; + float num; + + memcpy(&num_as_uint32, data, sizeof(uint32_t)); + num_as_uint32 = be32toh(num_as_uint32); + memcpy(&num, &num_as_uint32, sizeof(float)); + + return num; +} + +template <> +double read_type(char *data) +{ + uint64_t num_as_uint64; + double num; + + memcpy(&num_as_uint64, data, sizeof(uint64_t)); + num_as_uint64 = be64toh(num_as_uint64); + memcpy(&num, &num_as_uint64, sizeof(double)); + + return num; +} + + +template constexpr void const_for_each_(std::integer_sequence, F&& func) +{ + (func(std::integral_constant{}), ...); +} + +template constexpr void const_for_(F&& func) +{ + if constexpr (N > 0) + const_for_each_(std::make_integer_sequence{}, std::forward(func)); +} \ No newline at end of file diff --git a/file_deserialising.h b/file_deserialising.h new file mode 100644 index 0000000..31c28b8 --- /dev/null +++ b/file_deserialising.h @@ -0,0 +1,25 @@ +#pragma once +#include +#include +#include +#ifdef __APPLE__ +#include + +#define htobe16(x) OSSwapHostToBigInt16(x) +#define htole16(x) OSSwapHostToLittleInt16(x) +#define be16toh(x) OSSwapBigToHostInt16(x) +#define le16toh(x) OSSwapLittleToHostInt16(x) + +#define htobe32(x) OSSwapHostToBigInt32(x) +#define htole32(x) OSSwapHostToLittleInt32(x) +#define be32toh(x) OSSwapBigToHostInt32(x) +#define le32toh(x) OSSwapLittleToHostInt32(x) + +#define htobe64(x) OSSwapHostToBigInt64(x) +#define htole64(x) OSSwapHostToLittleInt64(x) +#define be64toh(x) OSSwapBigToHostInt64(x) +#define le64toh(x) OSSwapLittleToHostInt64(x) +#endif + +template constexpr void const_for_each_(std::integer_sequence, F&& func); +template constexpr void const_for_(F&& func); diff --git a/file_read.cpp b/file_read.cpp new file mode 100644 index 0000000..33c3852 --- /dev/null +++ b/file_read.cpp @@ -0,0 +1,8 @@ +#include "file_read.h" + +#include + +void hello() +{ + std::cout << "Hello, World!" << std::endl; +} \ No newline at end of file diff --git a/file_read.h b/file_read.h new file mode 100644 index 0000000..af9bb7f --- /dev/null +++ b/file_read.h @@ -0,0 +1,3 @@ +#pragma once + +void hello();