diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-09-21 18:38:55 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2020-09-21 18:38:55 -0700 |
| commit | 528832bd3a2e7b686ee84aef5887df740a6114db (patch) | |
| tree | 90ccff9faa2ba2604c8538aeec0a147a4b01148c /src/Package.zig | |
| parent | b9f61d401502f5d221e72c0d0e3bf448b11dcd68 (diff) | |
| download | zig-528832bd3a2e7b686ee84aef5887df740a6114db.tar.gz zig-528832bd3a2e7b686ee84aef5887df740a6114db.zip | |
rename src-self-hosted/ to src/
Diffstat (limited to 'src/Package.zig')
| -rw-r--r-- | src/Package.zig | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/Package.zig b/src/Package.zig new file mode 100644 index 0000000000..14be8b64d6 --- /dev/null +++ b/src/Package.zig @@ -0,0 +1,61 @@ +pub const Table = std.StringHashMapUnmanaged(*Package); + +root_src_directory: Compilation.Directory, +/// Relative to `root_src_directory`. May contain path separators. +root_src_path: []const u8, +table: Table = .{}, + +const std = @import("std"); +const mem = std.mem; +const Allocator = std.mem.Allocator; +const assert = std.debug.assert; +const Package = @This(); +const Compilation = @import("Compilation.zig"); + +/// No references to `root_src_dir` and `root_src_path` are kept. +pub fn create( + gpa: *Allocator, + base_directory: Compilation.Directory, + /// Relative to `base_directory`. + root_src_dir: []const u8, + /// Relative to `root_src_dir`. + root_src_path: []const u8, +) !*Package { + const ptr = try gpa.create(Package); + errdefer gpa.destroy(ptr); + + const root_src_dir_path = try base_directory.join(gpa, &[_][]const u8{root_src_dir}); + errdefer gpa.free(root_src_dir_path); + + const root_src_path_dupe = try mem.dupe(gpa, u8, root_src_path); + errdefer gpa.free(root_src_path_dupe); + + ptr.* = .{ + .root_src_directory = .{ + .path = root_src_dir_path, + .handle = try base_directory.handle.openDir(root_src_dir, .{}), + }, + .root_src_path = root_src_path_dupe, + }; + return ptr; +} + +pub fn destroy(pkg: *Package, gpa: *Allocator) void { + pkg.root_src_directory.handle.close(); + gpa.free(pkg.root_src_path); + if (pkg.root_src_directory.path) |p| gpa.free(p); + { + var it = pkg.table.iterator(); + while (it.next()) |kv| { + gpa.free(kv.key); + } + } + pkg.table.deinit(gpa); + gpa.destroy(pkg); +} + +pub fn add(pkg: *Package, gpa: *Allocator, name: []const u8, package: *Package) !void { + try pkg.table.ensureCapacity(gpa, pkg.table.items().len + 1); + const name_dupe = try mem.dupe(gpa, u8, name); + pkg.table.putAssumeCapacityNoClobber(name_dupe, package); +} |
