Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6e690ee98d | |||
| 9b7c68efc9 | |||
| 58400b950b | |||
| aa1b3d0a74 |
+1
-1
@@ -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
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user