Buffer reading now seems stable (or at least not broken)

This commit is contained in:
Luna 2025-06-30 20:16:13 +02:00
parent 3944277f6d
commit d161e31e63
2 changed files with 21 additions and 36 deletions

View file

@ -4,7 +4,7 @@
#include <print> #include <print>
#include <type_traits> #include <type_traits>
#include "buffer.h" #include "buffer.h"
#define read_comp(size, ptr, t, sizes) const_for_<size>([&](auto i){std::get<i.value>(t) = read_var<std::tuple_element_t<i.value, std::remove_cvref_t<decltype(t)>>>::call(&ptr, sizes[i.value]);}); #define read_comp(size, ptr, t, sizes) const_for_<size>([&](auto i){read_var<std::tuple_element_t<i.value, std::remove_cvref_t<decltype(t)>>>::call(std::get<i.value>(t), &ptr, sizes[i.value]);});
#ifdef __APPLE__ #ifdef __APPLE__
#include <libkern/OSByteOrder.h> #include <libkern/OSByteOrder.h>
@ -37,79 +37,65 @@ struct parsing_buffer
}; };
template <typename T> template <typename T>
static T read_type(char *data, size_t size) static void read_type(T& val, char *data, size_t size)
{ {
T a;
std::memcpy(&a, data, size);
switch (size) switch (size)
{ {
case 1: case 1:
break; break;
case 2: case 2:
a = be16toh(a); val = be16toh(val);
break; break;
case 4: case 4:
a = be32toh(a); val = be32toh(val);
break; break;
case 8: case 8:
a = be64toh(a); val = be64toh(val);
break; break;
default: default:
std::println("This integer is not supported!"); std::println("This integer is not supported!");
} }
return a;
} }
template <> template <>
float read_type<float>(char *data, size_t size) void read_type<float>(float &val, char *data, size_t size)
{ {
uint32_t num_as_uint32; uint32_t num_as_uint32;
float num;
memcpy(&num_as_uint32, data, size); memcpy(&num_as_uint32, data, size);
num_as_uint32 = be32toh(num_as_uint32); num_as_uint32 = be32toh(num_as_uint32);
memcpy(&num, &num_as_uint32, size); memcpy(&val, &num_as_uint32, size);
return num;
} }
template <> template <>
double read_type<double>(char *data, size_t size) void read_type<double>(double &val, char *data, size_t size)
{ {
uint64_t num_as_uint64; uint64_t num_as_uint64;
double num;
memcpy(&num_as_uint64, data, size); memcpy(&num_as_uint64, data, size);
num_as_uint64 = be64toh(num_as_uint64); num_as_uint64 = be64toh(num_as_uint64);
memcpy(&num, &num_as_uint64, size); memcpy(&val, &num_as_uint64, size);
return num;
} }
template<> template<>
buffer read_type<buffer>(char *data, size_t size) void read_type<buffer>(buffer &val, char *data, size_t size)
{ {
buffer ret; val.allocated = size + 1;
ret.allocated = size + 1; val.size = size;
ret.size = size; val.data = (char *)malloc(size * sizeof(char) + 1);
ret.data = (char *)malloc(size * sizeof(char) + 1); std::memcpy(val.data, data, size);
return ret;
} }
template<typename T> template<typename T>
struct read_var struct read_var
{ {
static T call(parsing_buffer* v, size_t size) static void call(T& val, parsing_buffer* v, size_t size)
{ {
if (size + v->consumed_size > v->buf.size) if (size + v->consumed_size > v->buf.size)
return T{}; return ;
T ret = read_type<T>(v->point, size); read_type<T>(val, v->point, size);
v->point += sizeof(T); v->point += size;
v->consumed_size += sizeof(T); v->consumed_size += size;
return ret;
} }
}; };

View file

@ -17,14 +17,14 @@ class file_reader
} }
template<typename ...T> template<typename ...T>
std::tuple<T...> read_from_tuple(std::tuple<T...> &in) void read_from_tuple(std::tuple<T...> &in)
{ {
constexpr std::size_t size_tuple = sizeof...(T); constexpr std::size_t size_tuple = sizeof...(T);
int size = 0; int size = 0;
std::array<size_t, size_tuple> sizes; std::array<size_t, size_tuple> sizes;
const_for_<size_tuple>([&](auto i) const_for_<size_tuple>([&](auto i)
{ {
if (typeid(std::get<i.value>(in)) == typeid(buffer)) if constexpr (typeid(std::get<i.value>(in)) == typeid(buffer))
{ {
size += std::get<i.value>(in).size; size += std::get<i.value>(in).size;
sizes[i.value] = std::get<i.value>(in).size; sizes[i.value] = std::get<i.value>(in).size;
@ -62,7 +62,6 @@ class file_reader
par_buf.consumed_size = 0; par_buf.consumed_size = 0;
read_comp(size_tuple, par_buf, in, sizes); read_comp(size_tuple, par_buf, in, sizes);
buf.remove(0, size); buf.remove(0, size);
return in;
} }
buffer buf; buffer buf;
int fd; int fd;