diff --git a/src/main.zig b/src/main.zig index f36a7ff..32c881e 100644 --- a/src/main.zig +++ b/src/main.zig @@ -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}); }