-
Notifications
You must be signed in to change notification settings - Fork 5
/
17typedef.c
84 lines (64 loc) · 2.14 KB
/
17typedef.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "common.h"
struct sTypedefNode
{
string mTypeName;
sType*% mType;
int sline;
string sname;
};
sTypedefNode*% sTypedefNode*::initialize(sTypedefNode*% self, string type_name, sType*% type, sInfo* info)
{
self.sline = info.sline;
self.sname = string(info.sname);
self.mTypeName = string(type_name);
self.mType = clone type;
return self;
}
bool sTypedefNode*::terminated()
{
return true;
}
bool sTypedefNode*::compile(sTypedefNode* self, sInfo* info)
{
string type_name = string(self.mTypeName);
if(type_name === "__darwin_va_list") {
info.classes.insert(string("__darwin_va_list"), new sClass("__darwin_va_list", number:true));
sType*% type = new sType("__darwin_va_list", info);
type->mOriginalTypeName = string("__darwin_va_list");
info.types.insert(string(type_name), clone type);
add_come_code_at_source_head(info, "typedef __builtin_va_list __darwin_va_list;\n");
}
else {
sType*% type = clone self.mType;
if(type_name !== "va_list") {
type->mOriginalTypeName = string(type_name);
}
info.types.insert(string(type_name), clone type);
add_come_code_at_source_head(info, "typedef %s;\n", make_define_var(type, type_name, info, true@in_header));
}
return true;
}
int sTypedefNode*::sline(sTypedefNode* self, sInfo* info)
{
return self.sline;
}
string sTypedefNode*::sname(sTypedefNode* self, sInfo* info)
{
return string(self.sname);
}
sNode*% top_level(string buf, char* head, int head_sline, sInfo* info) version 95
{
if(buf === "typedef") {
bool in_typedef = info.in_typedef;
info.in_typedef = true;
var type, type_name,err = parse_type(info, true@parse_variable_name);
if(!err) {
printf("%s %d: parse_type failed\n", info->sname, info->sline);
exit(2);
}
info.in_typedef = false;
info.in_typedef = in_typedef;
return new sNode(new sTypedefNode(type_name, type, info));
}
return inherit(string(buf), head, head_sline, info);
}