authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-28 20:31:00-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-31 22:10:11-07:00
log63f496c4f9a44e145362d3b851d46e9326ecf1c2
tree56cd3717a5cbddfa99ec9864db2872779ac76959
parentc00fb86db6a9d1f1eb0684304eeb79b1f12bb805

make takeBits deal with integers only


1 files changed, 11 insertions(+), 25 deletions(-)

lib/std/compress/flate/Decompress.zig+11-25
......@@ -216,7 +216,7 @@ fn readInner(d: *Decompress, w: *Writer, limit: std.Io.Limit) (Error || Reader.S
216216 },
217217 .block_header => {
218218 d.final_block = (try d.takeBits(u1)) != 0;
219 const block_type = try d.takeBits(BlockType);
219 const block_type: BlockType = @enumFromInt(try d.takeBits(u2));
220220 switch (block_type) {
221221 .stored => {
222222 d.alignBitsToByte(); // skip padding until byte boundary
......@@ -372,41 +372,31 @@ fn writeMatch(w: *Writer, length: u16, distance: u16) !void {
372372 for (dest, src) |*d, s| d.* = s;
373373}
374374
375fn takeBits(d: *Decompress, comptime T: type) !T {
376 const U = @Type(.{ .int = .{ .signedness = .unsigned, .bits = @bitSizeOf(T) } });
375fn takeBits(d: *Decompress, comptime U: type) !U {
377376 const remaining_bits = d.remaining_bits;
378377 const next_bits = d.next_bits;
379 if (remaining_bits >= @bitSizeOf(T)) {
378 if (remaining_bits >= @bitSizeOf(U)) {
380379 const u: U = @truncate(next_bits);
381 d.next_bits = next_bits >> @bitSizeOf(T);
382 d.remaining_bits = remaining_bits - @bitSizeOf(T);
383 return switch (@typeInfo(T)) {
384 .int => u,
385 .@"enum" => @enumFromInt(u),
386 else => @bitCast(u),
387 };
380 d.next_bits = next_bits >> @bitSizeOf(U);
381 d.remaining_bits = remaining_bits - @bitSizeOf(U);
382 return u;
388383 }
389384 const in = d.input;
390385 const next_int = in.takeInt(usize, .little) catch |err| switch (err) {
391386 error.ReadFailed => return error.ReadFailed,
392 error.EndOfStream => return takeBitsEnding(d, T),
387 error.EndOfStream => return takeBitsEnding(d, U),
393388 };
394 const needed_bits = @bitSizeOf(T) - remaining_bits;
389 const needed_bits = @bitSizeOf(U) - remaining_bits;
395390 const u: U = @intCast(((next_int & ((@as(usize, 1) << needed_bits) - 1)) << remaining_bits) | next_bits);
396391 d.next_bits = next_int >> needed_bits;
397392 d.remaining_bits = @intCast(@bitSizeOf(usize) - @as(usize, needed_bits));
398 return switch (@typeInfo(T)) {
399 .int => u,
400 .@"enum" => @enumFromInt(u),
401 else => @bitCast(u),
402 };
393 return u;
403394}
404395
405fn takeBitsEnding(d: *Decompress, comptime T: type) !T {
396fn takeBitsEnding(d: *Decompress, comptime U: type) !U {
406397 const remaining_bits = d.remaining_bits;
407398 const next_bits = d.next_bits;
408399 const in = d.input;
409 const U = @Type(.{ .int = .{ .signedness = .unsigned, .bits = @bitSizeOf(T) } });
410400 var u: U = 0;
411401 var remaining_needed_bits = @bitSizeOf(U) - remaining_bits;
412402 while (@bitSizeOf(U) >= 8 and remaining_needed_bits >= 8) {
......@@ -424,11 +414,7 @@ fn takeBitsEnding(d: *Decompress, comptime T: type) !T {
424414 d.remaining_bits = @intCast(8 - remaining_needed_bits);
425415 }
426416 u = @intCast((@as(usize, u) << remaining_bits) | next_bits);
427 return switch (@typeInfo(T)) {
428 .int => u,
429 .@"enum" => @enumFromInt(u),
430 else => @bitCast(u),
431 };
417 return u;
432418}
433419
434420fn peekBits(d: *Decompress, comptime U: type) !U {