diff options
author | Dave Hylands <dhylands@gmail.com> | 2014-06-15 22:33:14 -0700 |
---|---|---|
committer | Dave Hylands <dhylands@gmail.com> | 2014-06-15 22:48:05 -0700 |
commit | 4f1b7fec9f103c92de40875e9a06b7decc4923f4 (patch) | |
tree | d9e0f1b0e7dd290a728c065960500ecf30967997 /teensy/memzip.c | |
parent | 2547928148aefcf163953057979e14f46bef1170 (diff) | |
download | micropython-4f1b7fec9f103c92de40875e9a06b7decc4923f4.tar.gz micropython-4f1b7fec9f103c92de40875e9a06b7decc4923f4.zip |
Updated teensy to build.
Refactored some stmhal files which are shared with teensy.
Diffstat (limited to 'teensy/memzip.c')
-rw-r--r-- | teensy/memzip.c | 86 |
1 files changed, 77 insertions, 9 deletions
diff --git a/teensy/memzip.c b/teensy/memzip.c index ec6c26980c..b269c472a1 100644 --- a/teensy/memzip.c +++ b/teensy/memzip.c @@ -1,12 +1,13 @@ #include <stdint.h> #include <stdlib.h> #include <string.h> +#include "misc.h" #include "memzip.h" extern uint8_t _staticfs[]; -MEMZIP_RESULT memzip_locate(const char *filename, void **data, size_t *len) -{ +const MEMZIP_FILE_HDR *memzip_find_file_header(const char *filename) { + const MEMZIP_FILE_HDR *file_hdr = (const MEMZIP_FILE_HDR *)_staticfs; uint8_t *mem_data; @@ -22,16 +23,83 @@ MEMZIP_RESULT memzip_locate(const char *filename, void **data, size_t *len) mem_data += file_hdr->extra_len; if (!strncmp(file_hdr_filename, filename, file_hdr->filename_len)) { /* We found a match */ - if (file_hdr->compression_method != 0) { - return MZ_FILE_COMPRESSED; - } + return file_hdr; + } + mem_data += file_hdr->uncompressed_size; + file_hdr = (const MEMZIP_FILE_HDR *)mem_data; + } + return NULL; +} - *data = mem_data; - *len = file_hdr->uncompressed_size; - return MZ_OK; +bool memzip_is_dir(const char *filename) { + const MEMZIP_FILE_HDR *file_hdr = (const MEMZIP_FILE_HDR *)_staticfs; + uint8_t *mem_data; + + if (strcmp(filename, "/") == 0) { + // The root directory is a directory. + return true; + } + + // Zip filenames don't have a leading /, so we strip it off + if (*filename == '/') { + filename++; + } + size_t filename_len = strlen(filename); + + while (file_hdr->signature == MEMZIP_FILE_HEADER_SIGNATURE) { + const char *file_hdr_filename = (const char *)&file_hdr[1]; + if (filename_len < file_hdr->filename_len && + strncmp(file_hdr_filename, filename, filename_len) == 0 && + file_hdr_filename[filename_len] == '/') { + return true; } + + mem_data = (uint8_t *)file_hdr_filename; + mem_data += file_hdr->filename_len; + mem_data += file_hdr->extra_len; mem_data += file_hdr->uncompressed_size; file_hdr = (const MEMZIP_FILE_HDR *)mem_data; } - return MZ_NO_FILE; + return NULL; + +} + +MEMZIP_RESULT memzip_locate(const char *filename, void **data, size_t *len) +{ + const MEMZIP_FILE_HDR *file_hdr = memzip_find_file_header(filename); + if (file_hdr == NULL) { + return MZ_NO_FILE; + } + if (file_hdr->compression_method != 0) { + return MZ_FILE_COMPRESSED; + } + + uint8_t *mem_data; + mem_data = (uint8_t *)&file_hdr[1]; + mem_data += file_hdr->filename_len; + mem_data += file_hdr->extra_len; + + *data = mem_data; + *len = file_hdr->uncompressed_size; + return MZ_OK; +} + +MEMZIP_RESULT memzip_stat(const char *path, MEMZIP_FILE_INFO *info) { + const MEMZIP_FILE_HDR *file_hdr = memzip_find_file_header(path); + if (file_hdr == NULL) { + if (memzip_is_dir(path)) { + info->file_size = 0; + info->last_mod_date = 0; + info->last_mod_time = 0; + info->is_dir = 1; + return MZ_OK; + } + return MZ_NO_FILE; + } + info->file_size = file_hdr->uncompressed_size; + info->last_mod_date = file_hdr->last_mod_date; + info->last_mod_time = file_hdr->last_mod_time; + info->is_dir = 0; + + return MZ_OK; } |