luat_fs_inline.c 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. #include "luat_base.h"
  2. #include "luat_fs.h"
  3. #include "luat_mem.h"
  4. #define LUAT_LOG_TAG "fs"
  5. #include "luat_log.h"
  6. #include "luat_luadb.h"
  7. typedef struct luat_fs_inline
  8. {
  9. const char* ptr;
  10. uint32_t size;
  11. uint32_t offset;
  12. }luat_fs_inline_t;
  13. #ifdef LUAT_CONF_VM_64bit
  14. extern const luadb_file_t luat_inline2_libs_64bit_size64[];
  15. extern const luadb_file_t luat_inline2_libs_64bit_size32[];
  16. #else
  17. extern const luadb_file_t luat_inline2_libs[];
  18. #endif
  19. extern const luadb_file_t luat_inline2_libs_source[];
  20. #ifdef LUAT_USE_FS_VFS
  21. FILE* luat_vfs_inline_fopen(void* userdata, const char *filename, const char *mode) {
  22. //LLOGD("open inline %s", filename);
  23. const luadb_file_t* file = NULL;
  24. #ifdef LUAT_CONF_USE_LIBSYS_SOURCE
  25. file = luat_inline2_libs_source;
  26. #else
  27. #ifdef LUAT_CONF_VM_64bit
  28. #if defined(LUA_USE_LINUX) || (defined(LUA_USE_WINDOWS) && defined(__XMAKE_BUILD__))
  29. file = luat_inline2_libs_64bit_size64;
  30. #else
  31. file = luat_inline2_libs_64bit_size32;
  32. #endif
  33. #else
  34. file = luat_inline2_libs;
  35. #endif
  36. #endif
  37. if (!strcmp("r", mode) || !strcmp("rb", mode)) {
  38. luat_fs_inline_t* fd = luat_heap_malloc(sizeof(luat_fs_inline_t));
  39. if (fd == NULL) {
  40. LLOGE("out of memory when malloc luat_fs_inline_t");
  41. return NULL;
  42. }
  43. while (file != NULL && file->ptr != NULL) {
  44. if (!memcmp(file->name, filename, strlen(filename)+1)) {
  45. break;
  46. }
  47. file ++;
  48. }
  49. if (file == NULL || file->ptr == NULL) {
  50. //LLOGD("Not Found %s", filename);
  51. return NULL;
  52. }
  53. fd->ptr = file->ptr;
  54. fd->size = file->size;
  55. fd->offset = 0;
  56. return (FILE*)fd;
  57. }
  58. //LLOGD("Not Found %s", filename);
  59. return NULL;
  60. }
  61. int luat_vfs_inline_getc(void* userdata, FILE* stream) {
  62. //LLOGD("getc %p %p", userdata, stream);
  63. luat_fs_inline_t* fd = (luat_fs_inline_t*)stream;
  64. //LLOGD("getc %p %p %d %d", userdata, stream, fd->offset, fd->size);
  65. if (fd->offset < fd->size) {
  66. uint8_t c = (uint8_t)fd->ptr[fd->offset];
  67. fd->offset ++;
  68. //LLOGD("getc %02X", c);
  69. return c;
  70. }
  71. return -1;
  72. }
  73. int luat_vfs_inline_fseek(void* userdata, FILE* stream, long int offset, int origin) {
  74. //LLOGD("fseek %p %p %d %d", userdata, stream, offset, origin);
  75. luat_fs_inline_t* fd = (luat_fs_inline_t*)stream;
  76. if (origin == SEEK_CUR) {
  77. fd->offset += offset;
  78. return 0;
  79. }
  80. else if (origin == SEEK_SET) {
  81. fd->offset = offset;
  82. return 0;
  83. }
  84. else {
  85. fd->offset = fd->size - offset;
  86. return 0;
  87. }
  88. }
  89. int luat_vfs_inline_ftell(void* userdata, FILE* stream) {
  90. luat_fs_inline_t* fd = (luat_fs_inline_t*)stream;
  91. //LLOGD("tell %p %p %d %d", userdata, stream, fd->size, fd->offset);
  92. return fd->offset;
  93. }
  94. int luat_vfs_inline_fclose(void* userdata, FILE* stream) {
  95. luat_fs_inline_t* fd = (luat_fs_inline_t*)stream;
  96. //LLOGD("fclose %p %p %d %d", userdata, stream, fd->size, fd->offset);
  97. luat_heap_free(fd);
  98. return 0;
  99. }
  100. int luat_vfs_inline_feof(void* userdata, FILE* stream) {
  101. luat_fs_inline_t* fd = (luat_fs_inline_t*)stream;
  102. //LLOGD("feof %p %p %d %d", userdata, stream, fd->size, fd->offset);
  103. return fd->offset >= fd->size ? 1 : 0;
  104. }
  105. int luat_vfs_inline_ferror(void* userdata, FILE *stream) {
  106. return 0;
  107. }
  108. size_t luat_vfs_inline_fread(void* userdata, void *ptr, size_t size, size_t nmemb, FILE *stream) {
  109. luat_fs_inline_t* fd = (luat_fs_inline_t*)stream;
  110. //LLOGD("fread %p %p %d %d", userdata, stream, fd->size, fd->offset);
  111. //LLOGD("fread2 %p %p %d %d", userdata, stream, size * nmemb, fd->offset);
  112. size_t read_size = size*nmemb;
  113. if (fd->offset + read_size > fd->size) {
  114. read_size = fd->size - fd->offset;
  115. }
  116. memcpy(ptr, fd->ptr + fd->offset, read_size);
  117. fd->offset += read_size;
  118. return read_size;
  119. }
  120. int luat_vfs_inline_fexist(void* userdata, const char *filename) {
  121. const luadb_file_t* file = NULL;
  122. #ifdef LUAT_CONF_VM_64bit
  123. #if defined(LUA_USE_LINUX) || (defined(LUA_USE_WINDOWS) && defined(__XMAKE_BUILD__))
  124. file = luat_inline2_libs_64bit_size64;
  125. #else
  126. file = luat_inline2_libs_64bit_size32;
  127. #endif
  128. #else
  129. file = luat_inline2_libs;
  130. #endif
  131. while (file != NULL && file->ptr != NULL) {
  132. if (!memcmp(file->name, filename, strlen(filename)+1)) {
  133. return 1;
  134. }
  135. file ++;
  136. }
  137. //LLOGD("Not Found %s", filename);
  138. return 0;
  139. }
  140. size_t luat_vfs_inline_fsize(void* userdata, const char *filename) {
  141. luat_fs_inline_t *fd = (luat_fs_inline_t*)(userdata);
  142. //LLOGD("fsize %p %p %d %d", userdata, fd);
  143. return fd->size;
  144. }
  145. int luat_vfs_inline_mount(void** userdata, luat_fs_conf_t *conf) {
  146. *userdata = (luat_fs_inline_t*)conf->busname;
  147. return 0;
  148. }
  149. int luat_vfs_inline_info(void* userdata, const char* path, luat_fs_info_t *conf) {
  150. memcpy(conf->filesystem, "inline", strlen("inline")+1);
  151. conf->type = 0;
  152. conf->total_block = 0;
  153. conf->block_used = 0;
  154. conf->block_size = 512;
  155. return 0;
  156. }
  157. #define T(name) .name = luat_vfs_inline_##name
  158. const struct luat_vfs_filesystem vfs_fs_inline = {
  159. .name = "inline",
  160. .opts = {
  161. .mkfs = NULL,
  162. T(mount),
  163. .umount = NULL,
  164. .mkdir = NULL,
  165. .rmdir = NULL,
  166. .lsdir = NULL,
  167. .remove = NULL,
  168. .rename = NULL,
  169. T(fsize),
  170. T(fexist),
  171. T(info)
  172. },
  173. .fopts = {
  174. T(fopen),
  175. T(getc),
  176. T(fseek),
  177. T(ftell),
  178. T(fclose),
  179. T(feof),
  180. T(ferror),
  181. T(fread),
  182. .fwrite = NULL
  183. }
  184. };
  185. #endif