6 static struct obstack _type_obst;
7 struct obstack *type_obst = &_type_obst;
11 obstack_init(type_obst);
16 obstack_free(type_obst, NULL);
20 void print_type_qualifiers(FILE *out, const type_t *type)
22 unsigned qualifiers = type->qualifiers;
23 if(qualifiers & TYPE_QUALIFIER_CONST) {
26 if(qualifiers & TYPE_QUALIFIER_VOLATILE) {
27 fputs("volatile ", out);
29 if(qualifiers & TYPE_QUALIFIER_RESTRICT) {
30 fputs("restrict ", out);
32 if(qualifiers & TYPE_QUALIFIER_INLINE) {
33 fputs("inline ", out);
38 void print_atomic_type(FILE *out, const atomic_type_t *type)
40 print_type_qualifiers(out, & type->type);
43 case ATOMIC_TYPE_INVALID: fputs("INVALIDATOMIC", out); return;
44 case ATOMIC_TYPE_VOID: fputs("void", out); return;
45 case ATOMIC_TYPE_BOOL: fputs("bool", out); return;
46 case ATOMIC_TYPE_CHAR: fputs("char", out); return;
47 case ATOMIC_TYPE_SCHAR: fputs("signed char", out); return;
48 case ATOMIC_TYPE_UCHAR: fputs("unsigned char", out); return;
49 case ATOMIC_TYPE_INT: fputs("int", out); return;
50 case ATOMIC_TYPE_UINT: fputs("unsigned int", out); return;
51 case ATOMIC_TYPE_SHORT: fputs("short", out); return;
52 case ATOMIC_TYPE_USHORT: fputs("unsigned short", out); return;
53 case ATOMIC_TYPE_LONG: fputs("long", out); return;
54 case ATOMIC_TYPE_ULONG: fputs("unsigned long", out); return;
55 case ATOMIC_TYPE_LONGLONG: fputs("long long", out); return;
56 case ATOMIC_TYPE_ULONGLONG: fputs("unsigned long long", out); return;
57 case ATOMIC_TYPE_LONG_DOUBLE: fputs("long double", out); return;
58 case ATOMIC_TYPE_FLOAT: fputs("float", out); return;
59 case ATOMIC_TYPE_DOUBLE: fputs("double", out); return;
61 fputs("UNKNOWNATOMIC", out);
65 void print_method_type(FILE *out, const method_type_t *type)
67 print_type_qualifiers(out, & type->type);
70 print_type(out, type->result_type);
73 if(type->abi_style != NULL) {
74 fprintf(out, "\"%s\" ", type->abi_style);
76 fputs("method(", out);
77 method_parameter_type_t *param_type = type->parameter_types;
79 while(param_type != NULL) {
85 print_type(out, param_type->type);
86 param_type = param_type->next;
92 void print_pointer_type(FILE *out, const pointer_type_t *type)
94 print_type(out, type->points_to);
96 print_type_qualifiers(out, &type->type);
99 void print_type(FILE *out, const type_t *type)
102 fputs("nil type", out);
108 fputs("invalid", out);
111 print_type_qualifiers(out, type);
112 fputs("enum (TODO)", out);
115 print_atomic_type(out, (const atomic_type_t*) type);
117 case TYPE_COMPOUND_STRUCT:
118 case TYPE_COMPOUND_UNION:
119 print_type_qualifiers(out, type);
120 if(((const compound_type_t*) type)->symbol != NULL) {
121 fprintf(out, "%s", ((const compound_type_t*) type)->symbol->string);
125 fputs(((builtin_type_t*) type)->symbol->string, out);
128 print_method_type(out, (const method_type_t*) type);
131 print_pointer_type(out, (const pointer_type_t*) type);
134 fputs("unknown", out);
137 int type_valid(const type_t *type)
139 return type->type != TYPE_INVALID;
142 int is_type_int(const type_t *type)
144 if(type->type != TYPE_ATOMIC)
147 atomic_type_t *atomic_type = (atomic_type_t*) type;
148 switch(atomic_type->atype) {
149 case ATOMIC_TYPE_CHAR:
150 case ATOMIC_TYPE_SCHAR:
151 case ATOMIC_TYPE_UCHAR:
152 case ATOMIC_TYPE_SHORT:
153 case ATOMIC_TYPE_USHORT:
154 case ATOMIC_TYPE_INT:
155 case ATOMIC_TYPE_UINT:
156 case ATOMIC_TYPE_LONG:
157 case ATOMIC_TYPE_ULONG:
158 case ATOMIC_TYPE_LONGLONG:
159 case ATOMIC_TYPE_ULONGLONG:
166 static __attribute__((unused))
167 void dbg_type(const type_t *type)
169 print_type(stdout,type);