diff --git a/src/DB.zig b/src/DB.zig index d602688..fa4de40 100644 --- a/src/DB.zig +++ b/src/DB.zig @@ -12,7 +12,6 @@ const BoundedArray = std.BoundedArray; const ErrCtx = @import("ErrCtx.zig"); const Corpus = @import("Corpus.zig"); -const pad = @import("padding.zig"); const compress = @import("compress.zig"); const Group = @import("Group.zig"); const CGroup = Group.CGroup; @@ -195,7 +194,7 @@ pub fn iov(self: *align(8) const DB) BoundedArray(os.iovec_const, DB_fields.len .iov_base = bytes.ptr, .iov_len = bytes.len, }); - const padding = pad.until(usize, section_length_bits, bytes.len); + const padding = mem.alignForward(bytes.len, section_length) - bytes.len; if (padding != 0) result.appendAssumeCapacity(.{ .iov_base = zeroes, @@ -592,7 +591,7 @@ fn usersSection( gids.idx2offset[i], shells.shell2idx, ); - try pad.arrayList(&blob, PackedUser.alignment_bits); + try blob.appendNTimes(0, mem.alignForward(blob.items.len, 8) - blob.items.len); } return UsersSection{ .len = @intCast(u32, corpus.users.len), @@ -680,7 +679,7 @@ fn groupsSection( .members_offset = members_offset[i], }; try PackedGroup.packTo(&blob, group_stored); - try pad.arrayList(&blob, PackedGroup.alignment_bits); + try blob.appendNTimes(0, mem.alignForward(blob.items.len, 8) - blob.items.len); } return GroupsSection{ @@ -727,7 +726,7 @@ pub fn nblocks_n(comptime T: type, nbytes: usize) T { u64 => u70, else => @compileError("got " ++ @typeName(T) ++ ", only u8, u32 and u64 are supported"), }; - const upper = pad.roundUp(B, section_length_bits, @intCast(B, nbytes)); + const upper = @intCast(B, mem.alignForward(nbytes, section_length)); assert(upper & (section_length - 1) == 0); return @truncate(T, upper >> section_length_bits); } diff --git a/src/PackedGroup.zig b/src/PackedGroup.zig index 30730e5..f4e1e94 100644 --- a/src/PackedGroup.zig +++ b/src/PackedGroup.zig @@ -6,7 +6,6 @@ const Allocator = mem.Allocator; const ArrayListAligned = std.ArrayListAligned; const BufSet = std.BufSet; -const pad = @import("padding.zig"); const validate = @import("validate.zig"); const compress = @import("compress.zig"); const InvalidRecord = validate.InvalidRecord; @@ -55,7 +54,7 @@ pub fn fromBytes(bytes: []align(8) const u8) Entry { .groupdata = bytes[start_blob..end_strings], .members_offset = members_offset.value, }, - .end = pad.roundUp(usize, alignment_bits, end_blob), + .end = mem.alignForward(end_blob, 8), }; } @@ -145,7 +144,7 @@ test "PackedGroup construct" { for (groups) |group| { try PackedGroup.packTo(&buf, group); - try pad.arrayList(&buf, PackedGroup.alignment_bits); + try buf.appendNTimes(0, mem.alignForward(buf.items.len, 8) - buf.items.len); } var i: u29 = 0; diff --git a/src/PackedUser.zig b/src/PackedUser.zig index e6fc7fb..d9a7645 100644 --- a/src/PackedUser.zig +++ b/src/PackedUser.zig @@ -7,7 +7,6 @@ const ArrayListAligned = std.ArrayListAligned; const StringHashMap = std.StringHashMap; const fieldInfo = std.meta.fieldInfo; -const pad = @import("padding.zig"); const validate = @import("validate.zig"); const compress = @import("compress.zig"); const ShellReader = @import("shell.zig").ShellReader; @@ -99,7 +98,7 @@ pub fn fromBytes(blob: []align(8) const u8) Entry { .var_payload = blob[start_var_payload..end_payload], .additional_gids_offset = gids_offset.value, }, - .end = pad.roundUp(usize, alignment_bits, end_payload), + .end = mem.alignForward(end_payload, 8), }; } @@ -292,7 +291,7 @@ test "PackedUser construct section" { defer shellIndex.deinit(); for (users) |user| { try PackedUser.packTo(&buf, user, additional_gids, shellIndex); - try pad.arrayList(&buf, PackedUser.alignment_bits); + try buf.appendNTimes(0, mem.alignForward(buf.items.len, 8) - buf.items.len); } var i: u29 = 0; diff --git a/src/padding.zig b/src/padding.zig deleted file mode 100644 index a1dd78f..0000000 --- a/src/padding.zig +++ /dev/null @@ -1,53 +0,0 @@ -const std = @import("std"); -const assert = std.debug.assert; -const Allocator = std.mem.Allocator; -const ArrayListAligned = std.ArrayListAligned; - -// rounds up an int to the nearest factor of nbits. -pub fn roundUp(comptime T: type, comptime nbits: u8, n: T) T { - comptime assert(nbits < @bitSizeOf(T)); - const factor = comptime (1 << nbits) - 1; - return ((n + factor) & ~@as(T, factor)); -} - -// rounds up an integer to the nearest factor of nbits and returns the -// difference (padding) -pub fn until(comptime T: type, comptime nbits: u8, n: T) T { - return roundUp(T, nbits, n) - n; -} - -// arrayList adds padding to an ArrayListAligned(u8, 8) for a given number of nbits -pub fn arrayList(arr: *ArrayListAligned(u8, 8), comptime nbits: u8) Allocator.Error!void { - const padding = until(u64, nbits, arr.items.len); - try arr.*.appendNTimes(0, padding); -} - -const testing = std.testing; - -test "padding" { - try testing.expectEqual(until(u12, 2, 0), 0); - try testing.expectEqual(until(u12, 2, 1), 3); - try testing.expectEqual(until(u12, 2, 2), 2); - try testing.expectEqual(until(u12, 2, 3), 1); - try testing.expectEqual(until(u12, 2, 4), 0); - try testing.expectEqual(until(u12, 2, 40), 0); - try testing.expectEqual(until(u12, 2, 41), 3); - try testing.expectEqual(until(u12, 2, 42), 2); - try testing.expectEqual(until(u12, 2, 43), 1); - try testing.expectEqual(until(u12, 2, 44), 0); - try testing.expectEqual(until(u12, 2, 4091), 1); - try testing.expectEqual(until(u12, 2, 4092), 0); -} - -test "padding arrayList" { - var buf = try ArrayListAligned(u8, 8).initCapacity(testing.allocator, 16); - defer buf.deinit(); - - buf.appendAssumeCapacity(1); - try arrayList(&buf, 3); - try testing.expectEqual(buf.items.len, 8); - - buf.appendAssumeCapacity(2); - try arrayList(&buf, 10); - try testing.expectEqual(buf.items.len, 1024); -} diff --git a/src/test_all.zig b/src/test_all.zig index dc9ae7a..a149b8b 100644 --- a/src/test_all.zig +++ b/src/test_all.zig @@ -10,7 +10,6 @@ test "turbonss test suite" { _ = @import("libnss.zig"); _ = @import("PackedGroup.zig"); _ = @import("PackedUser.zig"); - _ = @import("padding.zig"); _ = @import("shell.zig"); _ = @import("User.zig"); _ = @import("validate.zig");