|
|
@@ -0,0 +1,206 @@
|
|
|
+#include "os_platform.h"
|
|
|
+
|
|
|
+int os_getFileSize(PikaObj* fd) {
|
|
|
+ FILE* fp = obj_getPtr(fd, "fd");
|
|
|
+ if (fp != NULL) {
|
|
|
+ int ret = fseek(fp, 0, SEEK_END);
|
|
|
+ if (ret == 0) {
|
|
|
+ ret = ftell(fp);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return -2;
|
|
|
+}
|
|
|
+
|
|
|
+PikaObj* os_open_platform(char* filename, int flags) {
|
|
|
+ char file_flag[4] = {0};
|
|
|
+ int index = 0;
|
|
|
+ char dirpath[256] = {0};
|
|
|
+ memcpy(dirpath + strlen(dirpath), filename, strlen(filename));
|
|
|
+
|
|
|
+ if (FILE_RDONLY == (flags & FILE_RDONLY)) {
|
|
|
+ file_flag[0] = 'r';
|
|
|
+ if (FILE_CREAT == (flags & FILE_CREAT)) {
|
|
|
+ file_flag[1] = 'w';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (FILE_RDWR == (flags & FILE_RDWR)) {
|
|
|
+ memcpy(file_flag, "r+", 2);
|
|
|
+ if (FILE_CREAT == (flags & FILE_CREAT)) {
|
|
|
+ memcpy(file_flag, "w+", 2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (FILE_WRONLY == (flags & FILE_WRONLY))
|
|
|
+ file_flag[index] = 'w';
|
|
|
+
|
|
|
+ if (FILE_APPEND == (flags & FILE_APPEND))
|
|
|
+ memcpy(file_flag, "a+", 2);
|
|
|
+
|
|
|
+ FILE* fp = fopen(dirpath, file_flag);
|
|
|
+ if (fp != NULL) {
|
|
|
+ PikaObj* file_obj = newNormalObj(New_TinyObj);
|
|
|
+ obj_setPtr(file_obj, "fd", fp);
|
|
|
+ return file_obj;
|
|
|
+ } else {
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+char* os_read_platform(PikaObj* self, PikaObj* fd, int len) {
|
|
|
+ char* buf = NULL;
|
|
|
+ int size = 0;
|
|
|
+ FILE* fp = obj_getPtr(fd, "fd");
|
|
|
+ if (fp != NULL) {
|
|
|
+ buf = malloc(len);
|
|
|
+ memset(buf, 0x00, len);
|
|
|
+ size = fread(buf, 1, len, fp);
|
|
|
+
|
|
|
+ if (size > 0) {
|
|
|
+ //转换成
|
|
|
+ obj_setStr(self, "os_file_read", buf);
|
|
|
+ free(buf);
|
|
|
+ return obj_getStr(self, "os_file_read");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return "";
|
|
|
+}
|
|
|
+
|
|
|
+int os_write_platform(uint8_t* buf, size_t len, PikaObj* fd) {
|
|
|
+ int size = 0;
|
|
|
+ FILE* fp = obj_getPtr(fd, "fd");
|
|
|
+ if (fp != NULL) {
|
|
|
+ size = fwrite(buf, 1, len, fp);
|
|
|
+ return size;
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int os_lseek_platform(PikaObj* fd, int how, int pos) {
|
|
|
+ FILE* fp = obj_getPtr(fd, "fd");
|
|
|
+ if (fp != NULL) {
|
|
|
+ int ret = fseek(fp, pos, how);
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ } else
|
|
|
+ return -2;
|
|
|
+}
|
|
|
+
|
|
|
+int os_close_platform(PikaObj* fd) {
|
|
|
+ FILE* fp = obj_getPtr(fd, "fd");
|
|
|
+ if (fp != NULL) {
|
|
|
+ int ret = fclose(fp);
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ } else
|
|
|
+ return -2;
|
|
|
+}
|
|
|
+
|
|
|
+char* os_getcwd_platform(PikaObj* self) {
|
|
|
+ char dirpath[256] = {0};
|
|
|
+ if (getcwd(dirpath, sizeof(dirpath)) == NULL) {
|
|
|
+ obj_setErrorCode(self, PIKA_RES_ERR_IO_ERROR);
|
|
|
+ obj_setStr(self, "os_current_path", "");
|
|
|
+ return NULL;
|
|
|
+ }
|
|
|
+ obj_setStr(self, "os_current_path", dirpath);
|
|
|
+ return obj_getStr(self, "os_current_path");
|
|
|
+}
|
|
|
+
|
|
|
+PikaObj* os_listdir_platform(char* path) {
|
|
|
+#ifdef _WIN32
|
|
|
+ struct _finddata_t fb;
|
|
|
+ long handle = 0;
|
|
|
+ char dirpath[256] = {0};
|
|
|
+ char* currentPath = getcwd(dirpath, 256);
|
|
|
+ memcpy(dirpath + strlen(dirpath), path, strlen(path));
|
|
|
+ strcat(dirpath, "/*");
|
|
|
+
|
|
|
+ PikaObj* list = newNormalObj(New_PikaStdData_List);
|
|
|
+ PikaStdData_List___init__(list);
|
|
|
+
|
|
|
+ handle = _findfirst(dirpath, &fb);
|
|
|
+ //找到第一个匹配的文件
|
|
|
+ if (handle != -1L) {
|
|
|
+ if (memcmp(fb.name, ".", 1) != 0) {
|
|
|
+ Arg* arg = arg_setStr(NULL, "", fb.name);
|
|
|
+
|
|
|
+ PikaStdData_List_append(list, arg);
|
|
|
+
|
|
|
+ arg_deinit(arg);
|
|
|
+ }
|
|
|
+
|
|
|
+ while (0 == _findnext(handle, &fb)) {
|
|
|
+ if (memcmp(fb.name, "..", 2) != 0) {
|
|
|
+ Arg* arg = arg_setStr(NULL, "", fb.name);
|
|
|
+ PikaStdData_List_append(list, arg);
|
|
|
+ arg_deinit(arg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ _findclose(handle);
|
|
|
+ }
|
|
|
+
|
|
|
+ return list;
|
|
|
+#elif defined(__linux) || defined(ESP32)
|
|
|
+ struct dirent* dp;
|
|
|
+ DIR* dir = opendir(path);
|
|
|
+
|
|
|
+ PikaObj* list = newNormalObj(New_PikaStdData_List);
|
|
|
+ PikaStdData_List___init__(list);
|
|
|
+
|
|
|
+ if (dir != NULL) {
|
|
|
+ while ((dp = readdir(dir)) != NULL) {
|
|
|
+ if (strcmp(dp->d_name, ".") != 0 && strcmp(dp->d_name, "..") != 0) {
|
|
|
+ Arg* arg = arg_setStr(NULL, "", dp->d_name);
|
|
|
+ PikaStdData_List_append(list, arg);
|
|
|
+ arg_deinit(arg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ closedir(dir);
|
|
|
+ }
|
|
|
+
|
|
|
+ return list;
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+int os_mkdir_platform(int mode, char* path) {
|
|
|
+ char dirpath[256] = {0};
|
|
|
+ int ret = 0;
|
|
|
+ memcpy(dirpath + strlen(dirpath), path, strlen(path));
|
|
|
+
|
|
|
+ ret = mkdir(dirpath, mode);
|
|
|
+ if (ret != 0)
|
|
|
+ printf("create file error\n");
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+int os_chdir_platform(char* path) {
|
|
|
+ int ret = 0;
|
|
|
+ ret = chdir(path);
|
|
|
+ if (ret == 0)
|
|
|
+ ret = PIKA_TRUE;
|
|
|
+ else
|
|
|
+ ret = PIKA_FALSE;
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+int os_rmdir_platform(char* path) {
|
|
|
+ int ret = 0;
|
|
|
+ char dirpath[256] = {0};
|
|
|
+ memcpy(dirpath + strlen(dirpath), path, strlen(path));
|
|
|
+
|
|
|
+ ret = rmdir(dirpath);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+int os_remove_platform(char* filename) {
|
|
|
+ int ret = 0;
|
|
|
+ char dirpath[256] = {0};
|
|
|
+ memcpy(dirpath + strlen(dirpath), filename, strlen(filename));
|
|
|
+ ret = remove(dirpath);
|
|
|
+ return ret;
|
|
|
+}
|