Skip to content

Instantly share code, notes, and snippets.

@thebirk
Last active November 20, 2020 12:26
Show Gist options
  • Save thebirk/bd478a8d0912f42b3e58cdae178dddbe to your computer and use it in GitHub Desktop.
Save thebirk/bd478a8d0912f42b3e58cdae178dddbe to your computer and use it in GitHub Desktop.
read_zip :: proc(reader: ^io.Reader) {
LOCAL_FILE_MAGIC :: 0x04034B50;
END_MAGIC :: 0x06054b50;
Local_File_Header :: struct #packed {
//signature: u32le,
minimum_version: u16le,
flags: u16le,
compression: u16le,
last_mod_time: u16le,
last_mod_date: u16le,
crc32: u32le,
compressed_size: u32le,
uncompressed_size: u32le,
name_length: u16le,
extra_field_length: u16le,
// name: [name_length]u8
// extra_field: [extra_field_length]u8
};
End_Of_Central_Record :: struct #packed {
//signature: u32le,
number_of_this_disk: u16le,
number_of_disk_with_start_of_central: u16le,
total_entries_on_this_disk: u16le,
total_entries: u16le,
size_of_central_dir: u32le,
offset_of_central: u32le,
zip_file_comment_length: u16le,
// zip_file_comment: [zip_file_comment_length]u8
};
loop:
for {
signature, err := io.read_u32le(reader);
switch signature {
case LOCAL_FILE_MAGIC:
file, ferr := io.read_typeid(reader, Local_File_Header);
buffer := make([]u8, file.name_length);
n, err := io.read(reader, buffer);
name := string(buffer);
fmt.printf("file: %v, size: %d\n", name, file.compressed_size);
data := make([]u8, file.compressed_size);
io.read(reader, data);
delete(data);
case END_MAGIC:
break loop;
case:
fmt.printf("Unexpected signature 0x%04X\n", signature);
break loop;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment