From 6ed8f5151719fbc14ec0ac6d28a346d1f74cf2ca Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Fri, 2 Jan 2026 22:42:31 +0100 Subject: Initial commit --- src/args.cc | 389 ++++++++++++++++++++ src/args.hh | 64 ++++ src/cfg.cc | 199 +++++++++++ src/cfg.hh | 45 +++ src/check.hh | 39 ++ src/colour.cc | 15 + src/colour.hh | 20 ++ src/config.h.in | 6 + src/image.cc | 15 + src/image.hh | 62 ++++ src/image_loader.hh | 15 + src/image_processor.cc | 947 +++++++++++++++++++++++++++++++++++++++++++++++++ src/image_processor.hh | 29 ++ src/io.cc | 358 +++++++++++++++++++ src/io.hh | 109 ++++++ src/line.cc | 127 +++++++ src/line.hh | 37 ++ src/logger.cc | 125 +++++++ src/logger.hh | 41 +++ src/main.cc | 47 +++ src/paths.cc | 100 ++++++ src/paths.hh | 20 ++ src/size.hh | 30 ++ src/spawner.cc | 236 ++++++++++++ src/spawner.hh | 49 +++ src/str.cc | 94 +++++ src/str.hh | 34 ++ src/u.hh | 21 ++ src/u8.hh | 196 ++++++++++ src/unique_fd.cc | 9 + src/unique_fd.hh | 36 ++ src/xpm/.clang-tidy | 2 + src/xpm/color.c | 882 +++++++++++++++++++++++++++++++++++++++++++++ src/xpm/dix-config.h | 1 + src/xpm/dix/dix_priv.h | 14 + src/xpm/include/dix.h | 14 + 36 files changed, 4427 insertions(+) create mode 100644 src/args.cc create mode 100644 src/args.hh create mode 100644 src/cfg.cc create mode 100644 src/cfg.hh create mode 100644 src/check.hh create mode 100644 src/colour.cc create mode 100644 src/colour.hh create mode 100644 src/config.h.in create mode 100644 src/image.cc create mode 100644 src/image.hh create mode 100644 src/image_loader.hh create mode 100644 src/image_processor.cc create mode 100644 src/image_processor.hh create mode 100644 src/io.cc create mode 100644 src/io.hh create mode 100644 src/line.cc create mode 100644 src/line.hh create mode 100644 src/logger.cc create mode 100644 src/logger.hh create mode 100644 src/main.cc create mode 100644 src/paths.cc create mode 100644 src/paths.hh create mode 100644 src/size.hh create mode 100644 src/spawner.cc create mode 100644 src/spawner.hh create mode 100644 src/str.cc create mode 100644 src/str.hh create mode 100644 src/u.hh create mode 100644 src/u8.hh create mode 100644 src/unique_fd.cc create mode 100644 src/unique_fd.hh create mode 100644 src/xpm/.clang-tidy create mode 100644 src/xpm/color.c create mode 100644 src/xpm/dix-config.h create mode 100644 src/xpm/dix/dix_priv.h create mode 100644 src/xpm/include/dix.h (limited to 'src') diff --git a/src/args.cc b/src/args.cc new file mode 100644 index 0000000..1794941 --- /dev/null +++ b/src/args.cc @@ -0,0 +1,389 @@ +#include "args.hh" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace { + +std::string kEmpty; + +class OptionImpl : public Args::OptionArgument { + public: + enum Type : uint8_t { + NoArgument, + RequiredArgument, + OptionalArgument, + }; + + OptionImpl(Type type, char shortname, std::string longname, std::string arg, + std::string help) + : type(type), + shortname(shortname), + longname(std::move(longname)), + arg(std::move(arg)), + help(std::move(help)) {} + + const Type type; + const char shortname; + const std::string longname; + const std::string arg; + const std::string help; + + [[nodiscard]] bool is_set() const override { return is_set_; } + + [[nodiscard]] bool has_argument() const override { + return value_.has_value(); + } + + [[nodiscard]] const std::string& argument() const override { + if (value_.has_value()) + return value_.value(); + assert(false); + return kEmpty; + } + + void clear() { + is_set_ = false; + value_.reset(); + } + + void set_argument(std::string value) { + assert(type == Type::RequiredArgument || type == Type::OptionalArgument); + is_set_ = true; + value_ = std::move(value); + } + + void set_no_argument() { + assert(type == Type::NoArgument || type == Type::OptionalArgument); + is_set_ = true; + value_.reset(); + } + + private: + bool is_set_{false}; + std::optional value_; +}; + +class ArgsImpl : public Args { + public: + explicit ArgsImpl(std::string prgname) : prgname_(std::move(prgname)) {} + + std::shared_ptr