os_platform.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include "os_platform.h"
  2. int os_getFileSize(PikaObj* fd) {
  3. FILE* fp = obj_getPtr(fd, "fd");
  4. if (fp != NULL) {
  5. int ret = fseek(fp, 0, SEEK_END);
  6. if (ret == 0) {
  7. ret = ftell(fp);
  8. return ret;
  9. }
  10. }
  11. return -2;
  12. }
  13. PikaObj* os_open_platform(char* filename, int flags) {
  14. char file_flag[4] = {0};
  15. int index = 0;
  16. char dirpath[256] = {0};
  17. memcpy(dirpath + strlen(dirpath), filename, strlen(filename));
  18. if (FILE_RDONLY == (flags & FILE_RDONLY)) {
  19. file_flag[0] = 'r';
  20. if (FILE_CREAT == (flags & FILE_CREAT)) {
  21. file_flag[1] = 'w';
  22. }
  23. }
  24. if (FILE_RDWR == (flags & FILE_RDWR)) {
  25. memcpy(file_flag, "r+", 2);
  26. if (FILE_CREAT == (flags & FILE_CREAT)) {
  27. memcpy(file_flag, "w+", 2);
  28. }
  29. }
  30. if (FILE_WRONLY == (flags & FILE_WRONLY))
  31. file_flag[index] = 'w';
  32. if (FILE_APPEND == (flags & FILE_APPEND))
  33. memcpy(file_flag, "a+", 2);
  34. FILE* fp = fopen(dirpath, file_flag);
  35. if (fp != NULL) {
  36. PikaObj* file_obj = newNormalObj(New_TinyObj);
  37. obj_setPtr(file_obj, "fd", fp);
  38. return file_obj;
  39. } else {
  40. return NULL;
  41. }
  42. }
  43. char* os_read_platform(PikaObj* self, PikaObj* fd, int len) {
  44. char* buf = NULL;
  45. int size = 0;
  46. FILE* fp = obj_getPtr(fd, "fd");
  47. if (fp != NULL) {
  48. buf = malloc(len);
  49. memset(buf, 0x00, len);
  50. size = fread(buf, 1, len, fp);
  51. if (size > 0) {
  52. //转换成
  53. obj_setStr(self, "os_file_read", buf);
  54. free(buf);
  55. return obj_getStr(self, "os_file_read");
  56. }
  57. }
  58. return "";
  59. }
  60. int os_write_platform(uint8_t* buf, size_t len, PikaObj* fd) {
  61. int size = 0;
  62. FILE* fp = obj_getPtr(fd, "fd");
  63. if (fp != NULL) {
  64. size = fwrite(buf, 1, len, fp);
  65. return size;
  66. }
  67. return 0;
  68. }
  69. int os_lseek_platform(PikaObj* fd, int how, int pos) {
  70. FILE* fp = obj_getPtr(fd, "fd");
  71. if (fp != NULL) {
  72. int ret = fseek(fp, pos, how);
  73. return ret;
  74. } else
  75. return -2;
  76. }
  77. int os_close_platform(PikaObj* fd) {
  78. FILE* fp = obj_getPtr(fd, "fd");
  79. if (fp != NULL) {
  80. int ret = fclose(fp);
  81. return ret;
  82. } else
  83. return -2;
  84. }
  85. char* os_getcwd_platform(PikaObj* self) {
  86. char dirpath[256] = {0};
  87. if (getcwd(dirpath, sizeof(dirpath)) == NULL) {
  88. obj_setErrorCode(self, PIKA_RES_ERR_IO_ERROR);
  89. obj_setStr(self, "os_current_path", "");
  90. return NULL;
  91. }
  92. obj_setStr(self, "os_current_path", dirpath);
  93. return obj_getStr(self, "os_current_path");
  94. }
  95. PikaObj* os_listdir_platform(char* path) {
  96. #ifdef _WIN32
  97. struct _finddata_t fb;
  98. long handle = 0;
  99. char dirpath[256] = {0};
  100. char* currentPath = getcwd(dirpath, 256);
  101. memcpy(dirpath + strlen(dirpath), path, strlen(path));
  102. strcat(dirpath, "/*");
  103. PikaObj* list = newNormalObj(New_PikaStdData_List);
  104. PikaStdData_List___init__(list);
  105. handle = _findfirst(dirpath, &fb);
  106. //找到第一个匹配的文件
  107. if (handle != -1L) {
  108. if (memcmp(fb.name, ".", 1) != 0) {
  109. Arg* arg = arg_setStr(NULL, "", fb.name);
  110. PikaStdData_List_append(list, arg);
  111. arg_deinit(arg);
  112. }
  113. while (0 == _findnext(handle, &fb)) {
  114. if (memcmp(fb.name, "..", 2) != 0) {
  115. Arg* arg = arg_setStr(NULL, "", fb.name);
  116. PikaStdData_List_append(list, arg);
  117. arg_deinit(arg);
  118. }
  119. }
  120. _findclose(handle);
  121. }
  122. return list;
  123. #elif defined(__linux) || PIKA_LINUX_COMPATIBLE
  124. struct dirent* dp;
  125. DIR* dir = opendir(path);
  126. PikaObj* list = newNormalObj(New_PikaStdData_List);
  127. PikaStdData_List___init__(list);
  128. if (dir != NULL) {
  129. while ((dp = readdir(dir)) != NULL) {
  130. if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0) {
  131. Arg* arg = arg_setStr(NULL, "", dp->d_name);
  132. PikaStdData_List_append(list, arg);
  133. arg_deinit(arg);
  134. }
  135. }
  136. closedir(dir);
  137. }
  138. return list;
  139. #endif
  140. }
  141. int os_mkdir_platform(int mode, char* path) {
  142. char dirpath[256] = {0};
  143. int ret = 0;
  144. memcpy(dirpath + strlen(dirpath), path, strlen(path));
  145. ret = mkdir(dirpath, mode);
  146. return ret;
  147. }
  148. int os_chdir_platform(char* path) {
  149. int ret = 0;
  150. ret = chdir(path);
  151. if (ret == 0)
  152. ret = PIKA_TRUE;
  153. else
  154. ret = PIKA_FALSE;
  155. return ret;
  156. }
  157. int os_rmdir_platform(char* path) {
  158. int ret = 0;
  159. char dirpath[256] = {0};
  160. memcpy(dirpath + strlen(dirpath), path, strlen(path));
  161. ret = rmdir(dirpath);
  162. return ret;
  163. }
  164. int os_remove_platform(char* filename) {
  165. int ret = 0;
  166. char dirpath[256] = {0};
  167. memcpy(dirpath + strlen(dirpath), filename, strlen(filename));
  168. ret = remove(dirpath);
  169. return ret;
  170. }
  171. int os_rename_platform(char* old, char* new) {
  172. if (NULL == old || NULL == new) {
  173. return -1;
  174. }
  175. if (0 != rename(old, new)) {
  176. return -1;
  177. }
  178. return 0;
  179. }