[ox/fs] Cleanup
This commit is contained in:
parent
8dd837b359
commit
702b166b8d
115
deps/ox/src/ox/fs/filesystem/directory.hpp
vendored
115
deps/ox/src/ox/fs/filesystem/directory.hpp
vendored
@ -43,13 +43,14 @@ struct OX_PACKED DirectoryEntry {
|
|||||||
public:
|
public:
|
||||||
constexpr DirectoryEntry() noexcept = default;
|
constexpr DirectoryEntry() noexcept = default;
|
||||||
|
|
||||||
Error init(InodeId_t inode, const char *name, InodeId_t bufferSize) noexcept {
|
Error init(InodeId_t inode, ox::CRStringView name, size_t bufferSize) noexcept {
|
||||||
m_bufferSize = bufferSize;
|
m_bufferSize = static_cast<InodeId_t>(bufferSize);
|
||||||
auto d = data();
|
auto d = data();
|
||||||
if (d.valid()) {
|
if (d.valid()) {
|
||||||
d->inode = inode;
|
d->inode = inode;
|
||||||
ox::strncpy(d->name, name, ox::min(bufferSize, static_cast<InodeId_t>(MaxFileNameLength)));
|
auto const maxStrSz = bufferSize - 1 - sizeof(*this);
|
||||||
return OxError(0);
|
ox::strncpy(d->name, name.data(), ox::min(maxStrSz, name.len()));
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
return OxError(1);
|
return OxError(1);
|
||||||
}
|
}
|
||||||
@ -103,23 +104,23 @@ class Directory {
|
|||||||
*/
|
*/
|
||||||
Error init() noexcept;
|
Error init() noexcept;
|
||||||
|
|
||||||
Error mkdir(PathIterator path, bool parents, FileName *nameBuff = nullptr);
|
Error mkdir(PathIterator path, bool parents);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param parents indicates the operation should create non-existent directories in the path, like mkdir -p
|
* @param parents indicates the operation should create non-existent directories in the path, like mkdir -p
|
||||||
*/
|
*/
|
||||||
Error write(PathIterator path, uint64_t inode64, FileName *nameBuff = nullptr) noexcept;
|
Error write(PathIterator path, uint64_t inode64) noexcept;
|
||||||
|
|
||||||
Error remove(PathIterator path, FileName *nameBuff = nullptr) noexcept;
|
Error remove(PathIterator path) noexcept;
|
||||||
|
|
||||||
template<typename F>
|
template<typename F>
|
||||||
Error ls(F cb) noexcept;
|
Error ls(F cb) noexcept;
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
Result<typename FileStore::InodeId_t> findEntry(const FileName &name) const noexcept;
|
Result<typename FileStore::InodeId_t> findEntry(const StringView &name) const noexcept;
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
Result<typename FileStore::InodeId_t> find(PathIterator name, FileName *nameBuff = nullptr) const noexcept;
|
Result<typename FileStore::InodeId_t> find(PathIterator path) const noexcept;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -145,22 +146,17 @@ Error Directory<FileStore, InodeId_t>::init() noexcept {
|
|||||||
}
|
}
|
||||||
new (buff) Buffer(Size);
|
new (buff) Buffer(Size);
|
||||||
m_size = Size;
|
m_size = Size;
|
||||||
return OxError(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename InodeId_t>
|
template<typename FileStore, typename InodeId_t>
|
||||||
Error Directory<FileStore, InodeId_t>::mkdir(PathIterator path, bool parents, FileName *nameBuff) {
|
Error Directory<FileStore, InodeId_t>::mkdir(PathIterator path, bool parents) {
|
||||||
if (path.valid()) {
|
if (path.valid()) {
|
||||||
oxTrace("ox.fs.Directory.mkdir", path.fullPath());
|
oxTrace("ox.fs.Directory.mkdir", path.fullPath());
|
||||||
// reuse nameBuff if it has already been allocated, as it is a rather large variable
|
|
||||||
if (nameBuff == nullptr) {
|
|
||||||
nameBuff = new (ox_alloca(sizeof(FileName))) FileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
// determine if already exists
|
// determine if already exists
|
||||||
auto name = nameBuff;
|
ox::StringView name;
|
||||||
oxReturnError(path.get(*name));
|
oxReturnError(path.get(name));
|
||||||
auto childInode = find(PathIterator(*name));
|
auto childInode = find(PathIterator(name));
|
||||||
if (!childInode.ok()) {
|
if (!childInode.ok()) {
|
||||||
// if this is not the last item in the path and parents is disabled,
|
// if this is not the last item in the path and parents is disabled,
|
||||||
// return an error
|
// return an error
|
||||||
@ -171,12 +167,10 @@ Error Directory<FileStore, InodeId_t>::mkdir(PathIterator path, bool parents, Fi
|
|||||||
oxTracef("ox.fs.Directory.mkdir", "Generated Inode ID: {}", childInode.value);
|
oxTracef("ox.fs.Directory.mkdir", "Generated Inode ID: {}", childInode.value);
|
||||||
oxLogError(childInode.error);
|
oxLogError(childInode.error);
|
||||||
oxReturnError(childInode.error);
|
oxReturnError(childInode.error);
|
||||||
|
|
||||||
// initialize the directory
|
// initialize the directory
|
||||||
Directory<FileStore, InodeId_t> child(m_fs, childInode.value);
|
Directory<FileStore, InodeId_t> child(m_fs, childInode.value);
|
||||||
oxReturnError(child.init());
|
oxReturnError(child.init());
|
||||||
|
auto err = write(PathIterator(name), childInode.value);
|
||||||
auto err = write(PathIterator(*name), childInode.value);
|
|
||||||
if (err) {
|
if (err) {
|
||||||
oxLogError(err);
|
oxLogError(err);
|
||||||
// could not index the directory, delete it
|
// could not index the directory, delete it
|
||||||
@ -184,46 +178,34 @@ Error Directory<FileStore, InodeId_t>::mkdir(PathIterator path, bool parents, Fi
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Directory<FileStore, InodeId_t> child(m_fs, childInode.value);
|
Directory<FileStore, InodeId_t> child(m_fs, childInode.value);
|
||||||
if (path.hasNext()) {
|
if (path.hasNext()) {
|
||||||
oxReturnError(child.mkdir(path.next(), parents, nameBuff));
|
oxReturnError(child.mkdir(path.next(), parents));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return OxError(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename InodeId_t>
|
template<typename FileStore, typename InodeId_t>
|
||||||
Error Directory<FileStore, InodeId_t>::write(PathIterator path, uint64_t inode64, FileName *nameBuff) noexcept {
|
Error Directory<FileStore, InodeId_t>::write(PathIterator path, uint64_t inode64) noexcept {
|
||||||
const auto inode = static_cast<InodeId_t>(inode64);
|
const auto inode = static_cast<InodeId_t>(inode64);
|
||||||
// reuse nameBuff if it has already been allocated, as it is a rather large variable
|
ox::StringView name;
|
||||||
if (nameBuff == nullptr) {
|
oxReturnError(path.next(name));
|
||||||
nameBuff = new (ox_alloca(sizeof(FileName))) FileName;
|
|
||||||
}
|
|
||||||
auto name = nameBuff;
|
|
||||||
|
|
||||||
if (path.next().hasNext()) { // not yet at target directory, recurse to next one
|
if (path.next().hasNext()) { // not yet at target directory, recurse to next one
|
||||||
oxReturnError(path.get(*name));
|
|
||||||
oxTracef("ox.fs.Directory.write", "Attempting to write to next sub-Directory: {} of {}",
|
oxTracef("ox.fs.Directory.write", "Attempting to write to next sub-Directory: {} of {}",
|
||||||
*name, path.fullPath());
|
name, path.fullPath());
|
||||||
oxRequire(nextChild, findEntry(*name));
|
oxRequire(nextChild, findEntry(name));
|
||||||
oxTracef("ox.fs.Directory.write", "{}: {}", *name, nextChild);
|
oxTracef("ox.fs.Directory.write", "{}: {}", name, nextChild);
|
||||||
if (nextChild) {
|
if (nextChild) {
|
||||||
// reuse name because it is a rather large variable and will not be used again
|
return Directory(m_fs, nextChild).write(path.next(), inode);
|
||||||
// be attentive that this remains true
|
|
||||||
name = nullptr;
|
|
||||||
return Directory(m_fs, nextChild).write(path.next(), inode, nameBuff);
|
|
||||||
} else {
|
} else {
|
||||||
oxTracef("ox.fs.Directory.write", "{} not found and not allowed to create it.", *name);
|
oxTracef("ox.fs.Directory.write", "{} not found and not allowed to create it.", name);
|
||||||
return OxError(1, "File not found and not allowed to create it.");
|
return OxError(1, "File not found and not allowed to create it.");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
oxTrace("ox.fs.Directory.write", path.fullPath());
|
oxTrace("ox.fs.Directory.write", path.fullPath());
|
||||||
// insert the new entry on this directory
|
// insert the new entry on this directory
|
||||||
|
|
||||||
// get the name
|
// get the name
|
||||||
oxReturnError(path.next(*name));
|
|
||||||
|
|
||||||
// find existing version of directory
|
// find existing version of directory
|
||||||
oxTracef("ox.fs.Directory.write", "Searching for directory inode {}", m_inodeId);
|
oxTracef("ox.fs.Directory.write", "Searching for directory inode {}", m_inodeId);
|
||||||
oxRequire(oldStat, m_fs.stat(m_inodeId));
|
oxRequire(oldStat, m_fs.stat(m_inodeId));
|
||||||
@ -233,8 +215,7 @@ Error Directory<FileStore, InodeId_t>::write(PathIterator path, uint64_t inode64
|
|||||||
oxTrace("ox.fs.Directory.write.fail", "Could not read existing version of Directory");
|
oxTrace("ox.fs.Directory.write.fail", "Could not read existing version of Directory");
|
||||||
return OxError(1, "Could not read existing version of Directory");
|
return OxError(1, "Could not read existing version of Directory");
|
||||||
}
|
}
|
||||||
|
const auto pathSize = name.len() + 1;
|
||||||
const auto pathSize = name->len() + 1;
|
|
||||||
const auto entryDataSize = DirectoryEntry<InodeId_t>::DirectoryEntryData::spaceNeeded(pathSize);
|
const auto entryDataSize = DirectoryEntry<InodeId_t>::DirectoryEntryData::spaceNeeded(pathSize);
|
||||||
const auto newSize = oldStat.size + Buffer::spaceNeeded(entryDataSize);
|
const auto newSize = oldStat.size + Buffer::spaceNeeded(entryDataSize);
|
||||||
auto cpy = ox_malloca(newSize, Buffer, *old, oldStat.size);
|
auto cpy = ox_malloca(newSize, Buffer, *old, oldStat.size);
|
||||||
@ -242,29 +223,22 @@ Error Directory<FileStore, InodeId_t>::write(PathIterator path, uint64_t inode64
|
|||||||
oxTrace("ox.fs.Directory.write.fail", "Could not allocate memory for copy of Directory");
|
oxTrace("ox.fs.Directory.write.fail", "Could not allocate memory for copy of Directory");
|
||||||
return OxError(1, "Could not allocate memory for copy of Directory");
|
return OxError(1, "Could not allocate memory for copy of Directory");
|
||||||
}
|
}
|
||||||
|
|
||||||
oxReturnError(cpy->setSize(newSize));
|
oxReturnError(cpy->setSize(newSize));
|
||||||
auto val = cpy->malloc(entryDataSize).value;
|
auto val = cpy->malloc(entryDataSize).value;
|
||||||
if (!val.valid()) {
|
if (!val.valid()) {
|
||||||
oxTrace("ox.fs.Directory.write.fail", "Could not allocate memory for new directory entry");
|
oxTrace("ox.fs.Directory.write.fail", "Could not allocate memory for new directory entry");
|
||||||
return OxError(1, "Could not allocate memory for new directory entry");
|
return OxError(1, "Could not allocate memory for new directory entry");
|
||||||
}
|
}
|
||||||
|
oxTracef("ox.fs.Directory.write", "Attempting to write Directory entry: {}", name);
|
||||||
oxTracef("ox.fs.Directory.write", "Attempting to write Directory entry: {}", name->data());
|
oxReturnError(val->init(inode, name, val.size()));
|
||||||
oxReturnError(val->init(inode, name->data(), val.size()));
|
|
||||||
return m_fs.write(m_inodeId, cpy.get(), cpy->size(), static_cast<uint8_t>(FileType::Directory));
|
return m_fs.write(m_inodeId, cpy.get(), cpy->size(), static_cast<uint8_t>(FileType::Directory));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename InodeId_t>
|
template<typename FileStore, typename InodeId_t>
|
||||||
Error Directory<FileStore, InodeId_t>::remove(PathIterator path, FileName *nameBuff) noexcept {
|
Error Directory<FileStore, InodeId_t>::remove(PathIterator path) noexcept {
|
||||||
// reuse nameBuff if it has already been allocated, as it is a rather large variable
|
ox::StringView name;
|
||||||
if (nameBuff == nullptr) {
|
|
||||||
nameBuff = new (ox_alloca(sizeof(FileName))) FileName;
|
|
||||||
}
|
|
||||||
auto &name = *nameBuff;
|
|
||||||
oxReturnError(path.get(name));
|
oxReturnError(path.get(name));
|
||||||
|
|
||||||
oxTrace("ox.fs.Directory.remove", name);
|
oxTrace("ox.fs.Directory.remove", name);
|
||||||
auto buff = m_fs.read(m_inodeId).template to<Buffer>();
|
auto buff = m_fs.read(m_inodeId).template to<Buffer>();
|
||||||
if (buff.valid()) {
|
if (buff.valid()) {
|
||||||
@ -283,7 +257,7 @@ Error Directory<FileStore, InodeId_t>::remove(PathIterator path, FileName *nameB
|
|||||||
oxTrace("ox.fs.Directory.remove.fail", "Could not find directory buffer");
|
oxTrace("ox.fs.Directory.remove.fail", "Could not find directory buffer");
|
||||||
return OxError(1, "Could not find directory buffer");
|
return OxError(1, "Could not find directory buffer");
|
||||||
}
|
}
|
||||||
return OxError(0);
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename InodeId_t>
|
template<typename FileStore, typename InodeId_t>
|
||||||
@ -295,7 +269,6 @@ Error Directory<FileStore, InodeId_t>::ls(F cb) noexcept {
|
|||||||
oxTrace("ox.fs.Directory.ls.fail", "Could not directory buffer");
|
oxTrace("ox.fs.Directory.ls.fail", "Could not directory buffer");
|
||||||
return OxError(1, "Could not directory buffer");
|
return OxError(1, "Could not directory buffer");
|
||||||
}
|
}
|
||||||
|
|
||||||
oxTrace("ox.fs.Directory.ls", "Found directory buffer.");
|
oxTrace("ox.fs.Directory.ls", "Found directory buffer.");
|
||||||
for (auto i = buff->iterator(); i.valid(); i.next()) {
|
for (auto i = buff->iterator(); i.valid(); i.next()) {
|
||||||
auto data = i->data();
|
auto data = i->data();
|
||||||
@ -305,12 +278,11 @@ Error Directory<FileStore, InodeId_t>::ls(F cb) noexcept {
|
|||||||
oxTrace("ox.fs.Directory.ls", "INVALID DIRECTORY ENTRY");
|
oxTrace("ox.fs.Directory.ls", "INVALID DIRECTORY ENTRY");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return {};
|
||||||
return OxError(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename InodeId_t>
|
template<typename FileStore, typename InodeId_t>
|
||||||
Result<typename FileStore::InodeId_t> Directory<FileStore, InodeId_t>::findEntry(const FileName &name) const noexcept {
|
Result<typename FileStore::InodeId_t> Directory<FileStore, InodeId_t>::findEntry(CRStringView name) const noexcept {
|
||||||
oxTrace("ox.fs.Directory.findEntry", name);
|
oxTrace("ox.fs.Directory.findEntry", name);
|
||||||
auto buff = m_fs.read(m_inodeId).template to<Buffer>();
|
auto buff = m_fs.read(m_inodeId).template to<Buffer>();
|
||||||
if (!buff.valid()) {
|
if (!buff.valid()) {
|
||||||
@ -327,7 +299,7 @@ Result<typename FileStore::InodeId_t> Directory<FileStore, InodeId_t>::findEntry
|
|||||||
return static_cast<InodeId_t>(data->inode);
|
return static_cast<InodeId_t>(data->inode);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
oxTrace("ox.fs.Directory.findEntry") << "INVALID DIRECTORY ENTRY";
|
oxTrace("ox.fs.Directory.findEntry", "INVALID DIRECTORY ENTRY");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
oxTrace("ox.fs.Directory.findEntry.fail", "Entry not present");
|
oxTrace("ox.fs.Directory.findEntry.fail", "Entry not present");
|
||||||
@ -335,22 +307,15 @@ Result<typename FileStore::InodeId_t> Directory<FileStore, InodeId_t>::findEntry
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<typename FileStore, typename InodeId_t>
|
template<typename FileStore, typename InodeId_t>
|
||||||
Result<typename FileStore::InodeId_t> Directory<FileStore, InodeId_t>::find(PathIterator path, FileName *nameBuff) const noexcept {
|
Result<typename FileStore::InodeId_t> Directory<FileStore, InodeId_t>::find(PathIterator path) const noexcept {
|
||||||
// reuse nameBuff if it has already been allocated, as it is a rather large variable
|
|
||||||
if (nameBuff == nullptr) {
|
|
||||||
nameBuff = new (ox_alloca(sizeof(FileName))) FileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
// determine if already exists
|
// determine if already exists
|
||||||
auto name = nameBuff;
|
ox::StringView name;
|
||||||
oxReturnError(path.get(*name));
|
oxReturnError(path.get(name));
|
||||||
|
oxRequire(v, findEntry(name));
|
||||||
oxRequire(v, findEntry(*name));
|
|
||||||
// recurse if not at end of path
|
// recurse if not at end of path
|
||||||
if (auto p = path.next(); p.valid()) {
|
if (auto p = path.next(); p.valid()) {
|
||||||
Directory dir(m_fs, v);
|
Directory dir(m_fs, v);
|
||||||
name = nullptr;
|
return dir.find(p);
|
||||||
return dir.find(p, nameBuff);
|
|
||||||
}
|
}
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
43
deps/ox/src/ox/fs/filesystem/pathiterator.cpp
vendored
43
deps/ox/src/ox/fs/filesystem/pathiterator.cpp
vendored
@ -40,30 +40,9 @@ Error PathIterator::dirPath(char *out, std::size_t outSize) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return 0 if no error
|
|
||||||
*/
|
|
||||||
Error PathIterator::fileName(char *out, std::size_t outSize) {
|
|
||||||
auto idx = ox::lastIndexOf(m_path, '/', m_maxSize);
|
|
||||||
if (idx >= 0) {
|
|
||||||
idx++; // pass up the preceding /
|
|
||||||
std::size_t fileNameSize = static_cast<size_t>(ox::strlen(&m_path[idx]));
|
|
||||||
if (fileNameSize < outSize) {
|
|
||||||
ox::memcpy(out, &m_path[idx], fileNameSize);
|
|
||||||
out[fileNameSize] = 0;
|
|
||||||
return OxError(0);
|
|
||||||
} else {
|
|
||||||
return OxError(1);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return OxError(2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gets the get item in the path
|
// Gets the get item in the path
|
||||||
Error PathIterator::get(IString<MaxFileNameLength> &fileName) {
|
Error PathIterator::get(StringView &fileName) {
|
||||||
std::size_t size = 0;
|
std::size_t size = 0;
|
||||||
std::ignore = fileName.resize(MaxFileNameLength);
|
|
||||||
if (m_iterator >= m_maxSize) {
|
if (m_iterator >= m_maxSize) {
|
||||||
oxTracef("ox.fs.PathIterator.get", "m_iterator ({}) >= m_maxSize ({})", m_iterator, m_maxSize);
|
oxTracef("ox.fs.PathIterator.get", "m_iterator ({}) >= m_maxSize ({})", m_iterator, m_maxSize);
|
||||||
return OxError(1);
|
return OxError(1);
|
||||||
@ -88,22 +67,21 @@ Error PathIterator::get(IString<MaxFileNameLength> &fileName) {
|
|||||||
if (size >= MaxFileNameLength || size == 0) {
|
if (size >= MaxFileNameLength || size == 0) {
|
||||||
return OxError(1);
|
return OxError(1);
|
||||||
}
|
}
|
||||||
ox::memcpy(fileName.data(), &m_path[start], size);
|
fileName = ox::substr(m_path, start, start + size);
|
||||||
// truncate trailing /
|
// truncate trailing /
|
||||||
if (size && fileName[size - 1] == '/') {
|
if (size && fileName[size - 1] == '/') {
|
||||||
size--;
|
fileName = ox::substr(m_path, start, start + size - 1);
|
||||||
}
|
}
|
||||||
oxReturnError(fileName.resize(size));
|
oxAssert(fileName[fileName.len()-1] != '/', "name ends in /");
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return 0 if no error
|
* @return 0 if no error
|
||||||
*/
|
*/
|
||||||
Error PathIterator::next(IString<MaxFileNameLength> &fileName) {
|
Error PathIterator::next(StringView &fileName) {
|
||||||
std::size_t size = 0;
|
std::size_t size = 0;
|
||||||
auto retval = OxError(1);
|
auto retval = OxError(1);
|
||||||
std::ignore = fileName.resize(MaxFileNameLength);
|
|
||||||
if (m_iterator < m_maxSize && ox::strlen(&m_path[m_iterator])) {
|
if (m_iterator < m_maxSize && ox::strlen(&m_path[m_iterator])) {
|
||||||
retval = OxError(0);
|
retval = OxError(0);
|
||||||
if (m_path[m_iterator] == '/') {
|
if (m_path[m_iterator] == '/') {
|
||||||
@ -122,15 +100,14 @@ Error PathIterator::next(IString<MaxFileNameLength> &fileName) {
|
|||||||
if (size >= MaxFileNameLength) {
|
if (size >= MaxFileNameLength) {
|
||||||
return OxError(1);
|
return OxError(1);
|
||||||
}
|
}
|
||||||
ox::memcpy(fileName.data(), &m_path[start], size);
|
fileName = ox::substr(m_path, start, start + size);
|
||||||
}
|
|
||||||
// truncate trailing /
|
// truncate trailing /
|
||||||
if (size && fileName[size - 1] == '/') {
|
while (fileName.len() && fileName[fileName.len() - 1] == '/') {
|
||||||
size--;
|
fileName = ox::substr(m_path, start, start + size);
|
||||||
}
|
}
|
||||||
fileName[size] = 0; // end with null terminator
|
|
||||||
oxReturnError(fileName.resize(size));
|
|
||||||
m_iterator += size;
|
m_iterator += size;
|
||||||
|
oxAssert(fileName.len() == 0 || fileName[fileName.len()-1] != '/', "name ends in /");
|
||||||
|
}
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
20
deps/ox/src/ox/fs/filesystem/pathiterator.hpp
vendored
20
deps/ox/src/ox/fs/filesystem/pathiterator.hpp
vendored
@ -13,7 +13,6 @@
|
|||||||
namespace ox {
|
namespace ox {
|
||||||
|
|
||||||
constexpr std::size_t MaxFileNameLength = 255;
|
constexpr std::size_t MaxFileNameLength = 255;
|
||||||
using FileName = IString<MaxFileNameLength>;
|
|
||||||
|
|
||||||
class PathIterator {
|
class PathIterator {
|
||||||
private:
|
private:
|
||||||
@ -28,29 +27,14 @@ class PathIterator {
|
|||||||
|
|
||||||
PathIterator(CRStringView path);
|
PathIterator(CRStringView path);
|
||||||
|
|
||||||
/**
|
|
||||||
* @return 0 if no error
|
|
||||||
*/
|
|
||||||
Error dirPath(char *pathOut, std::size_t pathOutSize);
|
Error dirPath(char *pathOut, std::size_t pathOutSize);
|
||||||
|
|
||||||
/**
|
|
||||||
* @return 0 if no error
|
|
||||||
*/
|
|
||||||
Error fileName(char *out, std::size_t outSize);
|
Error fileName(char *out, std::size_t outSize);
|
||||||
|
|
||||||
/**
|
Error next(StringView &fileName);
|
||||||
* @return 0 if no error
|
|
||||||
*/
|
|
||||||
Error next(FileName &fileName);
|
|
||||||
|
|
||||||
/**
|
Error get(StringView &fileName);
|
||||||
* @return 0 if no error
|
|
||||||
*/
|
|
||||||
Error get(FileName &fileName);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return 0 if no error
|
|
||||||
*/
|
|
||||||
Result<std::size_t> nextSize() const;
|
Result<std::size_t> nextSize() const;
|
||||||
|
|
||||||
[[nodiscard]]
|
[[nodiscard]]
|
||||||
|
1
deps/ox/src/ox/fs/test/CMakeLists.txt
vendored
1
deps/ox/src/ox/fs/test/CMakeLists.txt
vendored
@ -19,7 +19,6 @@ add_test("[ox/fs] PathIterator::next5" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FSTests
|
|||||||
add_test("[ox/fs] PathIterator::hasNext" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FSTests PathIterator::hasNext)
|
add_test("[ox/fs] PathIterator::hasNext" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FSTests PathIterator::hasNext)
|
||||||
|
|
||||||
add_test("[ox/fs] PathIterator::dirPath" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FSTests PathIterator::dirPath)
|
add_test("[ox/fs] PathIterator::dirPath" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FSTests PathIterator::dirPath)
|
||||||
add_test("[ox/fs] PathIterator::fileName" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FSTests PathIterator::fileName)
|
|
||||||
|
|
||||||
add_test("[ox/fs] NodeBuffer::insert" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FSTests "NodeBuffer::insert")
|
add_test("[ox/fs] NodeBuffer::insert" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FSTests "NodeBuffer::insert")
|
||||||
add_test("[ox/fs] FileStore::readWrite" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FSTests "FileStore::readWrite")
|
add_test("[ox/fs] FileStore::readWrite" ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/FSTests "FileStore::readWrite")
|
||||||
|
52
deps/ox/src/ox/fs/test/tests.cpp
vendored
52
deps/ox/src/ox/fs/test/tests.cpp
vendored
@ -58,9 +58,9 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
{
|
{
|
||||||
"PathIterator::next1",
|
"PathIterator::next1",
|
||||||
[](ox::StringView) {
|
[](ox::StringView) {
|
||||||
auto const path = ox::String("/usr/share/charset.gbag");
|
auto constexpr path = ox::StringLiteral("/usr/share/charset.gbag");
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
ox::PathIterator it(path.c_str(), path.len());
|
||||||
ox::FileName buff;
|
ox::StringView buff;
|
||||||
oxAssert(it.next(buff) == 0 && buff == "usr", "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "usr", "PathIterator shows wrong next");
|
||||||
oxAssert(it.next(buff) == 0 && buff == "share", "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "share", "PathIterator shows wrong next");
|
||||||
oxAssert(it.next(buff) == 0 && buff == "charset.gbag", "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "charset.gbag", "PathIterator shows wrong next");
|
||||||
@ -70,11 +70,13 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
{
|
{
|
||||||
"PathIterator::next2",
|
"PathIterator::next2",
|
||||||
[](ox::StringView) {
|
[](ox::StringView) {
|
||||||
auto const path = ox::String("/usr/share/");
|
auto constexpr path = ox::StringView("/usr/share/");
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
ox::PathIterator it(path);
|
||||||
ox::FileName buff;
|
ox::StringView buff;
|
||||||
oxAssert(it.next(buff) == 0 && ox::strcmp(buff, "usr") == 0, "PathIterator shows wrong next");
|
oxAssert(it.next(buff), "PathIterator::next returned error");
|
||||||
oxAssert(it.next(buff) == 0 && ox::strcmp(buff, "share") == 0, "PathIterator shows wrong next");
|
oxExpect(buff, "usr");
|
||||||
|
oxAssert(it.next(buff), "PathIterator::next returned error");
|
||||||
|
oxExpect(buff, "share");
|
||||||
return OxError(0);
|
return OxError(0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -83,20 +85,20 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
[](ox::StringView) {
|
[](ox::StringView) {
|
||||||
auto const path = ox::String("/");
|
auto const path = ox::String("/");
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
ox::PathIterator it(path.c_str(), path.len());
|
||||||
ox::FileName buff;
|
ox::StringView buff;
|
||||||
oxAssert(it.next(buff) == 0 && ox::strcmp(buff, "\0") == 0, "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "\0", "PathIterator shows wrong next");
|
||||||
return OxError(0);
|
return OxError(0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"PathIterator::next4",
|
"PathIterator::next4",
|
||||||
[](ox::StringView) {
|
[](ox::StringView) {
|
||||||
auto const path = ox::String("usr/share/charset.gbag");
|
auto constexpr path = ox::StringLiteral("usr/share/charset.gbag");
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
ox::PathIterator it(path);
|
||||||
ox::FileName buff;
|
ox::StringView buff;
|
||||||
oxAssert(it.next(buff) == 0 && ox::strcmp(buff, "usr") == 0, "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "usr", "PathIterator shows wrong next");
|
||||||
oxAssert(it.next(buff) == 0 && ox::strcmp(buff, "share") == 0, "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "share", "PathIterator shows wrong next");
|
||||||
oxAssert(it.next(buff) == 0 && ox::strcmp(buff, "charset.gbag") == 0, "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "charset.gbag", "PathIterator shows wrong next");
|
||||||
return OxError(0);
|
return OxError(0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -105,32 +107,22 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
[](ox::StringView) {
|
[](ox::StringView) {
|
||||||
auto const path = ox::String("usr/share/");
|
auto const path = ox::String("usr/share/");
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
ox::PathIterator it(path.c_str(), path.len());
|
||||||
ox::FileName buff;
|
ox::StringView buff;
|
||||||
oxAssert(it.next(buff) == 0 && ox::strcmp(buff, "usr") == 0, "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "usr", "PathIterator shows wrong next");
|
||||||
oxAssert(it.next(buff) == 0 && ox::strcmp(buff, "share") == 0, "PathIterator shows wrong next");
|
oxAssert(it.next(buff) == 0 && buff == "share", "PathIterator shows wrong next");
|
||||||
return OxError(0);
|
return OxError(0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"PathIterator::dirPath",
|
"PathIterator::dirPath",
|
||||||
[] (ox::StringView) {
|
[] (ox::StringView) {
|
||||||
auto const path = ox::String("/usr/share/charset.gbag");
|
auto constexpr path = ox::StringLiteral("/usr/share/charset.gbag");
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
ox::PathIterator it(path.c_str(), path.len());
|
||||||
auto buff = static_cast<char*>(ox_alloca(path.len() + 1));
|
auto buff = static_cast<char*>(ox_alloca(path.len() + 1));
|
||||||
oxAssert(it.dirPath(buff, path.len()) == 0 && ox::strcmp(buff, "/usr/share/") == 0, "PathIterator shows incorrect dir path");
|
oxAssert(it.dirPath(buff, path.len()) == 0 && ox::strcmp(buff, "/usr/share/") == 0, "PathIterator shows incorrect dir path");
|
||||||
return OxError(0);
|
return OxError(0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"PathIterator::fileName",
|
|
||||||
[](ox::StringView) {
|
|
||||||
auto const path = ox::String("/usr/share/charset.gbag");
|
|
||||||
ox::PathIterator it(path.c_str(), path.len());
|
|
||||||
auto buff = static_cast<char*>(ox_alloca(path.len() + 1));
|
|
||||||
oxAssert(it.fileName(buff, path.len()) == 0 && ox::strcmp(buff, "charset.gbag") == 0, "PathIterator shows incorrect file name");
|
|
||||||
return OxError(0);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"PathIterator::hasNext",
|
"PathIterator::hasNext",
|
||||||
[](ox::StringView) {
|
[](ox::StringView) {
|
||||||
@ -221,7 +213,6 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
oxTrace("ox.fs.test.FileSystem") << "format";
|
oxTrace("ox.fs.test.FileSystem") << "format";
|
||||||
oxAssert(ox::FileSystem32::format(fsBuff.data(), fsBuff.size()), "FileSystem format failed");
|
oxAssert(ox::FileSystem32::format(fsBuff.data(), fsBuff.size()), "FileSystem format failed");
|
||||||
ox::FileSystem32 fs(ox::FileStore32(fsBuff.data(), fsBuff.size()));
|
ox::FileSystem32 fs(ox::FileStore32(fsBuff.data(), fsBuff.size()));
|
||||||
|
|
||||||
oxTrace("ox.fs.test.FileSystem") << "mkdir";
|
oxTrace("ox.fs.test.FileSystem") << "mkdir";
|
||||||
oxAssert(fs.mkdir("/dir", true), "mkdir failed");
|
oxAssert(fs.mkdir("/dir", true), "mkdir failed");
|
||||||
oxAssert(fs.stat("/dir").error, "mkdir failed");
|
oxAssert(fs.stat("/dir").error, "mkdir failed");
|
||||||
@ -229,7 +220,6 @@ const std::map<ox::StringView, std::function<ox::Error(ox::StringView)>> tests =
|
|||||||
oxAssert(fs.stat("/l1d1/l2d1/l3d1").error, "mkdir failed");
|
oxAssert(fs.stat("/l1d1/l2d1/l3d1").error, "mkdir failed");
|
||||||
oxAssert(fs.mkdir("/l1d1/l2d2", true), "mkdir failed");
|
oxAssert(fs.mkdir("/l1d1/l2d2", true), "mkdir failed");
|
||||||
oxAssert(fs.stat("/l1d1/l2d2").error, "mkdir failed");
|
oxAssert(fs.stat("/l1d1/l2d2").error, "mkdir failed");
|
||||||
|
|
||||||
return OxError(0);
|
return OxError(0);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user