4 Commits

2 changed files with 41 additions and 9 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ BUILD_TYPE=$2
if [[ $TARGET == windows ]]; then if [[ $TARGET == windows ]]; then
toolchain="-DCMAKE_TOOLCHAIN_FILE=cmake/Modules/Mingw.cmake" toolchain="-DCMAKE_TOOLCHAIN_FILE=cmake/Modules/Mingw.cmake"
elif [[ $TARGET == gba ]]; then elif [[ $TARGET == gba ]]; then
toolchain="-DCMAKE_TOOLCHAIN_FILE=cmake/Modules/GBA.cmake -DOX_USE_STDLIB=OFF" toolchain="-DCMAKE_TOOLCHAIN_FILE=cmake/Modules/GBA.cmake -DOX_USE_STDLIB=OFF -DCMAKE_INSTALL_PREFIX=$DEVKITARM"
fi fi
if [[ $BUILD_TYPE == debug ]]; then if [[ $BUILD_TYPE == debug ]]; then
+40 -8
View File
@@ -13,7 +13,7 @@ namespace ox {
namespace fs { namespace fs {
template<typename FsT, typename InodeId> template<typename FsT, typename InodeId>
struct FileStoreHeader { struct __attribute__((packed)) FileStoreHeader {
public: public:
typedef InodeId InodeId_t; typedef InodeId InodeId_t;
typedef FsT FsSize_t; typedef FsT FsSize_t;
@@ -108,15 +108,17 @@ class FileStore {
}; };
private: private:
struct Inode { struct __attribute__((packed)) Inode {
private: private:
// the next Inode in memory // the next Inode in memory
typename Header::FsSize_t m_prev, m_next; typename Header::FsSize_t m_prev;
typename Header::FsSize_t m_next;
typename Header::FsSize_t m_dataLen; typename Header::FsSize_t m_dataLen;
InodeId_t m_id; InodeId_t m_id;
uint8_t m_fileType; uint8_t m_fileType;
typename Header::FsSize_t m_left, m_right; typename Header::FsSize_t m_left;
typename Header::FsSize_t m_right;
public: public:
typename Header::FsSize_t size(); typename Header::FsSize_t size();
@@ -200,6 +202,21 @@ class FileStore {
typename Header::FsSize_t readSize, void *data, typename Header::FsSize_t readSize, void *data,
typename Header::FsSize_t *size); typename Header::FsSize_t *size);
/**
* Reads the "file" at the given id. You are responsible for freeing
* the data when done with it.
* @param id id of the "file"
* @param readStart where in the data to start reading
* @param readSize how much data to read
* @param data pointer to the pointer where the data is stored
* @param size pointer to a value that will be assigned the size of data
* @return 0 if read is a success
*/
template<typename T>
int read(InodeId_t id, typename Header::FsSize_t readStart,
typename Header::FsSize_t readSize, T *data,
typename Header::FsSize_t *size);
/** /**
* Reads the stat information of the inode of the given inode id. * Reads the stat information of the inode of the given inode id.
* If the returned inode id is 0, then the requested inode was not found. * If the returned inode id is 0, then the requested inode was not found.
@@ -264,8 +281,9 @@ class FileStore {
* @param size pointer to a value that will be assigned the size of data * @param size pointer to a value that will be assigned the size of data
* @return 0 if read is a success * @return 0 if read is a success
*/ */
template<typename T>
int read(Inode *inode, typename Header::FsSize_t readStart, int read(Inode *inode, typename Header::FsSize_t readStart,
typename Header::FsSize_t readSize, void *data, typename Header::FsSize_t readSize, T *data,
typename Header::FsSize_t *size); typename Header::FsSize_t *size);
/** /**
@@ -566,19 +584,28 @@ void FileStore<Header>::updateInodeAddress(InodeId_t id, typename Header::FsSize
template<typename Header> template<typename Header>
int FileStore<Header>::read(InodeId_t id, void *data, typename Header::FsSize_t *size) { int FileStore<Header>::read(InodeId_t id, void *data, typename Header::FsSize_t *size) {
auto inode = getInode(ptr<Inode*>(m_header.getRootInode()), id); auto inode = getInode(ptr<Inode*>(m_header.getRootInode()), id);
return inode ? read(inode, 0, inode->getDataLen(), data, size) : 1; return inode ? read(inode, 0, inode->getDataLen(), (uint8_t*) data, size) : 1;
} }
template<typename Header> template<typename Header>
int FileStore<Header>::read(InodeId_t id, typename Header::FsSize_t readStart, int FileStore<Header>::read(InodeId_t id, typename Header::FsSize_t readStart,
typename Header::FsSize_t readSize, void *data, typename Header::FsSize_t *size) { typename Header::FsSize_t readSize, void *data, typename Header::FsSize_t *size) {
auto inode = getInode(ptr<Inode*>(m_header.getRootInode()), id); auto inode = getInode(ptr<Inode*>(m_header.getRootInode()), id);
return inode ? read<uint8_t>(inode, readStart, readSize, (uint8_t*) data, size) : 1;
}
template<typename Header>
template<typename T>
int FileStore<Header>::read(InodeId_t id, typename Header::FsSize_t readStart,
typename Header::FsSize_t readSize, T *data, typename Header::FsSize_t *size) {
auto inode = getInode(ptr<Inode*>(m_header.getRootInode()), id);
return inode ? read(inode, readStart, readSize, data, size) : 1; return inode ? read(inode, readStart, readSize, data, size) : 1;
} }
template<typename Header> template<typename Header>
template<typename T>
int FileStore<Header>::read(Inode *inode, typename Header::FsSize_t readStart, int FileStore<Header>::read(Inode *inode, typename Header::FsSize_t readStart,
typename Header::FsSize_t readSize, void *data, typename Header::FsSize_t *size) { typename Header::FsSize_t readSize, T *data, typename Header::FsSize_t *size) {
// be sure read size is not greater than what is available to read // be sure read size is not greater than what is available to read
if (inode->getDataLen() - readStart < readSize) { if (inode->getDataLen() - readStart < readSize) {
readSize = inode->getDataLen() - readStart; readSize = inode->getDataLen() - readStart;
@@ -586,7 +613,12 @@ int FileStore<Header>::read(Inode *inode, typename Header::FsSize_t readStart,
if (size) { if (size) {
*size = readSize; *size = readSize;
} }
ox_memcpy(data, inode->getData() + readStart, readSize);
readSize /= sizeof(T);
T *it = (T*) &(inode->getData()[readStart]);
for (typename Header::FsSize_t i = 0; i < readSize; i++) {
*(data++) = *(it++);
}
return 0; return 0;
} }