struct & value 4

This commit is contained in:
mykola2312 2022-05-03 07:38:26 +03:00
parent f2b04e7514
commit 99daecee2e
2 changed files with 46 additions and 11 deletions

View file

@ -1,7 +1,14 @@
#include "struct.h"
#include "cutil.h"
uint struct_size(struct cu_struct_s* st, uint idx, uint8_t* in)
union intvalue_u {
uint8_t int8;
uint16_t int16;
uint32_t int32;
uint64_t int64;
};
uint value_size(struct cu_struct_s* st, uint idx, const void* in)
{
struct cu_value_s* value = &st->members[idx];
switch (value->type)
@ -17,16 +24,43 @@ uint struct_size(struct cu_struct_s* st, uint idx, uint8_t* in)
}
}
uint struct_offset(struct cu_struct_s* st, uint idx, uint8_t* in)
uint value_offset(struct cu_struct_s* st, uint idx, const void* in)
{
uint offset = 0;
do {
offset += struct_size(st, idx, in);
offset += value_size(st, idx, in);
} while (idx--);
return offset;
}
uint struct_value(struct cu_struct_s* st, uint idx, uint8_t* in, uint8_t* out)
void value_value(struct cu_struct_s* st, uint idx, const void* in, void* out)
{
uint size = value_size(st, idx, in);
uint offset = value_offset(st, idx, in);
struct cu_value_s* value = &st->members[idx];
union intvalue_u* data = (union intvalue_u*)out;
if (size) cu_memcpy(out, in + offset, size);
else return;
if (st->endian != cu_endian)
{
switch (value->type)
{
case Int8: break;
case Int16: data->int16 = cu_bswap16(data->int16); break;
case Int32: data->int32 = cu_bswap32(data->int32); break;
case Int64: data->int64 = cu_bswap64(data->int64); break;
}
}
}
uint value_array_size(struct cu_struct_s* st, uint idx, const void* in)
{
union intvalue_u size;
struct cu_value_s* value = &st->members[idx];
if (value->array.index)
{
//struct_value(st, value->array.count, in, (uint8_t*))
}
}

View file

@ -58,12 +58,13 @@ struct cu_struct_s {
{.type = Array, .array = {.item = (_item), .count = 0, .index = 0}},
typedef void (*cu_value_process_t)(struct cu_value_s* type,
uint8_t* in, uint8_t* out);
const void* in, void* out);
uint struct_size(struct cu_struct_s* st, uint idx, uint8_t* in);
uint struct_offset(struct cu_struct_s* st, uint idx, uint8_t* in);
uint struct_value(struct cu_struct_s* st, uint idx, uint8_t* in, uint8_t* out);
void struct_process(struct cu_struct_s* st, cu_value_process_t p,
uint8_t* in, uint8_t* out);
uint value_size(struct cu_struct_s* st, uint idx, const void* in);
uint value_offset(struct cu_struct_s* st, uint idx, const void* in);
void value_get(struct cu_struct_s* st, uint idx, const void* in, void* out);
uint value_array_size(struct cu_struct_s* st, uint idx, const void* in);
//void struct_process(struct cu_struct_s* st, cu_value_process_t p,
// uint8_t* in, uint8_t* out);
#endif