Просмотр исходного кода

add: fs_luadb支持自定义读取方式,解决某些平台不支持指针方式直接访问flash

Wendal Chen 1 год назад
Родитель
Сommit
c4a7b063c2
1 измененных файлов с 33 добавлено и 19 удалено
  1. 33 19
      luat/vfs/luat_fs_luadb.c

+ 33 - 19
luat/vfs/luat_fs_luadb.c

@@ -10,20 +10,27 @@
 #undef LLOGD
 #define LLOGD(...) 
 
-// #ifdef LUAT_CONF_VM_64bit
-// extern const luadb_file_t luat_inline2_libs_64bit_size64[];
-// extern const luadb_file_t luat_inline2_libs_64bit_size32[];
-// #else
-// extern const luadb_file_t luat_inline2_libs[];
-// #endif
+#ifndef LUAT_CONF_LUADB_CUSTOM_READ
+void luat_luadb_read_bytes(char* dst, const char* ptr, size_t len) {
+    memcpy(dst, ptr, len);
+}
 
-//---
 static uint8_t readU8(const char* ptr, int *index) {
     int val = ptr[*index];
     *index = (*index) + 1;
     return val & 0xFF;
 }
 
+#else
+extern void luat_luadb_read_bytes(char* dst, const char* ptr, size_t len);
+static uint8_t readU8(const char* ptr, int *index) {
+    char val = 0;
+    luat_luadb_read_bytes(&val, ptr + (*index), 1);
+    *index = (*index) + 1;
+    return val & 0xFF;
+}
+#endif
+
 static uint16_t readU16(const char* ptr, int *index) {
     return readU8(ptr,index) + (readU8(ptr,index) << 8);
 }
@@ -111,7 +118,11 @@ size_t luat_luadb_read(luadb_fs_t *fs, int fd, void *dst, size_t size) {
         re = fdt->file->size - fdt->fd_pos;
     }
     if (re > 0) {
+        #ifndef LUAT_CONF_LUADB_CUSTOM_READ
         memcpy(dst, fdt->file->ptr + fdt->fd_pos, re);
+        #else
+        luat_luadb_read_bytes(dst, fdt->file->ptr + fdt->fd_pos, re);
+        #endif
         fdt->fd_pos += re;
     }
     //LLOGD("luadb read name %s offset %d size %d ret %d", fdt->file->name, fdt->fd_pos, size, re);
@@ -262,8 +273,8 @@ _after_head:
         
         LLOGD("LuaDB check files .... %d", i+1);
         
-        type = ptr[index++];
-        len = ptr[index++];
+        type = readU8(ptr, &index);
+        len = readU8(ptr, &index);
         if (type != 1 || len != 4) {
             LLOGD("bad file data 1 : %d %d %d", type, len, index);
             fail = 1;
@@ -273,8 +284,8 @@ _after_head:
         index += 4;
 
         // 2. 然后是名字
-        type = ptr[index++];
-        len = ptr[index++];
+        type = readU8(ptr, &index);
+        len = readU8(ptr, &index);
         if (type != 2) {
             LLOGD("bad file data 2 : %d %d %d", type, len, index);
             fail = 1;
@@ -282,18 +293,19 @@ _after_head:
         }
         // 拷贝文件名
         LLOGD("LuaDB file name len = %d", len);
-
+        #ifndef LUAT_CONF_LUADB_CUSTOM_READ
         memcpy(fs->files[i].name, &(ptr[index]), len);
-
+        #else
+        luat_luadb_read_bytes(fs->files[i].name, ptr + index, len);
+        #endif
         fs->files[i].name[len] = 0x00;
-
         index += len;
 
-        LLOGD("LuaDB file name %s", fs->files[i].name);
+        LLOGD("LuaDB file name %.*s", len, fs->files[i].name);
 
         // 3. 文件大小
-        type = ptr[index++];
-        len = ptr[index++];
+        type = readU8(ptr, &index);
+        len = readU8(ptr, &index);
         if (type != 3 || len != 4) {
             LLOGD("bad file data 3 : %d %d %d", type, len, index);
             fail = 1;
@@ -302,8 +314,8 @@ _after_head:
         fs->files[i].size = readU32(ptr, &index);
 
         // 0xFE校验码
-        type = ptr[index++];
-        len = ptr[index++];
+        type = readU8(ptr, &index);
+        len = readU8(ptr, &index);
         if (type != 0xFE || len != 2) {
             LLOGD("bad file data 4 : %d %d %d", type, len, index);
             fail = 1;
@@ -540,7 +552,9 @@ const struct luat_vfs_filesystem vfs_fs_luadb = {
         T(feof),
         T(ferror),
         T(fread),
+    #ifndef LUAT_CONF_LUADB_CUSTOM_READ
         T(mmap),
+    #endif
         .fwrite = NULL
     }
 };