diff --git a/libmineziper/include/libmineziper_zip.h b/libmineziper/include/libmineziper_zip.h index ff8ff27..57704c3 100644 --- a/libmineziper/include/libmineziper_zip.h +++ b/libmineziper/include/libmineziper_zip.h @@ -1,15 +1,27 @@ #ifndef LIBMINEZIPER_ZIP_H #define LIBMINEZIPER_ZIP_H +#define START_CDH_SEARCH 22 +#define CDH_MB "PK\05\06" +#define LFH_MB "PK\03\04" + +typedef struct raw +{ + char* buf; + int size; +} raw; + typedef struct CDH { - void* crc32; // TODO TYPE? + char mb[4]; // CDH_MB "PK\05\06" + void* crc32; // TODO TYPE? LFH* lfh; - void* filename; // TODO TYPE? + void* filename; // TODO TYPE? } CDH; typedef struct LFH { + char mb[4]; // CDH_MB "PK\03\04" void* crc32; // TODO TYPE? LFH* lfh; int size_compressed_data; @@ -24,6 +36,7 @@ typedef struct zip CDH* central_directory; } zip; +void find_cdh(raw* raw, zip* out); void parse_zip(char* filename, zip* out); #endif \ No newline at end of file diff --git a/libmineziper/src/libmineziper_zip.c b/libmineziper/src/libmineziper_zip.c new file mode 100644 index 0000000..d09e593 --- /dev/null +++ b/libmineziper/src/libmineziper_zip.c @@ -0,0 +1,20 @@ +#include "libmineziper_zip.h" +#include + +void find_cdh(raw* raw, zip* out) +{ + if (raw->size < START_CDH_SEARCH) + return; + + char* se = raw->buf + raw->size - START_CDH_SEARCH; + while (se > raw->buf) + { + if (strcmp(se, CDH_MB) == 0) + { + zip->cdh = se; + break; + } + + se--; + } +} \ No newline at end of file