Implement unicode on console, move readline into driver

This commit is contained in:
2023-05-18 17:14:55 -04:00
parent 2b03ca2eb6
commit fd137e8e74
12 changed files with 371 additions and 162 deletions

View File

@@ -0,0 +1,53 @@
#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