mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 08:45:52 +00:00
delete flate implementation
This commit is contained in:
parent
83513ade35
commit
a4f05a4588
@ -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;
|
||||
}
|
||||
|
||||
@ -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
@ -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
|
||||
|
||||
475
lib/std/compress/flate/HuffmanEncoder.zig
Normal file
475
lib/std/compress/flate/HuffmanEncoder.zig
Normal 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,
|
||||
};
|
||||
606
lib/std/compress/flate/testdata/block_writer.zig
vendored
606
lib/std/compress/flate/testdata/block_writer.zig
vendored
@ -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),
|
||||
},
|
||||
},
|
||||
};
|
||||
};
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
||||
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420198938095257201065485863278865936153381827968230301952035301852968995773622599413891249721775283479131515574857242454150695950829533116861727855889075098381754637464939319255060400927701671139009848824012858361603563707660104710181942955596198946767837449448255379774726847104047534646208046684259069491293313677028989152104752162056966024058038150193511253382430035587640247496473263914199272604269922796782354781636009341721641219924586315030286182974555706749838505494588586926995690927210797509302955321165344987202755960236480665499119881834797753566369807426542527862551818417574672890977772793800081647060016145249192173217214772350141441973568548161361157352552133475741849468438523323907394143334547762416862518983569485562099219222184272550254256887671790494601653466804988627232791786085784383827967976681454100953883786360950680064225125205117392984896084128488626945604241965285022210661186306744278622039194945047123713786960956364371917287467764657573962413890865832645995813390478027590099465764078951269468398352595709825822620522489407726719478268482601476990902640136394437455305068203496252451749399651431429809190659250937221696461515709858387410597885959772975498930161753928468138268683868942774155991855925245953959431049972524680845987273644695848653836736222626099124608051243884390451244136549762780797715691435997700129616089441694868555848406353422072225828488648158456028506016842739452267467678895252138522549954666727823986456596116354886230577456498035593634568174324112515076069479451096596094025228879710893145669136867228748940560101503308617928680920874760917824938589009714909675985261365549781893129784821682998948722658804857564014270477555132379641451523746234364542858444795265867821051141354735739523113427166102135969536231442952484937187110145765403590279934403742007310578539062198387447808478489683321445713868751943506430218453191048481005370614680674919278191197939952061419663428754440643745123718192179998391015919561814675142691239748940907186494231961567945208095146550225231603881930142093762137855956638937787083039069792077346722182562599661501421503068038447734549202605414665925201497442850732518666002132434088190710486331734649651453905796268561005508106658796998163574736384052571459102897064140110971206280439039759515677157700420337869936007230558763176359421873125147120532928191826186125867321579198414848829164470609575270695722091756711672291098169091528017350671274858322287183520935396572512108357915136988209144421006751033467110314126711136990865851639831501970165151168517143765761835155650884909989859982387345528331635507647918535893226185489632132933089857064204675259070915481416549859461637180
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,4 +0,0 @@
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
|
||||
ř‹–vH
|
||||
…”%€ŻÂţŤč ë†É·ĹŢę}‹ç>Úß˙lsŢĚçmŤIGH°čžň1YŢ4´[ĺŕ 0Â<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Úę›
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,2 +0,0 @@
|
||||
101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010
|
||||
232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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!"#¤%&/?"
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -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..]);
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1 +0,0 @@
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user