| ... | ... | @@ -2780,10 +2780,8 @@ pub const Zld = struct { |
| 2780 | 2780 | |
| 2781 | 2781 | const chunk_size = 0x4000; |
| 2782 | 2782 | |
| 2783 | | var rb = RingBuffer{}; |
| 2784 | 2783 | var hasher = Md5.init(.{}); |
| 2785 | 2784 | var buffer: [chunk_size]u8 = undefined; |
| 2786 | | var hashed: usize = 0; |
| 2787 | 2785 | |
| 2788 | 2786 | for (subsections[0..count]) |cut| { |
| 2789 | 2787 | const size = cut.end - cut.start; |
| ... | ... | @@ -2799,24 +2797,10 @@ pub const Zld = struct { |
| 2799 | 2797 | const amt = try self.file.preadAll(buffer[0..fsize], fstart); |
| 2800 | 2798 | if (amt != fsize) return error.InputOutput; |
| 2801 | 2799 | |
| 2802 | | var leftover = rb.append(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 | | } |
| 2800 | hasher.update(buffer[0..fsize]); |
| 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 | 2804 | hasher.final(&self.uuid_cmd.uuid); |
| 2821 | 2805 | conformUuid(&self.uuid_cmd.uuid); |
| 2822 | 2806 | }, |
| ... | ... | @@ -2826,44 +2810,6 @@ pub const Zld = struct { |
| 2826 | 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 | 2813 | inline fn conformUuid(out: *[Md5.digest_length]u8) void { |
| 2868 | 2814 | // LC_UUID uuids should conform to RFC 4122 UUID version 4 & UUID version 5 formats |
| 2869 | 2815 | out[6] = (out[6] & 0x0F) | (3 << 4); |