123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- #include "AP_ROMFS.h"
- #include "tinf.h"
- #ifdef HAL_HAVE_AP_ROMFS_EMBEDDED_H
- #include <ap_romfs_embedded.h>
- #else
- const AP_ROMFS::embedded_file AP_ROMFS::files[] = {};
- #endif
- const uint8_t *AP_ROMFS::find_file(const char *name, uint32_t &size)
- {
- for (uint16_t i=0; i<ARRAY_SIZE(files); i++) {
- if (strcmp(name, files[i].filename) == 0) {
- size = files[i].size;
- return files[i].contents;
- }
- }
- return nullptr;
- }
- uint8_t *AP_ROMFS::find_decompress(const char *name, uint32_t &size)
- {
- uint32_t compressed_size;
- const uint8_t *compressed_data = find_file(name, compressed_size);
- if (!compressed_data) {
- return nullptr;
- }
-
- const uint8_t *p = &compressed_data[compressed_size-4];
- uint32_t decompressed_size = p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
-
- uint8_t *decompressed_data = (uint8_t *)malloc(decompressed_size + 1);
- if (!decompressed_data) {
- return nullptr;
- }
-
- decompressed_data[decompressed_size] = 0;
- TINF_DATA *d = (TINF_DATA *)malloc(sizeof(TINF_DATA));
- if (!d) {
- free(decompressed_data);
- return nullptr;
- }
- uzlib_uncompress_init(d, NULL, 0);
- d->source = compressed_data;
- d->source_limit = compressed_data + compressed_size - 4;
-
- int res = uzlib_gzip_parse_header(d);
- if (res != TINF_OK) {
- free(decompressed_data);
- free(d);
- return nullptr;
- }
- d->dest = decompressed_data;
- d->destSize = decompressed_size;
-
-
- res = uzlib_uncompress(d);
- free(d);
-
- if (res != TINF_OK) {
- free(decompressed_data);
- return nullptr;
- }
- size = decompressed_size;
- return decompressed_data;
- }
|