Documentation and code cleaenups.
This commit is contained in:
parent
67d4a1ebce
commit
8dba3d27f2
2
Arena.h
2
Arena.h
|
@ -115,10 +115,10 @@ public:
|
||||||
#if defined(__linux__)
|
#if defined(__linux__)
|
||||||
int Create(const char *path, size_t fileSize);
|
int Create(const char *path, size_t fileSize);
|
||||||
#elif defined(__WIN64__) || defined(__WIN32__) || defined(WIN32)
|
#elif defined(__WIN64__) || defined(__WIN32__) || defined(WIN32)
|
||||||
|
|
||||||
int Create(const char *path, size_t fileSize);
|
int Create(const char *path, size_t fileSize);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// Open reads a file into the arena; the file must already exist. On
|
/// Open reads a file into the arena; the file must already exist. On
|
||||||
/// Unix-based platforms, the arena will be backed by a memory via
|
/// Unix-based platforms, the arena will be backed by a memory via
|
||||||
/// #MemoryMap. On other platforms (e.g. Windows), the arena will read
|
/// #MemoryMap. On other platforms (e.g. Windows), the arena will read
|
||||||
|
|
|
@ -38,11 +38,11 @@ set(SOURCE_FILES
|
||||||
TLV.cc
|
TLV.cc
|
||||||
Commander.cpp
|
Commander.cpp
|
||||||
Commander.h
|
Commander.h
|
||||||
WinHelpers.cpp)
|
WinHelpers.cc)
|
||||||
|
|
||||||
add_library(klib STATIC ${SOURCE_FILES} ${HEADER_FILES})
|
add_library(klib STATIC ${SOURCE_FILES} ${HEADER_FILES})
|
||||||
|
|
||||||
add_executable(phonebook phonebook.cpp)
|
add_executable(phonebook phonebook.cc)
|
||||||
target_link_libraries(phonebook klib)
|
target_link_libraries(phonebook klib)
|
||||||
|
|
||||||
include(CTest)
|
include(CTest)
|
||||||
|
|
|
@ -1,26 +1,8 @@
|
||||||
///
|
///
|
||||||
/// \file Commander.cpp
|
/// \file Commander.cpp
|
||||||
/// \author kyle
|
/// \author kyle
|
||||||
/// \created 10/10/23
|
/// \date 2023-10-10
|
||||||
/// \brief
|
|
||||||
/// \section COPYRIGHT
|
|
||||||
/// \section COPYRIGHT
|
|
||||||
/// Copyright 2023 K. Isom <kyle@imap.cc>
|
|
||||||
///
|
///
|
||||||
/// Permission to use, copy, modify, and/or distribute this software for
|
|
||||||
/// any purpose with or without fee is hereby granted, provided that the
|
|
||||||
/// above copyright notice and this permission notice appear in all copies.
|
|
||||||
///
|
|
||||||
/// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
|
|
||||||
/// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
|
|
||||||
/// WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
|
|
||||||
/// BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
|
|
||||||
/// OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
|
|
||||||
/// WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
|
|
||||||
/// ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
|
||||||
/// SOFTWARE.
|
|
||||||
///
|
|
||||||
/// @\section DESCRIPTION
|
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include "Commander.h"
|
#include "Commander.h"
|
||||||
|
|
59
Commander.h
59
Commander.h
|
@ -1,8 +1,17 @@
|
||||||
///
|
///
|
||||||
/// \file Commander.h
|
/// \file Commander.h
|
||||||
/// \author kyle
|
/// \author K. Isom <kyle@imap.cc>
|
||||||
/// \created 2023-10-10
|
/// \date 2023-10-10
|
||||||
/// \brief Subprogram tooling.
|
/// \brief Subprogram tooling.
|
||||||
|
///
|
||||||
|
/// Commander is tooling for creating subcommand interfaces for command-line
|
||||||
|
/// programs. For an example, see phonebook.cc.
|
||||||
|
///
|
||||||
|
/// The basic idea is to enable writing programs of the form
|
||||||
|
/// ```
|
||||||
|
/// $ some_tool subcommand args...
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
@ -16,23 +25,47 @@
|
||||||
namespace klib {
|
namespace klib {
|
||||||
|
|
||||||
|
|
||||||
|
/// CommanderFunc describes a function that can be run in Commander.
|
||||||
|
///
|
||||||
|
/// It expects an argument count and a list of arguments.
|
||||||
typedef std::function<bool(int, char **)> CommanderFunc;
|
typedef std::function<bool(int, char **)> CommanderFunc;
|
||||||
|
|
||||||
|
|
||||||
|
/// Subcommands are the individual commands for the program. A Subcommand
|
||||||
|
/// will check that it has enough arguments before running its function.
|
||||||
class Subcommand {
|
class Subcommand {
|
||||||
public:
|
public:
|
||||||
|
/// Status describes the results of running a Subcommand.
|
||||||
enum class Status : uint8_t {
|
enum class Status : uint8_t {
|
||||||
|
/// The subcommand executed correctly.
|
||||||
OK = 0,
|
OK = 0,
|
||||||
|
/// Not enough arguments were supplied to the subcommand.
|
||||||
NotEnoughArgs = 1,
|
NotEnoughArgs = 1,
|
||||||
|
/// The subcommand failed to run correctly.
|
||||||
Failed = 2,
|
Failed = 2,
|
||||||
|
/// The subcommand hasn't been registered in a Commander
|
||||||
|
/// instance.
|
||||||
CommandNotRegistered = 3,
|
CommandNotRegistered = 3,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// A Subcommand is initialized with a name, the number of arguments
|
||||||
|
/// it requires, and a function to run.
|
||||||
|
///
|
||||||
|
/// \param name The subcommand name; this is the name that will select this command.
|
||||||
|
/// \param argc The minimum number of arguments required by this subcommand.
|
||||||
|
/// \param func A valid CommanderFunc.
|
||||||
Subcommand(std::string name, int argc, CommanderFunc func)
|
Subcommand(std::string name, int argc, CommanderFunc func)
|
||||||
: fn(func), args(argc), command(name)
|
: fn(func), args(argc), command(name)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
/// Name returns the name of this subcommand.
|
||||||
std::string Name() { return this->command; }
|
std::string Name() { return this->command; }
|
||||||
|
|
||||||
|
/// Run attempts to run the CommanderFunc for this subcommand.
|
||||||
|
///
|
||||||
|
/// \param argc The number of arguments supplied.
|
||||||
|
/// \param argv The argument list.
|
||||||
|
/// \return A Status type indicating the status of running the command.
|
||||||
Status Run(int argc, char **argv);
|
Status Run(int argc, char **argv);
|
||||||
private:
|
private:
|
||||||
CommanderFunc fn;
|
CommanderFunc fn;
|
||||||
|
@ -40,14 +73,32 @@ private:
|
||||||
std::string command;
|
std::string command;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Commander does this.
|
/// Commander collects subcommands and can run the apppropriate one.
|
||||||
|
///
|
||||||
|
/// For example:
|
||||||
|
/// ```
|
||||||
|
/// auto command = string(argv[optind++]);
|
||||||
|
/// Commander commander;
|
||||||
|
///
|
||||||
|
/// commander.Register(Subcommand("list", 0, listFiles));
|
||||||
|
/// commander.Register(Subcommand("new", 1, newPhonebook));
|
||||||
|
/// commander.Register(Subcommand("del", 1, delKey));
|
||||||
|
/// commander.Register(Subcommand("has", 1, hasKey));
|
||||||
|
/// commander.Register(Subcommand("get", 1, getKey));
|
||||||
|
/// commander.Register(Subcommand("put", 2, putKey));
|
||||||
|
///
|
||||||
|
/// auto result = commander.Run(command, argc-optind, argv+optind);
|
||||||
|
/// ```
|
||||||
///
|
///
|
||||||
/// Longer description...
|
|
||||||
class Commander {
|
class Commander {
|
||||||
public:
|
public:
|
||||||
|
/// A Commander is initialized empty.
|
||||||
Commander();
|
Commander();
|
||||||
|
|
||||||
|
/// Register adds the subcommand. It will be copied into the Commander.
|
||||||
bool Register(Subcommand scmd);
|
bool Register(Subcommand scmd);
|
||||||
|
|
||||||
|
/// Try to run a subcommand registered with this Commander.
|
||||||
Subcommand::Status Run(std::string command, int argc, char **argv);
|
Subcommand::Status Run(std::string command, int argc, char **argv);
|
||||||
private:
|
private:
|
||||||
std::map<std::string, Subcommand *> cmap;
|
std::map<std::string, Subcommand *> cmap;
|
||||||
|
|
|
@ -12,9 +12,16 @@
|
||||||
namespace klib {
|
namespace klib {
|
||||||
|
|
||||||
|
|
||||||
|
/// NotImplemented is an exception reserved for unsupported platforms.
|
||||||
|
///
|
||||||
|
/// It is used to mark functionality included for compatibility, and useful for
|
||||||
|
/// debugging.
|
||||||
class NotImplemented : public std::exception {
|
class NotImplemented : public std::exception {
|
||||||
public:
|
public:
|
||||||
|
/// NotImplemented exceptions are constructed with a platform name.
|
||||||
explicit NotImplemented(const char *pl) : platform((char *)pl) {}
|
explicit NotImplemented(const char *pl) : platform((char *)pl) {}
|
||||||
|
|
||||||
|
/// what returns a message naming the platform.
|
||||||
char *what() {
|
char *what() {
|
||||||
return this->platform;
|
return this->platform;
|
||||||
}
|
}
|
||||||
|
|
4
klib.h
4
klib.h
|
@ -45,7 +45,7 @@ namespace klib {
|
||||||
///
|
///
|
||||||
/// This library arose from two main use cases.
|
/// This library arose from two main use cases.
|
||||||
///
|
///
|
||||||
/// \subsection The modem
|
/// \subsection kimodem The modem
|
||||||
///
|
///
|
||||||
/// On the one hand, I was building a wireless modem for some Z80 computers I
|
/// On the one hand, I was building a wireless modem for some Z80 computers I
|
||||||
/// have. I needed to be able to store a phonebook of SSIDs and WPA keys, as
|
/// have. I needed to be able to store a phonebook of SSIDs and WPA keys, as
|
||||||
|
@ -60,7 +60,7 @@ namespace klib {
|
||||||
/// Closely related to this, I've been working on building an ARM-based handheld
|
/// Closely related to this, I've been working on building an ARM-based handheld
|
||||||
/// computer, for which I would also need a memory arena.
|
/// computer, for which I would also need a memory arena.
|
||||||
///
|
///
|
||||||
/// \subsection The text editors
|
/// \subsection textedit The text editors
|
||||||
///
|
///
|
||||||
/// Some time ago, I wrote a console text editor of my own; then later, started
|
/// Some time ago, I wrote a console text editor of my own; then later, started
|
||||||
/// working on a graphical editor. For this, I needed some data structures to
|
/// working on a graphical editor. For this, I needed some data structures to
|
||||||
|
|
Loading…
Reference in New Issue