#ifndef _PLY_TYPE_H #define _PLY_TYPE_H #include #include typedef struct type type_t; struct t_tdef { char *name; type_t *type; }; struct t_scalar { char *name; }; struct t_pointer { type_t *type; }; struct t_array { type_t *type; size_t len; }; struct t_map { type_t *vtype; type_t *ktype; size_t len; }; typedef struct field { char *name; type_t *type; size_t offset; } field_t; struct t_sou { char *name; int packed:1; field_t *fields; }; struct t_func { char *name; type_t *type; field_t *args; }; typedef enum ttype { T_TYPEDEF, T_SCALAR, T_POINTER, T_ARRAY, T_MAP, T_STRUCT, T_UNION, T_FUNC, } ttype_t; struct type { size_t size; ttype_t ttype; union { struct t_tdef tdef; struct t_scalar scalar; struct t_pointer pointer; struct t_array array; struct t_map map; struct t_sou sou; struct t_func func; } t; }; extern type_t t_v; extern type_t t_vp; extern type_t t_c; extern type_t t_cp; extern type_t t_uc; extern type_t t_ucp; extern type_t t_s; extern type_t t_sp; extern type_t t_us; extern type_t t_usp; extern type_t t_i; extern type_t t_ip; extern type_t t_ui; extern type_t t_uip; extern type_t t_l; extern type_t t_lp; extern type_t t_ul; extern type_t t_ulp; extern type_t t_ll; extern type_t t_llp; extern type_t t_ull; extern type_t t_ullp; int type_equal(type_t *a, type_t *b); int type_add(type_t *t); int type_add_list(type_t **ts); void type_dump (type_t *t, FILE *fp); void type_dump_cdecl(type_t *t, FILE *fp); void types_dump_cdecl(FILE *fp); #endif /* _PLY_TYPE_H */