authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2015-12-03 16:12:10-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2015-12-03 16:12:10-07:00
log96d4d0d674980a6358c934547ee138aa74682e1b
tree9ff0659a6b064cd562ba1252bfefad6837e29a84
parentad3f98c615e688387c2d3580321ab17965b21378

parseh: detect fixed size integer types


1 files changed, 36 insertions(+), 8 deletions(-)

src/parseh.cpp+36-8
......@@ -61,12 +61,17 @@ start_over:
6161}
6262
6363static Buf *to_zig_type(CXType raw_type) {
64 CXType canonical = clang_getCanonicalType(raw_type);
65 switch (canonical.kind) {
64 if (raw_type.kind == CXType_Unexposed) {
65 CXType canonical = clang_getCanonicalType(raw_type);
66 if (canonical.kind != CXType_Unexposed)
67 return to_zig_type(canonical);
68 else
69 zig_panic("clang C api insufficient");
70 }
71 switch (raw_type.kind) {
6672 case CXType_Invalid:
67 zig_unreachable();
6873 case CXType_Unexposed:
69 zig_panic("clang C api insufficient");
74 zig_unreachable();
7075 case CXType_Void:
7176 return buf_create_from_str("void");
7277 case CXType_Bool:
......@@ -125,7 +130,7 @@ static Buf *to_zig_type(CXType raw_type) {
125130 zig_panic("TODO");
126131 case CXType_Pointer:
127132 {
128 CXType pointee_type = clang_getPointeeType(canonical);
133 CXType pointee_type = clang_getPointeeType(raw_type);
129134 Buf *pointee_buf = to_zig_type(pointee_type);
130135 if (clang_isConstQualifiedType(pointee_type)) {
131136 return buf_sprintf("*const %s", buf_ptr(pointee_buf));
......@@ -141,16 +146,39 @@ static Buf *to_zig_type(CXType raw_type) {
141146 zig_panic("TODO");
142147 case CXType_Record:
143148 {
144 const char *name = prefixes_stripped(canonical);
149 const char *name = prefixes_stripped(raw_type);
145150 return buf_sprintf("%s", name);
146151 }
147152 case CXType_Enum:
148153 {
149 const char *name = prefixes_stripped(canonical);
154 const char *name = prefixes_stripped(raw_type);
150155 return buf_sprintf("%s", name);
151156 }
152157 case CXType_Typedef:
153 zig_panic("TODO");
158 {
159 const char *name = prefixes_stripped(raw_type);
160 if (strcmp(name, "int8_t") == 0) {
161 return buf_create_from_str("i8");
162 } else if (strcmp(name, "uint8_t") == 0) {
163 return buf_create_from_str("u8");
164 } else if (strcmp(name, "uint16_t") == 0) {
165 return buf_create_from_str("u16");
166 } else if (strcmp(name, "uint32_t") == 0) {
167 return buf_create_from_str("u32");
168 } else if (strcmp(name, "uint64_t") == 0) {
169 return buf_create_from_str("u64");
170 } else if (strcmp(name, "int16_t") == 0) {
171 return buf_create_from_str("i16");
172 } else if (strcmp(name, "int32_t") == 0) {
173 return buf_create_from_str("i32");
174 } else if (strcmp(name, "int64_t") == 0) {
175 return buf_create_from_str("i64");
176 } else {
177 CXCursor typedef_cursor = clang_getTypeDeclaration(raw_type);
178 CXType underlying_type = clang_getTypedefDeclUnderlyingType(typedef_cursor);
179 return to_zig_type(underlying_type);
180 }
181 }
154182 case CXType_ObjCInterface:
155183 zig_panic("TODO");
156184 case CXType_ObjCObjectPointer: