luat_fs_inline.c 5.4 KB

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