#include "uzlib.h"
#include "zones.gz.h"
#define OUT_CHUNK_SIZE 512
void gunzip () {
uzlib_init();
uint32_t outlen = 0;
for (uint x = 4; x>0; x--)
outlen += zones_gz[zones_gz_len-x] << (4-x)*8;
struct uzlib_uncomp d;
void* dict_ring = (void*)malloc(32768);
uzlib_uncompress_init(&d, dict_ring, 32768);
d.source = zones_gz;
d.source_limit = zones_gz + zones_gz_len - 4;
d.source_read_cb = NULL;
int res = uzlib_gzip_parse_header(&d);
if (res != TINF_OK) {
Serial.printf("Error parsing header: %d\n", res);
return;
}
unsigned char* dest = (unsigned char*)malloc(OUT_CHUNK_SIZE);
d.dest_start = dest;
uint32_t dlen = outlen + 1;
while (dlen) {
unsigned int chunk_len = dlen < OUT_CHUNK_SIZE ? dlen : OUT_CHUNK_SIZE;
d.dest = d.dest_start;
d.dest_limit = d.dest + chunk_len;
res = uzlib_uncompress_chksum(&d);
dlen -= chunk_len;
//Serial.write(dest, chunk_len);
if (res != TINF_OK) {
break;
}
}
free(dest);
if (res == TINF_DONE) {
Serial.println("decompressed!");
} else {
Serial.printf("unzip failed: %d\n", res);
}
free(dict_ring);
}
void setup() {
Serial.begin(115200);
unsigned long start = millis();
gunzip();
Serial.printf("time to decompress: %lu\n", millis()-start);
}
void loop() {
delay(-1);
}