diff --git a/struct.c b/struct.c index bf4a17c..cb259c9 100644 --- a/struct.c +++ b/struct.c @@ -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*)) + } } diff --git a/struct.h b/struct.h index 4464d68..fc34bc3 100644 --- a/struct.h +++ b/struct.h @@ -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 \ No newline at end of file