9 typedef struct _struct_member
13 struct _struct_member* next;
18 struct_member* member_list;
20 struct _type* type_value;
27 unsigned int default_sign;
28 struct_type* struct_desc;
31 static struct_type struct_types[255];
33 static int next_struct_slot_free = 0;
34 static struct_type* current_struct;
36 static type types[255] = {
38 {"boolean", BOOLEAN_TYPE, UNSIGNED_TYPE_OPTION},
39 {"byte", BYTE_TYPE, 0},
40 {"char", CHAR_TYPE, UNSIGNED_TYPE_OPTION},
41 {"double", DOUBLE_TYPE, 0},
42 {"enum", ENUM_TYPE, 0},
43 {"error_status_t", ERROR_STATUS_TYPE, UNSIGNED_TYPE_OPTION},
44 {"float", FLOAT_TYPE, 0},
45 {"handle_t", HANDLE_TYPE, 0},
46 {"hyper", HYPER_TYPE, SIGNED_TYPE_OPTION},
47 {"int", INT_TYPE, SIGNED_TYPE_OPTION},
48 {"__int32", INT32_TYPE, SIGNED_TYPE_OPTION},
49 {"__int3264", INT32OR64_TYPE, SIGNED_TYPE_OPTION},
50 {"__int64", INT64_TYPE, SIGNED_TYPE_OPTION},
51 {"long", LONG_TYPE, SIGNED_TYPE_OPTION},
52 {"short", SHORT_TYPE, SIGNED_TYPE_OPTION},
53 {"small", SMALL_TYPE, SIGNED_TYPE_OPTION},
54 {"void", VOID_TYPE, 0},
55 {"wchar_t", WCHAR_TYPE, UNSIGNED_TYPE_OPTION},
59 static int next_free_slot = 18;
61 unsigned int struct_to_type(char* tag)
65 for (i = 0; i < next_struct_slot_free; i++)
67 if (strcmp(tag, struct_types[i].tag) == 0)
69 return(struct_types[i].type_value->value);
75 void start_struct(char* tag)
82 sprintf(tag, "__unnamed_struct%d", next_struct_slot_free);
85 name = malloc(strlen("struct ") + strlen(tag) + 1);
86 strcpy(name, "struct ");
89 struct_types[next_struct_slot_free].tag = strdup(tag);
90 struct_types[next_struct_slot_free].member_list = NULL;
91 current_struct = &struct_types[next_struct_slot_free];
93 types[next_free_slot].name = name;
94 types[next_free_slot].value = next_free_slot << 8;
95 types[next_free_slot].default_sign = 0;
96 types[next_free_slot].struct_desc =
97 &struct_types[next_struct_slot_free];
99 struct_types[next_struct_slot_free].type_value = &types[next_free_slot];
101 next_struct_slot_free++;
105 void add_struct_member(char* name, unsigned int type)
107 struct_member* member;
109 member = malloc(sizeof(struct_member));
111 member->name = strdup(name);
112 member->value = type;
113 member->next = current_struct->member_list;
114 current_struct->member_list = member;
117 unsigned int end_struct(void)
122 printf("Defining struct %s {\n", current_struct->tag);
124 cur = current_struct->member_list;
127 print_type(cur->value);
128 printf(" %s\n", cur->name);
134 n = current_struct->type_value->value;
135 current_struct = NULL;
139 void add_typedef(char* name, int type)
141 printf("Adding typedef %s to ", name);
145 types[next_free_slot].name = strdup(name);
146 types[next_free_slot].value = type;
147 types[next_free_slot].default_sign = 0;
151 void print_type(int tval)
155 for (i = 1; i < next_free_slot; i++)
157 if ((tval & BASE_TYPE_MASK) == types[i].value)
159 if (tval & UNSIGNED_TYPE_OPTION)
163 if (tval & SIGNED_TYPE_OPTION)
167 printf("%s", types[i].name);
168 if (tval & POINTER_TYPE_OPTION)
175 printf("unknown type");
178 int token_to_type(char* token)
182 for (i = 1; i < next_free_slot; i++)
184 if (strcmp(types[i].name, token) == 0)
186 return(types[i].value);