start packed group
This commit is contained in:
parent
3bf1b3fc01
commit
b924e3a935
12
README.md
12
README.md
|
@ -180,10 +180,10 @@ referred by their byte offset in the `Users` and `Groups` section relative to
|
||||||
the beginning of the section.
|
the beginning of the section.
|
||||||
|
|
||||||
```
|
```
|
||||||
const PackedGroup = struct {
|
const PackedGroup = packed struct {
|
||||||
gid: u32,
|
gid: u32,
|
||||||
// index to a separate structure with a list of members. The memberlist is
|
// index to a separate structure with a list of members. The memberlist is
|
||||||
// always 2^5-byte aligned (32b), this is an index there.
|
// 2^5-byte aligned (32b), this is an index there.
|
||||||
members_offset: u27,
|
members_offset: u27,
|
||||||
groupname_len: u5,
|
groupname_len: u5,
|
||||||
// a groupname_len-sized string
|
// a groupname_len-sized string
|
||||||
|
@ -347,10 +347,10 @@ Each section is padded to 64 bytes.
|
||||||
```
|
```
|
||||||
STATUS SECTION SIZE DESCRIPTION
|
STATUS SECTION SIZE DESCRIPTION
|
||||||
✅ Header 48 see "Turbonss header" section
|
✅ Header 48 see "Turbonss header" section
|
||||||
bdz_gid ? bdz(gid)
|
✅ bdz_gid ? bdz(gid)
|
||||||
bdz_groupname ? bdz(groupname)
|
✅ bdz_groupname ? bdz(groupname)
|
||||||
bdz_uid ? bdz(uid)
|
✅ bdz_uid ? bdz(uid)
|
||||||
bdz_name ? bdz(username)
|
✅ bdz_name ? bdz(username)
|
||||||
idx_gid2group len(group)*29/8 bdz->offset Groups
|
idx_gid2group len(group)*29/8 bdz->offset Groups
|
||||||
idx_groupname2group len(group)*29/8 bdz->offset Groups
|
idx_groupname2group len(group)*29/8 bdz->offset Groups
|
||||||
idx_uid2user len(user)*29/8 bdz->offset Users
|
idx_uid2user len(user)*29/8 bdz->offset Users
|
||||||
|
|
|
@ -5,7 +5,7 @@ const c = @cImport({
|
||||||
@cInclude("bdz.h");
|
@cInclude("bdz.h");
|
||||||
});
|
});
|
||||||
|
|
||||||
pub fn search_packed(packed_mphf: []const u8, key: []const u8) error{Overflow}!u32 {
|
pub fn search(packed_mphf: []const u8, key: []const u8) error{Overflow}!u32 {
|
||||||
const bdz_start = @intToPtr(?*anyopaque, @ptrToInt(&packed_mphf[0]));
|
const bdz_start = @intToPtr(?*anyopaque, @ptrToInt(&packed_mphf[0]));
|
||||||
const len = try std.math.cast(c_uint, key.len);
|
const len = try std.math.cast(c_uint, key.len);
|
||||||
return @as(u32, c.bdz_search_packed(bdz_start, key.ptr, len));
|
return @as(u32, c.bdz_search_packed(bdz_start, key.ptr, len));
|
||||||
|
|
|
@ -59,7 +59,7 @@ test "basic pack/unpack" {
|
||||||
var used: [items_len]bool = undefined;
|
var used: [items_len]bool = undefined;
|
||||||
|
|
||||||
inline for (items) |elem| {
|
inline for (items) |elem| {
|
||||||
const hashed = try bdz.search_packed(buf, elem);
|
const hashed = try bdz.search(buf, elem);
|
||||||
used[hashed] = true;
|
used[hashed] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,19 @@
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
|
|
||||||
|
const PackedGroup = packed struct {
|
||||||
|
gid: u32,
|
||||||
|
members_offset: u27,
|
||||||
|
groupname_len: u5,
|
||||||
|
};
|
||||||
|
|
||||||
const Group = struct {
|
const Group = struct {
|
||||||
gid: u32,
|
gid: u32,
|
||||||
name: []const u8,
|
name: []const u8,
|
||||||
members: std.BufSet,
|
members: std.BufSet,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const testing = std.testing;
|
||||||
|
|
||||||
|
test "PackedGroup alignment" {
|
||||||
|
try testing.expectEqual(@sizeOf(PackedGroup) * 8, @bitSizeOf(PackedGroup));
|
||||||
|
}
|
||||||
|
|
|
@ -248,7 +248,7 @@ test "PackedUser internal and external alignment" {
|
||||||
// cannot be converted from/to [@bitSizeOf(PackedUser)/8]u8;
|
// cannot be converted from/to [@bitSizeOf(PackedUser)/8]u8;
|
||||||
// asBytes/bytesAsValue use @sizeOf, which is larger. Now we are putting no
|
// asBytes/bytesAsValue use @sizeOf, which is larger. Now we are putting no
|
||||||
// more than 1, but it probably could be higher.
|
// more than 1, but it probably could be higher.
|
||||||
try testing.expect(@bitSizeOf(PackedUser) - @sizeOf(PackedUser) * 8 <= 8);
|
try testing.expect(@sizeOf(PackedUser) * 8 - @bitSizeOf(PackedUser) <= 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn testShellIndex(shell: []const u8) ?u6 {
|
fn testShellIndex(shell: []const u8) ?u6 {
|
||||||
|
|
Loading…
Reference in New Issue