delete flate implementation

This commit is contained in:
Andrew Kelley 2025-07-27 10:25:46 -07:00
parent 83513ade35
commit a4f05a4588
58 changed files with 787 additions and 1779 deletions

View File

@ -1,7 +1,7 @@
const builtin = @import("builtin");
const std = @import("../std.zig");
const testing = std.testing;
const Writer = std.io.Writer;
const Writer = std.Io.Writer;
/// Container of the deflate bit stream body. Container adds header before
/// deflate bit stream and footer after. It can bi gzip, zlib or raw (no header,
@ -77,7 +77,7 @@ pub const Container = enum {
raw: void,
gzip: struct {
crc: std.hash.Crc32 = .init(),
count: usize = 0,
count: u32 = 0,
},
zlib: std.hash.Adler32,
@ -98,7 +98,7 @@ pub const Container = enum {
.raw => {},
.gzip => |*gzip| {
gzip.update(buf);
gzip.count += buf.len;
gzip.count +%= buf.len;
},
.zlib => |*zlib| {
zlib.update(buf);
@ -148,35 +148,9 @@ pub const Compress = @import("flate/Compress.zig");
/// decompression and correctly produces the original full-size data or file.
pub const Decompress = @import("flate/Decompress.zig");
/// Huffman only compression. Without Lempel-Ziv match searching. Faster
/// compression, less memory requirements but bigger compressed sizes.
pub const huffman = struct {
// The odd order in which the codegen code sizes are written.
pub const codegen_order = [_]u32{ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
// The number of codegen codes.
pub const codegen_code_count = 19;
// The largest distance code.
pub const distance_code_count = 30;
// Maximum number of literals.
pub const max_num_lit = 286;
// Max number of frequencies used for a Huffman Code
// Possible lengths are codegen_code_count (19), distance_code_count (30) and max_num_lit (286).
// The largest of these is max_num_lit.
pub const max_num_frequencies = max_num_lit;
// Biggest block size for uncompressed block.
pub const max_store_block_size = 65535;
// The special code used to mark the end of a block.
pub const end_block_marker = 256;
};
test {
_ = Compress;
_ = Decompress;
}
/// Compression without Lempel-Ziv match searching. Faster compression, less
/// memory requirements but bigger compressed sizes.
pub const HuffmanEncoder = @import("flate/HuffmanEncoder.zig");
test "compress/decompress" {
const print = std.debug.print;
@ -217,12 +191,11 @@ test "compress/decompress" {
},
};
for (cases, 0..) |case, case_no| { // for each case
for (cases, 0..) |case, case_no| {
const data = case.data;
for (levels, 0..) |level, i| { // for each compression level
inline for (Container.list) |container| { // for each wrapping
for (levels, 0..) |level, i| {
for (Container.list) |container| {
var compressed_size: usize = if (case.gzip_sizes[i] > 0)
case.gzip_sizes[i] - Container.gzip.size() + container.size()
else
@ -230,21 +203,21 @@ test "compress/decompress" {
// compress original stream to compressed stream
{
var original: std.io.Reader = .fixed(data);
var compressed: Writer = .fixed(&cmp_buf);
var compress: Compress = .init(&original, &.{}, .{ .container = .raw, .level = level });
const n = try compress.reader.streamRemaining(&compressed);
var compress: Compress = .init(&compressed, &.{}, .{ .container = .raw, .level = level });
try compress.writer.writeAll(data);
try compress.end();
if (compressed_size == 0) {
if (container == .gzip)
print("case {d} gzip level {} compressed size: {d}\n", .{ case_no, level, compressed.pos });
compressed_size = compressed.end;
}
try testing.expectEqual(compressed_size, n);
try testing.expectEqual(compressed_size, compressed.end);
}
// decompress compressed stream to decompressed stream
{
var compressed: std.io.Reader = .fixed(cmp_buf[0..compressed_size]);
var compressed: std.Io.Reader = .fixed(cmp_buf[0..compressed_size]);
var decompressed: Writer = .fixed(&dcm_buf);
var decompress: Decompress = .init(&compressed, container, &.{});
_ = try decompress.reader.streamRemaining(&decompressed);
@ -266,7 +239,7 @@ test "compress/decompress" {
}
// decompressor reader interface
{
var compressed: std.io.Reader = .fixed(cmp_buf[0..compressed_size]);
var compressed: std.Io.Reader = .fixed(cmp_buf[0..compressed_size]);
var decompress: Decompress = .init(&compressed, container, &.{});
const n = try decompress.reader.readSliceShort(&dcm_buf);
try testing.expectEqual(data.len, n);
@ -276,7 +249,7 @@ test "compress/decompress" {
}
// huffman only compression
{
inline for (Container.list) |container| { // for each wrapping
for (Container.list) |container| {
var compressed_size: usize = if (case.huffman_only_size > 0)
case.huffman_only_size - Container.gzip.size() + container.size()
else
@ -284,7 +257,7 @@ test "compress/decompress" {
// compress original stream to compressed stream
{
var original: std.io.Reader = .fixed(data);
var original: std.Io.Reader = .fixed(data);
var compressed: Writer = .fixed(&cmp_buf);
var cmp = try Compress.Huffman.init(container, &compressed);
try cmp.compress(original.reader());
@ -298,7 +271,7 @@ test "compress/decompress" {
}
// decompress compressed stream to decompressed stream
{
var compressed: std.io.Reader = .fixed(cmp_buf[0..compressed_size]);
var compressed: std.Io.Reader = .fixed(cmp_buf[0..compressed_size]);
var decompress: Decompress = .init(&compressed, container, &.{});
var decompressed: Writer = .fixed(&dcm_buf);
_ = try decompress.reader.streamRemaining(&decompressed);
@ -309,7 +282,7 @@ test "compress/decompress" {
// store only
{
inline for (Container.list) |container| { // for each wrapping
for (Container.list) |container| {
var compressed_size: usize = if (case.store_size > 0)
case.store_size - Container.gzip.size() + container.size()
else
@ -317,7 +290,7 @@ test "compress/decompress" {
// compress original stream to compressed stream
{
var original: std.io.Reader = .fixed(data);
var original: std.Io.Reader = .fixed(data);
var compressed: Writer = .fixed(&cmp_buf);
var cmp = try Compress.SimpleCompressor(.store, container).init(&compressed);
try cmp.compress(original.reader());
@ -332,7 +305,7 @@ test "compress/decompress" {
}
// decompress compressed stream to decompressed stream
{
var compressed: std.io.Reader = .fixed(cmp_buf[0..compressed_size]);
var compressed: std.Io.Reader = .fixed(cmp_buf[0..compressed_size]);
var decompress: Decompress = .init(&compressed, container, &.{});
var decompressed: Writer = .fixed(&dcm_buf);
_ = try decompress.reader.streamRemaining(&decompressed);
@ -344,13 +317,13 @@ test "compress/decompress" {
}
fn testDecompress(container: Container, compressed: []const u8, expected_plain: []const u8) !void {
var in: std.io.Reader = .fixed(compressed);
var aw: std.io.Writer.Allocating = .init(testing.allocator);
var in: std.Io.Reader = .fixed(compressed);
var aw: std.Io.Writer.Allocating = .init(testing.allocator);
defer aw.deinit();
var decompress: Decompress = .init(&in, container, &.{});
_ = try decompress.reader.streamRemaining(&aw.writer);
try testing.expectEqualSlices(u8, expected_plain, aw.items);
try testing.expectEqualSlices(u8, expected_plain, aw.getWritten());
}
test "don't read past deflate stream's end" {
@ -483,17 +456,12 @@ test "public interface" {
var buffer1: [64]u8 = undefined;
var buffer2: [64]u8 = undefined;
// TODO These used to be functions, need to migrate the tests
const decompress = void;
const compress = void;
const store = void;
// decompress
{
var plain: Writer = .fixed(&buffer2);
var in: std.io.Reader = .fixed(gzip_data);
try decompress(&in, &plain);
var in: std.Io.Reader = .fixed(gzip_data);
var d: Decompress = .init(&in, .raw, &.{});
_ = try d.reader.streamRemaining(&plain);
try testing.expectEqualSlices(u8, plain_data, plain.buffered());
}
@ -502,11 +470,13 @@ test "public interface" {
var plain: Writer = .fixed(&buffer2);
var compressed: Writer = .fixed(&buffer1);
var in: std.io.Reader = .fixed(plain_data);
try compress(&in, &compressed, .{});
var cmp: Compress = .init(&compressed, &.{}, .{});
try cmp.writer.writeAll(plain_data);
try cmp.end();
var r: std.io.Reader = .fixed(&buffer1);
try decompress(&r, &plain);
var r: std.Io.Reader = .fixed(&buffer1);
var d: Decompress = .init(&r, .raw, &.{});
_ = try d.reader.streamRemaining(&plain);
try testing.expectEqualSlices(u8, plain_data, plain.buffered());
}
@ -515,12 +485,11 @@ test "public interface" {
var plain: Writer = .fixed(&buffer2);
var compressed: Writer = .fixed(&buffer1);
var in: std.io.Reader = .fixed(plain_data);
var cmp = try Compress(&compressed, .{});
try cmp.compress(&in);
try cmp.finish();
var cmp: Compress = .init(&compressed, &.{}, .{});
try cmp.writer.writeAll(plain_data);
try cmp.end();
var r: std.io.Reader = .fixed(&buffer1);
var r: std.Io.Reader = .fixed(&buffer1);
var dcp = Decompress(&r);
try dcp.decompress(&plain);
try testing.expectEqualSlices(u8, plain_data, plain.buffered());
@ -533,11 +502,12 @@ test "public interface" {
var plain: Writer = .fixed(&buffer2);
var compressed: Writer = .fixed(&buffer1);
var in: std.io.Reader = .fixed(plain_data);
try huffman.compress(&in, &compressed);
var in: std.Io.Reader = .fixed(plain_data);
try HuffmanEncoder.compress(&in, &compressed);
var r: std.io.Reader = .fixed(&buffer1);
try decompress(&r, &plain);
var r: std.Io.Reader = .fixed(&buffer1);
var d: Decompress = .init(&r, .raw, &.{});
_ = try d.reader.streamRemaining(&plain);
try testing.expectEqualSlices(u8, plain_data, plain.buffered());
}
@ -546,47 +516,50 @@ test "public interface" {
var plain: Writer = .fixed(&buffer2);
var compressed: Writer = .fixed(&buffer1);
var in: std.io.Reader = .fixed(plain_data);
var cmp = try huffman.Compressor(&compressed);
var in: std.Io.Reader = .fixed(plain_data);
var cmp = try HuffmanEncoder.Compressor(&compressed);
try cmp.compress(&in);
try cmp.finish();
var r: std.io.Reader = .fixed(&buffer1);
try decompress(&r, &plain);
var r: std.Io.Reader = .fixed(&buffer1);
var d: Decompress = .init(&r, .raw, &.{});
_ = try d.reader.streamRemaining(&plain);
try testing.expectEqualSlices(u8, plain_data, plain.buffered());
}
}
// store
{
// store compress/decompress
{
var plain: Writer = .fixed(&buffer2);
var compressed: Writer = .fixed(&buffer1);
// TODO
//{
// // store compress/decompress
// {
// var plain: Writer = .fixed(&buffer2);
// var compressed: Writer = .fixed(&buffer1);
var in: std.io.Reader = .fixed(plain_data);
try store.compress(&in, &compressed);
// var in: std.Io.Reader = .fixed(plain_data);
// try store.compress(&in, &compressed);
var r: std.io.Reader = .fixed(&buffer1);
try decompress(&r, &plain);
try testing.expectEqualSlices(u8, plain_data, plain.buffered());
}
// var r: std.Io.Reader = .fixed(&buffer1);
// var d: Decompress = .init(&r, .raw, &.{});
// _ = try d.reader.streamRemaining(&plain);
// try testing.expectEqualSlices(u8, plain_data, plain.buffered());
// }
// store compressor/decompressor
{
var plain: Writer = .fixed(&buffer2);
var compressed: Writer = .fixed(&buffer1);
// // store compressor/decompressor
// {
// var plain: Writer = .fixed(&buffer2);
// var compressed: Writer = .fixed(&buffer1);
var in: std.io.Reader = .fixed(plain_data);
var cmp = try store.compressor(&compressed);
try cmp.compress(&in);
try cmp.finish();
// var in: std.Io.Reader = .fixed(plain_data);
// var cmp = try store.compressor(&compressed);
// try cmp.compress(&in);
// try cmp.finish();
var r: std.io.Reader = .fixed(&buffer1);
try decompress(&r, &plain);
try testing.expectEqualSlices(u8, plain_data, plain.buffered());
}
}
// var r: std.Io.Reader = .fixed(&buffer1);
// var d: Decompress = .init(&r, .raw, &.{});
// _ = try d.reader.streamRemaining(&plain);
// try testing.expectEqualSlices(u8, plain_data, plain.buffered());
// }
//}
}
pub const match = struct {
@ -615,26 +588,33 @@ test "zlib should not overshoot" {
0x03, 0x00, 0x8b, 0x61, 0x0f, 0xa4, 0x52, 0x5a, 0x94, 0x12,
};
var stream: std.io.Reader = .fixed(&data);
const reader = stream.reader();
var reader: std.Io.Reader = .fixed(&data);
var dcp = Decompress.init(reader);
var decompress: Decompress = .init(&reader, .zlib, &.{});
var out: [128]u8 = undefined;
// Decompress
var n = try dcp.reader().readAll(out[0..]);
{
const n = try decompress.reader.readSliceShort(out[0..]);
// Expected decompressed data
try std.testing.expectEqual(46, n);
try std.testing.expectEqualStrings("Copyright Willem van Schaik, Singapore 1995-96", out[0..n]);
// Expected decompressed data
try std.testing.expectEqual(46, n);
try std.testing.expectEqualStrings("Copyright Willem van Schaik, Singapore 1995-96", out[0..n]);
// Decompressor don't overshoot underlying reader.
// It is leaving it at the end of compressed data chunk.
try std.testing.expectEqual(data.len - 4, stream.getPos());
try std.testing.expectEqual(0, dcp.unreadBytes());
// Decompressor don't overshoot underlying reader.
// It is leaving it at the end of compressed data chunk.
try std.testing.expectEqual(data.len - 4, reader.seek);
// TODO what was this testing, exactly?
//try std.testing.expectEqual(0, decompress.unreadBytes());
}
// 4 bytes after compressed chunk are available in reader.
n = try reader.readAll(out[0..]);
const n = try reader.readSliceShort(out[0..]);
try std.testing.expectEqual(n, 4);
try std.testing.expectEqualSlices(u8, data[data.len - 4 .. data.len], out[0..n]);
}
test {
_ = HuffmanEncoder;
_ = Compress;
_ = Decompress;
}

View File

@ -8,32 +8,33 @@ const Writer = std.io.Writer;
const BlockWriter = @This();
const flate = @import("../flate.zig");
const Compress = flate.Compress;
const huffman = flate.huffman;
const HuffmanEncoder = flate.HuffmanEncoder;
const Token = @import("Token.zig");
const codegen_order = huffman.codegen_order;
const codegen_order = HuffmanEncoder.codegen_order;
const end_code_mark = 255;
output: *Writer,
codegen_freq: [huffman.codegen_code_count]u16 = undefined,
literal_freq: [huffman.max_num_lit]u16 = undefined,
distance_freq: [huffman.distance_code_count]u16 = undefined,
codegen: [huffman.max_num_lit + huffman.distance_code_count + 1]u8 = undefined,
literal_encoding: Compress.LiteralEncoder = .{},
distance_encoding: Compress.DistanceEncoder = .{},
codegen_encoding: Compress.CodegenEncoder = .{},
fixed_literal_encoding: Compress.LiteralEncoder,
fixed_distance_encoding: Compress.DistanceEncoder,
huff_distance: Compress.DistanceEncoder,
codegen_freq: [HuffmanEncoder.codegen_code_count]u16,
literal_freq: [HuffmanEncoder.max_num_lit]u16,
distance_freq: [HuffmanEncoder.distance_code_count]u16,
codegen: [HuffmanEncoder.max_num_lit + HuffmanEncoder.distance_code_count + 1]u8,
literal_encoding: HuffmanEncoder,
distance_encoding: HuffmanEncoder,
codegen_encoding: HuffmanEncoder,
fixed_literal_encoding: HuffmanEncoder,
fixed_distance_encoding: HuffmanEncoder,
huff_distance: HuffmanEncoder,
pub fn init(output: *Writer) BlockWriter {
return .{
.output = output,
.fixed_literal_encoding = Compress.fixedLiteralEncoder(),
.fixed_distance_encoding = Compress.fixedDistanceEncoder(),
.huff_distance = Compress.huffmanDistanceEncoder(),
};
fixed_literal_codes: [HuffmanEncoder.max_num_frequencies]HuffmanEncoder.Code,
fixed_distance_codes: [HuffmanEncoder.distance_code_count]HuffmanEncoder.Code,
distance_codes: [HuffmanEncoder.distance_code_count]HuffmanEncoder.Code,
pub fn init(bw: *BlockWriter) void {
bw.fixed_literal_encoding = .fixedLiteralEncoder(&bw.fixed_literal_codes);
bw.fixed_distance_encoding = .fixedDistanceEncoder(&bw.fixed_distance_codes);
bw.huff_distance = .huffmanDistanceEncoder(&bw.distance_codes);
}
/// Flush intrenal bit buffer to the writer.
@ -46,27 +47,23 @@ pub fn flush(self: *BlockWriter) Writer.Error!void {
try self.bit_writer.flush();
}
pub fn setWriter(self: *BlockWriter, new_writer: *Writer) void {
self.bit_writer.setWriter(new_writer);
}
fn writeCode(self: *BlockWriter, c: Compress.HuffCode) Writer.Error!void {
try self.bit_writer.writeBits(c.code, c.len);
}
// RFC 1951 3.2.7 specifies a special run-length encoding for specifying
// the literal and distance lengths arrays (which are concatenated into a single
// array). This method generates that run-length encoding.
//
// The result is written into the codegen array, and the frequencies
// of each code is written into the codegen_freq array.
// Codes 0-15 are single byte codes. Codes 16-18 are followed by additional
// information. Code bad_code is an end marker
//
// num_literals: The number of literals in literal_encoding
// num_distances: The number of distances in distance_encoding
// lit_enc: The literal encoder to use
// dist_enc: The distance encoder to use
/// RFC 1951 3.2.7 specifies a special run-length encoding for specifying
/// the literal and distance lengths arrays (which are concatenated into a single
/// array). This method generates that run-length encoding.
///
/// The result is written into the codegen array, and the frequencies
/// of each code is written into the codegen_freq array.
/// Codes 0-15 are single byte codes. Codes 16-18 are followed by additional
/// information. Code bad_code is an end marker
///
/// num_literals: The number of literals in literal_encoding
/// num_distances: The number of distances in distance_encoding
/// lit_enc: The literal encoder to use
/// dist_enc: The distance encoder to use
fn generateCodegen(
self: *BlockWriter,
num_literals: u32,
@ -167,7 +164,7 @@ const DynamicSize = struct {
num_codegens: u32,
};
// dynamicSize returns the size of dynamically encoded data in bits.
/// dynamicSize returns the size of dynamically encoded data in bits.
fn dynamicSize(
self: *BlockWriter,
lit_enc: *Compress.LiteralEncoder, // literal encoder
@ -194,7 +191,7 @@ fn dynamicSize(
};
}
// fixedSize returns the size of dynamically encoded data in bits.
/// fixedSize returns the size of dynamically encoded data in bits.
fn fixedSize(self: *BlockWriter, extra_bits: u32) u32 {
return 3 +
self.fixed_literal_encoding.bitLength(&self.literal_freq) +
@ -207,25 +204,25 @@ const StoredSize = struct {
storable: bool,
};
// storedSizeFits calculates the stored size, including header.
// The function returns the size in bits and whether the block
// fits inside a single block.
/// storedSizeFits calculates the stored size, including header.
/// The function returns the size in bits and whether the block
/// fits inside a single block.
fn storedSizeFits(in: ?[]const u8) StoredSize {
if (in == null) {
return .{ .size = 0, .storable = false };
}
if (in.?.len <= huffman.max_store_block_size) {
if (in.?.len <= HuffmanEncoder.max_store_block_size) {
return .{ .size = @as(u32, @intCast((in.?.len + 5) * 8)), .storable = true };
}
return .{ .size = 0, .storable = false };
}
// Write the header of a dynamic Huffman block to the output stream.
//
// num_literals: The number of literals specified in codegen
// num_distances: The number of distances specified in codegen
// num_codegens: The number of codegens used in codegen
// eof: Is it the end-of-file? (end of stream)
/// Write the header of a dynamic Huffman block to the output stream.
///
/// num_literals: The number of literals specified in codegen
/// num_distances: The number of distances specified in codegen
/// num_codegens: The number of codegens used in codegen
/// eof: Is it the end-of-file? (end of stream)
fn dynamicHeader(
self: *BlockWriter,
num_literals: u32,
@ -291,11 +288,11 @@ fn fixedHeader(self: *BlockWriter, eof: bool) Writer.Error!void {
try self.bit_writer.writeBits(value, 3);
}
// Write a block of tokens with the smallest encoding. Will choose block type.
// The original input can be supplied, and if the huffman encoded data
// is larger than the original bytes, the data will be written as a
// stored block.
// If the input is null, the tokens will always be Huffman encoded.
/// Write a block of tokens with the smallest encoding. Will choose block type.
/// The original input can be supplied, and if the huffman encoded data
/// is larger than the original bytes, the data will be written as a
/// stored block.
/// If the input is null, the tokens will always be Huffman encoded.
pub fn write(self: *BlockWriter, tokens: []const Token, eof: bool, input: ?[]const u8) Writer.Error!void {
const lit_and_dist = self.indexTokens(tokens);
const num_literals = lit_and_dist.num_literals;
@ -379,11 +376,11 @@ pub fn storedBlock(self: *BlockWriter, input: []const u8, eof: bool) Writer.Erro
try self.bit_writer.writeBytes(input);
}
// writeBlockDynamic encodes a block using a dynamic Huffman table.
// This should be used if the symbols used have a disproportionate
// histogram distribution.
// If input is supplied and the compression savings are below 1/16th of the
// input size the block is stored.
/// writeBlockDynamic encodes a block using a dynamic Huffman table.
/// This should be used if the symbols used have a disproportionate
/// histogram distribution.
/// If input is supplied and the compression savings are below 1/16th of the
/// input size the block is stored.
fn dynamicBlock(
self: *BlockWriter,
tokens: []const Token,
@ -429,10 +426,10 @@ const TotalIndexedTokens = struct {
num_distances: u32,
};
// Indexes a slice of tokens followed by an end_block_marker, and updates
// literal_freq and distance_freq, and generates literal_encoding
// and distance_encoding.
// The number of literal and distance tokens is returned.
/// Indexes a slice of tokens followed by an end_block_marker, and updates
/// literal_freq and distance_freq, and generates literal_encoding
/// and distance_encoding.
/// The number of literal and distance tokens is returned.
fn indexTokens(self: *BlockWriter, tokens: []const Token) TotalIndexedTokens {
var num_literals: u32 = 0;
var num_distances: u32 = 0;
@ -453,7 +450,7 @@ fn indexTokens(self: *BlockWriter, tokens: []const Token) TotalIndexedTokens {
self.distance_freq[t.distanceCode()] += 1;
}
// add end_block_marker token at the end
self.literal_freq[huffman.end_block_marker] += 1;
self.literal_freq[HuffmanEncoder.end_block_marker] += 1;
// get the number of literals
num_literals = @as(u32, @intCast(self.literal_freq.len));
@ -479,8 +476,8 @@ fn indexTokens(self: *BlockWriter, tokens: []const Token) TotalIndexedTokens {
};
}
// Writes a slice of tokens to the output followed by and end_block_marker.
// codes for literal and distance encoding must be supplied.
/// Writes a slice of tokens to the output followed by and end_block_marker.
/// codes for literal and distance encoding must be supplied.
fn writeTokens(
self: *BlockWriter,
tokens: []const Token,
@ -508,18 +505,18 @@ fn writeTokens(
}
}
// add end_block_marker at the end
try self.writeCode(le_codes[huffman.end_block_marker]);
try self.writeCode(le_codes[HuffmanEncoder.end_block_marker]);
}
// Encodes a block of bytes as either Huffman encoded literals or uncompressed bytes
// if the results only gains very little from compression.
/// Encodes a block of bytes as either Huffman encoded literals or uncompressed bytes
/// if the results only gains very little from compression.
pub fn huffmanBlock(self: *BlockWriter, input: []const u8, eof: bool) Writer.Error!void {
// Add everything as literals
histogram(input, &self.literal_freq);
self.literal_freq[huffman.end_block_marker] = 1;
self.literal_freq[HuffmanEncoder.end_block_marker] = 1;
const num_literals = huffman.end_block_marker + 1;
const num_literals = HuffmanEncoder.end_block_marker + 1;
self.distance_freq[0] = 1;
const num_distances = 1;
@ -560,10 +557,9 @@ pub fn huffmanBlock(self: *BlockWriter, input: []const u8, eof: bool) Writer.Err
const c = encoding[t];
try self.bit_writer.writeBits(c.code, c.len);
}
try self.writeCode(encoding[huffman.end_block_marker]);
try self.writeCode(encoding[HuffmanEncoder.end_block_marker]);
}
// histogram accumulates a histogram of b in h.
fn histogram(b: []const u8, h: *[286]u16) void {
// Clear histogram
for (h, 0..) |_, i| {
@ -575,122 +571,3 @@ fn histogram(b: []const u8, h: *[286]u16) void {
lh[t] += 1;
}
}
// tests
const expect = std.testing.expect;
const fmt = std.fmt;
const testing = std.testing;
const ArrayList = std.ArrayList;
const TestCase = @import("testdata/block_writer.zig").TestCase;
const testCases = @import("testdata/block_writer.zig").testCases;
// tests if the writeBlock encoding has changed.
test "write" {
inline for (0..testCases.len) |i| {
try testBlock(testCases[i], .write_block);
}
}
// tests if the writeBlockDynamic encoding has changed.
test "dynamicBlock" {
inline for (0..testCases.len) |i| {
try testBlock(testCases[i], .write_dyn_block);
}
}
test "huffmanBlock" {
inline for (0..testCases.len) |i| {
try testBlock(testCases[i], .write_huffman_block);
}
try testBlock(.{
.tokens = &[_]Token{},
.input = "huffman-rand-max.input",
.want = "huffman-rand-max.{s}.expect",
}, .write_huffman_block);
}
const TestFn = enum {
write_block,
write_dyn_block, // write dynamic block
write_huffman_block,
fn to_s(self: TestFn) []const u8 {
return switch (self) {
.write_block => "wb",
.write_dyn_block => "dyn",
.write_huffman_block => "huff",
};
}
fn write(
comptime self: TestFn,
bw: anytype,
tok: []const Token,
input: ?[]const u8,
final: bool,
) !void {
switch (self) {
.write_block => try bw.write(tok, final, input),
.write_dyn_block => try bw.dynamicBlock(tok, final, input),
.write_huffman_block => try bw.huffmanBlock(input.?, final),
}
try bw.flush();
}
};
// testBlock tests a block against its references
//
// size
// 64K [file-name].input - input non compressed file
// 8.1K [file-name].golden -
// 78 [file-name].dyn.expect - output with writeBlockDynamic
// 78 [file-name].wb.expect - output with writeBlock
// 8.1K [file-name].huff.expect - output with writeBlockHuff
// 78 [file-name].dyn.expect-noinput - output with writeBlockDynamic when input is null
// 78 [file-name].wb.expect-noinput - output with writeBlock when input is null
//
// wb - writeBlock
// dyn - writeBlockDynamic
// huff - writeBlockHuff
//
fn testBlock(comptime tc: TestCase, comptime tfn: TestFn) !void {
if (tc.input.len != 0 and tc.want.len != 0) {
const want_name = comptime fmt.comptimePrint(tc.want, .{tfn.to_s()});
const input = @embedFile("testdata/block_writer/" ++ tc.input);
const want = @embedFile("testdata/block_writer/" ++ want_name);
try testWriteBlock(tfn, input, want, tc.tokens);
}
if (tfn == .write_huffman_block) {
return;
}
const want_name_no_input = comptime fmt.comptimePrint(tc.want_no_input, .{tfn.to_s()});
const want = @embedFile("testdata/block_writer/" ++ want_name_no_input);
try testWriteBlock(tfn, null, want, tc.tokens);
}
// Uses writer function `tfn` to write `tokens`, tests that we got `want` as output.
fn testWriteBlock(comptime tfn: TestFn, input: ?[]const u8, want: []const u8, tokens: []const Token) !void {
var buf = ArrayList(u8).init(testing.allocator);
var bw: BlockWriter = .init(buf.writer());
try tfn.write(&bw, tokens, input, false);
var got = buf.items;
try testing.expectEqualSlices(u8, want, got); // expect writeBlock to yield expected result
try expect(got[0] & 0b0000_0001 == 0); // bfinal is not set
//
// Test if the writer produces the same output after reset.
buf.deinit();
buf = ArrayList(u8).init(testing.allocator);
defer buf.deinit();
bw.setWriter(buf.writer());
try tfn.write(&bw, tokens, input, true);
try bw.flush();
got = buf.items;
try expect(got[0] & 1 == 1); // bfinal is set
buf.items[0] &= 0b1111_1110; // remove bfinal bit, so we can run test slices
try testing.expectEqualSlices(u8, want, got); // expect writeBlock to yield expected result
}

File diff suppressed because it is too large Load Diff

View File

@ -620,10 +620,9 @@ test "init/find" {
}
test "encode/decode literals" {
const LiteralEncoder = std.compress.flate.Compress.LiteralEncoder;
var codes: [flate.HuffmanEncoder.max_num_frequencies]flate.HuffmanEncoder.Code = undefined;
for (1..286) |j| { // for all different number of codes
var enc: LiteralEncoder = .{};
var enc: flate.HuffmanEncoder = .{ .codes = &codes };
// create frequencies
var freq = [_]u16{0} ** 286;
freq[256] = 1; // ensure we have end of block code

View File

@ -0,0 +1,475 @@
const HuffmanEncoder = @This();
const std = @import("std");
const assert = std.debug.assert;
const testing = std.testing;
codes: []Code,
// Reusable buffer with the longest possible frequency table.
freq_cache: [max_num_frequencies + 1]LiteralNode,
bit_count: [17]u32,
lns: []LiteralNode, // sorted by literal, stored to avoid repeated allocation in generate
lfs: []LiteralNode, // sorted by frequency, stored to avoid repeated allocation in generate
pub const LiteralNode = struct {
literal: u16,
freq: u16,
pub fn max() LiteralNode {
return .{
.literal = std.math.maxInt(u16),
.freq = std.math.maxInt(u16),
};
}
};
pub const Code = struct {
code: u16 = 0,
len: u16 = 0,
};
/// The odd order in which the codegen code sizes are written.
pub const codegen_order = [_]u32{ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
/// The number of codegen codes.
pub const codegen_code_count = 19;
/// The largest distance code.
pub const distance_code_count = 30;
/// Maximum number of literals.
pub const max_num_lit = 286;
/// Max number of frequencies used for a Huffman Code
/// Possible lengths are codegen_code_count (19), distance_code_count (30) and max_num_lit (286).
/// The largest of these is max_num_lit.
pub const max_num_frequencies = max_num_lit;
/// Biggest block size for uncompressed block.
pub const max_store_block_size = 65535;
/// The special code used to mark the end of a block.
pub const end_block_marker = 256;
/// Update this Huffman Code object to be the minimum code for the specified frequency count.
///
/// freq An array of frequencies, in which frequency[i] gives the frequency of literal i.
/// max_bits The maximum number of bits to use for any literal.
pub fn generate(self: *HuffmanEncoder, freq: []u16, max_bits: u32) void {
var list = self.freq_cache[0 .. freq.len + 1];
// Number of non-zero literals
var count: u32 = 0;
// Set list to be the set of all non-zero literals and their frequencies
for (freq, 0..) |f, i| {
if (f != 0) {
list[count] = LiteralNode{ .literal = @as(u16, @intCast(i)), .freq = f };
count += 1;
} else {
list[count] = LiteralNode{ .literal = 0x00, .freq = 0 };
self.codes[i].len = 0;
}
}
list[freq.len] = LiteralNode{ .literal = 0x00, .freq = 0 };
list = list[0..count];
if (count <= 2) {
// Handle the small cases here, because they are awkward for the general case code. With
// two or fewer literals, everything has bit length 1.
for (list, 0..) |node, i| {
// "list" is in order of increasing literal value.
self.codes[node.literal] = .{
.code = @intCast(i),
.len = 1,
};
}
return;
}
self.lfs = list;
std.mem.sort(LiteralNode, self.lfs, {}, byFreq);
// Get the number of literals for each bit count
const bit_count = self.bitCounts(list, max_bits);
// And do the assignment
self.assignEncodingAndSize(bit_count, list);
}
pub fn bitLength(self: *HuffmanEncoder, freq: []u16) u32 {
var total: u32 = 0;
for (freq, 0..) |f, i| {
if (f != 0) {
total += @as(u32, @intCast(f)) * @as(u32, @intCast(self.codes[i].len));
}
}
return total;
}
/// Return the number of literals assigned to each bit size in the Huffman encoding
///
/// This method is only called when list.len >= 3
/// The cases of 0, 1, and 2 literals are handled by special case code.
///
/// list: An array of the literals with non-zero frequencies
/// and their associated frequencies. The array is in order of increasing
/// frequency, and has as its last element a special element with frequency
/// `math.maxInt(i32)`
///
/// max_bits: The maximum number of bits that should be used to encode any literal.
/// Must be less than 16.
///
/// Returns an integer array in which array[i] indicates the number of literals
/// that should be encoded in i bits.
fn bitCounts(self: *HuffmanEncoder, list: []LiteralNode, max_bits_to_use: usize) []u32 {
var max_bits = max_bits_to_use;
const n = list.len;
const max_bits_limit = 16;
assert(max_bits < max_bits_limit);
// The tree can't have greater depth than n - 1, no matter what. This
// saves a little bit of work in some small cases
max_bits = @min(max_bits, n - 1);
// Create information about each of the levels.
// A bogus "Level 0" whose sole purpose is so that
// level1.prev.needed == 0. This makes level1.next_pair_freq
// be a legitimate value that never gets chosen.
var levels: [max_bits_limit]LevelInfo = std.mem.zeroes([max_bits_limit]LevelInfo);
// leaf_counts[i] counts the number of literals at the left
// of ancestors of the rightmost node at level i.
// leaf_counts[i][j] is the number of literals at the left
// of the level j ancestor.
var leaf_counts: [max_bits_limit][max_bits_limit]u32 = @splat(0);
{
var level = @as(u32, 1);
while (level <= max_bits) : (level += 1) {
// For every level, the first two items are the first two characters.
// We initialize the levels as if we had already figured this out.
levels[level] = LevelInfo{
.level = level,
.last_freq = list[1].freq,
.next_char_freq = list[2].freq,
.next_pair_freq = list[0].freq + list[1].freq,
.needed = 0,
};
leaf_counts[level][level] = 2;
if (level == 1) {
levels[level].next_pair_freq = std.math.maxInt(i32);
}
}
}
// We need a total of 2*n - 2 items at top level and have already generated 2.
levels[max_bits].needed = 2 * @as(u32, @intCast(n)) - 4;
{
var level = max_bits;
while (true) {
var l = &levels[level];
if (l.next_pair_freq == std.math.maxInt(i32) and l.next_char_freq == std.math.maxInt(i32)) {
// We've run out of both leaves and pairs.
// End all calculations for this level.
// To make sure we never come back to this level or any lower level,
// set next_pair_freq impossibly large.
l.needed = 0;
levels[level + 1].next_pair_freq = std.math.maxInt(i32);
level += 1;
continue;
}
const prev_freq = l.last_freq;
if (l.next_char_freq < l.next_pair_freq) {
// The next item on this row is a leaf node.
const next = leaf_counts[level][level] + 1;
l.last_freq = l.next_char_freq;
// Lower leaf_counts are the same of the previous node.
leaf_counts[level][level] = next;
if (next >= list.len) {
l.next_char_freq = LiteralNode.max().freq;
} else {
l.next_char_freq = list[next].freq;
}
} else {
// The next item on this row is a pair from the previous row.
// next_pair_freq isn't valid until we generate two
// more values in the level below
l.last_freq = l.next_pair_freq;
// Take leaf counts from the lower level, except counts[level] remains the same.
@memcpy(leaf_counts[level][0..level], leaf_counts[level - 1][0..level]);
levels[l.level - 1].needed = 2;
}
l.needed -= 1;
if (l.needed == 0) {
// We've done everything we need to do for this level.
// Continue calculating one level up. Fill in next_pair_freq
// of that level with the sum of the two nodes we've just calculated on
// this level.
if (l.level == max_bits) {
// All done!
break;
}
levels[l.level + 1].next_pair_freq = prev_freq + l.last_freq;
level += 1;
} else {
// If we stole from below, move down temporarily to replenish it.
while (levels[level - 1].needed > 0) {
level -= 1;
if (level == 0) {
break;
}
}
}
}
}
// Somethings is wrong if at the end, the top level is null or hasn't used
// all of the leaves.
assert(leaf_counts[max_bits][max_bits] == n);
var bit_count = self.bit_count[0 .. max_bits + 1];
var bits: u32 = 1;
const counts = &leaf_counts[max_bits];
{
var level = max_bits;
while (level > 0) : (level -= 1) {
// counts[level] gives the number of literals requiring at least "bits"
// bits to encode.
bit_count[bits] = counts[level] - counts[level - 1];
bits += 1;
if (level == 0) {
break;
}
}
}
return bit_count;
}
/// Look at the leaves and assign them a bit count and an encoding as specified
/// in RFC 1951 3.2.2
fn assignEncodingAndSize(self: *HuffmanEncoder, bit_count: []u32, list_arg: []LiteralNode) void {
var code = @as(u16, 0);
var list = list_arg;
for (bit_count, 0..) |bits, n| {
code <<= 1;
if (n == 0 or bits == 0) {
continue;
}
// The literals list[list.len-bits] .. list[list.len-bits]
// are encoded using "bits" bits, and get the values
// code, code + 1, .... The code values are
// assigned in literal order (not frequency order).
const chunk = list[list.len - @as(u32, @intCast(bits)) ..];
self.lns = chunk;
std.mem.sort(LiteralNode, self.lns, {}, byLiteral);
for (chunk) |node| {
self.codes[node.literal] = .{
.code = bitReverse(u16, code, @as(u5, @intCast(n))),
.len = @as(u16, @intCast(n)),
};
code += 1;
}
list = list[0 .. list.len - @as(u32, @intCast(bits))];
}
}
fn byFreq(context: void, a: LiteralNode, b: LiteralNode) bool {
_ = context;
if (a.freq == b.freq) {
return a.literal < b.literal;
}
return a.freq < b.freq;
}
/// Describes the state of the constructed tree for a given depth.
const LevelInfo = struct {
/// Our level. for better printing
level: u32,
/// The frequency of the last node at this level
last_freq: u32,
/// The frequency of the next character to add to this level
next_char_freq: u32,
/// The frequency of the next pair (from level below) to add to this level.
/// Only valid if the "needed" value of the next lower level is 0.
next_pair_freq: u32,
/// The number of chains remaining to generate for this level before moving
/// up to the next level
needed: u32,
};
fn byLiteral(context: void, a: LiteralNode, b: LiteralNode) bool {
_ = context;
return a.literal < b.literal;
}
/// Reverse bit-by-bit a N-bit code.
fn bitReverse(comptime T: type, value: T, n: usize) T {
const r = @bitReverse(value);
return r >> @as(std.math.Log2Int(T), @intCast(@typeInfo(T).int.bits - n));
}
test bitReverse {
const ReverseBitsTest = struct {
in: u16,
bit_count: u5,
out: u16,
};
const reverse_bits_tests = [_]ReverseBitsTest{
.{ .in = 1, .bit_count = 1, .out = 1 },
.{ .in = 1, .bit_count = 2, .out = 2 },
.{ .in = 1, .bit_count = 3, .out = 4 },
.{ .in = 1, .bit_count = 4, .out = 8 },
.{ .in = 1, .bit_count = 5, .out = 16 },
.{ .in = 17, .bit_count = 5, .out = 17 },
.{ .in = 257, .bit_count = 9, .out = 257 },
.{ .in = 29, .bit_count = 5, .out = 23 },
};
for (reverse_bits_tests) |h| {
const v = bitReverse(u16, h.in, h.bit_count);
try std.testing.expectEqual(h.out, v);
}
}
/// Generates a HuffmanCode corresponding to the fixed literal table
pub fn fixedLiteralEncoder(codes: *[max_num_frequencies]Code) HuffmanEncoder {
var h: HuffmanEncoder = undefined;
h.codes = codes;
var ch: u16 = 0;
while (ch < max_num_frequencies) : (ch += 1) {
var bits: u16 = undefined;
var size: u16 = undefined;
switch (ch) {
0...143 => {
// size 8, 000110000 .. 10111111
bits = ch + 48;
size = 8;
},
144...255 => {
// size 9, 110010000 .. 111111111
bits = ch + 400 - 144;
size = 9;
},
256...279 => {
// size 7, 0000000 .. 0010111
bits = ch - 256;
size = 7;
},
else => {
// size 8, 11000000 .. 11000111
bits = ch + 192 - 280;
size = 8;
},
}
h.codes[ch] = .{ .code = bitReverse(u16, bits, @as(u5, @intCast(size))), .len = size };
}
return h;
}
pub fn fixedDistanceEncoder(codes: *[distance_code_count]Code) HuffmanEncoder {
var h: HuffmanEncoder = undefined;
h.codes = codes;
for (h.codes, 0..) |_, ch| {
h.codes[ch] = .{ .code = bitReverse(u16, @as(u16, @intCast(ch)), 5), .len = 5 };
}
return h;
}
pub fn huffmanDistanceEncoder(codes: *[distance_code_count]Code) HuffmanEncoder {
var distance_freq: [distance_code_count]u16 = @splat(0);
distance_freq[0] = 1;
// huff_distance is a static distance encoder used for huffman only encoding.
// It can be reused since we will not be encoding distance values.
var h: HuffmanEncoder = .{};
h.codes = codes;
h.generate(distance_freq[0..], 15);
return h;
}
test "generate a Huffman code for the fixed literal table specific to Deflate" {
const enc = fixedLiteralEncoder();
for (enc.codes) |c| {
switch (c.len) {
7 => {
const v = @bitReverse(@as(u7, @intCast(c.code)));
try testing.expect(v <= 0b0010111);
},
8 => {
const v = @bitReverse(@as(u8, @intCast(c.code)));
try testing.expect((v >= 0b000110000 and v <= 0b10111111) or
(v >= 0b11000000 and v <= 11000111));
},
9 => {
const v = @bitReverse(@as(u9, @intCast(c.code)));
try testing.expect(v >= 0b110010000 and v <= 0b111111111);
},
else => unreachable,
}
}
}
test "generate a Huffman code for the 30 possible relative distances (LZ77 distances) of Deflate" {
var codes: [distance_code_count]Code = undefined;
const enc = fixedDistanceEncoder(&codes);
for (enc.codes) |c| {
const v = @bitReverse(@as(u5, @intCast(c.code)));
try testing.expect(v <= 29);
try testing.expect(c.len == 5);
}
}
test "fixedLiteralEncoder codes" {
var al = std.ArrayList(u8).init(testing.allocator);
defer al.deinit();
var bw = std.Io.bitWriter(.little, al.writer());
var codes: [max_num_frequencies]Code = undefined;
const f = fixedLiteralEncoder(&codes);
for (f.codes) |c| {
try bw.writeBits(c.code, c.len);
}
try testing.expectEqualSlices(u8, &fixed_codes, al.items);
}
pub const fixed_codes = [_]u8{
0b00001100, 0b10001100, 0b01001100, 0b11001100, 0b00101100, 0b10101100, 0b01101100, 0b11101100,
0b00011100, 0b10011100, 0b01011100, 0b11011100, 0b00111100, 0b10111100, 0b01111100, 0b11111100,
0b00000010, 0b10000010, 0b01000010, 0b11000010, 0b00100010, 0b10100010, 0b01100010, 0b11100010,
0b00010010, 0b10010010, 0b01010010, 0b11010010, 0b00110010, 0b10110010, 0b01110010, 0b11110010,
0b00001010, 0b10001010, 0b01001010, 0b11001010, 0b00101010, 0b10101010, 0b01101010, 0b11101010,
0b00011010, 0b10011010, 0b01011010, 0b11011010, 0b00111010, 0b10111010, 0b01111010, 0b11111010,
0b00000110, 0b10000110, 0b01000110, 0b11000110, 0b00100110, 0b10100110, 0b01100110, 0b11100110,
0b00010110, 0b10010110, 0b01010110, 0b11010110, 0b00110110, 0b10110110, 0b01110110, 0b11110110,
0b00001110, 0b10001110, 0b01001110, 0b11001110, 0b00101110, 0b10101110, 0b01101110, 0b11101110,
0b00011110, 0b10011110, 0b01011110, 0b11011110, 0b00111110, 0b10111110, 0b01111110, 0b11111110,
0b00000001, 0b10000001, 0b01000001, 0b11000001, 0b00100001, 0b10100001, 0b01100001, 0b11100001,
0b00010001, 0b10010001, 0b01010001, 0b11010001, 0b00110001, 0b10110001, 0b01110001, 0b11110001,
0b00001001, 0b10001001, 0b01001001, 0b11001001, 0b00101001, 0b10101001, 0b01101001, 0b11101001,
0b00011001, 0b10011001, 0b01011001, 0b11011001, 0b00111001, 0b10111001, 0b01111001, 0b11111001,
0b00000101, 0b10000101, 0b01000101, 0b11000101, 0b00100101, 0b10100101, 0b01100101, 0b11100101,
0b00010101, 0b10010101, 0b01010101, 0b11010101, 0b00110101, 0b10110101, 0b01110101, 0b11110101,
0b00001101, 0b10001101, 0b01001101, 0b11001101, 0b00101101, 0b10101101, 0b01101101, 0b11101101,
0b00011101, 0b10011101, 0b01011101, 0b11011101, 0b00111101, 0b10111101, 0b01111101, 0b11111101,
0b00010011, 0b00100110, 0b01001110, 0b10011010, 0b00111100, 0b01100101, 0b11101010, 0b10110100,
0b11101001, 0b00110011, 0b01100110, 0b11001110, 0b10011010, 0b00111101, 0b01100111, 0b11101110,
0b10111100, 0b11111001, 0b00001011, 0b00010110, 0b00101110, 0b01011010, 0b10111100, 0b01100100,
0b11101001, 0b10110010, 0b11100101, 0b00101011, 0b01010110, 0b10101110, 0b01011010, 0b10111101,
0b01100110, 0b11101101, 0b10111010, 0b11110101, 0b00011011, 0b00110110, 0b01101110, 0b11011010,
0b10111100, 0b01100101, 0b11101011, 0b10110110, 0b11101101, 0b00111011, 0b01110110, 0b11101110,
0b11011010, 0b10111101, 0b01100111, 0b11101111, 0b10111110, 0b11111101, 0b00000111, 0b00001110,
0b00011110, 0b00111010, 0b01111100, 0b11100100, 0b11101000, 0b10110001, 0b11100011, 0b00100111,
0b01001110, 0b10011110, 0b00111010, 0b01111101, 0b11100110, 0b11101100, 0b10111001, 0b11110011,
0b00010111, 0b00101110, 0b01011110, 0b10111010, 0b01111100, 0b11100101, 0b11101010, 0b10110101,
0b11101011, 0b00110111, 0b01101110, 0b11011110, 0b10111010, 0b01111101, 0b11100111, 0b11101110,
0b10111101, 0b11111011, 0b00001111, 0b00011110, 0b00111110, 0b01111010, 0b11111100, 0b11100100,
0b11101001, 0b10110011, 0b11100111, 0b00101111, 0b01011110, 0b10111110, 0b01111010, 0b11111101,
0b11100110, 0b11101101, 0b10111011, 0b11110111, 0b00011111, 0b00111110, 0b01111110, 0b11111010,
0b11111100, 0b11100101, 0b11101011, 0b10110111, 0b11101111, 0b00111111, 0b01111110, 0b11111110,
0b11111010, 0b11111101, 0b11100111, 0b11101111, 0b10111111, 0b11111111, 0b00000000, 0b00100000,
0b00001000, 0b00001100, 0b10000001, 0b11000010, 0b11100000, 0b00001000, 0b00100100, 0b00001010,
0b10001101, 0b11000001, 0b11100010, 0b11110000, 0b00000100, 0b00100010, 0b10001001, 0b01001100,
0b10100001, 0b11010010, 0b11101000, 0b00000011, 0b10000011, 0b01000011, 0b11000011, 0b00100011,
0b10100011,
};

View File

@ -1,606 +0,0 @@
const Token = @import("../Token.zig");
pub const TestCase = struct {
tokens: []const Token,
input: []const u8 = "", // File name of input data matching the tokens.
want: []const u8 = "", // File name of data with the expected output with input available.
want_no_input: []const u8 = "", // File name of the expected output when no input is available.
};
pub const testCases = blk: {
@setEvalBranchQuota(4096 * 2);
const L = Token.initLiteral;
const M = Token.initMatch;
const ml = M(1, 258); // Maximum length token. Used to reduce the size of writeBlockTests
break :blk &[_]TestCase{
TestCase{
.input = "huffman-null-max.input",
.want = "huffman-null-max.{s}.expect",
.want_no_input = "huffman-null-max.{s}.expect-noinput",
.tokens = &[_]Token{
L(0x0), ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, L(0x0), L(0x0),
},
},
TestCase{
.input = "huffman-pi.input",
.want = "huffman-pi.{s}.expect",
.want_no_input = "huffman-pi.{s}.expect-noinput",
.tokens = &[_]Token{
L('3'), L('.'), L('1'), L('4'), L('1'), L('5'), L('9'), L('2'),
L('6'), L('5'), L('3'), L('5'), L('8'), L('9'), L('7'), L('9'),
L('3'), L('2'), L('3'), L('8'), L('4'), L('6'), L('2'), L('6'),
L('4'), L('3'), L('3'), L('8'), L('3'), L('2'), L('7'), L('9'),
L('5'), L('0'), L('2'), L('8'), L('8'), L('4'), L('1'), L('9'),
L('7'), L('1'), L('6'), L('9'), L('3'), L('9'), L('9'), L('3'),
L('7'), L('5'), L('1'), L('0'), L('5'), L('8'), L('2'), L('0'),
L('9'), L('7'), L('4'), L('9'), L('4'), L('4'), L('5'), L('9'),
L('2'), L('3'), L('0'), L('7'), L('8'), L('1'), L('6'), L('4'),
L('0'), L('6'), L('2'), L('8'), L('6'), L('2'), L('0'), L('8'),
L('9'), L('9'), L('8'), L('6'), L('2'), L('8'), L('0'), L('3'),
L('4'), L('8'), L('2'), L('5'), L('3'), L('4'), L('2'), L('1'),
L('1'), L('7'), L('0'), L('6'), L('7'), L('9'), L('8'), L('2'),
L('1'), L('4'), L('8'), L('0'), L('8'), L('6'), L('5'), L('1'),
L('3'), L('2'), L('8'), L('2'), L('3'), L('0'), L('6'), L('6'),
L('4'), L('7'), L('0'), L('9'), L('3'), L('8'), L('4'), L('4'),
L('6'), L('0'), L('9'), L('5'), L('5'), L('0'), L('5'), L('8'),
L('2'), L('2'), L('3'), L('1'), L('7'), L('2'), L('5'), L('3'),
L('5'), L('9'), L('4'), L('0'), L('8'), L('1'), L('2'), L('8'),
L('4'), L('8'), L('1'), L('1'), L('1'), L('7'), L('4'), M(127, 4),
L('4'), L('1'), L('0'), L('2'), L('7'), L('0'), L('1'), L('9'),
L('3'), L('8'), L('5'), L('2'), L('1'), L('1'), L('0'), L('5'),
L('5'), L('5'), L('9'), L('6'), L('4'), L('4'), L('6'), L('2'),
L('2'), L('9'), L('4'), L('8'), L('9'), L('5'), L('4'), L('9'),
L('3'), L('0'), L('3'), L('8'), L('1'), M(19, 4), L('2'), L('8'),
L('8'), L('1'), L('0'), L('9'), L('7'), L('5'), L('6'), L('6'),
L('5'), L('9'), L('3'), L('3'), L('4'), L('4'), L('6'), M(72, 4),
L('7'), L('5'), L('6'), L('4'), L('8'), L('2'), L('3'), L('3'),
L('7'), L('8'), L('6'), L('7'), L('8'), L('3'), L('1'), L('6'),
L('5'), L('2'), L('7'), L('1'), L('2'), L('0'), L('1'), L('9'),
L('0'), L('9'), L('1'), L('4'), M(27, 4), L('5'), L('6'), L('6'),
L('9'), L('2'), L('3'), L('4'), L('6'), M(179, 4), L('6'), L('1'),
L('0'), L('4'), L('5'), L('4'), L('3'), L('2'), L('6'), M(51, 4),
L('1'), L('3'), L('3'), L('9'), L('3'), L('6'), L('0'), L('7'),
L('2'), L('6'), L('0'), L('2'), L('4'), L('9'), L('1'), L('4'),
L('1'), L('2'), L('7'), L('3'), L('7'), L('2'), L('4'), L('5'),
L('8'), L('7'), L('0'), L('0'), L('6'), L('6'), L('0'), L('6'),
L('3'), L('1'), L('5'), L('5'), L('8'), L('8'), L('1'), L('7'),
L('4'), L('8'), L('8'), L('1'), L('5'), L('2'), L('0'), L('9'),
L('2'), L('0'), L('9'), L('6'), L('2'), L('8'), L('2'), L('9'),
L('2'), L('5'), L('4'), L('0'), L('9'), L('1'), L('7'), L('1'),
L('5'), L('3'), L('6'), L('4'), L('3'), L('6'), L('7'), L('8'),
L('9'), L('2'), L('5'), L('9'), L('0'), L('3'), L('6'), L('0'),
L('0'), L('1'), L('1'), L('3'), L('3'), L('0'), L('5'), L('3'),
L('0'), L('5'), L('4'), L('8'), L('8'), L('2'), L('0'), L('4'),
L('6'), L('6'), L('5'), L('2'), L('1'), L('3'), L('8'), L('4'),
L('1'), L('4'), L('6'), L('9'), L('5'), L('1'), L('9'), L('4'),
L('1'), L('5'), L('1'), L('1'), L('6'), L('0'), L('9'), L('4'),
L('3'), L('3'), L('0'), L('5'), L('7'), L('2'), L('7'), L('0'),
L('3'), L('6'), L('5'), L('7'), L('5'), L('9'), L('5'), L('9'),
L('1'), L('9'), L('5'), L('3'), L('0'), L('9'), L('2'), L('1'),
L('8'), L('6'), L('1'), L('1'), L('7'), M(234, 4), L('3'), L('2'),
M(10, 4), L('9'), L('3'), L('1'), L('0'), L('5'), L('1'), L('1'),
L('8'), L('5'), L('4'), L('8'), L('0'), L('7'), M(271, 4), L('3'),
L('7'), L('9'), L('9'), L('6'), L('2'), L('7'), L('4'), L('9'),
L('5'), L('6'), L('7'), L('3'), L('5'), L('1'), L('8'), L('8'),
L('5'), L('7'), L('5'), L('2'), L('7'), L('2'), L('4'), L('8'),
L('9'), L('1'), L('2'), L('2'), L('7'), L('9'), L('3'), L('8'),
L('1'), L('8'), L('3'), L('0'), L('1'), L('1'), L('9'), L('4'),
L('9'), L('1'), L('2'), L('9'), L('8'), L('3'), L('3'), L('6'),
L('7'), L('3'), L('3'), L('6'), L('2'), L('4'), L('4'), L('0'),
L('6'), L('5'), L('6'), L('6'), L('4'), L('3'), L('0'), L('8'),
L('6'), L('0'), L('2'), L('1'), L('3'), L('9'), L('4'), L('9'),
L('4'), L('6'), L('3'), L('9'), L('5'), L('2'), L('2'), L('4'),
L('7'), L('3'), L('7'), L('1'), L('9'), L('0'), L('7'), L('0'),
L('2'), L('1'), L('7'), L('9'), L('8'), M(154, 5), L('7'), L('0'),
L('2'), L('7'), L('7'), L('0'), L('5'), L('3'), L('9'), L('2'),
L('1'), L('7'), L('1'), L('7'), L('6'), L('2'), L('9'), L('3'),
L('1'), L('7'), L('6'), L('7'), L('5'), M(563, 5), L('7'), L('4'),
L('8'), L('1'), M(7, 4), L('6'), L('6'), L('9'), L('4'), L('0'),
M(488, 4), L('0'), L('0'), L('0'), L('5'), L('6'), L('8'), L('1'),
L('2'), L('7'), L('1'), L('4'), L('5'), L('2'), L('6'), L('3'),
L('5'), L('6'), L('0'), L('8'), L('2'), L('7'), L('7'), L('8'),
L('5'), L('7'), L('7'), L('1'), L('3'), L('4'), L('2'), L('7'),
L('5'), L('7'), L('7'), L('8'), L('9'), L('6'), M(298, 4), L('3'),
L('6'), L('3'), L('7'), L('1'), L('7'), L('8'), L('7'), L('2'),
L('1'), L('4'), L('6'), L('8'), L('4'), L('4'), L('0'), L('9'),
L('0'), L('1'), L('2'), L('2'), L('4'), L('9'), L('5'), L('3'),
L('4'), L('3'), L('0'), L('1'), L('4'), L('6'), L('5'), L('4'),
L('9'), L('5'), L('8'), L('5'), L('3'), L('7'), L('1'), L('0'),
L('5'), L('0'), L('7'), L('9'), M(203, 4), L('6'), M(340, 4), L('8'),
L('9'), L('2'), L('3'), L('5'), L('4'), M(458, 4), L('9'), L('5'),
L('6'), L('1'), L('1'), L('2'), L('1'), L('2'), L('9'), L('0'),
L('2'), L('1'), L('9'), L('6'), L('0'), L('8'), L('6'), L('4'),
L('0'), L('3'), L('4'), L('4'), L('1'), L('8'), L('1'), L('5'),
L('9'), L('8'), L('1'), L('3'), L('6'), L('2'), L('9'), L('7'),
L('7'), L('4'), M(117, 4), L('0'), L('9'), L('9'), L('6'), L('0'),
L('5'), L('1'), L('8'), L('7'), L('0'), L('7'), L('2'), L('1'),
L('1'), L('3'), L('4'), L('9'), M(1, 5), L('8'), L('3'), L('7'),
L('2'), L('9'), L('7'), L('8'), L('0'), L('4'), L('9'), L('9'),
M(731, 4), L('9'), L('7'), L('3'), L('1'), L('7'), L('3'), L('2'),
L('8'), M(395, 4), L('6'), L('3'), L('1'), L('8'), L('5'), M(770, 4),
M(745, 4), L('4'), L('5'), L('5'), L('3'), L('4'), L('6'), L('9'),
L('0'), L('8'), L('3'), L('0'), L('2'), L('6'), L('4'), L('2'),
L('5'), L('2'), L('2'), L('3'), L('0'), M(740, 4), M(616, 4), L('8'),
L('5'), L('0'), L('3'), L('5'), L('2'), L('6'), L('1'), L('9'),
L('3'), L('1'), L('1'), M(531, 4), L('1'), L('0'), L('1'), L('0'),
L('0'), L('0'), L('3'), L('1'), L('3'), L('7'), L('8'), L('3'),
L('8'), L('7'), L('5'), L('2'), L('8'), L('8'), L('6'), L('5'),
L('8'), L('7'), L('5'), L('3'), L('3'), L('2'), L('0'), L('8'),
L('3'), L('8'), L('1'), L('4'), L('2'), L('0'), L('6'), M(321, 4),
M(300, 4), L('1'), L('4'), L('7'), L('3'), L('0'), L('3'), L('5'),
L('9'), M(815, 5), L('9'), L('0'), L('4'), L('2'), L('8'), L('7'),
L('5'), L('5'), L('4'), L('6'), L('8'), L('7'), L('3'), L('1'),
L('1'), L('5'), L('9'), L('5'), M(854, 4), L('3'), L('8'), L('8'),
L('2'), L('3'), L('5'), L('3'), L('7'), L('8'), L('7'), L('5'),
M(896, 5), L('9'), M(315, 4), L('1'), M(329, 4), L('8'), L('0'), L('5'),
L('3'), M(395, 4), L('2'), L('2'), L('6'), L('8'), L('0'), L('6'),
L('6'), L('1'), L('3'), L('0'), L('0'), L('1'), L('9'), L('2'),
L('7'), L('8'), L('7'), L('6'), L('6'), L('1'), L('1'), L('1'),
L('9'), L('5'), L('9'), M(568, 4), L('6'), M(293, 5), L('8'), L('9'),
L('3'), L('8'), L('0'), L('9'), L('5'), L('2'), L('5'), L('7'),
L('2'), L('0'), L('1'), L('0'), L('6'), L('5'), L('4'), L('8'),
L('5'), L('8'), L('6'), L('3'), L('2'), L('7'), M(155, 4), L('9'),
L('3'), L('6'), L('1'), L('5'), L('3'), M(545, 4), M(349, 5), L('2'),
L('3'), L('0'), L('3'), L('0'), L('1'), L('9'), L('5'), L('2'),
L('0'), L('3'), L('5'), L('3'), L('0'), L('1'), L('8'), L('5'),
L('2'), M(370, 4), M(118, 4), L('3'), L('6'), L('2'), L('2'), L('5'),
L('9'), L('9'), L('4'), L('1'), L('3'), M(597, 4), L('4'), L('9'),
L('7'), L('2'), L('1'), L('7'), M(223, 4), L('3'), L('4'), L('7'),
L('9'), L('1'), L('3'), L('1'), L('5'), L('1'), L('5'), L('5'),
L('7'), L('4'), L('8'), L('5'), L('7'), L('2'), L('4'), L('2'),
L('4'), L('5'), L('4'), L('1'), L('5'), L('0'), L('6'), L('9'),
M(320, 4), L('8'), L('2'), L('9'), L('5'), L('3'), L('3'), L('1'),
L('1'), L('6'), L('8'), L('6'), L('1'), L('7'), L('2'), L('7'),
L('8'), M(824, 4), L('9'), L('0'), L('7'), L('5'), L('0'), L('9'),
M(270, 4), L('7'), L('5'), L('4'), L('6'), L('3'), L('7'), L('4'),
L('6'), L('4'), L('9'), L('3'), L('9'), L('3'), L('1'), L('9'),
L('2'), L('5'), L('5'), L('0'), L('6'), L('0'), L('4'), L('0'),
L('0'), L('9'), M(620, 4), L('1'), L('6'), L('7'), L('1'), L('1'),
L('3'), L('9'), L('0'), L('0'), L('9'), L('8'), M(822, 4), L('4'),
L('0'), L('1'), L('2'), L('8'), L('5'), L('8'), L('3'), L('6'),
L('1'), L('6'), L('0'), L('3'), L('5'), L('6'), L('3'), L('7'),
L('0'), L('7'), L('6'), L('6'), L('0'), L('1'), L('0'), L('4'),
M(371, 4), L('8'), L('1'), L('9'), L('4'), L('2'), L('9'), M(1055, 5),
M(240, 4), M(652, 4), L('7'), L('8'), L('3'), L('7'), L('4'), M(1193, 4),
L('8'), L('2'), L('5'), L('5'), L('3'), L('7'), M(522, 5), L('2'),
L('6'), L('8'), M(47, 4), L('4'), L('0'), L('4'), L('7'), M(466, 4),
L('4'), M(1206, 4), M(910, 4), L('8'), L('4'), M(937, 4), L('6'), M(800, 6),
L('3'), L('3'), L('1'), L('3'), L('6'), L('7'), L('7'), L('0'),
L('2'), L('8'), L('9'), L('8'), L('9'), L('1'), L('5'), L('2'),
M(99, 4), L('5'), L('2'), L('1'), L('6'), L('2'), L('0'), L('5'),
L('6'), L('9'), L('6'), M(1042, 4), L('0'), L('5'), L('8'), M(1144, 4),
L('5'), M(1177, 4), L('5'), L('1'), L('1'), M(522, 4), L('8'), L('2'),
L('4'), L('3'), L('0'), L('0'), L('3'), L('5'), L('5'), L('8'),
L('7'), L('6'), L('4'), L('0'), L('2'), L('4'), L('7'), L('4'),
L('9'), L('6'), L('4'), L('7'), L('3'), L('2'), L('6'), L('3'),
M(1087, 4), L('9'), L('9'), L('2'), M(1100, 4), L('4'), L('2'), L('6'),
L('9'), M(710, 6), L('7'), M(471, 4), L('4'), M(1342, 4), M(1054, 4), L('9'),
L('3'), L('4'), L('1'), L('7'), M(430, 4), L('1'), L('2'), M(43, 4),
L('4'), M(415, 4), L('1'), L('5'), L('0'), L('3'), L('0'), L('2'),
L('8'), L('6'), L('1'), L('8'), L('2'), L('9'), L('7'), L('4'),
L('5'), L('5'), L('5'), L('7'), L('0'), L('6'), L('7'), L('4'),
M(310, 4), L('5'), L('0'), L('5'), L('4'), L('9'), L('4'), L('5'),
L('8'), M(454, 4), L('9'), M(82, 4), L('5'), L('6'), M(493, 4), L('7'),
L('2'), L('1'), L('0'), L('7'), L('9'), M(346, 4), L('3'), L('0'),
M(267, 4), L('3'), L('2'), L('1'), L('1'), L('6'), L('5'), L('3'),
L('4'), L('4'), L('9'), L('8'), L('7'), L('2'), L('0'), L('2'),
L('7'), M(284, 4), L('0'), L('2'), L('3'), L('6'), L('4'), M(559, 4),
L('5'), L('4'), L('9'), L('9'), L('1'), L('1'), L('9'), L('8'),
M(1049, 4), L('4'), M(284, 4), L('5'), L('3'), L('5'), L('6'), L('6'),
L('3'), L('6'), L('9'), M(1105, 4), L('2'), L('6'), L('5'), M(741, 4),
L('7'), L('8'), L('6'), L('2'), L('5'), L('5'), L('1'), M(987, 4),
L('1'), L('7'), L('5'), L('7'), L('4'), L('6'), L('7'), L('2'),
L('8'), L('9'), L('0'), L('9'), L('7'), L('7'), L('7'), L('7'),
M(1108, 5), L('0'), L('0'), L('0'), M(1534, 4), L('7'), L('0'), M(1248, 4),
L('6'), M(1002, 4), L('4'), L('9'), L('1'), M(1055, 4), M(664, 4), L('2'),
L('1'), L('4'), L('7'), L('7'), L('2'), L('3'), L('5'), L('0'),
L('1'), L('4'), L('1'), L('4'), M(1604, 4), L('3'), L('5'), L('6'),
M(1200, 4), L('1'), L('6'), L('1'), L('3'), L('6'), L('1'), L('1'),
L('5'), L('7'), L('3'), L('5'), L('2'), L('5'), M(1285, 4), L('3'),
L('4'), M(92, 4), L('1'), L('8'), M(1148, 4), L('8'), L('4'), M(1512, 4),
L('3'), L('3'), L('2'), L('3'), L('9'), L('0'), L('7'), L('3'),
L('9'), L('4'), L('1'), L('4'), L('3'), L('3'), L('3'), L('4'),
L('5'), L('4'), L('7'), L('7'), L('6'), L('2'), L('4'), M(579, 4),
L('2'), L('5'), L('1'), L('8'), L('9'), L('8'), L('3'), L('5'),
L('6'), L('9'), L('4'), L('8'), L('5'), L('5'), L('6'), L('2'),
L('0'), L('9'), L('9'), L('2'), L('1'), L('9'), L('2'), L('2'),
L('2'), L('1'), L('8'), L('4'), L('2'), L('7'), M(575, 4), L('2'),
M(187, 4), L('6'), L('8'), L('8'), L('7'), L('6'), L('7'), L('1'),
L('7'), L('9'), L('0'), M(86, 4), L('0'), M(263, 5), L('6'), L('6'),
M(1000, 4), L('8'), L('8'), L('6'), L('2'), L('7'), L('2'), M(1757, 4),
L('1'), L('7'), L('8'), L('6'), L('0'), L('8'), L('5'), L('7'),
M(116, 4), L('3'), M(765, 5), L('7'), L('9'), L('7'), L('6'), L('6'),
L('8'), L('1'), M(702, 4), L('0'), L('0'), L('9'), L('5'), L('3'),
L('8'), L('8'), M(1593, 4), L('3'), M(1702, 4), L('0'), L('6'), L('8'),
L('0'), L('0'), L('6'), L('4'), L('2'), L('2'), L('5'), L('1'),
L('2'), L('5'), L('2'), M(1404, 4), L('7'), L('3'), L('9'), L('2'),
M(664, 4), M(1141, 4), L('4'), M(1716, 5), L('8'), L('6'), L('2'), L('6'),
L('9'), L('4'), L('5'), M(486, 4), L('4'), L('1'), L('9'), L('6'),
L('5'), L('2'), L('8'), L('5'), L('0'), M(154, 4), M(925, 4), L('1'),
L('8'), L('6'), L('3'), M(447, 4), L('4'), M(341, 5), L('2'), L('0'),
L('3'), L('9'), M(1420, 4), L('4'), L('5'), M(701, 4), L('2'), L('3'),
L('7'), M(1069, 4), L('6'), M(1297, 4), L('5'), L('6'), M(1593, 4), L('7'),
L('1'), L('9'), L('1'), L('7'), L('2'), L('8'), M(370, 4), L('7'),
L('6'), L('4'), L('6'), L('5'), L('7'), L('5'), L('7'), L('3'),
L('9'), M(258, 4), L('3'), L('8'), L('9'), M(1865, 4), L('8'), L('3'),
L('2'), L('6'), L('4'), L('5'), L('9'), L('9'), L('5'), L('8'),
M(1704, 4), L('0'), L('4'), L('7'), L('8'), M(479, 4), M(809, 4), L('9'),
M(46, 4), L('6'), L('4'), L('0'), L('7'), L('8'), L('9'), L('5'),
L('1'), M(143, 4), L('6'), L('8'), L('3'), M(304, 4), L('2'), L('5'),
L('9'), L('5'), L('7'), L('0'), M(1129, 4), L('8'), L('2'), L('2'),
M(713, 4), L('2'), M(1564, 4), L('4'), L('0'), L('7'), L('7'), L('2'),
L('6'), L('7'), L('1'), L('9'), L('4'), L('7'), L('8'), M(794, 4),
L('8'), L('2'), L('6'), L('0'), L('1'), L('4'), L('7'), L('6'),
L('9'), L('9'), L('0'), L('9'), M(1257, 4), L('0'), L('1'), L('3'),
L('6'), L('3'), L('9'), L('4'), L('4'), L('3'), M(640, 4), L('3'),
L('0'), M(262, 4), L('2'), L('0'), L('3'), L('4'), L('9'), L('6'),
L('2'), L('5'), L('2'), L('4'), L('5'), L('1'), L('7'), M(950, 4),
L('9'), L('6'), L('5'), L('1'), L('4'), L('3'), L('1'), L('4'),
L('2'), L('9'), L('8'), L('0'), L('9'), L('1'), L('9'), L('0'),
L('6'), L('5'), L('9'), L('2'), M(643, 4), L('7'), L('2'), L('2'),
L('1'), L('6'), L('9'), L('6'), L('4'), L('6'), M(1050, 4), M(123, 4),
L('5'), M(1295, 4), L('4'), M(1382, 5), L('8'), M(1370, 4), L('9'), L('7'),
M(1404, 4), L('5'), L('4'), M(1182, 4), M(575, 4), L('7'), M(1627, 4), L('8'),
L('4'), L('6'), L('8'), L('1'), L('3'), M(141, 4), L('6'), L('8'),
L('3'), L('8'), L('6'), L('8'), L('9'), L('4'), L('2'), L('7'),
L('7'), L('4'), L('1'), L('5'), L('5'), L('9'), L('9'), L('1'),
L('8'), L('5'), M(91, 4), L('2'), L('4'), L('5'), L('9'), L('5'),
L('3'), L('9'), L('5'), L('9'), L('4'), L('3'), L('1'), M(1464, 4),
L('7'), M(19, 4), L('6'), L('8'), L('0'), L('8'), L('4'), L('5'),
M(744, 4), L('7'), L('3'), M(2079, 4), L('9'), L('5'), L('8'), L('4'),
L('8'), L('6'), L('5'), L('3'), L('8'), M(1769, 4), L('6'), L('2'),
M(243, 4), L('6'), L('0'), L('9'), M(1207, 4), L('6'), L('0'), L('8'),
L('0'), L('5'), L('1'), L('2'), L('4'), L('3'), L('8'), L('8'),
L('4'), M(315, 4), M(12, 4), L('4'), L('1'), L('3'), M(784, 4), L('7'),
L('6'), L('2'), L('7'), L('8'), M(834, 4), L('7'), L('1'), L('5'),
M(1436, 4), L('3'), L('5'), L('9'), L('9'), L('7'), L('7'), L('0'),
L('0'), L('1'), L('2'), L('9'), M(1139, 4), L('8'), L('9'), L('4'),
L('4'), L('1'), M(632, 4), L('6'), L('8'), L('5'), L('5'), M(96, 4),
L('4'), L('0'), L('6'), L('3'), M(2279, 4), L('2'), L('0'), L('7'),
L('2'), L('2'), M(345, 4), M(516, 5), L('4'), L('8'), L('1'), L('5'),
L('8'), M(518, 4), M(511, 4), M(635, 4), M(665, 4), L('3'), L('9'), L('4'),
L('5'), L('2'), L('2'), L('6'), L('7'), M(1175, 6), L('8'), M(1419, 4),
L('2'), L('1'), M(747, 4), L('2'), M(904, 4), L('5'), L('4'), L('6'),
L('6'), L('6'), M(1308, 4), L('2'), L('3'), L('9'), L('8'), L('6'),
L('4'), L('5'), L('6'), M(1221, 4), L('1'), L('6'), L('3'), L('5'),
M(596, 5), M(2066, 4), L('7'), M(2222, 4), L('9'), L('8'), M(1119, 4), L('9'),
L('3'), L('6'), L('3'), L('4'), M(1884, 4), L('7'), L('4'), L('3'),
L('2'), L('4'), M(1148, 4), L('1'), L('5'), L('0'), L('7'), L('6'),
M(1212, 4), L('7'), L('9'), L('4'), L('5'), L('1'), L('0'), L('9'),
M(63, 4), L('0'), L('9'), L('4'), L('0'), M(1703, 4), L('8'), L('8'),
L('7'), L('9'), L('7'), L('1'), L('0'), L('8'), L('9'), L('3'),
M(2289, 4), L('6'), L('9'), L('1'), L('3'), L('6'), L('8'), L('6'),
L('7'), L('2'), M(604, 4), M(511, 4), L('5'), M(1344, 4), M(1129, 4), M(2050, 4),
L('1'), L('7'), L('9'), L('2'), L('8'), L('6'), L('8'), M(2253, 4),
L('8'), L('7'), L('4'), L('7'), M(1951, 5), L('8'), L('2'), L('4'),
M(2427, 4), L('8'), M(604, 4), L('7'), L('1'), L('4'), L('9'), L('0'),
L('9'), L('6'), L('7'), L('5'), L('9'), L('8'), M(1776, 4), L('3'),
L('6'), L('5'), M(309, 4), L('8'), L('1'), M(93, 4), M(1862, 4), M(2359, 4),
L('6'), L('8'), L('2'), L('9'), M(1407, 4), L('8'), L('7'), L('2'),
L('2'), L('6'), L('5'), L('8'), L('8'), L('0'), M(1554, 4), L('5'),
M(586, 4), L('4'), L('2'), L('7'), L('0'), L('4'), L('7'), L('7'),
L('5'), L('5'), M(2079, 4), L('3'), L('7'), L('9'), L('6'), L('4'),
L('1'), L('4'), L('5'), L('1'), L('5'), L('2'), M(1534, 4), L('2'),
L('3'), L('4'), L('3'), L('6'), L('4'), L('5'), L('4'), M(1503, 4),
L('4'), L('4'), L('4'), L('7'), L('9'), L('5'), M(61, 4), M(1316, 4),
M(2279, 5), L('4'), L('1'), M(1323, 4), L('3'), M(773, 4), L('5'), L('2'),
L('3'), L('1'), M(2114, 5), L('1'), L('6'), L('6'), L('1'), M(2227, 4),
L('5'), L('9'), L('6'), L('9'), L('5'), L('3'), L('6'), L('2'),
L('3'), L('1'), L('4'), M(1536, 4), L('2'), L('4'), L('8'), L('4'),
L('9'), L('3'), L('7'), L('1'), L('8'), L('7'), L('1'), L('1'),
L('0'), L('1'), L('4'), L('5'), L('7'), L('6'), L('5'), L('4'),
M(1890, 4), L('0'), L('2'), L('7'), L('9'), L('9'), L('3'), L('4'),
L('4'), L('0'), L('3'), L('7'), L('4'), L('2'), L('0'), L('0'),
L('7'), M(2368, 4), L('7'), L('8'), L('5'), L('3'), L('9'), L('0'),
L('6'), L('2'), L('1'), L('9'), M(666, 5), M(838, 4), L('8'), L('4'),
L('7'), M(979, 5), L('8'), L('3'), L('3'), L('2'), L('1'), L('4'),
L('4'), L('5'), L('7'), L('1'), M(645, 4), M(1911, 4), L('4'), L('3'),
L('5'), L('0'), M(2345, 4), M(1129, 4), L('5'), L('3'), L('1'), L('9'),
L('1'), L('0'), L('4'), L('8'), L('4'), L('8'), L('1'), L('0'),
L('0'), L('5'), L('3'), L('7'), L('0'), L('6'), M(2237, 4), M(1438, 5),
M(1922, 5), L('1'), M(1370, 4), L('7'), M(796, 4), L('5'), M(2029, 4), M(1037, 4),
L('6'), L('3'), M(2013, 5), L('4'), M(2418, 4), M(847, 5), M(1014, 5), L('8'),
M(1326, 5), M(2184, 5), L('9'), M(392, 4), L('9'), L('1'), M(2255, 4), L('8'),
L('1'), L('4'), L('6'), L('7'), L('5'), L('1'), M(1580, 4), L('1'),
L('2'), L('3'), L('9'), M(426, 6), L('9'), L('0'), L('7'), L('1'),
L('8'), L('6'), L('4'), L('9'), L('4'), L('2'), L('3'), L('1'),
L('9'), L('6'), L('1'), L('5'), L('6'), M(493, 4), M(1725, 4), L('9'),
L('5'), M(2343, 4), M(1130, 4), M(284, 4), L('6'), L('0'), L('3'), L('8'),
M(2598, 4), M(368, 4), M(901, 4), L('6'), L('2'), M(1115, 4), L('5'), M(2125, 4),
L('6'), L('3'), L('8'), L('9'), L('3'), L('7'), L('7'), L('8'),
L('7'), M(2246, 4), M(249, 4), L('9'), L('7'), L('9'), L('2'), L('0'),
L('7'), L('7'), L('3'), M(1496, 4), L('2'), L('1'), L('8'), L('2'),
L('5'), L('6'), M(2016, 4), L('6'), L('6'), M(1751, 4), L('4'), L('2'),
M(1663, 5), L('6'), M(1767, 4), L('4'), L('4'), M(37, 4), L('5'), L('4'),
L('9'), L('2'), L('0'), L('2'), L('6'), L('0'), L('5'), M(2740, 4),
M(997, 5), L('2'), L('0'), L('1'), L('4'), L('9'), M(1235, 4), L('8'),
L('5'), L('0'), L('7'), L('3'), M(1434, 4), L('6'), L('6'), L('6'),
L('0'), M(405, 4), L('2'), L('4'), L('3'), L('4'), L('0'), M(136, 4),
L('0'), M(1900, 4), L('8'), L('6'), L('3'), M(2391, 4), M(2021, 4), M(1068, 4),
M(373, 4), L('5'), L('7'), L('9'), L('6'), L('2'), L('6'), L('8'),
L('5'), L('6'), M(321, 4), L('5'), L('0'), L('8'), M(1316, 4), L('5'),
L('8'), L('7'), L('9'), L('6'), L('9'), L('9'), M(1810, 4), L('5'),
L('7'), L('4'), M(2585, 4), L('8'), L('4'), L('0'), M(2228, 4), L('1'),
L('4'), L('5'), L('9'), L('1'), M(1933, 4), L('7'), L('0'), M(565, 4),
L('0'), L('1'), M(3048, 4), L('1'), L('2'), M(3189, 4), L('0'), M(964, 4),
L('3'), L('9'), M(2859, 4), M(275, 4), L('7'), L('1'), L('5'), M(945, 4),
L('4'), L('2'), L('0'), M(3059, 5), L('9'), M(3011, 4), L('0'), L('7'),
M(834, 4), M(1942, 4), M(2736, 4), M(3171, 4), L('2'), L('1'), M(2401, 4), L('2'),
L('5'), L('1'), M(1404, 4), M(2373, 4), L('9'), L('2'), M(435, 4), L('8'),
L('2'), L('6'), M(2919, 4), L('2'), M(633, 4), L('3'), L('2'), L('1'),
L('5'), L('7'), L('9'), L('1'), L('9'), L('8'), L('4'), L('1'),
L('4'), M(2172, 5), L('9'), L('1'), L('6'), L('4'), M(1769, 5), L('9'),
M(2905, 5), M(2268, 4), L('7'), L('2'), L('2'), M(802, 4), L('5'), M(2213, 4),
M(322, 4), L('9'), L('1'), L('0'), M(189, 4), M(3164, 4), L('5'), L('2'),
L('8'), L('0'), L('1'), L('7'), M(562, 4), L('7'), L('1'), L('2'),
M(2325, 4), L('8'), L('3'), L('2'), M(884, 4), L('1'), M(1418, 4), L('0'),
L('9'), L('3'), L('5'), L('3'), L('9'), L('6'), L('5'), L('7'),
M(1612, 4), L('1'), L('0'), L('8'), L('3'), M(106, 4), L('5'), L('1'),
M(1915, 4), M(3419, 4), L('1'), L('4'), L('4'), L('4'), L('2'), L('1'),
L('0'), L('0'), M(515, 4), L('0'), L('3'), M(413, 4), L('1'), L('1'),
L('0'), L('3'), M(3202, 4), M(10, 4), M(39, 4), M(1539, 6), L('5'), L('1'),
L('6'), M(1498, 4), M(2180, 5), M(2347, 4), L('5'), M(3139, 5), L('8'), L('5'),
L('1'), L('7'), L('1'), L('4'), L('3'), L('7'), M(1542, 4), M(110, 4),
L('1'), L('5'), L('5'), L('6'), L('5'), L('0'), L('8'), L('8'),
M(954, 4), L('9'), L('8'), L('9'), L('8'), L('5'), L('9'), L('9'),
L('8'), L('2'), L('3'), L('8'), M(464, 4), M(2491, 4), L('3'), M(365, 4),
M(1087, 4), M(2500, 4), L('8'), M(3590, 5), L('3'), L('2'), M(264, 4), L('5'),
M(774, 4), L('3'), M(459, 4), L('9'), M(1052, 4), L('9'), L('8'), M(2174, 4),
L('4'), M(3257, 4), L('7'), M(1612, 4), L('0'), L('7'), M(230, 4), L('4'),
L('8'), L('1'), L('4'), L('1'), M(1338, 4), L('8'), L('5'), L('9'),
L('4'), L('6'), L('1'), M(3018, 4), L('8'), L('0'),
},
},
TestCase{
.input = "huffman-rand-1k.input",
.want = "huffman-rand-1k.{s}.expect",
.want_no_input = "huffman-rand-1k.{s}.expect-noinput",
.tokens = &[_]Token{
L(0xf8), L(0x8b), L(0x96), L(0x76), L(0x48), L(0xd), L(0x85), L(0x94), L(0x25), L(0x80), L(0xaf), L(0xc2), L(0xfe), L(0x8d),
L(0xe8), L(0x20), L(0xeb), L(0x17), L(0x86), L(0xc9), L(0xb7), L(0xc5), L(0xde), L(0x6), L(0xea), L(0x7d), L(0x18), L(0x8b),
L(0xe7), L(0x3e), L(0x7), L(0xda), L(0xdf), L(0xff), L(0x6c), L(0x73), L(0xde), L(0xcc), L(0xe7), L(0x6d), L(0x8d), L(0x4),
L(0x19), L(0x49), L(0x7f), L(0x47), L(0x1f), L(0x48), L(0x15), L(0xb0), L(0xe8), L(0x9e), L(0xf2), L(0x31), L(0x59), L(0xde),
L(0x34), L(0xb4), L(0x5b), L(0xe5), L(0xe0), L(0x9), L(0x11), L(0x30), L(0xc2), L(0x88), L(0x5b), L(0x7c), L(0x5d), L(0x14),
L(0x13), L(0x6f), L(0x23), L(0xa9), L(0xd), L(0xbc), L(0x2d), L(0x23), L(0xbe), L(0xd9), L(0xed), L(0x75), L(0x4), L(0x6c),
L(0x99), L(0xdf), L(0xfd), L(0x70), L(0x66), L(0xe6), L(0xee), L(0xd9), L(0xb1), L(0x9e), L(0x6e), L(0x83), L(0x59), L(0xd5),
L(0xd4), L(0x80), L(0x59), L(0x98), L(0x77), L(0x89), L(0x43), L(0x38), L(0xc9), L(0xaf), L(0x30), L(0x32), L(0x9a), L(0x20),
L(0x1b), L(0x46), L(0x3d), L(0x67), L(0x6e), L(0xd7), L(0x72), L(0x9e), L(0x4e), L(0x21), L(0x4f), L(0xc6), L(0xe0), L(0xd4),
L(0x7b), L(0x4), L(0x8d), L(0xa5), L(0x3), L(0xf6), L(0x5), L(0x9b), L(0x6b), L(0xdc), L(0x2a), L(0x93), L(0x77), L(0x28),
L(0xfd), L(0xb4), L(0x62), L(0xda), L(0x20), L(0xe7), L(0x1f), L(0xab), L(0x6b), L(0x51), L(0x43), L(0x39), L(0x2f), L(0xa0),
L(0x92), L(0x1), L(0x6c), L(0x75), L(0x3e), L(0xf4), L(0x35), L(0xfd), L(0x43), L(0x2e), L(0xf7), L(0xa4), L(0x75), L(0xda),
L(0xea), L(0x9b), L(0xa), L(0x64), L(0xb), L(0xe0), L(0x23), L(0x29), L(0xbd), L(0xf7), L(0xe7), L(0x83), L(0x3c), L(0xfb),
L(0xdf), L(0xb3), L(0xae), L(0x4f), L(0xa4), L(0x47), L(0x55), L(0x99), L(0xde), L(0x2f), L(0x96), L(0x6e), L(0x1c), L(0x43),
L(0x4c), L(0x87), L(0xe2), L(0x7c), L(0xd9), L(0x5f), L(0x4c), L(0x7c), L(0xe8), L(0x90), L(0x3), L(0xdb), L(0x30), L(0x95),
L(0xd6), L(0x22), L(0xc), L(0x47), L(0xb8), L(0x4d), L(0x6b), L(0xbd), L(0x24), L(0x11), L(0xab), L(0x2c), L(0xd7), L(0xbe),
L(0x6e), L(0x7a), L(0xd6), L(0x8), L(0xa3), L(0x98), L(0xd8), L(0xdd), L(0x15), L(0x6a), L(0xfa), L(0x93), L(0x30), L(0x1),
L(0x25), L(0x1d), L(0xa2), L(0x74), L(0x86), L(0x4b), L(0x6a), L(0x95), L(0xe8), L(0xe1), L(0x4e), L(0xe), L(0x76), L(0xb9),
L(0x49), L(0xa9), L(0x5f), L(0xa0), L(0xa6), L(0x63), L(0x3c), L(0x7e), L(0x7e), L(0x20), L(0x13), L(0x4f), L(0xbb), L(0x66),
L(0x92), L(0xb8), L(0x2e), L(0xa4), L(0xfa), L(0x48), L(0xcb), L(0xae), L(0xb9), L(0x3c), L(0xaf), L(0xd3), L(0x1f), L(0xe1),
L(0xd5), L(0x8d), L(0x42), L(0x6d), L(0xf0), L(0xfc), L(0x8c), L(0xc), L(0x0), L(0xde), L(0x40), L(0xab), L(0x8b), L(0x47),
L(0x97), L(0x4e), L(0xa8), L(0xcf), L(0x8e), L(0xdb), L(0xa6), L(0x8b), L(0x20), L(0x9), L(0x84), L(0x7a), L(0x66), L(0xe5),
L(0x98), L(0x29), L(0x2), L(0x95), L(0xe6), L(0x38), L(0x32), L(0x60), L(0x3), L(0xe3), L(0x9a), L(0x1e), L(0x54), L(0xe8),
L(0x63), L(0x80), L(0x48), L(0x9c), L(0xe7), L(0x63), L(0x33), L(0x6e), L(0xa0), L(0x65), L(0x83), L(0xfa), L(0xc6), L(0xba),
L(0x7a), L(0x43), L(0x71), L(0x5), L(0xf5), L(0x68), L(0x69), L(0x85), L(0x9c), L(0xba), L(0x45), L(0xcd), L(0x6b), L(0xb),
L(0x19), L(0xd1), L(0xbb), L(0x7f), L(0x70), L(0x85), L(0x92), L(0xd1), L(0xb4), L(0x64), L(0x82), L(0xb1), L(0xe4), L(0x62),
L(0xc5), L(0x3c), L(0x46), L(0x1f), L(0x92), L(0x31), L(0x1c), L(0x4e), L(0x41), L(0x77), L(0xf7), L(0xe7), L(0x87), L(0xa2),
L(0xf), L(0x6e), L(0xe8), L(0x92), L(0x3), L(0x6b), L(0xa), L(0xe7), L(0xa9), L(0x3b), L(0x11), L(0xda), L(0x66), L(0x8a),
L(0x29), L(0xda), L(0x79), L(0xe1), L(0x64), L(0x8d), L(0xe3), L(0x54), L(0xd4), L(0xf5), L(0xef), L(0x64), L(0x87), L(0x3b),
L(0xf4), L(0xc2), L(0xf4), L(0x71), L(0x13), L(0xa9), L(0xe9), L(0xe0), L(0xa2), L(0x6), L(0x14), L(0xab), L(0x5d), L(0xa7),
L(0x96), L(0x0), L(0xd6), L(0xc3), L(0xcc), L(0x57), L(0xed), L(0x39), L(0x6a), L(0x25), L(0xcd), L(0x76), L(0xea), L(0xba),
L(0x3a), L(0xf2), L(0xa1), L(0x95), L(0x5d), L(0xe5), L(0x71), L(0xcf), L(0x9c), L(0x62), L(0x9e), L(0x6a), L(0xfa), L(0xd5),
L(0x31), L(0xd1), L(0xa8), L(0x66), L(0x30), L(0x33), L(0xaa), L(0x51), L(0x17), L(0x13), L(0x82), L(0x99), L(0xc8), L(0x14),
L(0x60), L(0x9f), L(0x4d), L(0x32), L(0x6d), L(0xda), L(0x19), L(0x26), L(0x21), L(0xdc), L(0x7e), L(0x2e), L(0x25), L(0x67),
L(0x72), L(0xca), L(0xf), L(0x92), L(0xcd), L(0xf6), L(0xd6), L(0xcb), L(0x97), L(0x8a), L(0x33), L(0x58), L(0x73), L(0x70),
L(0x91), L(0x1d), L(0xbf), L(0x28), L(0x23), L(0xa3), L(0xc), L(0xf1), L(0x83), L(0xc3), L(0xc8), L(0x56), L(0x77), L(0x68),
L(0xe3), L(0x82), L(0xba), L(0xb9), L(0x57), L(0x56), L(0x57), L(0x9c), L(0xc3), L(0xd6), L(0x14), L(0x5), L(0x3c), L(0xb1),
L(0xaf), L(0x93), L(0xc8), L(0x8a), L(0x57), L(0x7f), L(0x53), L(0xfa), L(0x2f), L(0xaa), L(0x6e), L(0x66), L(0x83), L(0xfa),
L(0x33), L(0xd1), L(0x21), L(0xab), L(0x1b), L(0x71), L(0xb4), L(0x7c), L(0xda), L(0xfd), L(0xfb), L(0x7f), L(0x20), L(0xab),
L(0x5e), L(0xd5), L(0xca), L(0xfd), L(0xdd), L(0xe0), L(0xee), L(0xda), L(0xba), L(0xa8), L(0x27), L(0x99), L(0x97), L(0x69),
L(0xc1), L(0x3c), L(0x82), L(0x8c), L(0xa), L(0x5c), L(0x2d), L(0x5b), L(0x88), L(0x3e), L(0x34), L(0x35), L(0x86), L(0x37),
L(0x46), L(0x79), L(0xe1), L(0xaa), L(0x19), L(0xfb), L(0xaa), L(0xde), L(0x15), L(0x9), L(0xd), L(0x1a), L(0x57), L(0xff),
L(0xb5), L(0xf), L(0xf3), L(0x2b), L(0x5a), L(0x6a), L(0x4d), L(0x19), L(0x77), L(0x71), L(0x45), L(0xdf), L(0x4f), L(0xb3),
L(0xec), L(0xf1), L(0xeb), L(0x18), L(0x53), L(0x3e), L(0x3b), L(0x47), L(0x8), L(0x9a), L(0x73), L(0xa0), L(0x5c), L(0x8c),
L(0x5f), L(0xeb), L(0xf), L(0x3a), L(0xc2), L(0x43), L(0x67), L(0xb4), L(0x66), L(0x67), L(0x80), L(0x58), L(0xe), L(0xc1),
L(0xec), L(0x40), L(0xd4), L(0x22), L(0x94), L(0xca), L(0xf9), L(0xe8), L(0x92), L(0xe4), L(0x69), L(0x38), L(0xbe), L(0x67),
L(0x64), L(0xca), L(0x50), L(0xc7), L(0x6), L(0x67), L(0x42), L(0x6e), L(0xa3), L(0xf0), L(0xb7), L(0x6c), L(0xf2), L(0xe8),
L(0x5f), L(0xb1), L(0xaf), L(0xe7), L(0xdb), L(0xbb), L(0x77), L(0xb5), L(0xf8), L(0xcb), L(0x8), L(0xc4), L(0x75), L(0x7e),
L(0xc0), L(0xf9), L(0x1c), L(0x7f), L(0x3c), L(0x89), L(0x2f), L(0xd2), L(0x58), L(0x3a), L(0xe2), L(0xf8), L(0x91), L(0xb6),
L(0x7b), L(0x24), L(0x27), L(0xe9), L(0xae), L(0x84), L(0x8b), L(0xde), L(0x74), L(0xac), L(0xfd), L(0xd9), L(0xb7), L(0x69),
L(0x2a), L(0xec), L(0x32), L(0x6f), L(0xf0), L(0x92), L(0x84), L(0xf1), L(0x40), L(0xc), L(0x8a), L(0xbc), L(0x39), L(0x6e),
L(0x2e), L(0x73), L(0xd4), L(0x6e), L(0x8a), L(0x74), L(0x2a), L(0xdc), L(0x60), L(0x1f), L(0xa3), L(0x7), L(0xde), L(0x75),
L(0x8b), L(0x74), L(0xc8), L(0xfe), L(0x63), L(0x75), L(0xf6), L(0x3d), L(0x63), L(0xac), L(0x33), L(0x89), L(0xc3), L(0xf0),
L(0xf8), L(0x2d), L(0x6b), L(0xb4), L(0x9e), L(0x74), L(0x8b), L(0x5c), L(0x33), L(0xb4), L(0xca), L(0xa8), L(0xe4), L(0x99),
L(0xb6), L(0x90), L(0xa1), L(0xef), L(0xf), L(0xd3), L(0x61), L(0xb2), L(0xc6), L(0x1a), L(0x94), L(0x7c), L(0x44), L(0x55),
L(0xf4), L(0x45), L(0xff), L(0x9e), L(0xa5), L(0x5a), L(0xc6), L(0xa0), L(0xe8), L(0x2a), L(0xc1), L(0x8d), L(0x6f), L(0x34),
L(0x11), L(0xb9), L(0xbe), L(0x4e), L(0xd9), L(0x87), L(0x97), L(0x73), L(0xcf), L(0x3d), L(0x23), L(0xae), L(0xd5), L(0x1a),
L(0x5e), L(0xae), L(0x5d), L(0x6a), L(0x3), L(0xf9), L(0x22), L(0xd), L(0x10), L(0xd9), L(0x47), L(0x69), L(0x15), L(0x3f),
L(0xee), L(0x52), L(0xa3), L(0x8), L(0xd2), L(0x3c), L(0x51), L(0xf4), L(0xf8), L(0x9d), L(0xe4), L(0x98), L(0x89), L(0xc8),
L(0x67), L(0x39), L(0xd5), L(0x5e), L(0x35), L(0x78), L(0x27), L(0xe8), L(0x3c), L(0x80), L(0xae), L(0x79), L(0x71), L(0xd2),
L(0x93), L(0xf4), L(0xaa), L(0x51), L(0x12), L(0x1c), L(0x4b), L(0x1b), L(0xe5), L(0x6e), L(0x15), L(0x6f), L(0xe4), L(0xbb),
L(0x51), L(0x9b), L(0x45), L(0x9f), L(0xf9), L(0xc4), L(0x8c), L(0x2a), L(0xfb), L(0x1a), L(0xdf), L(0x55), L(0xd3), L(0x48),
L(0x93), L(0x27), L(0x1), L(0x26), L(0xc2), L(0x6b), L(0x55), L(0x6d), L(0xa2), L(0xfb), L(0x84), L(0x8b), L(0xc9), L(0x9e),
L(0x28), L(0xc2), L(0xef), L(0x1a), L(0x24), L(0xec), L(0x9b), L(0xae), L(0xbd), L(0x60), L(0xe9), L(0x15), L(0x35), L(0xee),
L(0x42), L(0xa4), L(0x33), L(0x5b), L(0xfa), L(0xf), L(0xb6), L(0xf7), L(0x1), L(0xa6), L(0x2), L(0x4c), L(0xca), L(0x90),
L(0x58), L(0x3a), L(0x96), L(0x41), L(0xe7), L(0xcb), L(0x9), L(0x8c), L(0xdb), L(0x85), L(0x4d), L(0xa8), L(0x89), L(0xf3),
L(0xb5), L(0x8e), L(0xfd), L(0x75), L(0x5b), L(0x4f), L(0xed), L(0xde), L(0x3f), L(0xeb), L(0x38), L(0xa3), L(0xbe), L(0xb0),
L(0x73), L(0xfc), L(0xb8), L(0x54), L(0xf7), L(0x4c), L(0x30), L(0x67), L(0x2e), L(0x38), L(0xa2), L(0x54), L(0x18), L(0xba),
L(0x8), L(0xbf), L(0xf2), L(0x39), L(0xd5), L(0xfe), L(0xa5), L(0x41), L(0xc6), L(0x66), L(0x66), L(0xba), L(0x81), L(0xef),
L(0x67), L(0xe4), L(0xe6), L(0x3c), L(0xc), L(0xca), L(0xa4), L(0xa), L(0x79), L(0xb3), L(0x57), L(0x8b), L(0x8a), L(0x75),
L(0x98), L(0x18), L(0x42), L(0x2f), L(0x29), L(0xa3), L(0x82), L(0xef), L(0x9f), L(0x86), L(0x6), L(0x23), L(0xe1), L(0x75),
L(0xfa), L(0x8), L(0xb1), L(0xde), L(0x17), L(0x4a),
},
},
TestCase{
.input = "huffman-rand-limit.input",
.want = "huffman-rand-limit.{s}.expect",
.want_no_input = "huffman-rand-limit.{s}.expect-noinput",
.tokens = &[_]Token{
L(0x61), M(1, 74), L(0xa), L(0xf8), L(0x8b), L(0x96), L(0x76), L(0x48), L(0xa), L(0x85), L(0x94), L(0x25), L(0x80),
L(0xaf), L(0xc2), L(0xfe), L(0x8d), L(0xe8), L(0x20), L(0xeb), L(0x17), L(0x86), L(0xc9), L(0xb7), L(0xc5), L(0xde),
L(0x6), L(0xea), L(0x7d), L(0x18), L(0x8b), L(0xe7), L(0x3e), L(0x7), L(0xda), L(0xdf), L(0xff), L(0x6c), L(0x73),
L(0xde), L(0xcc), L(0xe7), L(0x6d), L(0x8d), L(0x4), L(0x19), L(0x49), L(0x7f), L(0x47), L(0x1f), L(0x48), L(0x15),
L(0xb0), L(0xe8), L(0x9e), L(0xf2), L(0x31), L(0x59), L(0xde), L(0x34), L(0xb4), L(0x5b), L(0xe5), L(0xe0), L(0x9),
L(0x11), L(0x30), L(0xc2), L(0x88), L(0x5b), L(0x7c), L(0x5d), L(0x14), L(0x13), L(0x6f), L(0x23), L(0xa9), L(0xa),
L(0xbc), L(0x2d), L(0x23), L(0xbe), L(0xd9), L(0xed), L(0x75), L(0x4), L(0x6c), L(0x99), L(0xdf), L(0xfd), L(0x70),
L(0x66), L(0xe6), L(0xee), L(0xd9), L(0xb1), L(0x9e), L(0x6e), L(0x83), L(0x59), L(0xd5), L(0xd4), L(0x80), L(0x59),
L(0x98), L(0x77), L(0x89), L(0x43), L(0x38), L(0xc9), L(0xaf), L(0x30), L(0x32), L(0x9a), L(0x20), L(0x1b), L(0x46),
L(0x3d), L(0x67), L(0x6e), L(0xd7), L(0x72), L(0x9e), L(0x4e), L(0x21), L(0x4f), L(0xc6), L(0xe0), L(0xd4), L(0x7b),
L(0x4), L(0x8d), L(0xa5), L(0x3), L(0xf6), L(0x5), L(0x9b), L(0x6b), L(0xdc), L(0x2a), L(0x93), L(0x77), L(0x28),
L(0xfd), L(0xb4), L(0x62), L(0xda), L(0x20), L(0xe7), L(0x1f), L(0xab), L(0x6b), L(0x51), L(0x43), L(0x39), L(0x2f),
L(0xa0), L(0x92), L(0x1), L(0x6c), L(0x75), L(0x3e), L(0xf4), L(0x35), L(0xfd), L(0x43), L(0x2e), L(0xf7), L(0xa4),
L(0x75), L(0xda), L(0xea), L(0x9b), L(0xa),
},
},
TestCase{
.input = "huffman-shifts.input",
.want = "huffman-shifts.{s}.expect",
.want_no_input = "huffman-shifts.{s}.expect-noinput",
.tokens = &[_]Token{
L('1'), L('0'), M(2, 258), M(2, 258), M(2, 258), M(2, 258), M(2, 258), M(2, 258),
M(2, 258), M(2, 258), M(2, 258), M(2, 258), M(2, 258), M(2, 258), M(2, 258), M(2, 258),
M(2, 258), M(2, 76), L(0xd), L(0xa), L('2'), L('3'), M(2, 258), M(2, 258),
M(2, 258), M(2, 258), M(2, 258), M(2, 258), M(2, 258), M(2, 258), M(2, 258), M(2, 256),
},
},
TestCase{
.input = "huffman-text-shift.input",
.want = "huffman-text-shift.{s}.expect",
.want_no_input = "huffman-text-shift.{s}.expect-noinput",
.tokens = &[_]Token{
L('/'), L('/'), L('C'), L('o'), L('p'), L('y'), L('r'), L('i'),
L('g'), L('h'), L('t'), L('2'), L('0'), L('0'), L('9'), L('T'),
L('h'), L('G'), L('o'), L('A'), L('u'), L('t'), L('h'), L('o'),
L('r'), L('.'), L('A'), L('l'), L('l'), M(23, 5), L('r'), L('r'),
L('v'), L('d'), L('.'), L(0xd), L(0xa), L('/'), L('/'), L('U'),
L('o'), L('f'), L('t'), L('h'), L('i'), L('o'), L('u'), L('r'),
L('c'), L('c'), L('o'), L('d'), L('i'), L('g'), L('o'), L('v'),
L('r'), L('n'), L('d'), L('b'), L('y'), L('B'), L('S'), L('D'),
L('-'), L('t'), L('y'), L('l'), M(33, 4), L('l'), L('i'), L('c'),
L('n'), L('t'), L('h'), L('t'), L('c'), L('n'), L('b'), L('f'),
L('o'), L('u'), L('n'), L('d'), L('i'), L('n'), L('t'), L('h'),
L('L'), L('I'), L('C'), L('E'), L('N'), L('S'), L('E'), L('f'),
L('i'), L('l'), L('.'), L(0xd), L(0xa), L(0xd), L(0xa), L('p'),
L('c'), L('k'), L('g'), L('m'), L('i'), L('n'), M(11, 4), L('i'),
L('m'), L('p'), L('o'), L('r'), L('t'), L('"'), L('o'), L('"'),
M(13, 4), L('f'), L('u'), L('n'), L('c'), L('m'), L('i'), L('n'),
L('('), L(')'), L('{'), L(0xd), L(0xa), L(0x9), L('v'), L('r'),
L('b'), L('='), L('m'), L('k'), L('('), L('['), L(']'), L('b'),
L('y'), L('t'), L(','), L('6'), L('5'), L('5'), L('3'), L('5'),
L(')'), L(0xd), L(0xa), L(0x9), L('f'), L(','), L('_'), L(':'),
L('='), L('o'), L('.'), L('C'), L('r'), L('t'), L('('), L('"'),
L('h'), L('u'), L('f'), L('f'), L('m'), L('n'), L('-'), L('n'),
L('u'), L('l'), L('l'), L('-'), L('m'), L('x'), L('.'), L('i'),
L('n'), L('"'), M(34, 5), L('.'), L('W'), L('r'), L('i'), L('t'),
L('('), L('b'), L(')'), L(0xd), L(0xa), L('}'), L(0xd), L(0xa),
L('A'), L('B'), L('C'), L('D'), L('E'), L('F'), L('G'), L('H'),
L('I'), L('J'), L('K'), L('L'), L('M'), L('N'), L('O'), L('P'),
L('Q'), L('R'), L('S'), L('T'), L('U'), L('V'), L('X'), L('x'),
L('y'), L('z'), L('!'), L('"'), L('#'), L(0xc2), L(0xa4), L('%'),
L('&'), L('/'), L('?'), L('"'),
},
},
TestCase{
.input = "huffman-text.input",
.want = "huffman-text.{s}.expect",
.want_no_input = "huffman-text.{s}.expect-noinput",
.tokens = &[_]Token{
L('/'), L('/'), L(' '), L('z'), L('i'), L('g'), L(' '), L('v'),
L('0'), L('.'), L('1'), L('0'), L('.'), L('0'), L(0xa), L('/'),
L('/'), L(' '), L('c'), L('r'), L('e'), L('a'), L('t'), L('e'),
L(' '), L('a'), L(' '), L('f'), L('i'), L('l'), L('e'), M(5, 4),
L('l'), L('e'), L('d'), L(' '), L('w'), L('i'), L('t'), L('h'),
L(' '), L('0'), L('x'), L('0'), L('0'), L(0xa), L('c'), L('o'),
L('n'), L('s'), L('t'), L(' '), L('s'), L('t'), L('d'), L(' '),
L('='), L(' '), L('@'), L('i'), L('m'), L('p'), L('o'), L('r'),
L('t'), L('('), L('"'), L('s'), L('t'), L('d'), L('"'), L(')'),
L(';'), L(0xa), L(0xa), L('p'), L('u'), L('b'), L(' '), L('f'),
L('n'), L(' '), L('m'), L('a'), L('i'), L('n'), L('('), L(')'),
L(' '), L('!'), L('v'), L('o'), L('i'), L('d'), L(' '), L('{'),
L(0xa), L(' '), L(' '), L(' '), L(' '), L('v'), L('a'), L('r'),
L(' '), L('b'), L(' '), L('='), L(' '), L('['), L('1'), L(']'),
L('u'), L('8'), L('{'), L('0'), L('}'), L(' '), L('*'), L('*'),
L(' '), L('6'), L('5'), L('5'), L('3'), L('5'), L(';'), M(31, 5),
M(86, 6), L('f'), L(' '), L('='), L(' '), L('t'), L('r'), L('y'),
M(94, 4), L('.'), L('f'), L('s'), L('.'), L('c'), L('w'), L('d'),
L('('), L(')'), L('.'), M(144, 6), L('F'), L('i'), L('l'), L('e'),
L('('), M(43, 5), M(1, 4), L('"'), L('h'), L('u'), L('f'), L('f'),
L('m'), L('a'), L('n'), L('-'), L('n'), L('u'), L('l'), L('l'),
L('-'), L('m'), L('a'), L('x'), L('.'), L('i'), L('n'), L('"'),
L(','), M(31, 9), L('.'), L('{'), L(' '), L('.'), L('r'), L('e'),
L('a'), L('d'), M(79, 5), L('u'), L('e'), L(' '), L('}'), M(27, 6),
L(')'), M(108, 6), L('d'), L('e'), L('f'), L('e'), L('r'), L(' '),
L('f'), L('.'), L('c'), L('l'), L('o'), L('s'), L('e'), L('('),
M(183, 4), M(22, 4), L('_'), M(124, 7), L('f'), L('.'), L('w'), L('r'),
L('i'), L('t'), L('e'), L('A'), L('l'), L('l'), L('('), L('b'),
L('['), L('0'), L('.'), L('.'), L(']'), L(')'), L(';'), L(0xa),
L('}'), L(0xa),
},
},
TestCase{
.input = "huffman-zero.input",
.want = "huffman-zero.{s}.expect",
.want_no_input = "huffman-zero.{s}.expect-noinput",
.tokens = &[_]Token{ L(0x30), ml, M(1, 49) },
},
TestCase{
.input = "",
.want = "",
.want_no_input = "null-long-match.{s}.expect-noinput",
.tokens = &[_]Token{
L(0x0), ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml, ml,
ml, ml, ml, M(1, 8),
},
},
};
};

View File

@ -1 +0,0 @@
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590099465764078951269468398352595709825822620522489407726719478268482601476990902640136394437455305068203496252451749399651431429809190659250937221696461515709858387410597885959772975498930161753928468138268683868942774155991855925245953959431049972524680845987273644695848653836736222626099124608051243884390451244136549762780797715691435997700129616089441694868555848406353422072225828488648158456028506016842739452267467678895252138522549954666727823986456596116354886230577456498035593634568174324112515076069479451096596094025228879710893145669136867228748940560101503308617928680920874760917824938589009714909675985261365549781893129784821682998948722658804857564014270477555132379641451523746234364542858444795265867821051141354735739523113427166102135969536231442952484937187110145765403590279934403742007310578539062198387447808478489683321445713868751943506430218453191048481005370614680674919278191197939952061419663428754440643745123718192179998391015919561814675142691239748940907186494231961567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180

View File

@ -1,4 +0,0 @@
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
řvH
…”%€ŻÂţŤč ë†É·ĹŢę}‹ç>Úß˙lsŢĚçmŤIGH°čžň1YŢ4´[ĺŕ <30>[|]o#©
Ľ-#ľŮíul™ßýpfćîٱžn<C5BE>YŐÔ€Y<E282AC>w‰C8ÉŻ02š F=gn×ržN!OĆŕÔ{ŤĄökÜ*“w(ý´bÚ ç«kQC9/ lu>ô5ýC.÷¤uÚę

View File

@ -1,2 +0,0 @@
101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010
232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323

View File

@ -1,14 +0,0 @@
//Copyright2009ThGoAuthor.Allrightrrvd.
//UofthiourccodigovrndbyBSD-tyl
//licnthtcnbfoundinthLICENSEfil.
pckgmin
import"o"
funcmin(){
vrb=mk([]byt,65535)
f,_:=o.Crt("huffmn-null-mx.in")
f.Writ(b)
}
ABCDEFGHIJKLMNOPQRSTUVXxyz!"#¤%&/?"

View File

@ -1,14 +0,0 @@
// zig v0.10.0
// create a file filled with 0x00
const std = @import("std");
pub fn main() !void {
var b = [1]u8{0} ** 65535;
const f = try std.fs.cwd().createFile(
"huffman-null-max.in",
.{ .read = true },
);
defer f.close();
_ = try f.writeAll(b[0..]);
}

View File

@ -1 +0,0 @@
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000