#include "vxBoot/fs/smemfs.h" #include #include #include /* internal struct */ struct __file_info { uint16_t pathname[256]; void *buf; size_t count; off_t pos; }; /* generate_abolute_path(): Generate abolute path This function will generate the absolute path of a file because Casio's open primitive doesn't handle cannonical path */ static void generate_absolute_path(uint16_t *pathname, struct smemfs_inode *inode, int *pos) { if (inode == NULL) { memcpy(pathname, u"\\\\fls0", 12); *pos = 6; return; } generate_absolute_path(pathname, inode->parent, pos); pathname[(*pos)++] = '\\'; for (int i = 0; inode->name[i] != '\0'; ) { pathname[*pos] = inode->name[i]; *pos = *pos + 1; i = i + 1; } pathname[*pos] = '\0'; } /* __smemfs_pread() : involved in Casio's world */ static void __smemfs_pread(struct __file_info *info, ssize_t *read) { int handle; *read = -1; handle = BFile_Open(info->pathname, BFile_ReadOnly); if (handle >= 0) { *read = BFile_Read(handle, info->buf, info->count, info->pos); BFile_Close(handle); } } /* smemfs_read(): Read primitive */ ssize_t smemfs_pread(struct smemfs_inode *inode, void *buf, size_t count, off_t pos) { struct __file_info file_info = { .buf = buf, .count = count, .pos = pos }; ssize_t read; int tmp; if (inode == NULL) return (-1); tmp = 0; generate_absolute_path(file_info.pathname, inode, &tmp); gint_world_switch(GINT_CALL( (void*)&__smemfs_pread, (void*)&file_info, &read )); return (read); }