#ifndef DYNAMIC_TYPING_ #define DYNAMIC_TYPING_ enum TYPE_KIND { TY_BASIC, TY_ARRAY, TY_POINTER, TY_FUNCTION, TY_STRUCT, TY_UNION, }; struct type { enum TYPE_KIND kind; unsigned long size; // basic types: const char *basic; // array & pointer types: struct type *base; unsigned long length; // struct & union types struct type *members; struct type *next_member; unsigned long offset; const char *field_name; // function types: struct type *return_type; struct type *params; struct type *next_param; }; struct type *dynamic_typeof(void *ptr); struct type *make_basic(const char *type, unsigned long size); struct type *make_array(struct type *base, unsigned long len); struct type *make_pointer(struct type *base); // function not supported yet // for struct & union, the members are initialized by the caller struct type *make_struct(unsigned long size); struct type *make_union(unsigned long size); void prepend_member(struct type *aggregate, struct type *member, const char *name, unsigned long offset); void annotate_type(void *ptr, struct type *type); #endif