- Removed fennec::path, see #Security Ramblings in PLANNING.md
This commit is contained in:
@@ -1,113 +0,0 @@
|
||||
// =====================================================================================================================
|
||||
// fennec, a free and open source game engine
|
||||
// Copyright © 2025 Medusa Slockbower
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
// =====================================================================================================================
|
||||
|
||||
#ifndef FENNEC_FPROC_FILESYSTEM_PATH_H
|
||||
#define FENNEC_FPROC_FILESYSTEM_PATH_H
|
||||
#include <fennec/fproc/strings/string.h>
|
||||
|
||||
namespace fennec
|
||||
{
|
||||
|
||||
struct path
|
||||
{
|
||||
public:
|
||||
using string_t = fennec::string;
|
||||
|
||||
///
|
||||
/// \brief Helper function for getting the file separator for the current system
|
||||
/// \returns A character containing the file separator
|
||||
static constexpr char preferred_separator() {
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
return '\\';
|
||||
#else
|
||||
return '/';
|
||||
#endif
|
||||
}
|
||||
|
||||
///
|
||||
/// \brief Default Constructor, initializes empty path
|
||||
constexpr path()
|
||||
: _str(), _file(0), _parent(0) {
|
||||
}
|
||||
|
||||
///
|
||||
/// \brief
|
||||
/// \param str
|
||||
constexpr path(const cstring& str)
|
||||
: _str(str) {
|
||||
_find_paths();
|
||||
}
|
||||
|
||||
constexpr path(const string& str)
|
||||
: _str(str) {
|
||||
_find_paths();
|
||||
}
|
||||
|
||||
constexpr path(string&& str)
|
||||
: _str(fennec::forward<string_t>(str)) {
|
||||
_find_paths();
|
||||
}
|
||||
|
||||
constexpr path(const path& path)
|
||||
: _str(path._str) {
|
||||
_find_paths();
|
||||
}
|
||||
|
||||
constexpr path(path&& path) noexcept
|
||||
: _str(fennec::move(path._str)) {
|
||||
_find_paths();
|
||||
}
|
||||
|
||||
constexpr const string_t& string() const {
|
||||
return _str;
|
||||
}
|
||||
|
||||
constexpr path parent() const {
|
||||
return _str.substring(0, _file);
|
||||
}
|
||||
|
||||
|
||||
constexpr path operator/(const cstring& file) const {
|
||||
path res = _str + file;
|
||||
return res;
|
||||
}
|
||||
|
||||
constexpr path operator/(const string_t& file) const {
|
||||
path res = _str + file;
|
||||
return res;
|
||||
}
|
||||
|
||||
constexpr path operator/(const path& file) const {
|
||||
path res = _str + file._str;
|
||||
return res;
|
||||
}
|
||||
|
||||
private:
|
||||
constexpr void _find_paths() {
|
||||
_file = _str.rfind(preferred_separator());
|
||||
_parent = _str.rfind(preferred_separator(), _file - 1);
|
||||
}
|
||||
|
||||
string_t _str;
|
||||
size_t _file
|
||||
, _parent;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FENNEC_FPROC_FILESYSTEM_PATH_H
|
||||
@@ -21,28 +21,45 @@
|
||||
|
||||
#include <fennec/fproc/strings/cstring.h>
|
||||
#include <fennec/fproc/strings/string.h>
|
||||
#include <fennec/fproc/filesystem/path.h>
|
||||
|
||||
struct FILE;
|
||||
|
||||
namespace fennec
|
||||
{
|
||||
|
||||
///
|
||||
/// \brief Mode flags for opening a file
|
||||
enum fmode : uint8_t
|
||||
{
|
||||
read = 0b00000001
|
||||
, write = 0b00000010
|
||||
, append = 0b00000100
|
||||
, no_overwrite = 0b00001000
|
||||
};
|
||||
|
||||
class file
|
||||
{
|
||||
public:
|
||||
file();
|
||||
~file();
|
||||
|
||||
file(const cstring& filename, const cstring& mode);
|
||||
file(const string& filename, const cstring& mode);
|
||||
///
|
||||
/// \brief Opens a file at the provided path using the provided mode
|
||||
/// \param path the path to the provided file
|
||||
/// \param mode the flags for opening the file
|
||||
file(const cstring& path, fmode mode);
|
||||
file(const string& path, fmode mode);
|
||||
file(const path& path, fmode mode);
|
||||
|
||||
file(const file&) = delete;
|
||||
|
||||
|
||||
// File Access =========================================================================================================
|
||||
|
||||
void open(const cstring& filename, const cstring& mode);
|
||||
void open(const string& filename, const cstring& mode);
|
||||
void open(const cstring& filename, fmode mode);
|
||||
void open(const string& filename, fmode mode);
|
||||
void open(const path& filename, fmode mode);
|
||||
void close();
|
||||
void commit();
|
||||
|
||||
|
||||
@@ -54,6 +54,7 @@ using ::toupper;
|
||||
struct cstring
|
||||
{
|
||||
public:
|
||||
static constexpr size_t npos = -1;
|
||||
|
||||
// Constructors ========================================================================================================
|
||||
|
||||
@@ -196,21 +197,31 @@ public:
|
||||
|
||||
///
|
||||
/// \returns The length of the string to the first null-terminator
|
||||
constexpr size_t length() const
|
||||
{ return find('\0'); }
|
||||
constexpr size_t length() const {
|
||||
return find('\0');
|
||||
}
|
||||
|
||||
///
|
||||
/// \brief String Comparison
|
||||
/// \param ostr the string to compare against
|
||||
/// \param str the string to compare against
|
||||
/// \returns Zero if both strings are equal, otherwise a negative value if lhs appears before rhs according to the
|
||||
/// current locale, otherwise a positive value.
|
||||
constexpr int compare(const cstring& str, size_t i = 0) const {
|
||||
if (i >= _size) return -1;
|
||||
return ::strcoll(_cstr + i, str);
|
||||
constexpr int compare(const cstring& str, size_t i = 0, size_t n = npos) const {
|
||||
if (i >= _size) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
n = min(n, max(_size, str._size) + 1);
|
||||
return ::strncmp(_cstr + i, str, n);
|
||||
}
|
||||
|
||||
constexpr bool operator==(const cstring& str) const
|
||||
{ return compare(str) == 0; }
|
||||
///
|
||||
/// \brief String Equality
|
||||
/// \param str the string to compare against
|
||||
/// \returns True if all characters are equal, false otherwise
|
||||
constexpr bool operator==(const cstring& str) const {
|
||||
return compare(str) == 0;
|
||||
}
|
||||
|
||||
///
|
||||
/// \brief Finds the index of the first occurrence of `c` in the string
|
||||
@@ -218,7 +229,10 @@ public:
|
||||
/// \param i the index to start at
|
||||
/// \returns The index of `c` if it occurs in the string, otherwise returns `size()`
|
||||
constexpr size_t find(char c, size_t i = 0) const {
|
||||
if (i >= _size) return _size; // bounds check
|
||||
if (i >= _size) { // bounds check
|
||||
return _size;
|
||||
}
|
||||
|
||||
const char* loc = ::strchr(_cstr + i, c); // get location using strchr
|
||||
return loc ? loc - _cstr : _size; // return size if not found
|
||||
}
|
||||
@@ -229,7 +243,10 @@ public:
|
||||
/// \param i the index to start at
|
||||
/// \returns The index of `str` if it occurs in the string, otherwise returns `size()`
|
||||
constexpr size_t find(const cstring& str, size_t i = 0) const {
|
||||
if (i + str._size > _size) return _size; // bounds check
|
||||
if (i + str._size > _size) { // bounds check
|
||||
return _size;
|
||||
}
|
||||
|
||||
const char* loc = ::strstr(_cstr + i, str); // get location using strstr
|
||||
return loc ? loc - _cstr : _size; // return size if not found
|
||||
}
|
||||
@@ -239,8 +256,11 @@ public:
|
||||
/// \param c the string to find
|
||||
/// \param i the index to start at
|
||||
/// \returns The index of `c` if it occurs in the string, otherwise returns `size()`
|
||||
constexpr size_t rfind(char c, size_t i = 0) const {
|
||||
if (_size == 0) return _size;
|
||||
constexpr size_t rfind(char c, size_t i = npos) const {
|
||||
if (_size == 0) {
|
||||
return _size;
|
||||
}
|
||||
|
||||
i = min(i, _size - 1); // clamp i to bounds
|
||||
do {
|
||||
if (_cstr[i] == c) return i; // loop backwards looking for c
|
||||
@@ -253,12 +273,19 @@ public:
|
||||
/// \param str the string to find
|
||||
/// \param i the index to start at
|
||||
/// \returns The index of `str` if it occurs in the string, otherwise returns `size()`
|
||||
constexpr size_t rfind(const cstring& str, size_t i = 0) const {
|
||||
constexpr size_t rfind(const cstring& str, size_t i = npos) const {
|
||||
if (_size == 0) {
|
||||
return _size;
|
||||
}
|
||||
|
||||
const char first = str[0];
|
||||
i = min(i, _size - str._size);
|
||||
do {
|
||||
if(_cstr[i] == first)
|
||||
if (compare(str, i) == 0) return i; // loop backwards looking for str
|
||||
if(_cstr[i] == first) {
|
||||
if (compare(str, i, str._size - 1) == 0) {
|
||||
return i;
|
||||
}
|
||||
} // loop backwards looking for str
|
||||
} while (i--);
|
||||
return _size; // base case
|
||||
}
|
||||
|
||||
@@ -19,13 +19,16 @@
|
||||
#ifndef FENNEC_FPROC_STRINGS_STRING_H
|
||||
#define FENNEC_FPROC_STRINGS_STRING_H
|
||||
|
||||
#include <fennec/fproc/strings/cstring.h>
|
||||
#include <fennec/fproc/strings/detail/__ctype.h>
|
||||
#include <fennec/fproc/strings/cstring.h>
|
||||
|
||||
#include <fennec/lang/assert.h>
|
||||
|
||||
#include <fennec/memory/allocator.h>
|
||||
#include <fennec/memory/common.h>
|
||||
|
||||
#include <fennec/math/common.h>
|
||||
|
||||
namespace fennec
|
||||
{
|
||||
|
||||
@@ -43,6 +46,7 @@ template<typename AllocT = allocator<char>>
|
||||
struct _string
|
||||
{
|
||||
public:
|
||||
static constexpr size_t npos = -1;
|
||||
using alloc_t = allocation<char, AllocT>;
|
||||
|
||||
|
||||
@@ -139,7 +143,8 @@ public:
|
||||
///
|
||||
/// \brief Implicit Dereference Cast
|
||||
constexpr operator const char*() const {
|
||||
return _str; }
|
||||
return _str;
|
||||
}
|
||||
|
||||
|
||||
// Examination =========================================================================================================
|
||||
@@ -155,24 +160,37 @@ public:
|
||||
/// \param ostr the string to compare against
|
||||
/// \returns Zero if both strings are equal, otherwise a negative value if lhs appears before rhs according to the
|
||||
/// current locale, otherwise a positive value.
|
||||
constexpr int compare(const string& ostr) const {
|
||||
return ::strcoll(_str, ostr);
|
||||
constexpr int compare(const cstring& str, size_t i = 0, size_t n = npos) const {
|
||||
if (i >= size()) { // bounds check
|
||||
return -1;
|
||||
}
|
||||
n = min(n, max(_str, str.size()) + 1);
|
||||
|
||||
return ::strncmp(_str + i, str, n);
|
||||
}
|
||||
|
||||
///
|
||||
/// \brief Finds the index of the first occurrence of `x` in the string
|
||||
/// \param x the character to find
|
||||
/// \returns The index of `x` if it occurs in the string, otherwise returns `size()`
|
||||
constexpr size_t find(char x) const {
|
||||
const char* loc = ::strchr(_str, x);
|
||||
return loc ? loc - _str : size();
|
||||
constexpr size_t find(char c, size_t i = 0) const {
|
||||
if (i >= size()) { // bounds check
|
||||
return size();
|
||||
}
|
||||
|
||||
const char* loc = ::strchr(_str + i, c); // get location using strchr
|
||||
return loc ? loc - _str : size(); // return size if not found
|
||||
}
|
||||
|
||||
///
|
||||
/// \brief Finds the index of the first occurrence of `str` in the string.
|
||||
/// \param str the string to find
|
||||
/// \returns The index of `str` if it occurs in the string, otherwise returns `size()`
|
||||
constexpr size_t find(const string& str) const {
|
||||
constexpr size_t find(const string& str, size_t i = 0) const { // bounds check
|
||||
if (i >= size()) { // bounds check
|
||||
return size();
|
||||
}
|
||||
|
||||
const char* loc = ::strstr(_str, str);
|
||||
return loc ? loc - _str : size();
|
||||
}
|
||||
@@ -181,9 +199,13 @@ public:
|
||||
/// \brief Finds the index of the first occurrence of `str` in the string.
|
||||
/// \param str the string to find
|
||||
/// \returns The index of `str` if it occurs in the string, otherwise returns `size()`
|
||||
constexpr size_t find(const cstring& str) const {
|
||||
const char* loc = ::strstr(_str, str);
|
||||
return loc ? loc - _str : size();
|
||||
constexpr size_t find(const cstring& str, size_t i = 0) const {
|
||||
if (i + str.size() > size()) { // bounds check
|
||||
return size();
|
||||
}
|
||||
|
||||
const char* loc = ::strstr(_str + i, str); // get location using strstr
|
||||
return loc ? loc - _str : size(); // return size if not found
|
||||
}
|
||||
|
||||
///
|
||||
@@ -191,11 +213,15 @@ public:
|
||||
/// \param c the string to find
|
||||
/// \param i the index to start at
|
||||
/// \returns The index of `c` if it occurs in the string, otherwise returns `size()`
|
||||
constexpr size_t rfind(char c, size_t i = size()) const {
|
||||
if (size() == 0) return size();
|
||||
constexpr size_t rfind(char c, size_t i = npos) const {
|
||||
if (size() == 0) {
|
||||
return size();
|
||||
}
|
||||
i = min(i, size() - 1); // clamp i to bounds
|
||||
do {
|
||||
if (_str[i] == c) return i; // loop backwards looking for c
|
||||
if (_str[i] == c) { // loop backwards looking for c
|
||||
return i;
|
||||
}
|
||||
} while (i--);
|
||||
return size(); // base case
|
||||
}
|
||||
@@ -205,12 +231,18 @@ public:
|
||||
/// \param str the string to find
|
||||
/// \param i the index to start at
|
||||
/// \returns The index of `str` if it occurs in the string, otherwise returns `size()`
|
||||
constexpr size_t rfind(const cstring& str, size_t i = size()) const {
|
||||
constexpr size_t rfind(const cstring& str, size_t i = npos) const {
|
||||
if (size() == 0) {
|
||||
return size();
|
||||
}
|
||||
const char first = str[0];
|
||||
i = min(i, size() - str.size());
|
||||
do {
|
||||
if(_str[i] == first)
|
||||
if (compare(str, i) == 0) return i; // loop backwards looking for str
|
||||
if(_str[i] == first) {
|
||||
if (compare(str, i) == 0) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
} while (i--);
|
||||
return size(); // base case
|
||||
}
|
||||
@@ -220,12 +252,18 @@ public:
|
||||
/// \param str the string to find
|
||||
/// \param i the index to start at
|
||||
/// \returns The index of `str` if it occurs in the string, otherwise returns `size()`
|
||||
constexpr size_t rfind(const string& str, size_t i = size()) const {
|
||||
constexpr size_t rfind(const string& str, size_t i = npos) const {
|
||||
if (size() == 0) {
|
||||
return size();
|
||||
}
|
||||
const char first = str[0];
|
||||
i = min(i, size() - str.size());
|
||||
do {
|
||||
if(_str[i] == first)
|
||||
if (compare(str, i) == 0) return i; // loop backwards looking for str
|
||||
if(_str[i] == first) {
|
||||
if (compare(str, i) == 0) { // loop backwards looking for str
|
||||
return i;
|
||||
}
|
||||
}
|
||||
} while (i--);
|
||||
return size(); // base case
|
||||
}
|
||||
@@ -313,7 +351,7 @@ public:
|
||||
|
||||
constexpr string& operator+=(const string& str) {
|
||||
size_t x = size();
|
||||
string::resize(x + str.size());
|
||||
resize(x + str.size());
|
||||
fennec::memcpy(&_str[x], str, str.size());
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -324,8 +324,7 @@ struct vector : detail::vector_base_type<ScalarT, sizeof...(IndicesV)>
|
||||
/// \tparam SwizzleIndicesV swizzle Indices
|
||||
/// \param swizzle swizzle object
|
||||
template<typename SwizzleDataT, typename SwizzleScalarT, size_t... SwizzleIndicesV>
|
||||
explicit constexpr vector(
|
||||
const detail::swizzle_storage<SwizzleDataT, SwizzleScalarT, SwizzleIndicesV...>& swizzle) {
|
||||
explicit constexpr vector(const detail::swizzle_storage<SwizzleDataT, SwizzleScalarT, SwizzleIndicesV...>& swizzle) {
|
||||
((data[IndicesV] = ScalarT(swizzle[IndicesV])), ...);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user