Files
integration/luprex/cpp/drv/readline.hpp

54 lines
1.5 KiB
C++

#ifndef READLINE_HPP
#define READLINE_HPP
#include <string>
#include <string_view>
using CodepointString = std::basic_string<char32_t>;
class ReadlineDevice {
public:
using print_callback = void (*)(const CodepointString &text);
private:
print_callback print_cb_;
CodepointString desired_command_;
CodepointString current_command_;
CodepointString desired_prompt_;
CodepointString current_prompt_;
char32_t readline_lastc_;
void echo_command();
void erase_command();
public:
ReadlineDevice();
// The callback must be set before using the readline device.
void set_print_callback(print_callback cb);
// change the prompt.
void set_prompt(const CodepointString &prompt);
// Use this to print anything on the console.
void print(const CodepointString &cps);
// Whenever the user types a character, call 'putcode'. If the code is
// newline, this returns the line of text that was entered, including the
// newline. Otherwise returns empty string. Backspace is handled here.
CodepointString putcode(char32_t codepoint);
// This can be used to convert a codepoint string into a
// UTF8-string.
static std::string to_utf8(const CodepointString &cps);
// This can be used to convert UTF8 to a codepoint string.
// Some of the bytes may not be consumed. Returns the Codepoint
// string and the number of bytes consumed.
static CodepointString from_utf8(std::string_view source, int *consumed);
};
#endif // READLINE_HPP