cpp-utilities/application/commandlineutils.h

99 lines
3.2 KiB
C
Raw Permalink Normal View History

#ifndef APPLICATION_UTILITIES_COMMANDLINEUTILS_H
#define APPLICATION_UTILITIES_COMMANDLINEUTILS_H
2015-06-24 00:44:16 +02:00
#include "../global.h"
2015-06-24 00:44:16 +02:00
2022-10-08 22:29:32 +02:00
#include <optional>
#include <ostream>
2016-12-18 17:19:57 +01:00
#ifdef PLATFORM_WINDOWS
2017-05-01 03:13:11 +02:00
#include <memory>
#include <vector>
2016-12-18 17:19:57 +01:00
#endif
namespace CppUtilities {
2015-06-24 00:44:16 +02:00
2016-07-02 02:02:47 +02:00
/*!
* \brief The Response enum is used to specify the default response for the confirmPrompt() method.
*/
2017-05-01 03:13:11 +02:00
enum class Response { None, Yes, No };
2015-06-24 00:44:16 +02:00
CPP_UTILITIES_EXPORT bool confirmPrompt(const char *message, Response defaultResponse = Response::None);
2022-10-08 22:29:32 +02:00
CPP_UTILITIES_EXPORT std::optional<bool> isEnvVariableSet(const char *variableName);
2015-06-24 00:44:16 +02:00
#ifdef PLATFORM_WINDOWS
CPP_UTILITIES_EXPORT bool handleVirtualTerminalProcessing();
CPP_UTILITIES_EXPORT void startConsole();
CPP_UTILITIES_EXPORT std::pair<std::vector<std::unique_ptr<char[]>>, std::vector<char *>> convertArgsToUtf8();
#define CMD_UTILS_START_CONSOLE ::CppUtilities::startConsole();
2017-05-01 03:13:11 +02:00
#define CMD_UTILS_CONVERT_ARGS_TO_UTF8 \
auto utf8Args = ::CppUtilities::convertArgsToUtf8(); \
2017-05-01 03:13:11 +02:00
argv = utf8Args.second.data(); \
2016-12-18 17:19:57 +01:00
argc = static_cast<int>(utf8Args.second.size());
#define CMD_UTILS_HANDLE_VIRTUAL_TERMINAL_PROCESSING ::CppUtilities::handleVirtualTerminalProcessing();
#else
2017-05-01 03:13:11 +02:00
#define CMD_UTILS_START_CONSOLE
#define CMD_UTILS_CONVERT_ARGS_TO_UTF8
#define CMD_UTILS_HANDLE_VIRTUAL_TERMINAL_PROCESSING
#endif
2017-09-29 20:56:50 +02:00
/*!
* \brief The TerminalSize struct describes a terminal size.
* \remarks The same as the winsize structure is defined in `sys/ioctl.h`.
* \sa determineTerminalSize()
*/
struct TerminalSize {
TerminalSize(unsigned short rows = 0, unsigned short columns = 0, unsigned short width = 0, unsigned short height = 0);
/// \brief number of rows
unsigned short rows;
/// \brief number of columns
unsigned short columns;
/// \brief width in pixel
unsigned short width;
/// \brief height in pixel
unsigned short height;
};
inline TerminalSize::TerminalSize(unsigned short rows, unsigned short columns, unsigned short width, unsigned short height)
: rows(rows)
, columns(columns)
, width(width)
, height(height)
{
}
CPP_UTILITIES_EXPORT TerminalSize determineTerminalSize();
2017-09-29 20:56:50 +02:00
/*!
2016-12-18 17:19:57 +01:00
* \brief The Indentation class allows printing indentation conveniently, eg. cout << Indentation(4) << ...
*/
2017-05-01 03:13:11 +02:00
class CPP_UTILITIES_EXPORT Indentation {
public:
2017-05-01 03:13:11 +02:00
Indentation(unsigned char level = 4, char character = ' ')
: level(level)
, character(character)
{
}
2017-05-01 03:13:11 +02:00
Indentation operator+(unsigned char level)
{
return Indentation(this->level + level, character);
}
unsigned char level;
char character;
};
2017-05-01 03:13:11 +02:00
inline CPP_UTILITIES_EXPORT std::ostream &operator<<(std::ostream &out, Indentation indentation)
{
2017-05-01 03:13:11 +02:00
for (unsigned char i = 0; i < indentation.level; ++i) {
out << indentation.character;
}
return out;
}
} // namespace CppUtilities
2015-06-24 00:44:16 +02:00
#endif // APPLICATION_UTILITIES_COMMANDLINEUTILS_H