mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
use pikafs_fxxx API
This commit is contained in:
parent
9c8f60c839
commit
531dced423
@ -3,30 +3,13 @@
|
|||||||
#include "PikaCompiler.h"
|
#include "PikaCompiler.h"
|
||||||
#include "PikaStdData_List.h"
|
#include "PikaStdData_List.h"
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t* addr;
|
|
||||||
size_t size;
|
|
||||||
size_t pos;
|
|
||||||
} PIKAFS_FILE;
|
|
||||||
|
|
||||||
int PikaStdData_FILEIO_init(PikaObj* self, char* path, char* mode) {
|
int PikaStdData_FILEIO_init(PikaObj* self, char* path, char* mode) {
|
||||||
if (obj_isArgExist(self, "_f")) {
|
if (obj_isArgExist(self, "_f")) {
|
||||||
/* already initialized */
|
/* already initialized */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (strIsStartWith(path, "pikafs/")) {
|
if (strIsStartWith(path, "pikafs/")) {
|
||||||
PIKAFS_FILE* f = (PIKAFS_FILE*)pikaMalloc(sizeof(PIKAFS_FILE));
|
pikafs_FILE* f = pikafs_fopen(path + 7, "rb");
|
||||||
memset(f, 0, sizeof(PIKAFS_FILE));
|
|
||||||
extern volatile PikaObj* __pikaMain;
|
|
||||||
uint8_t* library_bytes = obj_getPtr((PikaObj*)__pikaMain, "@libraw");
|
|
||||||
if (NULL == library_bytes) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
char* file_name = path + 7;
|
|
||||||
if (PIKA_RES_OK != _loadModuleDataWithName(library_bytes, file_name,
|
|
||||||
&f->addr, &f->size)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
obj_setInt(self, "pikafs", PIKA_TRUE);
|
obj_setInt(self, "pikafs", PIKA_TRUE);
|
||||||
obj_setPtr(self, "_f", f);
|
obj_setPtr(self, "_f", f);
|
||||||
obj_setStr(self, "_mode", mode);
|
obj_setStr(self, "_mode", mode);
|
||||||
@ -43,11 +26,11 @@ int PikaStdData_FILEIO_init(PikaObj* self, char* path, char* mode) {
|
|||||||
|
|
||||||
void PikaStdData_FILEIO_close(PikaObj* self) {
|
void PikaStdData_FILEIO_close(PikaObj* self) {
|
||||||
if (PIKA_TRUE == obj_getInt(self, "pikafs")) {
|
if (PIKA_TRUE == obj_getInt(self, "pikafs")) {
|
||||||
PIKAFS_FILE* f = obj_getPtr(self, "_f");
|
pikafs_FILE* f = obj_getPtr(self, "_f");
|
||||||
if (NULL == f) {
|
if (NULL == f) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pikaFree(f, sizeof(PIKAFS_FILE));
|
pikafs_fclose(f);
|
||||||
obj_setPtr(self, "_f", NULL);
|
obj_setPtr(self, "_f", NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -59,18 +42,6 @@ void PikaStdData_FILEIO_close(PikaObj* self) {
|
|||||||
obj_setPtr(self, "_f", NULL);
|
obj_setPtr(self, "_f", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t _pikafs_fread(void* buf, size_t size, size_t count, PIKAFS_FILE* f) {
|
|
||||||
if (f->pos >= f->size) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (f->pos + size * count > f->size) {
|
|
||||||
count = (f->size - f->pos) / size;
|
|
||||||
}
|
|
||||||
__platform_memcpy(buf, f->addr + f->pos, size * count);
|
|
||||||
f->pos += size * count;
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
Arg* PikaStdData_FILEIO_read(PikaObj* self, PikaTuple* size_) {
|
Arg* PikaStdData_FILEIO_read(PikaObj* self, PikaTuple* size_) {
|
||||||
int size = 0;
|
int size = 0;
|
||||||
if (pikaTuple_getSize(size_) == 0) {
|
if (pikaTuple_getSize(size_) == 0) {
|
||||||
@ -87,11 +58,11 @@ Arg* PikaStdData_FILEIO_read(PikaObj* self, PikaTuple* size_) {
|
|||||||
int n = 0;
|
int n = 0;
|
||||||
/* read */
|
/* read */
|
||||||
if (PIKA_TRUE == obj_getInt(self, "pikafs")) {
|
if (PIKA_TRUE == obj_getInt(self, "pikafs")) {
|
||||||
PIKAFS_FILE* f = obj_getPtr(self, "_f");
|
pikafs_FILE* f = obj_getPtr(self, "_f");
|
||||||
if (NULL == f) {
|
if (NULL == f) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
n = _pikafs_fread(buf, 1, size, f);
|
n = pikafs_fread(buf, 1, size, f);
|
||||||
} else {
|
} else {
|
||||||
FILE* f = obj_getPtr(self, "_f");
|
FILE* f = obj_getPtr(self, "_f");
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
|
2
port/linux/.vscode/launch.json
vendored
2
port/linux/.vscode/launch.json
vendored
@ -11,7 +11,7 @@
|
|||||||
"program": "${workspaceFolder}/build/test/pikascript_test",
|
"program": "${workspaceFolder}/build/test/pikascript_test",
|
||||||
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
|
// "program": "${workspaceFolder}/build/boot/demo06-pikamain/pikascript_demo06-pikamain",
|
||||||
"args": [
|
"args": [
|
||||||
"--gtest_filter=except.except_break"
|
// "--gtest_filter=except.except_break"
|
||||||
],
|
],
|
||||||
"stopAtEntry": false,
|
"stopAtEntry": false,
|
||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
|
@ -3,30 +3,13 @@
|
|||||||
#include "PikaCompiler.h"
|
#include "PikaCompiler.h"
|
||||||
#include "PikaStdData_List.h"
|
#include "PikaStdData_List.h"
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t* addr;
|
|
||||||
size_t size;
|
|
||||||
size_t pos;
|
|
||||||
} PIKAFS_FILE;
|
|
||||||
|
|
||||||
int PikaStdData_FILEIO_init(PikaObj* self, char* path, char* mode) {
|
int PikaStdData_FILEIO_init(PikaObj* self, char* path, char* mode) {
|
||||||
if (obj_isArgExist(self, "_f")) {
|
if (obj_isArgExist(self, "_f")) {
|
||||||
/* already initialized */
|
/* already initialized */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (strIsStartWith(path, "pikafs/")) {
|
if (strIsStartWith(path, "pikafs/")) {
|
||||||
PIKAFS_FILE* f = (PIKAFS_FILE*)pikaMalloc(sizeof(PIKAFS_FILE));
|
pikafs_FILE* f = pikafs_fopen(path + 7, "rb");
|
||||||
memset(f, 0, sizeof(PIKAFS_FILE));
|
|
||||||
extern volatile PikaObj* __pikaMain;
|
|
||||||
uint8_t* library_bytes = obj_getPtr((PikaObj*)__pikaMain, "@libraw");
|
|
||||||
if (NULL == library_bytes) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
char* file_name = path + 7;
|
|
||||||
if (PIKA_RES_OK != _loadModuleDataWithName(library_bytes, file_name,
|
|
||||||
&f->addr, &f->size)) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
obj_setInt(self, "pikafs", PIKA_TRUE);
|
obj_setInt(self, "pikafs", PIKA_TRUE);
|
||||||
obj_setPtr(self, "_f", f);
|
obj_setPtr(self, "_f", f);
|
||||||
obj_setStr(self, "_mode", mode);
|
obj_setStr(self, "_mode", mode);
|
||||||
@ -43,11 +26,11 @@ int PikaStdData_FILEIO_init(PikaObj* self, char* path, char* mode) {
|
|||||||
|
|
||||||
void PikaStdData_FILEIO_close(PikaObj* self) {
|
void PikaStdData_FILEIO_close(PikaObj* self) {
|
||||||
if (PIKA_TRUE == obj_getInt(self, "pikafs")) {
|
if (PIKA_TRUE == obj_getInt(self, "pikafs")) {
|
||||||
PIKAFS_FILE* f = obj_getPtr(self, "_f");
|
pikafs_FILE* f = obj_getPtr(self, "_f");
|
||||||
if (NULL == f) {
|
if (NULL == f) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pikaFree(f, sizeof(PIKAFS_FILE));
|
pikafs_fclose(f);
|
||||||
obj_setPtr(self, "_f", NULL);
|
obj_setPtr(self, "_f", NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -59,18 +42,6 @@ void PikaStdData_FILEIO_close(PikaObj* self) {
|
|||||||
obj_setPtr(self, "_f", NULL);
|
obj_setPtr(self, "_f", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t _pikafs_fread(void* buf, size_t size, size_t count, PIKAFS_FILE* f) {
|
|
||||||
if (f->pos >= f->size) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (f->pos + size * count > f->size) {
|
|
||||||
count = (f->size - f->pos) / size;
|
|
||||||
}
|
|
||||||
__platform_memcpy(buf, f->addr + f->pos, size * count);
|
|
||||||
f->pos += size * count;
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
Arg* PikaStdData_FILEIO_read(PikaObj* self, PikaTuple* size_) {
|
Arg* PikaStdData_FILEIO_read(PikaObj* self, PikaTuple* size_) {
|
||||||
int size = 0;
|
int size = 0;
|
||||||
if (pikaTuple_getSize(size_) == 0) {
|
if (pikaTuple_getSize(size_) == 0) {
|
||||||
@ -87,11 +58,11 @@ Arg* PikaStdData_FILEIO_read(PikaObj* self, PikaTuple* size_) {
|
|||||||
int n = 0;
|
int n = 0;
|
||||||
/* read */
|
/* read */
|
||||||
if (PIKA_TRUE == obj_getInt(self, "pikafs")) {
|
if (PIKA_TRUE == obj_getInt(self, "pikafs")) {
|
||||||
PIKAFS_FILE* f = obj_getPtr(self, "_f");
|
pikafs_FILE* f = obj_getPtr(self, "_f");
|
||||||
if (NULL == f) {
|
if (NULL == f) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
n = _pikafs_fread(buf, 1, size, f);
|
n = pikafs_fread(buf, 1, size, f);
|
||||||
} else {
|
} else {
|
||||||
FILE* f = obj_getPtr(self, "_f");
|
FILE* f = obj_getPtr(self, "_f");
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
|
@ -865,3 +865,39 @@ PIKA_RES pikaMaker_linkRaw(PikaMaker* self, char* file_path) {
|
|||||||
LibObj_staticLinkFile(lib, file_path);
|
LibObj_staticLinkFile(lib, file_path);
|
||||||
return PIKA_RES_OK;
|
return PIKA_RES_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pikafs_FILE* pikafs_fopen(char* file_name, char* mode) {
|
||||||
|
pikafs_FILE* f = (pikafs_FILE*)pikaMalloc(sizeof(pikafs_FILE));
|
||||||
|
memset(f, 0, sizeof(pikafs_FILE));
|
||||||
|
extern volatile PikaObj* __pikaMain;
|
||||||
|
uint8_t* library_bytes = obj_getPtr((PikaObj*)__pikaMain, "@libraw");
|
||||||
|
if (NULL == library_bytes) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (PIKA_RES_OK !=
|
||||||
|
_loadModuleDataWithName(library_bytes, file_name, &f->addr, &f->size)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return f;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pikafs_fread(void* buf, size_t size, size_t count, pikafs_FILE* f) {
|
||||||
|
if (f->pos >= f->size) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (f->pos + size * count > f->size) {
|
||||||
|
count = (f->size - f->pos) / size;
|
||||||
|
}
|
||||||
|
__platform_memcpy(buf, f->addr + f->pos, size * count);
|
||||||
|
f->pos += size * count;
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pikafs_fwrite(void* buf, size_t size, size_t count, pikafs_FILE* file) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int pikafs_fclose(pikafs_FILE* file) {
|
||||||
|
pikaFree(file,sizeof(pikafs_FILE));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -45,4 +45,16 @@ PIKA_RES _loadModuleDataWithName(uint8_t* library_bytes,
|
|||||||
#define PIKA_APP_VERSION_OFFSET 2
|
#define PIKA_APP_VERSION_OFFSET 2
|
||||||
#define PIKA_APP_MODULE_NUM_OFFSET 3
|
#define PIKA_APP_MODULE_NUM_OFFSET 3
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint8_t* addr;
|
||||||
|
size_t size;
|
||||||
|
size_t pos;
|
||||||
|
} pikafs_FILE;
|
||||||
|
|
||||||
|
pikafs_FILE* pikafs_fopen(char* file_name, char* mode);
|
||||||
|
int pikafs_fread(void* buf, size_t size, size_t count, pikafs_FILE* file);
|
||||||
|
int pikafs_fwrite(void* buf, size_t size, size_t count, pikafs_FILE* file);
|
||||||
|
int pikafs_fclose(pikafs_FILE* file);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user