authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-28 20:44:50-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-07-31 22:10:11-07:00
log5bc63794cc9f38801e674d306c2c9ef4ccf92f13
treeb1cd93cb8ba0e270791628d3ddbcecdc2823739b
parent63f496c4f9a44e145362d3b851d46e9326ecf1c2

fix takeBitsEnding


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

lib/std/compress/flate/Decompress.zig+11-17
...@@ -397,23 +397,17 @@ fn takeBitsEnding(d: *Decompress, comptime U: type) !U {...@@ -397,23 +397,17 @@ fn takeBitsEnding(d: *Decompress, comptime U: type) !U {
397 const remaining_bits = d.remaining_bits;397 const remaining_bits = d.remaining_bits;
398 const next_bits = d.next_bits;398 const next_bits = d.next_bits;
399 const in = d.input;399 const in = d.input;
400 var u: U = 0;400 const n = in.bufferedLen();
401 var remaining_needed_bits = @bitSizeOf(U) - remaining_bits;401 assert(n < @sizeOf(usize));
402 while (@bitSizeOf(U) >= 8 and remaining_needed_bits >= 8) {402 const needed_bits = @bitSizeOf(U) - remaining_bits;
403 const byte = try in.takeByte();403 if (n * 8 < needed_bits) return error.EndOfStream;
404 u = (u << 8) | byte;404 const next_int = in.takeVarInt(usize, .little, n) catch |err| switch (err) {
405 remaining_needed_bits -= 8;405 error.ReadFailed => return error.ReadFailed,
406 }406 error.EndOfStream => unreachable,
407 if (remaining_needed_bits == 0) {407 };
408 d.next_bits = 0;408 const u: U = @intCast(((next_int & ((@as(usize, 1) << needed_bits) - 1)) << remaining_bits) | next_bits);
409 d.remaining_bits = 0;409 d.next_bits = next_int >> needed_bits;
410 } else {410 d.remaining_bits = @intCast(n * 8 - @as(usize, needed_bits));
411 const byte = try in.takeByte();
412 u = @intCast((@as(usize, u) << remaining_needed_bits) | (byte & ((@as(usize, 1) << remaining_needed_bits) - 1)));
413 d.next_bits = @as(usize, byte) >> remaining_needed_bits;
414 d.remaining_bits = @intCast(8 - remaining_needed_bits);
415 }
416 u = @intCast((@as(usize, u) << remaining_bits) | next_bits);
417 return u;411 return u;
418}412}
419413