#pragma once #define FLAG_POINTER 0x0001 #define FLAG_BITFIELD 0x0002 #define FLAG_UNNAMED 0x0004 #define FLAG_COMPOSITE 0x0008 #define FLAG_UNION 0x0010 #define FLAG_SIGNED 0x0020 #define FLAG_FLOAT 0x0040 #define FLAG_BIG_ENDIAN 0x0080 #define FLAG_PRIMITIVE 0x0100 #define FLAG_ENUM 0x0200 #define FLAG_ENUM_ELEMENT 0x0400 #define FLAG_TYPEDEF 0x0800 #define FLAG_VALUE_INITED 0x1000 #define FIELD_FLAGS 0x1fff #define PRIMITIVE_FLAGS 0x00ff #define FLAG_UNUSABLE 0x4000 #define FLAG_UNRECOGNISED 0x8000 #define FLAG_AVAILABLE 0x10000 #define FLAG_OCCUPIED 0x80000000 #define FLAG_NEW 0x40000000 #define FLAG_EXTERNAL 0x20000000 struct Struct; struct Field { int field_name_idx; // These would be strings, except that they point into a String_Vector int type_name_idx; Struct *st; // The struct/union that the field refers to, if it's a composite field Struct *this_st; // The struct that the field originally belongs to Struct *paste_st; // The struct that this field currently lives in char *parent_tag; // Used for the accumulated name of the struct that owns this field int paste_array_idx; // In case this field is embedded inside an array of structs, this keeps track of the struct index int paste_field; // Refers to the field where the this field's original struct has been embedded/instantiated/pasted int index; // The index of this field within its original struct int bit_offset; int bit_size; int default_bit_size; int array_len; int pointer_levels; u32 flags; Value64 value; void reset() { memset(this, 0, sizeof(Field)); field_name_idx = type_name_idx = paste_field = paste_array_idx = index = -1; } }; struct Field_Vector { Field *data = nullptr; int pool_size = 8; int n_fields = 0; Field_Vector(); ~Field_Vector(); void expand(); Field& back(); Field& add(Field& f); Field& add_blank(); void cancel_latest(); void zero_out(); }; struct Struct { int name_idx; int offset; int total_size; int longest_primitive; u32 flags; Field_Vector fields; }; bool is_struct_usable(Struct *s); void set_primitives(Map& definitions); Value64 evaluate_number(const char *token, bool as_float = false); int get_full_field_name(Field& field, String_Vector& name_vector, String_Vector& out_vec); void tokenize(String_Vector& tokens, const char *text, int sz); void parse_typedefs_and_enums(Map& definitions, String_Vector& tokens); void parse_c_struct(std::vector& structs, char **tokens, String_Vector& name_vector, Map& definitions, Struct *st = nullptr);