#ifndef _PLY_TYPE_H #define _PLY_TYPE_H typedef unsigned int tid_t; typedef struct alias { tid_t type; char *name; } alias_t; typedef struct scalar { char *name; } scalar_t; typedef struct pointer { tid_t type; } pointer_t; typedef struct array { tid_t type; size_t len; } array_t; typedef struct map { tid_t type; tid_t ktype; size_t len; } map_t; typedef struct field { struct field *next; tid_t type; size_t offset; char *name; } field_t; typedef struct sou { field_t *fields; } sou_t; typedef enum ttype { T_INVALID, T_NONE, T_ALIAS, T_SCALAR, T_POINTER, T_ARRAY, T_MAP, T_SOU, } ttype_t; typedef struct type { tid_t tid; size_t size; ttype_t type; union { alias_t alias; scalar_t scalar; pointer_t pointer; array_t array; map_t map; sou_t sou; } t; } type_t; typedef struct types { type_t *types; tid_t next; } types_t; #define BUILTIN_TYPES \ SCALAR(1, tid_v, void) \ POINTER(2, tid_vp, 1) \ \ SCALAR(3, tid_c, char) \ POINTER(4, tid_cp, 3) \ SCALAR(5, tid_uc, unsigned char) \ POINTER(6, tid_ucp, 5) \ \ SCALAR(7, tid_s, short) \ POINTER(8, tid_sp, 7) \ SCALAR(9, tid_us, unsigned short) \ POINTER(10, tid_usp, 9) \ \ SCALAR(11, tid_i, int) \ POINTER(12, tid_ip, 11) \ SCALAR(13, tid_ui, unsigned int) \ POINTER(14, tid_uip, 13) \ \ SCALAR(15, tid_l, long) \ POINTER(16, tid_lp, 15) \ SCALAR(17, tid_ul, unsigned long) \ POINTER(18, tid_ulp, 17) \ \ SCALAR(19, tid_ll, long long) \ POINTER(20, tid_llp, 19) \ SCALAR(21, tid_ull, unsigned long long) \ POINTER(22, tid_ullp, 21) typedef enum builtin_type { tid_none = 0, #define SCALAR(_tid, _name, _) _name = _tid, #define POINTER(_tid, _name, _) _name = _tid, BUILTIN_TYPES #undef SCALAR #undef POINTER } builtin_type_t; #endif /* _PLY_TYPE_H */