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...@@ -216,7 +216,7 @@ fn readInner(d: *Decompress, w: *Writer, limit: std.Io.Limit) (Error || Reader.S
216 },216 },
217 .block_header => {217 .block_header => {
218 d.final_block = (try d.takeBits(u1)) != 0;218 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));
220 switch (block_type) {220 switch (block_type) {
221 .stored => {221 .stored => {
222 d.alignBitsToByte(); // skip padding until byte boundary222 d.alignBitsToByte(); // skip padding until byte boundary
...@@ -372,41 +372,31 @@ fn writeMatch(w: *Writer, length: u16, distance: u16) !void {...@@ -372,41 +372,31 @@ fn writeMatch(w: *Writer, length: u16, distance: u16) !void {
372 for (dest, src) |*d, s| d.* = s;372 for (dest, src) |*d, s| d.* = s;
373}373}
374374
375fn takeBits(d: *Decompress, comptime T: type) !T {375fn takeBits(d: *Decompress, comptime U: type) !U {
376 const U = @Type(.{ .int = .{ .signedness = .unsigned, .bits = @bitSizeOf(T) } });
377 const remaining_bits = d.remaining_bits;376 const remaining_bits = d.remaining_bits;
378 const next_bits = d.next_bits;377 const next_bits = d.next_bits;
379 if (remaining_bits >= @bitSizeOf(T)) {378 if (remaining_bits >= @bitSizeOf(U)) {
380 const u: U = @truncate(next_bits);379 const u: U = @truncate(next_bits);
381 d.next_bits = next_bits >> @bitSizeOf(T);380 d.next_bits = next_bits >> @bitSizeOf(U);
382 d.remaining_bits = remaining_bits - @bitSizeOf(T);381 d.remaining_bits = remaining_bits - @bitSizeOf(U);
383 return switch (@typeInfo(T)) {382 return u;
384 .int => u,
385 .@"enum" => @enumFromInt(u),
386 else => @bitCast(u),
387 };
388 }383 }
389 const in = d.input;384 const in = d.input;
390 const next_int = in.takeInt(usize, .little) catch |err| switch (err) {385 const next_int = in.takeInt(usize, .little) catch |err| switch (err) {
391 error.ReadFailed => return error.ReadFailed,386 error.ReadFailed => return error.ReadFailed,
392 error.EndOfStream => return takeBitsEnding(d, T),387 error.EndOfStream => return takeBitsEnding(d, U),
393 };388 };
394 const needed_bits = @bitSizeOf(T) - remaining_bits;389 const needed_bits = @bitSizeOf(U) - remaining_bits;
395 const u: U = @intCast(((next_int & ((@as(usize, 1) << needed_bits) - 1)) << remaining_bits) | next_bits);390 const u: U = @intCast(((next_int & ((@as(usize, 1) << needed_bits) - 1)) << remaining_bits) | next_bits);
396 d.next_bits = next_int >> needed_bits;391 d.next_bits = next_int >> needed_bits;
397 d.remaining_bits = @intCast(@bitSizeOf(usize) - @as(usize, needed_bits));392 d.remaining_bits = @intCast(@bitSizeOf(usize) - @as(usize, needed_bits));
398 return switch (@typeInfo(T)) {393 return u;
399 .int => u,
400 .@"enum" => @enumFromInt(u),
401 else => @bitCast(u),
402 };
403}394}
404395
405fn takeBitsEnding(d: *Decompress, comptime T: type) !T {396fn takeBitsEnding(d: *Decompress, comptime U: type) !U {
406 const remaining_bits = d.remaining_bits;397 const remaining_bits = d.remaining_bits;
407 const next_bits = d.next_bits;398 const next_bits = d.next_bits;
408 const in = d.input;399 const in = d.input;
409 const U = @Type(.{ .int = .{ .signedness = .unsigned, .bits = @bitSizeOf(T) } });
410 var u: U = 0;400 var u: U = 0;
411 var remaining_needed_bits = @bitSizeOf(U) - remaining_bits;401 var remaining_needed_bits = @bitSizeOf(U) - remaining_bits;
412 while (@bitSizeOf(U) >= 8 and remaining_needed_bits >= 8) {402 while (@bitSizeOf(U) >= 8 and remaining_needed_bits >= 8) {
...@@ -424,11 +414,7 @@ fn takeBitsEnding(d: *Decompress, comptime T: type) !T {...@@ -424,11 +414,7 @@ fn takeBitsEnding(d: *Decompress, comptime T: type) !T {
424 d.remaining_bits = @intCast(8 - remaining_needed_bits);414 d.remaining_bits = @intCast(8 - remaining_needed_bits);
425 }415 }
426 u = @intCast((@as(usize, u) << remaining_bits) | next_bits);416 u = @intCast((@as(usize, u) << remaining_bits) | next_bits);
427 return switch (@typeInfo(T)) {417 return u;
428 .int => u,
429 .@"enum" => @enumFromInt(u),
430 else => @bitCast(u),
431 };
432}418}
433419
434fn peekBits(d: *Decompress, comptime U: type) !U {420fn peekBits(d: *Decompress, comptime U: type) !U {