diff --git a/src/base/all.h b/src/base/all.h index 52a86a0..ca33485 100644 --- a/src/base/all.h +++ b/src/base/all.h @@ -189,6 +189,10 @@ # define assertBreak() (*(volatile int*)0 = 0) #endif +#ifndef offsetof +# define offsetof(st, m) ((size_t)&(((st*)0)->m)) +#endif + #if ENABLE_ASSERT # define assert(c) stmnt( if (!(c)){ assertBreak(); } ) #else @@ -319,6 +323,31 @@ typedef enum Utf8Character { Utf8Character_Count, } Utf8Character; +typedef enum FieldType { + FieldTypeU8, + FieldTypeU16, + FieldTypeU32, + FieldTypeFloat, + FieldTypeString, + FieldTypeEnum, + FieldType_Count, +} FieldType; + +typedef struct FieldDescriptor { + str name; + FieldType type; + size_t offset; + int width; // column width for display + str* enum_vals; +} FieldDescriptor; + +typedef struct TableDrawInfo { + u32 x_offset; + u32 y_offset; + u32 rows; + u32 cols; +} TableDrawInfo; + typedef struct Box { u32 x; u32 y; @@ -336,6 +365,11 @@ typedef struct Pos2 { u16 y; } Pos2; +typedef struct Pos2u8 { + u8 x; + u8 y; +} Pos2u8; + typedef union Range1u32 Range1u32; union Range1u32 { @@ -399,6 +433,7 @@ union Range1f32 # include # include # include +# include typedef struct { DWORD input_mode; DWORD output_mode; @@ -468,6 +503,8 @@ global const u64 MAX_u64 = 0xffffffffffffffffull; global const u32 MAX_u32 = 0xffffffff; global const u16 MAX_u16 = 0xffff; global const u8 MAX_u8 = 0xff; +#define EULERS_E (2.71828) +#define PI (3.14159265358979323846) ///// CUSTOM ENTRY POINT /* TODO? diff --git a/src/base/serialize.c b/src/base/serialize.c index ecb304d..93e0815 100644 --- a/src/base/serialize.c +++ b/src/base/serialize.c @@ -34,6 +34,17 @@ fn u64 writeU16ToBufferLE(u8* buffer, u16 value) { return 2;// number of bytes written } +fn u64 writeF32ToBufferLE(u8* buffer, f32 value) { + u32 bits; + memcpy(&bits, &value, sizeof(u32)); // reinterpret float bits as integer + + buffer[0] = (u8)(bits & 0xFF); + buffer[1] = (u8)((bits >> 8) & 0xFF); + buffer[2] = (u8)((bits >> 16) & 0xFF); + buffer[3] = (u8)((bits >> 24) & 0xFF); + return 4;// number of bytes written +} + fn u64 readU64FromBufferLE(u8 *buffer) { return (u64)buffer[0] | ((u64)buffer[1] << 8) | @@ -64,3 +75,15 @@ fn u16 readU16FromBufferLE(u8 *buffer) { ((u16)buffer[1] << 8); } +fn f32 readF32FromBufferLE(u8 *buf) { + u32 bits = 0; + bits |= (u32)(u8)buf[0] << 0; + bits |= (u32)(u8)buf[1] << 8; + bits |= (u32)(u8)buf[2] << 16; + bits |= (u32)(u8)buf[3] << 24; + + f32 value; + memcpy(&value, &bits, sizeof(f32)); + return value; +} +