summaryrefslogtreecommitdiffstatshomepage
path: root/teensy/memzip.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-07-02 13:45:00 +0100
committerDamien George <damien.p.george@gmail.com>2014-07-02 13:45:00 +0100
commitf83debc716029f87f62cdae751e88838db343eb8 (patch)
tree5f6bdb76cac3f59334431f62a3920f39ceca8b8b /teensy/memzip.c
parent5fc580475f5eba8248de86a4148090e63f777372 (diff)
parent7a37f647a5d953a47a6147cf8302e08f27537771 (diff)
downloadmicropython-f83debc716029f87f62cdae751e88838db343eb8.tar.gz
micropython-f83debc716029f87f62cdae751e88838db343eb8.zip
Merge branch 'dhylands-teensy-new'
Diffstat (limited to 'teensy/memzip.c')
-rw-r--r--teensy/memzip.c86
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;
}