diff options
| author | Marcel Braun <marcel.braun@ost.ch> | 2026-05-11 14:48:46 +0200 |
|---|---|---|
| committer | Marcel Braun <marcel.braun@ost.ch> | 2026-05-11 14:48:46 +0200 |
| commit | 8a11512eb8030de09ed806d8b40b7f54c2f204ab (patch) | |
| tree | 1ee4aa34bb72ac9d2269dec1d1ff6cf656aee950 /kernel | |
| parent | 0ffee4e5dbc20dd7f1f7991d1f8dab698fc9b7a0 (diff) | |
| download | kernel-8a11512eb8030de09ed806d8b40b7f54c2f204ab.tar.xz kernel-8a11512eb8030de09ed806d8b40b7f54c2f204ab.zip | |
Refactor get_full_path remove recursion
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/src/filesystem/dentry.cpp | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/kernel/src/filesystem/dentry.cpp b/kernel/src/filesystem/dentry.cpp index 1cf8730..a3bd7f4 100644 --- a/kernel/src/filesystem/dentry.cpp +++ b/kernel/src/filesystem/dentry.cpp @@ -6,6 +6,7 @@ #include <kstd/memory> #include <kstd/string> +#include <kstd/vector> #include <algorithm> #include <cstdint> @@ -39,20 +40,35 @@ namespace kernel::filesystem return m_name.view(); } - // NOLINTNEXTLINE(misc-no-recursion) auto dentry::get_full_path() const -> kstd::string { - if (m_parent) + if (m_name == "/") { - auto parent_path = m_parent->get_full_path(); - if (parent_path != "/") - { - parent_path += '/'; - } - return parent_path + m_name.view(); + return "/"; } - return m_name.view(); + kstd::vector<std::string_view> components; + components.push_back(m_name.view()); + components.push_back("/"); + + auto parent = m_parent; + + while (parent && parent->m_name != "/") + { + components.push_back(parent->m_name.view()); + components.push_back("/"); + parent = parent->get_parent(); + } + + std::ranges::reverse(components); + + kstd::string full_path = ""; + for (auto const & view : components) + { + full_path += view; + } + + return full_path; } auto dentry::add_child(kstd::shared_ptr<dentry> const & child) -> void |
