summaryrefslogtreecommitdiffstatshomepage
path: root/teensy/memzip.c
diff options
context:
space:
mode:
authorDave Hylands <dhylands@gmail.com>2014-06-15 22:33:14 -0700
committerDave Hylands <dhylands@gmail.com>2014-06-15 22:48:05 -0700
commit4f1b7fec9f103c92de40875e9a06b7decc4923f4 (patch)
treed9e0f1b0e7dd290a728c065960500ecf30967997 /teensy/memzip.c
parent2547928148aefcf163953057979e14f46bef1170 (diff)
downloadmicropython-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.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;
}