| ... | ... | @@ -164,50 +164,6 @@ pub const EndRecord = extern struct { |
| 164 | 164 | } |
| 165 | 165 | }; |
| 166 | 166 | |
| 167 | | pub const Decompress = struct { |
| 168 | | interface: Reader, |
| 169 | | state: union { |
| 170 | | inflate: flate.Decompress, |
| 171 | | store: *Reader, |
| 172 | | }, |
| 173 | | |
| 174 | | pub fn init(reader: *Reader, method: CompressionMethod, buffer: []u8) Reader { |
| 175 | | return switch (method) { |
| 176 | | .store => .{ |
| 177 | | .state = .{ .store = reader }, |
| 178 | | .interface = .{ |
| 179 | | .context = undefined, |
| 180 | | .vtable = &.{ .stream = streamStore }, |
| 181 | | .buffer = buffer, |
| 182 | | .end = 0, |
| 183 | | .seek = 0, |
| 184 | | }, |
| 185 | | }, |
| 186 | | .deflate => .{ |
| 187 | | .state = .{ .inflate = .init(reader, .raw) }, |
| 188 | | .interface = .{ |
| 189 | | .context = undefined, |
| 190 | | .vtable = &.{ .stream = streamDeflate }, |
| 191 | | .buffer = buffer, |
| 192 | | .end = 0, |
| 193 | | .seek = 0, |
| 194 | | }, |
| 195 | | }, |
| 196 | | else => unreachable, |
| 197 | | }; |
| 198 | | } |
| 199 | | |
| 200 | | fn streamStore(r: *Reader, w: *Writer, limit: std.Io.Limit) Reader.StreamError!usize { |
| 201 | | const d: *Decompress = @fieldParentPtr("interface", r); |
| 202 | | return d.store.read(w, limit); |
| 203 | | } |
| 204 | | |
| 205 | | fn streamDeflate(r: *Reader, w: *Writer, limit: std.Io.Limit) Reader.StreamError!usize { |
| 206 | | const d: *Decompress = @fieldParentPtr("interface", r); |
| 207 | | return flate.Decompress.read(&d.inflate, w, limit); |
| 208 | | } |
| 209 | | }; |
| 210 | | |
| 211 | 167 | fn isBadFilename(filename: []const u8) bool { |
| 212 | 168 | if (filename.len == 0 or filename[0] == '/') |
| 213 | 169 | return true; |