[ox/fs] Add new Directory type
This commit is contained in:
		
							
								
								
									
										2
									
								
								deps/ox/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								deps/ox/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							@@ -36,7 +36,7 @@ if(NOT MSVC)
 | 
				
			|||||||
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra")
 | 
						set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra")
 | 
				
			||||||
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-compare")
 | 
						set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wsign-compare")
 | 
				
			||||||
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wunused-variable")
 | 
						set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wunused-variable")
 | 
				
			||||||
 | 
						set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wmissing-field-initializers")
 | 
				
			||||||
	if (CMAKE_BUILD_TYPE STREQUAL "Release")
 | 
						if (CMAKE_BUILD_TYPE STREQUAL "Release")
 | 
				
			||||||
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
 | 
							set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
 | 
				
			||||||
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
 | 
							set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3")
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								deps/ox/src/ox/fs/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								deps/ox/src/ox/fs/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							@@ -6,6 +6,7 @@ add_library(
 | 
				
			|||||||
		filestore/filestoretemplate.cpp
 | 
							filestore/filestoretemplate.cpp
 | 
				
			||||||
		filesystem/filesystem.cpp
 | 
							filesystem/filesystem.cpp
 | 
				
			||||||
		filesystem/pathiterator.cpp
 | 
							filesystem/pathiterator.cpp
 | 
				
			||||||
 | 
							filesystem2/directory.cpp
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set_property(
 | 
					set_property(
 | 
				
			||||||
@@ -38,14 +39,6 @@ install(
 | 
				
			|||||||
		include/ox/fs
 | 
							include/ox/fs
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
install(
 | 
					 | 
				
			||||||
	FILES
 | 
					 | 
				
			||||||
		filestore/nodebuffer.hpp
 | 
					 | 
				
			||||||
		filestore/ptr.hpp
 | 
					 | 
				
			||||||
	DESTINATION
 | 
					 | 
				
			||||||
		include/ox/fs/filestore
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
install(
 | 
					install(
 | 
				
			||||||
	FILES
 | 
						FILES
 | 
				
			||||||
		filesystem/filesystem.hpp
 | 
							filesystem/filesystem.hpp
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -32,7 +32,7 @@ struct __attribute__((packed)) FileStoreItem: public ptrarith::Item<size_t> {
 | 
				
			|||||||
		return sizeof(*this) + this->size();
 | 
							return sizeof(*this) + this->size();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ox::ptrarith::Ptr<uint8_t, size_t> data() {
 | 
						ptrarith::Ptr<uint8_t, size_t> data() {
 | 
				
			||||||
		return ptrarith::Ptr<uint8_t, size_t>(this, this->size(), sizeof(*this), this->size() - sizeof(*this));
 | 
							return ptrarith::Ptr<uint8_t, size_t>(this, this->size(), sizeof(*this), this->size() - sizeof(*this));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
@@ -42,8 +42,8 @@ template<typename size_t>
 | 
				
			|||||||
class FileStoreTemplate: public FileStore {
 | 
					class FileStoreTemplate: public FileStore {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private:
 | 
						private:
 | 
				
			||||||
		using ItemPtr = typename ox::ptrarith::NodeBuffer<size_t, FileStoreItem<size_t>>::ItemPtr;
 | 
							using ItemPtr = typename ptrarith::NodeBuffer<size_t, FileStoreItem<size_t>>::ItemPtr;
 | 
				
			||||||
		using Buffer = ox::ptrarith::NodeBuffer<size_t, FileStoreItem<size_t>>;
 | 
							using Buffer = ptrarith::NodeBuffer<size_t, FileStoreItem<size_t>>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		struct __attribute__((packed)) FileStoreData {
 | 
							struct __attribute__((packed)) FileStoreData {
 | 
				
			||||||
			ox::LittleEndian<size_t> rootNode = 0;
 | 
								ox::LittleEndian<size_t> rootNode = 0;
 | 
				
			||||||
@@ -128,7 +128,7 @@ class FileStoreTemplate: public FileStore {
 | 
				
			|||||||
template<typename size_t>
 | 
					template<typename size_t>
 | 
				
			||||||
FileStoreTemplate<size_t>::FileStoreTemplate(void *buff, size_t buffSize) {
 | 
					FileStoreTemplate<size_t>::FileStoreTemplate(void *buff, size_t buffSize) {
 | 
				
			||||||
	m_buffSize = buffSize;
 | 
						m_buffSize = buffSize;
 | 
				
			||||||
	m_buffer = reinterpret_cast<ox::ptrarith::NodeBuffer<size_t, FileStoreItem<size_t>>*>(buff);
 | 
						m_buffer = reinterpret_cast<ptrarith::NodeBuffer<size_t, FileStoreItem<size_t>>*>(buff);
 | 
				
			||||||
	if (!m_buffer->valid(buffSize)) {
 | 
						if (!m_buffer->valid(buffSize)) {
 | 
				
			||||||
		m_buffSize = 0;
 | 
							m_buffSize = 0;
 | 
				
			||||||
		m_buffer = nullptr;
 | 
							m_buffer = nullptr;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										39
									
								
								deps/ox/src/ox/fs/filesystem/pathiterator.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										39
									
								
								deps/ox/src/ox/fs/filesystem/pathiterator.cpp
									
									
									
									
										vendored
									
									
								
							@@ -12,9 +12,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
namespace ox {
 | 
					namespace ox {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
PathIterator::PathIterator(const char *path, std::size_t maxSize) {
 | 
					PathIterator::PathIterator(const char *path, std::size_t maxSize, std::size_t iterator) {
 | 
				
			||||||
	m_path = path;
 | 
						m_path = path;
 | 
				
			||||||
	m_maxSize = maxSize;
 | 
						m_maxSize = maxSize;
 | 
				
			||||||
 | 
						m_iterator = iterator;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PathIterator::PathIterator(const char *path): PathIterator(path, ox_strlen(path)) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
@@ -85,7 +89,30 @@ int PathIterator::next(char *pathOut, std::size_t pathOutSize) {
 | 
				
			|||||||
	return retval;
 | 
						return retval;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool PathIterator::hasNext() {
 | 
					ValErr<std::size_t> PathIterator::nextSize() const {
 | 
				
			||||||
 | 
						std::size_t size = 0;
 | 
				
			||||||
 | 
						Error retval = 1;
 | 
				
			||||||
 | 
						auto it = m_iterator;
 | 
				
			||||||
 | 
						if (it < m_maxSize && ox_strlen(&m_path[it])) {
 | 
				
			||||||
 | 
							retval = 0;
 | 
				
			||||||
 | 
							if (m_path[it] == '/') {
 | 
				
			||||||
 | 
								it++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							std::size_t start = it;
 | 
				
			||||||
 | 
							// end is at the next /
 | 
				
			||||||
 | 
							const char *substr = ox_strchr(&m_path[start], '/', m_maxSize - start);
 | 
				
			||||||
 | 
							// correct end if it is invalid, which happens if there is no next /
 | 
				
			||||||
 | 
							if (!substr) {
 | 
				
			||||||
 | 
								substr = ox_strchr(&m_path[start], 0, m_maxSize - start);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							std::size_t end = substr - m_path;
 | 
				
			||||||
 | 
							size = end - start;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						it += size;
 | 
				
			||||||
 | 
						return {size, retval};
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool PathIterator::hasNext() const {
 | 
				
			||||||
	std::size_t size = 0;
 | 
						std::size_t size = 0;
 | 
				
			||||||
	if (m_iterator < m_maxSize && ox_strlen(&m_path[m_iterator])) {
 | 
						if (m_iterator < m_maxSize && ox_strlen(&m_path[m_iterator])) {
 | 
				
			||||||
		std::size_t start = m_iterator;
 | 
							std::size_t start = m_iterator;
 | 
				
			||||||
@@ -104,4 +131,12 @@ bool PathIterator::hasNext() {
 | 
				
			|||||||
	return size > 0;
 | 
						return size > 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PathIterator PathIterator::operator+(int i) {
 | 
				
			||||||
 | 
						return PathIterator(m_path, m_maxSize, m_iterator + i);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PathIterator PathIterator::operator-(int i) {
 | 
				
			||||||
 | 
						return PathIterator(m_path, m_maxSize, m_iterator - i);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										17
									
								
								deps/ox/src/ox/fs/filesystem/pathiterator.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								deps/ox/src/ox/fs/filesystem/pathiterator.hpp
									
									
									
									
										vendored
									
									
								
							@@ -8,6 +8,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <ox/std/strops.hpp>
 | 
				
			||||||
#include <ox/std/types.hpp>
 | 
					#include <ox/std/types.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace ox {
 | 
					namespace ox {
 | 
				
			||||||
@@ -19,7 +20,9 @@ class PathIterator {
 | 
				
			|||||||
		std::size_t m_maxSize = 0;
 | 
							std::size_t m_maxSize = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	public:
 | 
						public:
 | 
				
			||||||
		PathIterator(const char *path, std::size_t maxSize);
 | 
							PathIterator(const char *path, std::size_t maxSize, std::size_t iterator = 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							PathIterator(const char *path);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/**
 | 
							/**
 | 
				
			||||||
		 * @return 0 if no error
 | 
							 * @return 0 if no error
 | 
				
			||||||
@@ -36,7 +39,17 @@ class PathIterator {
 | 
				
			|||||||
		 */
 | 
							 */
 | 
				
			||||||
		int next(char *pathOut, std::size_t pathOutSize);
 | 
							int next(char *pathOut, std::size_t pathOutSize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		bool hasNext();
 | 
							/**
 | 
				
			||||||
 | 
							 * @return 0 if no error
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							ValErr<std::size_t> nextSize() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bool hasNext() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							PathIterator operator+(int i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							PathIterator operator-(int i);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								deps/ox/src/ox/fs/filesystem2/directory.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								deps/ox/src/ox/fs/filesystem2/directory.cpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2015 - 2018 gtalent2@gmail.com
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This Source Code Form is subject to the terms of the Mozilla Public
 | 
				
			||||||
 | 
					 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
				
			||||||
 | 
					 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "directory.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace ox::fs {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template class Directory<uint16_t>;
 | 
				
			||||||
 | 
					template class Directory<uint32_t>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template struct DirectoryEntry<uint16_t>;
 | 
				
			||||||
 | 
					template struct DirectoryEntry<uint32_t>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										112
									
								
								deps/ox/src/ox/fs/filesystem2/directory.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										112
									
								
								deps/ox/src/ox/fs/filesystem2/directory.hpp
									
									
									
									
										vendored
									
									
								
							@@ -6,20 +6,126 @@
 | 
				
			|||||||
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
					 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <ox/fs/filesystem/pathiterator.hpp>
 | 
					#include <ox/fs/filesystem/pathiterator.hpp>
 | 
				
			||||||
#include <ox/fs/filestore.hpp>
 | 
					#include <ox/fs/filestore.hpp>
 | 
				
			||||||
 | 
					#include <ox/ptrarith/nodebuffer.hpp>
 | 
				
			||||||
 | 
					#include <ox/std/std.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace ox::fs {
 | 
					namespace ox::fs {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct DirectoryData {
 | 
					template<typename InodeId_t>
 | 
				
			||||||
 | 
					struct __attribute__((packed)) DirectoryEntry {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// NodeBuffer fields
 | 
				
			||||||
 | 
						ox::LittleEndian<std::size_t> prev = 0;
 | 
				
			||||||
 | 
						ox::LittleEndian<std::size_t> next = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// DirectoryEntry fields
 | 
				
			||||||
 | 
						ox::LittleEndian<InodeId_t> inode = 0;
 | 
				
			||||||
 | 
						BString<255> name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						explicit DirectoryEntry(const char *name) {
 | 
				
			||||||
 | 
							this->name = name;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * @return the size of the data + the size of the Item type
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						InodeId_t fullSize() const {
 | 
				
			||||||
 | 
							return offsetof(DirectoryEntry, name) + name.size();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						InodeId_t size() const {
 | 
				
			||||||
 | 
							return fullSize() - offsetof(DirectoryEntry, inode);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ptrarith::Ptr<uint8_t, InodeId_t> data() {
 | 
				
			||||||
 | 
							return ptrarith::Ptr<uint8_t, InodeId_t>(this, this->size(), sizeof(*this), this->size() - sizeof(*this));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename InodeId_t>
 | 
				
			||||||
class Directory {
 | 
					class Directory {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Error add(const PathIterator &it, uint64_t inode);
 | 
						private:
 | 
				
			||||||
 | 
							using Buffer = ptrarith::NodeBuffer<InodeId_t, DirectoryEntry<InodeId_t>>;
 | 
				
			||||||
 | 
							std::size_t m_size = 0;
 | 
				
			||||||
 | 
							Buffer *m_buff = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Error rm(PathIterator &it);
 | 
						public:
 | 
				
			||||||
 | 
							Directory(uint8_t *buff, std::size_t size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/**
 | 
				
			||||||
 | 
							 * Initializes Directory.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							Error init() noexcept;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Error write(PathIterator it, InodeId_t inode) noexcept;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Error rm(PathIterator it) noexcept;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ValErr<InodeId_t> find(PathIterator it) const noexcept;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename InodeId_t>
 | 
				
			||||||
 | 
					Directory<InodeId_t>::Directory(uint8_t *buff, std::size_t size) {
 | 
				
			||||||
 | 
						m_size = size;
 | 
				
			||||||
 | 
						m_buff = reinterpret_cast<decltype(m_buff)>(buff);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename InodeId_t>
 | 
				
			||||||
 | 
					Error Directory<InodeId_t>::init() noexcept {
 | 
				
			||||||
 | 
						if (m_size >= sizeof(Buffer)) {
 | 
				
			||||||
 | 
							new (m_buff) Buffer(m_size);
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename InodeId_t>
 | 
				
			||||||
 | 
					Error Directory<InodeId_t>::write(PathIterator it, InodeId_t inode) noexcept {
 | 
				
			||||||
 | 
						if (it.hasNext()) {
 | 
				
			||||||
 | 
							return write(it + 1, inode);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							auto current = find(it);
 | 
				
			||||||
 | 
							if (current.ok()) {
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename InodeId_t>
 | 
				
			||||||
 | 
					Error Directory<InodeId_t>::rm(PathIterator) noexcept {
 | 
				
			||||||
 | 
						return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename InodeId_t>
 | 
				
			||||||
 | 
					ValErr<InodeId_t> Directory<InodeId_t>::find(PathIterator it) const noexcept {
 | 
				
			||||||
 | 
						auto size = it.nextSize();
 | 
				
			||||||
 | 
						char name[size + 1];
 | 
				
			||||||
 | 
						it.next(name, size);
 | 
				
			||||||
 | 
						for (auto i = m_buff->iterator(); i.hasNext(); i.next()) {
 | 
				
			||||||
 | 
							if (i->name == name) {
 | 
				
			||||||
 | 
								return static_cast<InodeId_t>(i->inode);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return {0, 1};
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern template class Directory<uint16_t>;
 | 
				
			||||||
 | 
					extern template class Directory<uint32_t>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern template struct DirectoryEntry<uint16_t>;
 | 
				
			||||||
 | 
					extern template struct DirectoryEntry<uint32_t>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using Directory16 = Directory<uint16_t>;
 | 
				
			||||||
 | 
					using Directory32 = Directory<uint32_t>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										2
									
								
								deps/ox/src/ox/fs/test/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								deps/ox/src/ox/fs/test/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							@@ -74,3 +74,5 @@ add_test("Test\\ FileSystem32::stripDirectories" FSTests "FileSystem32::stripDir
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
add_test("Test\\ NodeBuffer::insert" FSTests "NodeBuffer::insert")
 | 
					add_test("Test\\ NodeBuffer::insert" FSTests "NodeBuffer::insert")
 | 
				
			||||||
add_test("Test\\ FileStore::readWrite" FSTests "FileStore::readWrite")
 | 
					add_test("Test\\ FileStore::readWrite" FSTests "FileStore::readWrite")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_test("Test\\ Directory" FSTests "Directory")
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										14
									
								
								deps/ox/src/ox/fs/test/tests.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								deps/ox/src/ox/fs/test/tests.cpp
									
									
									
									
										vendored
									
									
								
							@@ -11,6 +11,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include <iostream>
 | 
					#include <iostream>
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
 | 
					#include <array>
 | 
				
			||||||
#include <map>
 | 
					#include <map>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
#include <string>
 | 
					#include <string>
 | 
				
			||||||
@@ -382,6 +383,19 @@ map<string, int(*)(string)> tests = {
 | 
				
			|||||||
				return 0;
 | 
									return 0;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"Directory",
 | 
				
			||||||
 | 
								[](string) {
 | 
				
			||||||
 | 
									std::array<uint8_t, 1000> buff;
 | 
				
			||||||
 | 
									ox::fs::Directory32 dir(buff.data(), buff.size());
 | 
				
			||||||
 | 
									dir.init();
 | 
				
			||||||
 | 
									dir.write("/file1", 1);
 | 
				
			||||||
 | 
									//oxAssert(dir.find("/file1") == 1, "Could not find /file1");
 | 
				
			||||||
 | 
									dir.write("/file3", 3);
 | 
				
			||||||
 | 
									dir.write("/file2", 2);
 | 
				
			||||||
 | 
									return 0;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										66
									
								
								deps/ox/src/ox/ptrarith/nodebuffer.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										66
									
								
								deps/ox/src/ox/ptrarith/nodebuffer.hpp
									
									
									
									
										vendored
									
									
								
							@@ -24,7 +24,51 @@ class __attribute__((packed)) NodeBuffer {
 | 
				
			|||||||
			ox::LittleEndian<size_t> firstItem = 0;
 | 
								ox::LittleEndian<size_t> firstItem = 0;
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		using ItemPtr = ox::ptrarith::Ptr<Item, size_t, sizeof(Header)>;
 | 
							using ItemPtr = Ptr<Item, size_t, sizeof(Header)>;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							class Iterator {
 | 
				
			||||||
 | 
								private:
 | 
				
			||||||
 | 
									NodeBuffer *m_buffer = nullptr;
 | 
				
			||||||
 | 
									ItemPtr m_current;
 | 
				
			||||||
 | 
									size_t m_it = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								public:
 | 
				
			||||||
 | 
									Iterator(NodeBuffer *buffer, ItemPtr current) {
 | 
				
			||||||
 | 
										m_buffer = buffer;
 | 
				
			||||||
 | 
										m_current = current;
 | 
				
			||||||
 | 
										oxTrace("ox::ptrarith::Iterator::start") << current.offset();
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									operator const Item*() const {
 | 
				
			||||||
 | 
										return m_current;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									operator Item*() {
 | 
				
			||||||
 | 
										return m_current;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									const Item *operator->() const {
 | 
				
			||||||
 | 
										return m_current;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									Item *operator->() {
 | 
				
			||||||
 | 
										return m_current;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									bool hasNext() {
 | 
				
			||||||
 | 
										if (m_current.valid()) {
 | 
				
			||||||
 | 
											oxTrace("ox::ptrarith::NodeBuffer::Iterator::hasNext::current") << m_current.offset();
 | 
				
			||||||
 | 
											auto next = m_buffer->next(m_current);
 | 
				
			||||||
 | 
											return next.valid() && m_buffer->firstItem() != next;
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										return false;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									void next() {
 | 
				
			||||||
 | 
										oxTrace("ox::ptrarith::NodeBuffer::Iterator::next") << m_it++;
 | 
				
			||||||
 | 
										m_current = m_buffer->next(m_current);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
							};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Header m_header;
 | 
							Header m_header;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -33,6 +77,10 @@ class __attribute__((packed)) NodeBuffer {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		explicit NodeBuffer(size_t size);
 | 
							explicit NodeBuffer(size_t size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							const Iterator iterator() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Iterator iterator();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ItemPtr firstItem();
 | 
							ItemPtr firstItem();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ItemPtr lastItem();
 | 
							ItemPtr lastItem();
 | 
				
			||||||
@@ -84,8 +132,20 @@ NodeBuffer<size_t, Item>::NodeBuffer(size_t size) {
 | 
				
			|||||||
	m_header.size = size;
 | 
						m_header.size = size;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename size_t, typename Item>
 | 
				
			||||||
 | 
					const typename NodeBuffer<size_t, Item>::Iterator NodeBuffer<size_t, Item>::iterator() const {
 | 
				
			||||||
 | 
						return Iterator(this, firstItem());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename size_t, typename Item>
 | 
				
			||||||
 | 
					typename NodeBuffer<size_t, Item>::Iterator NodeBuffer<size_t, Item>::iterator() {
 | 
				
			||||||
 | 
						oxTrace("ox::ptrarith::NodeBuffer::iterator::size") << m_header.size;
 | 
				
			||||||
 | 
						return Iterator(this, firstItem());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename size_t, typename Item>
 | 
					template<typename size_t, typename Item>
 | 
				
			||||||
typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::firstItem() {
 | 
					typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::firstItem() {
 | 
				
			||||||
 | 
						oxTrace("ox::ptrarith::NodeBuffer::firstItem") << m_header.firstItem;
 | 
				
			||||||
	return ptr(m_header.firstItem);
 | 
						return ptr(m_header.firstItem);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -121,12 +181,14 @@ typename NodeBuffer<size_t, Item>::ItemPtr NodeBuffer<size_t, Item>::ptr(size_t
 | 
				
			|||||||
	// make sure this can be read as an Item, and then use Item::size for the size
 | 
						// make sure this can be read as an Item, and then use Item::size for the size
 | 
				
			||||||
	auto itemSpace = m_header.size - itemOffset;
 | 
						auto itemSpace = m_header.size - itemOffset;
 | 
				
			||||||
	auto item = reinterpret_cast<Item*>(reinterpret_cast<uint8_t*>(this) + itemOffset);
 | 
						auto item = reinterpret_cast<Item*>(reinterpret_cast<uint8_t*>(this) + itemOffset);
 | 
				
			||||||
 | 
						oxTrace("ox::ptrarith::NodeBuffer::ptr::itemOffset") << itemOffset << m_header.size - sizeof(Item);
 | 
				
			||||||
	if (itemOffset >= sizeof(Header) and
 | 
						if (itemOffset >= sizeof(Header) and
 | 
				
			||||||
		 itemOffset < m_header.size - sizeof(Item) and
 | 
							 itemOffset < m_header.size - sizeof(Item) and
 | 
				
			||||||
		 itemSpace >= static_cast<size_t>(sizeof(Item)) and
 | 
							 itemSpace >= static_cast<size_t>(sizeof(Item)) and
 | 
				
			||||||
		 itemSpace >= item->fullSize()) {
 | 
							 itemSpace >= item->fullSize()) {
 | 
				
			||||||
		return ItemPtr(this, m_header.size, itemOffset, item->fullSize());
 | 
							return ItemPtr(this, m_header.size, itemOffset, item->fullSize());
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
 | 
							oxTrace("ox::ptrarith::NodeBuffer::ptr::null") << itemOffset;
 | 
				
			||||||
		return ItemPtr(this, m_header.size, 0, 0);
 | 
							return ItemPtr(this, m_header.size, 0, 0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -271,7 +333,7 @@ struct __attribute__((packed)) Item {
 | 
				
			|||||||
			this->m_size = size;
 | 
								this->m_size = size;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		size_t size() const {
 | 
							virtual size_t size() const {
 | 
				
			||||||
			return m_size;
 | 
								return m_size;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										18
									
								
								deps/ox/src/ox/ptrarith/ptr.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								deps/ox/src/ox/ptrarith/ptr.hpp
									
									
									
									
										vendored
									
									
								
							@@ -56,6 +56,10 @@ class Ptr {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
		inline operator size_t() const;
 | 
							inline operator size_t() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline bool operator==(const Ptr<T, size_t, minOffset> &other) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							inline bool operator!=(const Ptr<T, size_t, minOffset> &other) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		template<typename SubT>
 | 
							template<typename SubT>
 | 
				
			||||||
		inline const Ptr<SubT, size_t, sizeof(T)> subPtr(size_t offset, size_t size) const;
 | 
							inline const Ptr<SubT, size_t, sizeof(T)> subPtr(size_t offset, size_t size) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -168,6 +172,20 @@ inline Ptr<T, size_t, minOffset>::operator size_t() const {
 | 
				
			|||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T, typename size_t, size_t minOffset>
 | 
				
			||||||
 | 
					inline bool Ptr<T, size_t, minOffset>::operator==(const Ptr<T, size_t, minOffset> &other) const {
 | 
				
			||||||
 | 
						return m_dataStart == other.m_dataStart &&
 | 
				
			||||||
 | 
						       m_itemOffset == other.m_itemOffset &&
 | 
				
			||||||
 | 
						       m_itemSize == other.m_itemSize;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					template<typename T, typename size_t, size_t minOffset>
 | 
				
			||||||
 | 
					inline bool Ptr<T, size_t, minOffset>::operator!=(const Ptr<T, size_t, minOffset> &other) const {
 | 
				
			||||||
 | 
						return m_dataStart != other.m_dataStart ||
 | 
				
			||||||
 | 
						       m_itemOffset != other.m_itemOffset ||
 | 
				
			||||||
 | 
						       m_itemSize != other.m_itemSize;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename T, typename size_t, size_t minOffset>
 | 
					template<typename T, typename size_t, size_t minOffset>
 | 
				
			||||||
template<typename SubT>
 | 
					template<typename SubT>
 | 
				
			||||||
inline const Ptr<SubT, size_t, sizeof(T)> Ptr<T, size_t, minOffset>::subPtr(size_t offset, size_t size) const {
 | 
					inline const Ptr<SubT, size_t, sizeof(T)> Ptr<T, size_t, minOffset>::subPtr(size_t offset, size_t size) const {
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								deps/ox/src/ox/std/std.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								deps/ox/src/ox/std/std.hpp
									
									
									
									
										vendored
									
									
								
							@@ -15,6 +15,7 @@
 | 
				
			|||||||
#include "memops.hpp"
 | 
					#include "memops.hpp"
 | 
				
			||||||
#include "new.hpp"
 | 
					#include "new.hpp"
 | 
				
			||||||
#include "random.hpp"
 | 
					#include "random.hpp"
 | 
				
			||||||
 | 
					#include "stddef.hpp"
 | 
				
			||||||
#include "strops.hpp"
 | 
					#include "strops.hpp"
 | 
				
			||||||
#include "string.hpp"
 | 
					#include "string.hpp"
 | 
				
			||||||
#include "types.hpp"
 | 
					#include "types.hpp"
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								deps/ox/src/ox/std/stddef.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								deps/ox/src/ox/std/stddef.hpp
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2015 - 2018 gtalent2@gmail.com
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This Source Code Form is subject to the terms of the Mozilla Public
 | 
				
			||||||
 | 
					 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
				
			||||||
 | 
					 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(offsetof)
 | 
				
			||||||
 | 
					#define offsetof(type, member) __builtin_offsetof(type, member)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										6
									
								
								deps/ox/src/ox/std/types.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								deps/ox/src/ox/std/types.hpp
									
									
									
									
										vendored
									
									
								
							@@ -66,11 +66,15 @@ struct ValErr {
 | 
				
			|||||||
		this->error = error;
 | 
							this->error = error;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						inline constexpr operator const T&() const {
 | 
				
			||||||
 | 
							return value;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline constexpr operator T&() {
 | 
						inline constexpr operator T&() {
 | 
				
			||||||
		return value;
 | 
							return value;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inline constexpr bool ok() {
 | 
						inline constexpr bool ok() const {
 | 
				
			||||||
		return error == 0;
 | 
							return error == 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								deps/ox/src/ox/trace/trace.hpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								deps/ox/src/ox/trace/trace.hpp
									
									
									
									
										vendored
									
									
								
							@@ -13,10 +13,10 @@
 | 
				
			|||||||
namespace ox::trace {
 | 
					namespace ox::trace {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct TraceMsg {
 | 
					struct TraceMsg {
 | 
				
			||||||
	ox::BString<150> file = "";
 | 
						ox::BString<255> file = "";
 | 
				
			||||||
	int line = 0;
 | 
						int line = 0;
 | 
				
			||||||
	uint64_t time = 0;
 | 
						uint64_t time = 0;
 | 
				
			||||||
	ox::BString<50> ch = "";
 | 
						ox::BString<75> ch = "";
 | 
				
			||||||
	ox::BString<100> msg;
 | 
						ox::BString<100> msg;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -93,4 +93,4 @@ class NullStream {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define oxTrace(ch) ox::trace::NullStream(__FILE__, __LINE__, ch)
 | 
					#define oxTrace(ch) ox::trace::StdOutStream(__FILE__, __LINE__, ch)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user