luat_fs_onefile.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. typedef struct luat_fs_onefile
  7. {
  8. char* ptr;
  9. uint32_t size;
  10. uint32_t offset;
  11. }luat_fs_onefile_t;
  12. // fs的默认实现, 指向poisx的stdio.h声明的方法
  13. #ifdef LUAT_USE_FS_VFS
  14. // #define PRINT_IT LLOGD("fd %p offset %d size %d", fd, fd->offset, fd->size)
  15. FILE* luat_vfs_onefile_fopen(void* userdata, const char *filename, const char *mode) {
  16. //LLOGD("open onefile %s", filename);
  17. if (!strcmp("r", mode) || !strcmp("rb", mode)) {
  18. luat_fs_onefile_t* fd = luat_heap_malloc(sizeof(luat_fs_onefile_t));
  19. if (fd == NULL) {
  20. LLOGE("out of memory when malloc luat_fs_onefile_t");
  21. return NULL;
  22. }
  23. //LLOGD("fd %p userdata %p", fd, userdata);
  24. memcpy(fd, userdata, sizeof(luat_fs_onefile_t));
  25. fd->offset = 0;
  26. return (FILE*)fd;
  27. }
  28. return NULL;
  29. }
  30. int luat_vfs_onefile_getc(void* userdata, FILE* stream) {
  31. //LLOGD("getc %p %p", userdata, stream);
  32. luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
  33. //LLOGD("getc %p %p %d %d", userdata, stream, fd->offset, fd->size);
  34. if (fd->offset < fd->size) {
  35. uint8_t c = (uint8_t)fd->ptr[fd->offset];
  36. fd->offset ++;
  37. //LLOGD("getc %02X", c);
  38. return c;
  39. }
  40. return -1;
  41. }
  42. int luat_vfs_onefile_fseek(void* userdata, FILE* stream, long int offset, int origin) {
  43. //LLOGD("fseek %p %p %d %d", userdata, stream, offset, origin);
  44. luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
  45. if (origin == SEEK_CUR) {
  46. fd->offset += offset;
  47. return 0;
  48. }
  49. else if (origin == SEEK_SET) {
  50. fd->offset = offset;
  51. return 0;
  52. }
  53. else {
  54. fd->offset = fd->size - offset;
  55. return 0;
  56. }
  57. }
  58. int luat_vfs_onefile_ftell(void* userdata, FILE* stream) {
  59. luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
  60. //LLOGD("tell %p %p %d %d", userdata, stream, fd->size, fd->offset);
  61. return fd->offset;
  62. }
  63. int luat_vfs_onefile_fclose(void* userdata, FILE* stream) {
  64. luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
  65. //LLOGD("fclose %p %p %d %d", userdata, stream, fd->size, fd->offset);
  66. luat_heap_free(fd);
  67. return 0;
  68. }
  69. int luat_vfs_onefile_feof(void* userdata, FILE* stream) {
  70. luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
  71. //LLOGD("feof %p %p %d %d", userdata, stream, fd->size, fd->offset);
  72. return fd->offset >= fd->size ? 1 : 0;
  73. }
  74. int luat_vfs_onefile_ferror(void* userdata, FILE *stream) {
  75. return 0;
  76. }
  77. size_t luat_vfs_onefile_fread(void* userdata, void *ptr, size_t size, size_t nmemb, FILE *stream) {
  78. luat_fs_onefile_t* fd = (luat_fs_onefile_t*)stream;
  79. //LLOGD("fread %p %p %d %d", userdata, stream, fd->size, fd->offset);
  80. //LLOGD("fread2 %p %p %d %d", userdata, stream, size * nmemb, fd->offset);
  81. size_t read_size = size*nmemb;
  82. if (fd->offset + read_size > fd->size) {
  83. read_size = fd->size - fd->offset;
  84. }
  85. memcpy(ptr, fd->ptr + fd->offset, read_size);
  86. fd->offset += read_size;
  87. return read_size;
  88. }
  89. size_t luat_vfs_onefile_fwrite(void* userdata, const void *ptr, size_t size, size_t nmemb, FILE *stream) {
  90. return 0;
  91. }
  92. int luat_vfs_onefile_remove(void* userdata, const char *filename) {
  93. return -1;
  94. }
  95. int luat_vfs_onefile_rename(void* userdata, const char *old_filename, const char *new_filename) {
  96. return -1;
  97. }
  98. int luat_vfs_onefile_fexist(void* userdata, const char *filename) {
  99. return 1;
  100. }
  101. size_t luat_vfs_onefile_fsize(void* userdata, const char *filename) {
  102. luat_fs_onefile_t *fd = (luat_fs_onefile_t*)(userdata);
  103. //LLOGD("fsize %p %p %d %d", userdata, fd);
  104. return fd->size;
  105. }
  106. int luat_vfs_onefile_mkfs(void* userdata, luat_fs_conf_t *conf) {
  107. return -1;
  108. }
  109. int luat_vfs_onefile_mount(void** userdata, luat_fs_conf_t *conf) {
  110. *userdata = (luat_fs_onefile_t*)conf->busname;
  111. return 0;
  112. }
  113. int luat_vfs_onefile_umount(void* userdata, luat_fs_conf_t *conf) {
  114. return 0;
  115. }
  116. int luat_vfs_onefile_mkdir(void* userdata, char const* _DirName) {
  117. return -1;
  118. }
  119. int luat_vfs_onefile_rmdir(void* userdata, char const* _DirName) {
  120. return -1;
  121. }
  122. int luat_vfs_onefile_info(void* userdata, const char* path, luat_fs_info_t *conf) {
  123. memcpy(conf->filesystem, "onefile", strlen("onefile")+1);
  124. conf->type = 0;
  125. conf->total_block = 0;
  126. conf->block_used = 0;
  127. conf->block_size = 512;
  128. return 0;
  129. }
  130. #define T(name) .name = luat_vfs_onefile_##name
  131. const struct luat_vfs_filesystem vfs_fs_onefile = {
  132. .name = "onefile",
  133. .opts = {
  134. .mkfs = NULL,
  135. T(mount),
  136. T(umount),
  137. .mkdir = NULL,
  138. .rmdir = NULL,
  139. .lsdir = NULL,
  140. .remove = NULL,
  141. .rename = NULL,
  142. T(fsize),
  143. T(fexist),
  144. T(info)
  145. },
  146. .fopts = {
  147. T(fopen),
  148. T(getc),
  149. T(fseek),
  150. T(ftell),
  151. T(fclose),
  152. T(feof),
  153. T(ferror),
  154. T(fread),
  155. .fwrite = NULL
  156. }
  157. };
  158. #endif