Registry: Structs

This commit is contained in:
Robin Voetter
2020-01-23 00:06:40 +01:00
parent 1d3f80c6a9
commit ab84fa591c
2 changed files with 33 additions and 19 deletions

View File

@@ -23,7 +23,7 @@ pub fn main() !void {
const registry = reg.generate(std.heap.page_allocator, spec.root); const registry = reg.generate(std.heap.page_allocator, spec.root);
defer registry.deinit(); defer registry.deinit();
// registry.dump(); registry.dump();
} }
test "main" { test "main" {

View File

@@ -97,7 +97,12 @@ pub const Registry = struct {
std.debug.warn("Structs:\n", .{}); std.debug.warn("Structs:\n", .{});
var it = self.structs.iterator(); var it = self.structs.iterator();
while (it.next()) |kv| { while (it.next()) |kv| {
std.debug.warn(" {} ({} fields)\n", .{kv.key, kv.value.members.count()}); std.debug.warn(" {}:\n", .{kv.key});
var member_it = kv.value.members.iterator(0);
while (member_it.next()) |member| {
std.debug.warn(" {} = {}\n", .{member.name, member.type_info});
}
} }
} }
@@ -190,24 +195,31 @@ const TypeInfo = struct {
return type_info; return type_info;
} }
fn dump(self: TypeInfo) void { pub fn format(
self: TypeInfo,
comptime fmt: []const u8,
options: std.fmt.FormatOptions,
context: var,
comptime Errors: type,
output: fn (@TypeOf(context), []const u8) Errors!void
) Errors!void {
for (self.pointers) |ptr| { for (self.pointers) |ptr| {
switch (ptr.size) { switch (ptr.size) {
.One => std.debug.warn("*", .{}), .One => try output(context, "*"),
.Many => std.debug.warn("[*]", .{}), .Many => try output(context, "[*]"),
.ZeroTerminated => std.debug.warn("[*:0]", .{}) .ZeroTerminated => try output(context, "[*:0]")
} }
if (ptr.is_const) { if (ptr.is_const) {
std.debug.warn("const ", .{}); try output(context, "const ");
} }
} }
if (self.array_size) |array_size| { if (self.array_size) |array_size| {
std.debug.warn("[{}]", .{array_size}); try std.fmt.format(context, Errors, output, "[{}]", .{array_size});
} }
std.debug.warn("{}", .{self.name}); try output(context, self.name);
} }
fn lenToPointerSize(len: []const u8) PointerSize { fn lenToPointerSize(len: []const u8) PointerSize {
@@ -224,18 +236,20 @@ const TypeInfo = struct {
const StructInfo = struct { const StructInfo = struct {
const Member = struct { const Member = struct {
name: []const u8, name: []const u8,
ty: TypeInfo, type_info: TypeInfo,
}; };
members: std.SegmentedList(Member, 0), members: std.SegmentedList(Member, 0),
extends: ?[]const u8,
fn init(allocator: *Allocator, extends: ?[]const u8) StructInfo { fn init(allocator: *Allocator) StructInfo {
return .{ return .{
.members = std.SegmentedList(Member, 0).init(allocator), .members = std.SegmentedList(Member, 0).init(allocator),
.extends = extends,
}; };
} }
fn addMember(self: *StructInfo, name: []const u8, type_info: TypeInfo) void {
self.members.push(.{.name = name, .type_info = type_info}) catch unreachable;
}
}; };
const HandleInfo = union(enum) { const HandleInfo = union(enum) {
@@ -412,20 +426,20 @@ fn processHandleType(registry: *Registry, ty: *xml.Element) void {
fn processStructType(registry: *Registry, ty: *xml.Element) void { fn processStructType(registry: *Registry, ty: *xml.Element) void {
const name = ty.getAttribute("name").?; const name = ty.getAttribute("name").?;
const extends = ty.getAttribute("structextends");
var s = StructInfo.init(&registry.arena.allocator, extends); if (ty.getAttribute("alias")) |alias| {
// TODO
return;
}
std.debug.warn("{}:\n", .{name}); var s = StructInfo.init(&registry.arena.allocator);
var members = ty.findChildrenByTag("member"); var members = ty.findChildrenByTag("member");
while (members.next()) |member| { while (members.next()) |member| {
const member_name = member.getCharData("name").?; const member_name = member.getCharData("name").?;
const type_info = TypeInfo.fromXml(&registry.arena.allocator, member); const type_info = TypeInfo.fromXml(&registry.arena.allocator, member);
std.debug.warn(" {} = ", .{member_name}); s.addMember(member_name, type_info);
type_info.dump();
std.debug.warn("\n", .{});
} }
if (registry.structs.put(name, s) catch unreachable) |_| unreachable; if (registry.structs.put(name, s) catch unreachable) |_| unreachable;