Add slackware package database parser

This commit is contained in:
Eugen Wissner 2025-03-06 22:20:38 +01:00
parent 26fc7c0bd6
commit 2d2b8c266e
Signed by: belka
GPG Key ID: A27FDC1E8EE902C0
4 changed files with 112 additions and 0 deletions

3
.gitignore vendored
View File

@ -2,3 +2,6 @@
/config/tea-cleaner.toml /config/tea-cleaner.toml
/log/ /log/
/tmp/ /tmp/
CMakeLists.txt
/.cache/
/build/

14
cli/main.cpp Normal file
View File

@ -0,0 +1,14 @@
#include <filesystem>
#include <iostream>
#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;
}

View File

@ -0,0 +1,28 @@
#pragma once
#include <string>
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;
};
}

67
katja/database.cpp Normal file
View File

@ -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;
}
}