From c87f9627efc8b612eb9b000acfcc6731cad15765 Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Tue, 7 Oct 2025 09:12:22 +0200 Subject: Initial commit --- src/args.cc | 389 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/args.hh | 64 +++++++++ src/buffer.cc | 213 ++++++++++++++++++++++++++++++ src/buffer.hh | 31 +++++ src/check.hh | 39 ++++++ src/config.h.in | 1 + src/io.cc | 232 +++++++++++++++++++++++++++++++++ src/io.hh | 51 ++++++++ src/line.cc | 127 ++++++++++++++++++ src/line.hh | 37 ++++++ src/main.cc | 31 +++++ src/str.cc | 53 ++++++++ src/str.hh | 21 +++ src/unique_fd.cc | 9 ++ src/unique_fd.hh | 36 +++++ 15 files changed, 1334 insertions(+) create mode 100644 src/args.cc create mode 100644 src/args.hh create mode 100644 src/buffer.cc create mode 100644 src/buffer.hh create mode 100644 src/check.hh create mode 100644 src/config.h.in 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/main.cc create mode 100644 src/str.cc create mode 100644 src/str.hh create mode 100644 src/unique_fd.cc create mode 100644 src/unique_fd.hh (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