| ... | @@ -2780,10 +2780,8 @@ pub const Zld = struct { | ... | @@ -2780,10 +2780,8 @@ pub const Zld = struct { |
| 2780 | | 2780 | |
| 2781 | const chunk_size = 0x4000; | 2781 | const chunk_size = 0x4000; |
| 2782 | | 2782 | |
| 2783 | var rb = RingBuffer{}; | | |
| 2784 | var hasher = Md5.init(.{}); | 2783 | var hasher = Md5.init(.{}); |
| 2785 | var buffer: [chunk_size]u8 = undefined; | 2784 | var buffer: [chunk_size]u8 = undefined; |
| 2786 | var hashed: usize = 0; | | |
| 2787 | | 2785 | |
| 2788 | for (subsections[0..count]) |cut| { | 2786 | for (subsections[0..count]) |cut| { |
| 2789 | const size = cut.end - cut.start; | 2787 | const size = cut.end - cut.start; |
| ... | @@ -2799,24 +2797,10 @@ pub const Zld = struct { | ... | @@ -2799,24 +2797,10 @@ pub const Zld = struct { |
| 2799 | const amt = try self.file.preadAll(buffer[0..fsize], fstart); | 2797 | const amt = try self.file.preadAll(buffer[0..fsize], fstart); |
| 2800 | if (amt != fsize) return error.InputOutput; | 2798 | if (amt != fsize) return error.InputOutput; |
| 2801 | | 2799 | |
| 2802 | var leftover = rb.append(buffer[0..fsize]); | 2800 | hasher.update(buffer[0..fsize]); |
| 2803 | while (leftover > 0) { | | |
| 2804 | if (rb.full()) { | | |
| 2805 | hasher.update(rb.getBuffer()); | | |
| 2806 | hashed += rb.getBuffer().len; | | |
| 2807 | rb.clear(); | | |
| 2808 | } | | |
| 2809 | leftover = rb.append(buffer[fsize - leftover ..]); | | |
| 2810 | } | | |
| 2811 | } | 2801 | } |
| 2812 | } | 2802 | } |
| 2813 | | 2803 | |
| 2814 | if (!rb.empty()) { | | |
| 2815 | hasher.update(rb.getBuffer()); | | |
| 2816 | hashed += rb.getBuffer().len; | | |
| 2817 | rb.clear(); | | |
| 2818 | } | | |
| 2819 | | | |
| 2820 | hasher.final(&self.uuid_cmd.uuid); | 2804 | hasher.final(&self.uuid_cmd.uuid); |
| 2821 | conformUuid(&self.uuid_cmd.uuid); | 2805 | conformUuid(&self.uuid_cmd.uuid); |
| 2822 | }, | 2806 | }, |
| ... | @@ -2826,44 +2810,6 @@ pub const Zld = struct { | ... | @@ -2826,44 +2810,6 @@ pub const Zld = struct { |
| 2826 | try self.file.pwriteAll(&self.uuid_cmd.uuid, in_file); | 2810 | try self.file.pwriteAll(&self.uuid_cmd.uuid, in_file); |
| 2827 | } | 2811 | } |
| 2828 | | 2812 | |
| 2829 | const RingBuffer = struct { | | |
| 2830 | buffer: [chunk_size]u8 = undefined, | | |
| 2831 | pos: usize = 0, | | |
| 2832 | | | |
| 2833 | const chunk_size = 0x4000; | | |
| 2834 | | | |
| 2835 | fn append(rb: *RingBuffer, data: []u8) usize { | | |
| 2836 | const cpy_size = if (data.len > rb.available()) | | |
| 2837 | data.len - rb.available() | | |
| 2838 | else | | |
| 2839 | data.len; | | |
| 2840 | mem.copy(u8, rb.buffer[rb.pos..], data[0..cpy_size]); | | |
| 2841 | rb.pos += cpy_size; | | |
| 2842 | const leftover = data.len - cpy_size; | | |
| 2843 | return leftover; | | |
| 2844 | } | | |
| 2845 | | | |
| 2846 | fn available(rb: RingBuffer) usize { | | |
| 2847 | return rb.buffer.len - rb.pos; | | |
| 2848 | } | | |
| 2849 | | | |
| 2850 | fn clear(rb: *RingBuffer) void { | | |
| 2851 | rb.pos = 0; | | |
| 2852 | } | | |
| 2853 | | | |
| 2854 | fn full(rb: RingBuffer) bool { | | |
| 2855 | return rb.buffer.len == rb.pos; | | |
| 2856 | } | | |
| 2857 | | | |
| 2858 | fn empty(rb: RingBuffer) bool { | | |
| 2859 | return rb.pos == 0; | | |
| 2860 | } | | |
| 2861 | | | |
| 2862 | fn getBuffer(rb: *const RingBuffer) []const u8 { | | |
| 2863 | return rb.buffer[0..rb.pos]; | | |
| 2864 | } | | |
| 2865 | }; | | |
| 2866 | | | |
| 2867 | inline fn conformUuid(out: *[Md5.digest_length]u8) void { | 2813 | inline fn conformUuid(out: *[Md5.digest_length]u8) void { |
| 2868 | // LC_UUID uuids should conform to RFC 4122 UUID version 4 & UUID version 5 formats | 2814 | // LC_UUID uuids should conform to RFC 4122 UUID version 4 & UUID version 5 formats |
| 2869 | out[6] = (out[6] & 0x0F) | (3 << 4); | 2815 | out[6] = (out[6] & 0x0F) | (3 << 4); |