started working on compresison

This commit is contained in:
Andre Henriques 2023-05-22 22:04:16 +01:00
parent 0ea7d8b7ee
commit 1bb0de9d0e

View File

@ -35,6 +35,7 @@ const ZipFileHeader = struct {
file_name: []u8,
extra_field: []u8,
compressed_content: []u8,
allocator: std.mem.Allocator,
@ -47,25 +48,28 @@ const ZipFileHeader = struct {
var self = Self{
.allocator = allocator,
.version = try reader.readInt(u16, .Big),
.general = try reader.readInt(u16, .Big),
.compression_method = try reader.readInt(u16, .Big),
.last_mod_time = try reader.readInt(u16, .Big),
.last_mod_date = try reader.readInt(u16, .Big),
.crc_32 = try reader.readInt(u32, .Big),
.compressed_size = try reader.readInt(u32, .Big),
.uncompressed_size = try reader.readInt(u32, .Big),
.file_name_length = try reader.readInt(u16, .Big),
.extra_field_length = try reader.readInt(u16, .Big),
.version = try reader.readInt(u16, .Little),
.general = try reader.readInt(u16, .Little),
.compression_method = try reader.readInt(u16, .Little),
.last_mod_time = try reader.readInt(u16, .Little),
.last_mod_date = try reader.readInt(u16, .Little),
.crc_32 = try reader.readInt(u32, .Little),
.compressed_size = try reader.readInt(u32, .Little),
.uncompressed_size = try reader.readInt(u32, .Little),
.file_name_length = try reader.readInt(u16, .Little),
.extra_field_length = try reader.readInt(u16, .Little),
.file_name = undefined,
.extra_field = undefined,
.compressed_content = undefined,
};
self.file_name = try allocator.alloc(u8, self.file_name_length);
self.extra_field = try allocator.alloc(u8, self.extra_field_length);
self.compressed_content = try allocator.alloc(u8, self.compressed_size);
_ = try reader.read(self.file_name);
_ = try reader.read(self.extra_field);
_ = try reader.read(self.compressed_content);
return self;
}
@ -73,6 +77,7 @@ const ZipFileHeader = struct {
fn deinit(self: *Self) void {
self.allocator.free(self.file_name);
self.allocator.free(self.extra_field);
self.allocator.free(self.compressed_content);
}
};
@ -122,7 +127,20 @@ pub fn main() !void {
var first_file = try ZipFileHeader.init(allocator, reader);
defer first_file.deinit();
print("G: {}", .{first_file.file_name_length});
print("T: {s}", .{first_file.file_name});
print("O: {s}", .{first_file.extra_field});
if (!std.mem.eql(u8, first_file.file_name, "mimetype")) {
exit("Invalid file provided", .{}, 1);
}
if (!std.mem.startsWith(u8, first_file.compressed_content, "application/epub")) {
exit("Invalid file provided", .{}, 1);
}
print("H: {}", .{first_file.compression_method});
var second_file = try ZipFileHeader.init(allocator, reader);
defer second_file.deinit();
print("G: {s}", .{second_file.file_name});
print("GI: {}", .{second_file.compression_method});
print("xml stuff:\n{s}", .{second_file.compressed_content});
}