mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 13:54:21 +00:00
Basically everything that has a direct replacement or no uses left. Notable omissions: - std.ArrayHashMap: Too much fallout, needs a separate cleanup. - std.debug.runtime_safety: Too much fallout. - std.heap.GeneralPurposeAllocator: Lots of references to it remain, not a simple find and replace as "debug allocator" is not equivalent to "general purpose allocator". - std.io.Reader: Is being reworked at the moment. - std.unicode.utf8Decode(): No replacement, needs a new API first. - Manifest backwards compat options: Removal would break test data used by TestFetchBuilder. - panic handler needs to be a namespace: Many tests still rely on it being a function, needs a separate cleanup.
102 lines
3.4 KiB
Zig
102 lines
3.4 KiB
Zig
// There is a generic CRC implementation "Crc()" which can be parameterized via
|
|
// the Algorithm struct for a plethora of uses.
|
|
//
|
|
// The primary interface for all of the standard CRC algorithms is the
|
|
// generated file "crc.zig", which uses the implementation code here to define
|
|
// many standard CRCs.
|
|
|
|
const std = @import("std");
|
|
|
|
pub fn Algorithm(comptime W: type) type {
|
|
return struct {
|
|
polynomial: W,
|
|
initial: W,
|
|
reflect_input: bool,
|
|
reflect_output: bool,
|
|
xor_output: W,
|
|
};
|
|
}
|
|
|
|
pub fn Crc(comptime W: type, comptime algorithm: Algorithm(W)) type {
|
|
return struct {
|
|
const Self = @This();
|
|
const I = if (@bitSizeOf(W) < 8) u8 else W;
|
|
const lookup_table = blk: {
|
|
@setEvalBranchQuota(2500);
|
|
|
|
const poly = if (algorithm.reflect_input)
|
|
@bitReverse(@as(I, algorithm.polynomial)) >> (@bitSizeOf(I) - @bitSizeOf(W))
|
|
else
|
|
@as(I, algorithm.polynomial) << (@bitSizeOf(I) - @bitSizeOf(W));
|
|
|
|
var table: [256]I = undefined;
|
|
for (&table, 0..) |*e, i| {
|
|
var crc: I = i;
|
|
if (algorithm.reflect_input) {
|
|
var j: usize = 0;
|
|
while (j < 8) : (j += 1) {
|
|
crc = (crc >> 1) ^ ((crc & 1) * poly);
|
|
}
|
|
} else {
|
|
crc <<= @bitSizeOf(I) - 8;
|
|
var j: usize = 0;
|
|
while (j < 8) : (j += 1) {
|
|
crc = (crc << 1) ^ (((crc >> (@bitSizeOf(I) - 1)) & 1) * poly);
|
|
}
|
|
}
|
|
e.* = crc;
|
|
}
|
|
break :blk table;
|
|
};
|
|
|
|
crc: I,
|
|
|
|
pub fn init() Self {
|
|
const initial = if (algorithm.reflect_input)
|
|
@bitReverse(@as(I, algorithm.initial)) >> (@bitSizeOf(I) - @bitSizeOf(W))
|
|
else
|
|
@as(I, algorithm.initial) << (@bitSizeOf(I) - @bitSizeOf(W));
|
|
return Self{ .crc = initial };
|
|
}
|
|
|
|
inline fn tableEntry(index: I) I {
|
|
return lookup_table[@as(u8, @intCast(index & 0xFF))];
|
|
}
|
|
|
|
pub fn update(self: *Self, bytes: []const u8) void {
|
|
var i: usize = 0;
|
|
if (@bitSizeOf(I) <= 8) {
|
|
while (i < bytes.len) : (i += 1) {
|
|
self.crc = tableEntry(self.crc ^ bytes[i]);
|
|
}
|
|
} else if (algorithm.reflect_input) {
|
|
while (i < bytes.len) : (i += 1) {
|
|
const table_index = self.crc ^ bytes[i];
|
|
self.crc = tableEntry(table_index) ^ (self.crc >> 8);
|
|
}
|
|
} else {
|
|
while (i < bytes.len) : (i += 1) {
|
|
const table_index = (self.crc >> (@bitSizeOf(I) - 8)) ^ bytes[i];
|
|
self.crc = tableEntry(table_index) ^ (self.crc << 8);
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn final(self: Self) W {
|
|
var c = self.crc;
|
|
if (algorithm.reflect_input != algorithm.reflect_output) {
|
|
c = @bitReverse(c);
|
|
}
|
|
if (!algorithm.reflect_output) {
|
|
c >>= @bitSizeOf(I) - @bitSizeOf(W);
|
|
}
|
|
return @as(W, @intCast(c ^ algorithm.xor_output));
|
|
}
|
|
|
|
pub fn hash(bytes: []const u8) W {
|
|
var c = Self.init();
|
|
c.update(bytes);
|
|
return c.final();
|
|
}
|
|
};
|
|
}
|