diff --git a/.gitignore b/.gitignore index 27c0c2b..a8d7602 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ /config/tea-cleaner.toml /log/ /tmp/ +CMakeLists.txt +/.cache/ +/build/ diff --git a/cli/main.cpp b/cli/main.cpp new file mode 100644 index 0000000..2c6ab3b --- /dev/null +++ b/cli/main.cpp @@ -0,0 +1,14 @@ +#include +#include +#include "katja/database.hpp" + +int main() +{ + for (const auto& entry : std::filesystem::directory_iterator(katja::database)) + { + katja::database_package database_entry{ entry.path().filename() }; + + std::cout << database_entry.to_string() << std::endl; + } + return 0; +} diff --git a/include/katja/database.hpp b/include/katja/database.hpp new file mode 100644 index 0000000..d4d99e6 --- /dev/null +++ b/include/katja/database.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include + +namespace katja +{ + constexpr const char *database = "/var/lib/pkgtools/packages"; + + class database_package + { + database_package(std::string&& name, std::string&& version, + std::string&& architecture, std::string&& build_tag); + + static database_package create_database_package(const std::string& fullname); + + public: + const std::string build_tag; + const std::string architecture; + const std::string version; + const std::string name; + + database_package(const std::string& fullname); + + std::string to_string() const; + }; + + +} diff --git a/katja/database.cpp b/katja/database.cpp new file mode 100644 index 0000000..555e679 --- /dev/null +++ b/katja/database.cpp @@ -0,0 +1,67 @@ +#include "katja/database.hpp" + +namespace katja +{ + database_package database_package::create_database_package(const std::string& fullname) + { + std::string::const_reverse_iterator begin_iterator = std::crbegin(fullname); + std::string::const_reverse_iterator end_iterator = begin_iterator; + int minus_counter = 0; + + std::string build_tag; + std::string architecture; + std::string version; + + for (; begin_iterator != std::crend(fullname) && minus_counter < 3; ++begin_iterator) + { + if (*begin_iterator == '-') + { + if (minus_counter == 0) + { + build_tag = std::string(begin_iterator.base(), end_iterator.base()); + } + else if (minus_counter == 1) + { + architecture = std::string(begin_iterator.base(), end_iterator.base()); + } + else if (minus_counter == 2) + { + version = std::string(begin_iterator.base(), end_iterator.base()); + } + end_iterator = begin_iterator + 1; + ++minus_counter; + } + } + return database_package(std::string(fullname.cbegin(), end_iterator.base()), + std::move(version), std::move(architecture), std::move(build_tag)); + } + + database_package::database_package(std::string&& name, std::string&& version, + std::string&& architecture, std::string&& build_tag) + : name(name), version(version), architecture(version), build_tag(build_tag) + { + } + + database_package::database_package(const std::string& fullname) + : database_package(create_database_package(fullname)) + { + } + + std::string database_package::to_string() const + { + std::string package_string; + const std::size_t total_size = this->name.size() + this->version.size() + + this->architecture.size() + this->build_tag.size() + 3; + + package_string.reserve(total_size); + package_string.append(this->name); + package_string.push_back('-'); + package_string.append(this->version); + package_string.push_back('-'); + package_string.append(this->architecture); + package_string.push_back('-'); + package_string.append(this->build_tag); + + return package_string; + } +}