[tests] try to make scripty output readable

This commit is contained in:
Timothy Stack 2021-01-08 14:08:52 -08:00
parent 4d936f7bba
commit 8235f9af5d
37 changed files with 1458 additions and 479 deletions

View File

@ -149,6 +149,8 @@ grep_output_for() {
on_error_fail_with() {
if test $? -ne 0; then
echo $1 > /dev/stderr
cat ${test_file_base}_${test_num}.tmp
cat ${test_file_base}_${test_num}.err
exit 1
fi
}

View File

@ -56,7 +56,7 @@ public:
auto_mem(const auto_mem &am) = delete;
template<typename F>
explicit auto_mem(F free_func)
explicit auto_mem(F free_func) noexcept
: am_ptr(nullptr), am_free_func((free_func_t)free_func) { };
auto_mem(auto_mem &&other) noexcept

View File

@ -39,6 +39,7 @@
#include "optional.hpp"
#include "strnatcmp.h"
#include "fmt/format.h"
struct string_fragment {
using iterator = const char *;
@ -212,6 +213,18 @@ struct string_fragment {
int sf_end;
};
namespace fmt {
template<>
struct formatter<string_fragment> : formatter<string_view> {
template<typename FormatContext>
auto format(const string_fragment& sf, FormatContext &ctx)
{
return formatter<string_view>::format(
string_view{sf.data(), (size_t) sf.length()}, ctx);
}
};
}
inline bool operator<(const char *left, const string_fragment &right) {
int rc = strncmp(left, right.data(), right.length());
return rc < 0;

View File

@ -841,6 +841,14 @@ struct Result {
return defaultValue;
}
template<typename Func>
auto unwrapOrElse(Func func) const {
if (isOk()) {
return storage().template get<T>();
}
return func(this->storage().template get<E>());
}
template<typename U = T>
typename std::enable_if<
!std::is_same<U, void>::value,

View File

@ -168,3 +168,10 @@ void split_ws(const std::string &str, std::vector<std::string> &toks_out)
toks_out.push_back(buf);
}
}
std::string repeat(const std::string& input, size_t num)
{
std::ostringstream os;
std::fill_n(std::ostream_iterator<std::string>(os), num, input);
return os.str();
}

View File

@ -143,4 +143,6 @@ size_t abbreviate_str(char *str, size_t len, size_t max_len);
void split_ws(const std::string &str, std::vector<std::string> &toks_out);
std::string repeat(const std::string& input, size_t num);
#endif

View File

@ -163,6 +163,8 @@ void bottom_status_source::update_loading(off_t off, size_t total)
{
status_field &sf = this->bss_fields[BSF_LOADING];
require(off >= 0);
if (total == 0 || (size_t)off == total) {
sf.set_cylon(false);
sf.set_role(view_colors::VCR_STATUS);

View File

@ -65,6 +65,10 @@ int sql_progress(const struct log_cursor &lc)
size_t total = lnav_data.ld_log_source.text_line_count();
off_t off = lc.lc_curr_line;
if (off < 0) {
return 0;
}
if (lnav_data.ld_window == nullptr) {
return 0;
}

View File

@ -135,8 +135,23 @@ void highlighter::annotate(attr_line_t &al, int start) const
attrs = this->h_attrs;
}
if (this->h_semantic) {
attrs |= vc.attrs_for_ident(&str[lr.lr_start],
lr.length());
bool found_color = false;
if (str[lr.lr_start] == '#' &&
(lr.length() == 4 || lr.length() == 7)) {
auto fg_res = rgb_color::from_str(
string_fragment(str.data(), lr.lr_start, lr.lr_end));
if (fg_res.isOk()) {
sa.emplace_back(lr,
&view_curses::VC_FOREGROUND,
vc.match_color(fg_res.unwrap()));
found_color = true;
}
}
if (!found_color) {
attrs |= vc.attrs_for_ident(&str[lr.lr_start],
lr.length());
}
}
if (!this->h_fg.empty()) {
sa.emplace_back(lr,

View File

@ -1497,6 +1497,8 @@ static void looper()
int session_stage = 0;
while (lnav_data.ld_looping) {
static bool initial_build = false;
vector<struct pollfd> pollfds;
auto poll_to = initial_rescan_completed ?
timeval{ 0, 333000 } :
@ -1596,6 +1598,9 @@ static void looper()
POLLIN,
0
});
if (initial_build) {
view_curses::awaiting_user_input();
}
}
rlc.update_poll_set(pollfds);
lnav_data.ld_filter_source.fss_editor.update_poll_set(pollfds);
@ -1669,7 +1674,6 @@ static void looper()
};
}
static bool initial_build = false;
if (initial_rescan_completed &&
(!initial_build || timer.fade_diff(index_counter) == 0)) {
if (lnav_data.ld_mode == LNM_PAGING) {

View File

@ -1923,31 +1923,34 @@ void external_log_format::build(std::vector<std::string> &errors) {
for (auto &hd_pair : this->elf_highlighter_patterns) {
external_log_format::highlighter_def &hd = hd_pair.second;
const std::string &pattern = hd.hd_pattern;
std::string errmsg;
const char *errptr;
rgb_color fg, bg;
int eoff, attrs = 0;
if (!hd.hd_color.empty()) {
if (!rgb_color::from_str(hd.hd_color, fg, errmsg)) {
errors.push_back("error:"
+ this->elf_name.to_string()
+ ":highlighters/"
+ hd_pair.first.to_string()
+ "/color:"
+ errmsg);
}
fg = rgb_color::from_str(hd.hd_color)
.unwrapOrElse([&](const auto& msg) {
errors.push_back("error:"
+ this->elf_name.to_string()
+ ":highlighters/"
+ hd_pair.first.to_string()
+ "/color:"
+ msg);
return rgb_color{};
});
}
if (!hd.hd_background_color.empty()) {
if (!rgb_color::from_str(hd.hd_background_color, bg, errmsg)) {
errors.push_back("error:"
+ this->elf_name.to_string()
+ ":highlighters/"
+ hd_pair.first.to_string()
+ "/color:"
+ errmsg);
}
bg = rgb_color::from_str(hd.hd_background_color)
.unwrapOrElse([&](const auto& msg) {
errors.push_back("error:"
+ this->elf_name.to_string()
+ ":highlighters/"
+ hd_pair.first.to_string()
+ "/color:"
+ msg);
return rgb_color{};
});
}
if (hd.hd_underline) {

View File

@ -1,7 +1,8 @@
AM_CPPFLAGS = \
-Wall \
-I$(top_srcdir)/src
-I$(top_srcdir)/src \
-I$(top_srcdir)/src/fmtlib
noinst_LIBRARIES = libpcrepp.a

View File

@ -238,6 +238,7 @@ public:
{
this->rc_value = value;
this->rc_value_expiration = time(nullptr) + VALUE_EXPIRATION;
this->set_needs_update();
};
std::string get_value() const { return this->rc_value; };

View File

@ -363,7 +363,7 @@ void readline_command_highlighter(attr_line_t &al, int x)
static const pcrepp SQL_PREFIXES("^:(filter-expr)");
static const pcrepp IDENT_PREFIXES("^:(tag|untag|delete-tags)");
static const pcrepp COLOR_PREFIXES("^:(config)");
static const pcrepp COLOR_RE("(#(?:[a-fA-F0-9]{3}|[a-fA-F0-9]{6}))");
static const pcrepp COLOR_RE("(#(?:[a-fA-F0-9]{6}|[a-fA-F0-9]{3}))");
view_colors &vc = view_colors::singleton();
int keyword_attrs = (
@ -401,19 +401,18 @@ void readline_command_highlighter(attr_line_t &al, int x)
pcre_context::capture_t *cap = pc[0];
string hash_color = pi.get_substr(cap);
string errmsg;
rgb_color rgb_fg, rgb_bg;
attr_t color_hint_attrs = vc.attrs_for_role(view_colors::VCR_COLOR_HINT);
int pnum = PAIR_NUMBER(color_hint_attrs);
if (rgb_color::from_str(hash_color, rgb_bg, errmsg)) {
rgb_color::from_str(hash_color).then([&](const auto& rgb_fg) {
pnum -= 1;
vc.ensure_color_pair(pnum, rgb_fg, rgb_bg);
vc.ensure_color_pair(pnum, rgb_fg, rgb_color{});
al.get_attrs().emplace_back(
line_range{cap->c_begin, cap->c_begin + 1},
&view_curses::VC_ROLE,
view_colors::VCR_COLOR_HINT);
}
});
}
}
pi.reset(line);

View File

@ -31,6 +31,7 @@
#include <string>
#include "fmt/format.h"
#include "yajlpp/yajlpp.hh"
#include "yajlpp/yajlpp_def.hh"
#include "styling.hh"
@ -53,6 +54,8 @@ static struct json_path_container term_color_handler = {
.FOR_FIELD(term_color, xc_id),
yajlpp::property_handler("name")
.FOR_FIELD(term_color, xc_name),
yajlpp::property_handler("hexString")
.FOR_FIELD(term_color, xc_hex),
yajlpp::property_handler("rgb")
.with_obj_provider<rgb_color, term_color>(
[](const auto &pc, term_color *xc) { return &xc->xc_color; })
@ -83,46 +86,46 @@ term_color_palette *ansi_colors()
return &retval;
}
bool rgb_color::from_str(const string_fragment &color,
rgb_color &rgb_out,
std::string &errmsg)
Result<rgb_color, std::string> rgb_color::from_str(const string_fragment &sf)
{
if (color.empty()) {
return true;
if (sf.empty()) {
return Ok(rgb_color());
}
if (color[0] == '#') {
switch (color.length()) {
rgb_color rgb_out;
if (sf[0] == '#') {
switch (sf.length()) {
case 4:
if (sscanf(color.data(), "#%1hx%1hx%1hx",
if (sscanf(sf.data(), "#%1hx%1hx%1hx",
&rgb_out.rc_r, &rgb_out.rc_g, &rgb_out.rc_b) == 3) {
rgb_out.rc_r |= rgb_out.rc_r << 4;
rgb_out.rc_g |= rgb_out.rc_g << 4;
rgb_out.rc_b |= rgb_out.rc_b << 4;
return true;
return Ok(rgb_out);
}
break;
case 7:
if (sscanf(color.data(), "#%2hx%2hx%2hx",
if (sscanf(sf.data(), "#%2hx%2hx%2hx",
&rgb_out.rc_r, &rgb_out.rc_g, &rgb_out.rc_b) == 3) {
return true;
return Ok(rgb_out);
}
break;
}
errmsg = "Could not parse color: " + color.to_string();
return false;
return Err(fmt::format("Could not parse color: {}", sf));
}
for (const auto &xc : xterm_colors()->tc_palette) {
if (color.iequal(xc.xc_name)) {
rgb_out = xc.xc_color;
return true;
if (sf.iequal(xc.xc_name)) {
return Ok(xc.xc_color);
}
}
errmsg = "Unknown color: '" + color.to_string() +
"'. See https://jonasjacek.github.io/colors/ for a list of supported color names";
return false;
return Err(fmt::format(
"Unknown color: '{}'. "
"See https://jonasjacek.github.io/colors/ for a list of supported "
"color names", sf));
}
bool rgb_color::operator<(const rgb_color &rhs) const

View File

@ -35,12 +35,11 @@
#include <vector>
#include "log_level.hh"
#include "base/result.h"
#include "base/intern_string.hh"
struct rgb_color {
static bool from_str(const string_fragment &color,
rgb_color &rgb_out,
std::string &errmsg);
static Result<rgb_color, std::string> from_str(const string_fragment &sf);
explicit rgb_color(short r = -1, short g = -1, short b = -1)
: rc_r(r), rc_g(g), rc_b(b) {
@ -103,6 +102,7 @@ struct lab_color {
struct term_color {
short xc_id;
std::string xc_name;
std::string xc_hex;
rgb_color xc_color;
lab_color xc_lab_color;
};

View File

@ -168,7 +168,7 @@ void textview_curses::reload_config(error_reporter &reporter)
const auto &sc = hl_pair.second.hc_style;
string fg1, bg1, fg_color, bg_color, errmsg;
rgb_color fg, bg;
bool invalid = false;
int attrs = 0;
fg1 = sc.sc_color;
@ -176,12 +176,19 @@ void textview_curses::reload_config(error_reporter &reporter)
shlex(fg1).eval(fg_color, theme_iter->second.lt_vars);
shlex(bg1).eval(bg_color, theme_iter->second.lt_vars);
if (!rgb_color::from_str(fg_color, fg, errmsg)) {
reporter(&sc.sc_color, errmsg);
continue;
}
if (!rgb_color::from_str(bg_color, bg, errmsg)) {
reporter(&sc.sc_background_color, errmsg);
auto fg = rgb_color::from_str(fg_color)
.unwrapOrElse([&](const auto& msg) {
reporter(&sc.sc_color, errmsg);
invalid = true;
return rgb_color{};
});
auto bg = rgb_color::from_str(bg_color)
.unwrapOrElse([&](const auto& msg) {
reporter(&sc.sc_background_color, errmsg);
invalid = true;
return rgb_color{};
});
if (invalid) {
continue;
}

View File

@ -6,7 +6,7 @@
"styles": {
"text": {
"color": "Silver",
"background-color": ""
"background-color": "Black"
},
"identifier": {
"background-color": ""
@ -149,6 +149,12 @@
}
},
"highlights": {
"colors": {
"pattern": "(?:#[a-fA-F0-9]{6}|#[a-fA-F0-9]{3})",
"style": {
"semantic": true
}
},
"ipv4": {
"pattern": "\\b(?<!\\d\\.)\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b(?!\\.\\d)",
"style": {

View File

@ -98,6 +98,13 @@ struct utf_to_display_adjustment {
};
};
void view_curses::awaiting_user_input()
{
static const char OSC_INPUT[] = "\x1b]999;send-input\a";
write(STDOUT_FILENO, OSC_INPUT, sizeof(OSC_INPUT) - 1);
}
void view_curses::mvwattrline(WINDOW *window,
int y,
int x,
@ -423,7 +430,7 @@ void view_colors::init()
{
vc_active_palette = ansi_colors();
if (has_colors()) {
static int ansi_colors_to_curses[] = {
static const int ansi_colors_to_curses[] = {
COLOR_BLACK,
COLOR_RED,
COLOR_GREEN,
@ -443,9 +450,22 @@ void view_colors::init()
for (int bg = 0; bg < 8; bg++) {
if (fg == 0 && bg == 0)
continue;
init_pair(ansi_color_pair_index(fg, bg),
ansi_colors_to_curses[fg],
ansi_colors_to_curses[bg]);
if (lnav_config.lc_ui_default_colors &&
ansi_colors_to_curses[fg] == COLOR_WHITE &&
ansi_colors_to_curses[bg] == COLOR_BLACK) {
init_pair(ansi_color_pair_index(fg, bg), -1, -1);
} else {
auto curs_bg = ansi_colors_to_curses[bg];
if (lnav_config.lc_ui_default_colors &&
curs_bg == COLOR_BLACK) {
curs_bg = -1;
}
init_pair(ansi_color_pair_index(fg, bg),
ansi_colors_to_curses[fg],
curs_bg);
}
}
}
if (COLORS >= 256) {
@ -466,6 +486,12 @@ void view_colors::init()
inline attr_t attr_for_colors(int &pair_base, short fg, short bg)
{
if (fg == -1) {
fg = COLOR_WHITE;
}
if (bg == -1) {
bg = COLOR_BLACK;
}
if (COLOR_PAIRS <= 64) {
return view_colors::ansi_color_pair(fg, bg);
} else {
@ -476,13 +502,6 @@ inline attr_t attr_for_colors(int &pair_base, short fg, short bg)
if (bg == COLOR_BLACK) {
bg = -1;
}
} else {
if (fg == -1) {
fg = COLOR_WHITE;
}
if (bg == -1) {
bg = COLOR_BLACK;
}
}
}
@ -502,8 +521,7 @@ pair<attr_t, attr_t> view_colors::to_attrs(
const lnav_theme &lt, const style_config &sc, const style_config &fallback_sc,
lnav_config_listener::error_reporter &reporter)
{
rgb_color fg, bg;
string fg1, bg1, fg_color, bg_color, errmsg;
string fg1, bg1, fg_color, bg_color;
fg1 = sc.sc_color;
if (fg1.empty()) {
@ -516,12 +534,14 @@ pair<attr_t, attr_t> view_colors::to_attrs(
shlex(fg1).eval(fg_color, lt.lt_vars);
shlex(bg1).eval(bg_color, lt.lt_vars);
if (!rgb_color::from_str(fg_color, fg, errmsg)) {
reporter(&sc.sc_color, errmsg);
}
if (!rgb_color::from_str(bg_color, bg, errmsg)) {
reporter(&sc.sc_background_color, errmsg);
}
auto fg = rgb_color::from_str(fg_color).unwrapOrElse([&](const auto& msg) {
reporter(&sc.sc_color, msg);
return rgb_color{};
});
auto bg = rgb_color::from_str(bg_color).unwrapOrElse([&](const auto& msg) {
reporter(&sc.sc_background_color, msg);
return rgb_color{};
});
attr_t retval1 = attr_for_colors(pair_base,
this->match_color(fg),
@ -552,13 +572,14 @@ void view_colors::init_roles(const lnav_theme &lt,
int ident_bg = (lnav_config.lc_ui_default_colors ? -1 : COLOR_BLACK);
if (!ident_sc.sc_background_color.empty()) {
string bg_color, errmsg;
rgb_color rgb_bg;
string bg_color;
shlex(ident_sc.sc_background_color).eval(bg_color, lt.lt_vars);
if (!rgb_color::from_str(bg_color, rgb_bg, errmsg)) {
reporter(&ident_sc.sc_background_color, errmsg);
}
auto rgb_bg = rgb_color::from_str(bg_color)
.unwrapOrElse([&](const auto& msg) {
reporter(&ident_sc.sc_background_color, msg);
return rgb_color{};
});
ident_bg = vc_active_palette->match_color(lab_color(rgb_bg));
}
for (int z = 0; z < 6; z++) {
@ -592,19 +613,17 @@ void view_colors::init_roles(const lnav_theme &lt,
auto fg_str = lt.lt_vars.find(COLOR_NAMES[ansi_fg]);
auto bg_str = lt.lt_vars.find(COLOR_NAMES[ansi_bg]);
rgb_color rgb_fg, rgb_bg;
string errmsg;
if (fg_str != lt.lt_vars.end() &&
!rgb_color::from_str(fg_str->second, rgb_fg, errmsg)) {
reporter(&fg_str->second, errmsg);
return;
}
if (bg_str != lt.lt_vars.end() &&
!rgb_color::from_str(bg_str->second, rgb_bg, errmsg)) {
reporter(&bg_str->second, errmsg);
return;
}
auto rgb_fg = rgb_color::from_str(fg_str->second)
.unwrapOrElse([&](const auto& msg) {
reporter(&fg_str->second, msg);
return rgb_color{};
});
auto rgb_bg = rgb_color::from_str(bg_str->second)
.unwrapOrElse([&](const auto& msg) {
reporter(&fg_str->second, msg);
return rgb_color{};
});
short fg = vc_active_palette->match_color(lab_color(rgb_fg));
short bg = vc_active_palette->match_color(lab_color(rgb_bg));
@ -617,6 +636,12 @@ void view_colors::init_roles(const lnav_theme &lt,
}
this->vc_ansi_to_theme[ansi_fg] = fg;
if (lnav_config.lc_ui_default_colors && bg == COLOR_BLACK) {
bg = -1;
if (fg == COLOR_WHITE) {
fg = -1;
}
}
init_pair(ansi_color_pair_index(ansi_fg, ansi_bg), fg, bg);
}
}
@ -882,7 +907,7 @@ attr_t view_colors::attrs_for_ident(const char *str, size_t len) const
pair_content(pnum, &fg, &bg);
}
else {
retval = BASIC_HL_PAIRS[index % BASIC_COLOR_COUNT];
retval = A_BOLD;
}
return retval;

View File

@ -442,6 +442,8 @@ public:
static string_attr_type VC_FOREGROUND;
static string_attr_type VC_BACKGROUND;
static void awaiting_user_input();
static void mvwattrline(WINDOW *window,
int y,
int x,

View File

@ -62,6 +62,9 @@ add_executable(test_top_status test_top_status.cc)
target_link_libraries(test_top_status diag PkgConfig::libpcre)
add_test(NAME test_top_status COMMAND test_top_status)
add_executable(drive_vt52_curses drive_vt52_curses.cc)
target_link_libraries(drive_vt52_curses diag PkgConfig::ncursesw)
add_executable(drive_sql_anno drive_sql_anno.cc)
target_link_libraries(drive_sql_anno diag PkgConfig::libpcre)

View File

@ -322,6 +322,7 @@ TESTS = \
test_line_buffer.sh \
test_listview.sh \
test_meta.sh \
test_mvwattrline.sh \
test_grep_proc.sh \
test_grep_proc2 \
test_json_format.sh \
@ -342,11 +343,11 @@ TESTS = \
test_sql_xml_func.sh \
test_data_parser.sh \
test_pretty_print.sh \
test_view_colors.sh \
test_vt52_curses.sh
DISABLED_TESTS = \
test_top_status \
test_view_colors.sh
test_top_status
if HAVE_LIBCURL
TESTS += \

View File

@ -35,7 +35,6 @@
#include <fstream>
#include <iostream>
#include "pcrepp/pcrepp.hh"
#include "textview_curses.hh"
#include "data_scanner.hh"
#include "data_parser.hh"

View File

@ -98,15 +98,10 @@ int main(int argc, char *argv[])
tgetstr((char *)"ce", nullptr),
"de",
"\n",
"1\n",
"2\n",
"3\n",
"4\n",
"5\n",
"6\n",
"7\n",
"8\n",
"9\n",
"1",
"2",
"3",
"\n",
"abc",
"\x02",
"\a",
@ -124,6 +119,7 @@ int main(int argc, char *argv[])
vt.map_output(CANNED_INPUT[lpc], strlen(CANNED_INPUT[lpc]));
vt.do_update();
refresh();
view_curses::awaiting_user_input();
getch();
}

View File

@ -1 +1,69 @@
read 1b29301b371b5b3f3437681b5b313b3234721b5b6d1b5b346c1b5b481b5b324a48656c6c6f1b5b3734430e780f1b5b323b31480e0f576f726c64211b5b3733430e780f1b5b333b3830480e780f1b5b343b3830480e780f1b5b353b3830480e780f1b5b363b3830480e780f1b5b373b3830480e780f1b5b383b3830480e780f1b5b393b3830480e780f1b5b31303b3830480e780f1b5b31313b3830480e780f1b5b31323b3830480e780f1b5b31333b3830480e780f1b5b31343b3830480e780f1b5b31353b3830480e780f1b5b31363b3830480e780f1b5b31373b3830480e780f1b5b31383b3830480e780f1b5b31393b3830480e780f1b5b32303b3830480e780f1b5b32313b3830480e780f1b5b32323b3830480e780f1b5b32333b3830480e780f1b5b32343b3830480e0f080e780f080e1b5b34680f201b5b346c0d1b5b32343b31481b5b324a1b5b3f34376c1b380d1b5b3f316c1b3e
CTRL Use alt charset
CTRL save cursor
CSI Use alternate screen buffer
CSI set scrolling region 1-24
S -1 ┋ ┋
A └ normal
CSI Replace mode
CSI Erase all
S 1 ┋Hello x┋
A └┛ alt
S 2 ┋World! x┋
A └┛ alt
S 3 ┋ x┋
A └┛ alt
S 4 ┋ x┋
A └┛ alt
S 5 ┋ x┋
A └┛ alt
S 6 ┋ x┋
A └┛ alt
S 7 ┋ x┋
A └┛ alt
S 8 ┋ x┋
A └┛ alt
S 9 ┋ x┋
A └┛ alt
S 10 ┋ x┋
A └┛ alt
S 11 ┋ x┋
A └┛ alt
S 12 ┋ x┋
A └┛ alt
S 13 ┋ x┋
A └┛ alt
S 14 ┋ x┋
A └┛ alt
S 15 ┋ x┋
A └┛ alt
S 16 ┋ x┋
A └┛ alt
S 17 ┋ x┋
A └┛ alt
S 18 ┋ x┋
A └┛ alt
S 19 ┋ x┋
A └┛ alt
S 20 ┋ x┋
A └┛ alt
S 21 ┋ x┋
A └┛ alt
S 22 ┋ x┋
A └┛ alt
S 23 ┋ x┋
A └┛ alt
S 24 ┋ ┋
A ···············································································└ backspace
A └┛ alt
A ···············································································└ backspace
A ··············································································└ [4h
CSI Replace mode
S 24 ┋ ┋
A ···············································································└ carriage-return
CSI Erase all
CSI Use normal screen buffer
CTRL restore cursor
S 24 ┋ ┋
A └ carriage-return
CSI Normal cursor keys
CTRL Normal keypad

View File

@ -1 +1,69 @@
read 1b29301b371b5b3f3437681b5b313b3234721b5b6d1b5b346c1b5b481b5b324a576f726c64211b5b3733430e780f1b5b323b3830480e780f1b5b333b3830480e780f1b5b343b3830480e780f1b5b353b3830480e780f1b5b363b3830480e780f1b5b373b3830480e780f1b5b383b3830480e780f1b5b393b3830480e780f1b5b31303b3830480e780f1b5b31313b3830480e780f1b5b31323b3830480e780f1b5b31333b3830480e780f1b5b31343b3830480e780f1b5b31353b3830480e780f1b5b31363b3830480e780f1b5b31373b3830480e780f1b5b31383b3830480e780f1b5b31393b3830480e780f1b5b32303b3830480e780f1b5b32313b3830480e780f1b5b32323b3830480e780f1b5b32333b3830480e780f1b5b32343b3830480e0f080e780f080e1b5b34680f201b5b346c0d1b5b32343b31481b5b324a1b5b3f34376c1b380d1b5b3f316c1b3e
CTRL Use alt charset
CTRL save cursor
CSI Use alternate screen buffer
CSI set scrolling region 1-24
S -1 ┋ ┋
A └ normal
CSI Replace mode
CSI Erase all
S 1 ┋World! x┋
A └┛ alt
S 2 ┋ x┋
A └┛ alt
S 3 ┋ x┋
A └┛ alt
S 4 ┋ x┋
A └┛ alt
S 5 ┋ x┋
A └┛ alt
S 6 ┋ x┋
A └┛ alt
S 7 ┋ x┋
A └┛ alt
S 8 ┋ x┋
A └┛ alt
S 9 ┋ x┋
A └┛ alt
S 10 ┋ x┋
A └┛ alt
S 11 ┋ x┋
A └┛ alt
S 12 ┋ x┋
A └┛ alt
S 13 ┋ x┋
A └┛ alt
S 14 ┋ x┋
A └┛ alt
S 15 ┋ x┋
A └┛ alt
S 16 ┋ x┋
A └┛ alt
S 17 ┋ x┋
A └┛ alt
S 18 ┋ x┋
A └┛ alt
S 19 ┋ x┋
A └┛ alt
S 20 ┋ x┋
A └┛ alt
S 21 ┋ x┋
A └┛ alt
S 22 ┋ x┋
A └┛ alt
S 23 ┋ x┋
A └┛ alt
S 24 ┋ ┋
A ···············································································└ backspace
A └┛ alt
A ···············································································└ backspace
A ··············································································└ [4h
CSI Replace mode
S 24 ┋ ┋
A ···············································································└ carriage-return
CSI Erase all
CSI Use normal screen buffer
CTRL restore cursor
S 24 ┋ ┋
A └ carriage-return
CSI Normal cursor keys
CTRL Normal keypad

View File

@ -1 +1,69 @@
read 1b29301b371b5b3f3437681b5b313b3234721b5b6d1b5b346c1b5b481b5b324a656c6c6f1b5b3735430e780f1b5b323b31480e0f6f726c64211b5b3734430e780f1b5b333b3830480e780f1b5b343b3830480e780f1b5b353b3830480e780f1b5b363b3830480e780f1b5b373b3830480e780f1b5b383b3830480e780f1b5b393b3830480e780f1b5b31303b3830480e780f1b5b31313b3830480e780f1b5b31323b3830480e780f1b5b31333b3830480e780f1b5b31343b3830480e780f1b5b31353b3830480e780f1b5b31363b3830480e780f1b5b31373b3830480e780f1b5b31383b3830480e780f1b5b31393b3830480e780f1b5b32303b3830480e780f1b5b32313b3830480e780f1b5b32323b3830480e780f1b5b32333b3830480e780f1b5b32343b3830480e0f080e780f080e1b5b34680f201b5b346c0d1b5b32343b31481b5b324a1b5b3f34376c1b380d1b5b3f316c1b3e
CTRL Use alt charset
CTRL save cursor
CSI Use alternate screen buffer
CSI set scrolling region 1-24
S -1 ┋ ┋
A └ normal
CSI Replace mode
CSI Erase all
S 1 ┋ello x┋
A └┛ alt
S 2 ┋orld! x┋
A └┛ alt
S 3 ┋ x┋
A └┛ alt
S 4 ┋ x┋
A └┛ alt
S 5 ┋ x┋
A └┛ alt
S 6 ┋ x┋
A └┛ alt
S 7 ┋ x┋
A └┛ alt
S 8 ┋ x┋
A └┛ alt
S 9 ┋ x┋
A └┛ alt
S 10 ┋ x┋
A └┛ alt
S 11 ┋ x┋
A └┛ alt
S 12 ┋ x┋
A └┛ alt
S 13 ┋ x┋
A └┛ alt
S 14 ┋ x┋
A └┛ alt
S 15 ┋ x┋
A └┛ alt
S 16 ┋ x┋
A └┛ alt
S 17 ┋ x┋
A └┛ alt
S 18 ┋ x┋
A └┛ alt
S 19 ┋ x┋
A └┛ alt
S 20 ┋ x┋
A └┛ alt
S 21 ┋ x┋
A └┛ alt
S 22 ┋ x┋
A └┛ alt
S 23 ┋ x┋
A └┛ alt
S 24 ┋ ┋
A ···············································································└ backspace
A └┛ alt
A ···············································································└ backspace
A ··············································································└ [4h
CSI Replace mode
S 24 ┋ ┋
A ···············································································└ carriage-return
CSI Erase all
CSI Use normal screen buffer
CTRL restore cursor
S 24 ┋ ┋
A └ carriage-return
CSI Normal cursor keys
CTRL Normal keypad

View File

@ -1 +1,69 @@
read 1b29301b371b5b3f3437681b5b313b3234721b5b6d1b5b346c1b5b481b5b324a6f726c64211b5b3734430e780f1b5b323b3830480e780f1b5b333b3830480e780f1b5b343b3830480e780f1b5b353b3830480e780f1b5b363b3830480e780f1b5b373b3830480e780f1b5b383b3830480e780f1b5b393b3830480e780f1b5b31303b3830480e780f1b5b31313b3830480e780f1b5b31323b3830480e780f1b5b31333b3830480e780f1b5b31343b3830480e780f1b5b31353b3830480e780f1b5b31363b3830480e780f1b5b31373b3830480e780f1b5b31383b3830480e780f1b5b31393b3830480e780f1b5b32303b3830480e780f1b5b32313b3830480e780f1b5b32323b3830480e780f1b5b32333b3830480e780f1b5b32343b3830480e0f080e780f080e1b5b34680f201b5b346c0d1b5b32343b31481b5b324a1b5b3f34376c1b380d1b5b3f316c1b3e
CTRL Use alt charset
CTRL save cursor
CSI Use alternate screen buffer
CSI set scrolling region 1-24
S -1 ┋ ┋
A └ normal
CSI Replace mode
CSI Erase all
S 1 ┋orld! x┋
A └┛ alt
S 2 ┋ x┋
A └┛ alt
S 3 ┋ x┋
A └┛ alt
S 4 ┋ x┋
A └┛ alt
S 5 ┋ x┋
A └┛ alt
S 6 ┋ x┋
A └┛ alt
S 7 ┋ x┋
A └┛ alt
S 8 ┋ x┋
A └┛ alt
S 9 ┋ x┋
A └┛ alt
S 10 ┋ x┋
A └┛ alt
S 11 ┋ x┋
A └┛ alt
S 12 ┋ x┋
A └┛ alt
S 13 ┋ x┋
A └┛ alt
S 14 ┋ x┋
A └┛ alt
S 15 ┋ x┋
A └┛ alt
S 16 ┋ x┋
A └┛ alt
S 17 ┋ x┋
A └┛ alt
S 18 ┋ x┋
A └┛ alt
S 19 ┋ x┋
A └┛ alt
S 20 ┋ x┋
A └┛ alt
S 21 ┋ x┋
A └┛ alt
S 22 ┋ x┋
A └┛ alt
S 23 ┋ x┋
A └┛ alt
S 24 ┋ ┋
A ···············································································└ backspace
A └┛ alt
A ···············································································└ backspace
A ··············································································└ [4h
CSI Replace mode
S 24 ┋ ┋
A ···············································································└ carriage-return
CSI Erase all
CSI Use normal screen buffer
CTRL restore cursor
S 24 ┋ ┋
A └ carriage-return
CSI Normal cursor keys
CTRL Normal keypad

View File

@ -1 +1,67 @@
read 1b29301b371b5b3f3437681b5b313b3234721b5b6d1b5b346c1b5b481b5b324a0a48656c6c6f1b5b3734430e780f1b5b333b31480e0f576f726c64211b5b3733430e780f1b5b343b31480e0f321b5b3738430e780f1b5b353b31480e0f331b5b3738430e780f1b5b363b31480e0f341b5b3738430e780f1b5b373b31480e0f351b5b3738430e780f1b5b383b31480e0f361b5b3738430e780f1b5b393b31480e0f371b5b3738430e780f1b5b31303b31480e0f381b5b3738430e780f1b5b31313b31480e0f391b5b3738430e780f1b5b31323b31480e0f31301b5b3737430e780f1b5b31333b31480e0f31311b5b3737430e780f1b5b31343b31480e0f31321b5b3737430e780f1b5b31353b31480e0f31331b5b3737430e780f1b5b31363b31480e0f31341b5b3737430e780f1b5b31373b31480e0f31351b5b3737430e780f1b5b31383b31480e0f31361b5b3737430e780f1b5b31393b31480e0f31371b5b3737430e780f1b5b32303b31480e0f31381b5b3737430e780f1b5b32313b31480e0f31391b5b3737430e780f1b5b32323b31480e0f32301b5b3737430e780f1b5b32333b31480e0f32311b5b3737430e780f1b5b32343b31480e0f32321b5b373743080e780f080e1b5b34680f201b5b346c0d1b5b32343b31481b5b324a1b5b3f34376c1b380d1b5b3f316c1b3e
CTRL Use alt charset
CTRL save cursor
CSI Use alternate screen buffer
CSI set scrolling region 1-24
S -1 ┋ ┋
A └ normal
CSI Replace mode
CSI Erase all
S 2 ┋Hello x┋
A └┛ alt
S 3 ┋World! x┋
A └┛ alt
S 4 ┋2 x┋
A └┛ alt
S 5 ┋3 x┋
A └┛ alt
S 6 ┋4 x┋
A └┛ alt
S 7 ┋5 x┋
A └┛ alt
S 8 ┋6 x┋
A └┛ alt
S 9 ┋7 x┋
A └┛ alt
S 10 ┋8 x┋
A └┛ alt
S 11 ┋9 x┋
A └┛ alt
S 12 ┋10 x┋
A └┛ alt
S 13 ┋11 x┋
A └┛ alt
S 14 ┋12 x┋
A └┛ alt
S 15 ┋13 x┋
A └┛ alt
S 16 ┋14 x┋
A └┛ alt
S 17 ┋15 x┋
A └┛ alt
S 18 ┋16 x┋
A └┛ alt
S 19 ┋17 x┋
A └┛ alt
S 20 ┋18 x┋
A └┛ alt
S 21 ┋19 x┋
A └┛ alt
S 22 ┋20 x┋
A └┛ alt
S 23 ┋21 x┋
A └┛ alt
S 24 ┋22 ┋
A ···············································································└ backspace
A └┛ alt
A ···············································································└ backspace
A ··············································································└ [4h
CSI Replace mode
S 24 ┋ ┋
A ···············································································└ carriage-return
CSI Erase all
CSI Use normal screen buffer
CTRL restore cursor
S 24 ┋ ┋
A └ carriage-return
CSI Normal cursor keys
CTRL Normal keypad

View File

@ -1 +1,59 @@
read 1b29301b371b5b3f3437681b5b313b3234721b5b6d1b5b346c1b5b481b5b324a0a48656c6c6f1b5b3734430e780f1b5b333b31480e0f576f726c64211b5b3733430e780f1b5b343b31480e0f321b5b3738430e780f1b5b353b31480e0f331b5b3738430e780f1b5b363b31480e0f341b5b3738430e780f1b5b373b31480e0f351b5b3738430e780f1b5b383b31480e0f361b5b3738430e780f1b5b393b31480e0f371b5b3738430e780f1b5b31303b31480e0f381b5b3738430e780f1b5b31313b31480e0f391b5b3738430e780f1b5b31323b31480e0f31301b5b3737430e780f1b5b31333b31480e0f31311b5b3737430e780f1b5b31343b31480e0f31321b5b3737430e780f1b5b31353b31480e0f31331b5b3737430e780f1b5b31363b31480e0f31341b5b3737430e780f1b5b31373b31480e0f31351b5b3737430e780f1b5b31383b31480e0f31361b5b3737430e780f1b5b31393b31480e0f31371b5b3737430e780f1b5b32303b31480e0f31381b5b3737430e780f1b5b32313b31480e0f31391b5b3737430e780f1b5b32323b31480e0f32301b5b3737430e780f1b5b32333b31480e0f32311b5b3737430e780f1b5b32333b31480e0f1b5b32343b31481b5b324a1b5b3f34376c1b380d1b5b3f316c1b3e
CTRL Use alt charset
CTRL save cursor
CSI Use alternate screen buffer
CSI set scrolling region 1-24
S -1 ┋ ┋
A └ normal
CSI Replace mode
CSI Erase all
S 2 ┋Hello x┋
A └┛ alt
S 3 ┋World! x┋
A └┛ alt
S 4 ┋2 x┋
A └┛ alt
S 5 ┋3 x┋
A └┛ alt
S 6 ┋4 x┋
A └┛ alt
S 7 ┋5 x┋
A └┛ alt
S 8 ┋6 x┋
A └┛ alt
S 9 ┋7 x┋
A └┛ alt
S 10 ┋8 x┋
A └┛ alt
S 11 ┋9 x┋
A └┛ alt
S 12 ┋10 x┋
A └┛ alt
S 13 ┋11 x┋
A └┛ alt
S 14 ┋12 x┋
A └┛ alt
S 15 ┋13 x┋
A └┛ alt
S 16 ┋14 x┋
A └┛ alt
S 17 ┋15 x┋
A └┛ alt
S 18 ┋16 x┋
A └┛ alt
S 19 ┋17 x┋
A └┛ alt
S 20 ┋18 x┋
A └┛ alt
S 21 ┋19 x┋
A └┛ alt
S 22 ┋20 x┋
A └┛ alt
S 23 ┋21 x┋
A └┛ alt
CSI Erase all
CSI Use normal screen buffer
CTRL restore cursor
S 24 ┋ ┋
A └ carriage-return
CSI Normal cursor keys
CTRL Normal keypad

View File

@ -1 +1,59 @@
read 1b29301b371b5b3f3437681b5b313b3234721b5b6d1b5b346c1b5b481b5b324a0a576f726c64211b5b3733430e780f1b5b333b31480e0f321b5b3738430e780f1b5b343b31480e0f331b5b3738430e780f1b5b353b31480e0f341b5b3738430e780f1b5b363b31480e0f351b5b3738430e780f1b5b373b31480e0f361b5b3738430e780f1b5b383b31480e0f371b5b3738430e780f1b5b393b31480e0f381b5b3738430e780f1b5b31303b31480e0f391b5b3738430e780f1b5b31313b31480e0f31301b5b3737430e780f1b5b31323b31480e0f31311b5b3737430e780f1b5b31333b31480e0f31321b5b3737430e780f1b5b31343b31480e0f31331b5b3737430e780f1b5b31353b31480e0f31341b5b3737430e780f1b5b31363b31480e0f31351b5b3737430e780f1b5b31373b31480e0f31361b5b3737430e780f1b5b31383b31480e0f31371b5b3737430e780f1b5b31393b31480e0f31381b5b3737430e780f1b5b32303b31480e0f31391b5b3737430e780f1b5b32313b31480e0f32301b5b3737430e780f1b5b32323b31480e0f32311b5b3737430e780f1b5b32333b31480e0f32321b5b3737430e780f1b5b32333b31480e0f1b5b32343b31481b5b324a1b5b3f34376c1b380d1b5b3f316c1b3e
CTRL Use alt charset
CTRL save cursor
CSI Use alternate screen buffer
CSI set scrolling region 1-24
S -1 ┋ ┋
A └ normal
CSI Replace mode
CSI Erase all
S 2 ┋World! x┋
A └┛ alt
S 3 ┋2 x┋
A └┛ alt
S 4 ┋3 x┋
A └┛ alt
S 5 ┋4 x┋
A └┛ alt
S 6 ┋5 x┋
A └┛ alt
S 7 ┋6 x┋
A └┛ alt
S 8 ┋7 x┋
A └┛ alt
S 9 ┋8 x┋
A └┛ alt
S 10 ┋9 x┋
A └┛ alt
S 11 ┋10 x┋
A └┛ alt
S 12 ┋11 x┋
A └┛ alt
S 13 ┋12 x┋
A └┛ alt
S 14 ┋13 x┋
A └┛ alt
S 15 ┋14 x┋
A └┛ alt
S 16 ┋15 x┋
A └┛ alt
S 17 ┋16 x┋
A └┛ alt
S 18 ┋17 x┋
A └┛ alt
S 19 ┋18 x┋
A └┛ alt
S 20 ┋19 x┋
A └┛ alt
S 21 ┋20 x┋
A └┛ alt
S 22 ┋21 x┋
A └┛ alt
S 23 ┋22 x┋
A └┛ alt
CSI Erase all
CSI Use normal screen buffer
CTRL restore cursor
S 24 ┋ ┋
A └ carriage-return
CSI Normal cursor keys
CTRL Normal keypad

View File

@ -115,12 +115,7 @@ TEST_CASE("ptime_fmt") {
TEST_CASE("rgb_color from string") {
string name = "SkyBlue1";
rgb_color color;
string errmsg;
bool rc;
rc = rgb_color::from_str(name, color, errmsg);
CHECK(rc);
auto color = rgb_color::from_str(name).unwrap();
CHECK(color.rc_r == 135);
CHECK(color.rc_g == 215);
CHECK(color.rc_b == 255);

View File

@ -1 +1,49 @@
read 1b29301b371b5b3f3437681b5b313b3234721b5b6d1b5b346c1b5b6d1b5b6d1b5b33376d1b5b34306d1b5b313b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b323b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b333b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b343b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b353b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b363b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b373b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b383b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b393b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b31303b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b31313b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b31323b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b31333b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b31343b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b31353b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b31363b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b31373b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b31383b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b31393b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b32303b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b32313b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b32323b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b32333b314820202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020201b5b32343b3148202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020200820081b5b3468201b5b346c1b5b481b5b33376d1b5b34306d506c61696e20746578740d0a1b5b376d20202020202020201b5b6d1b5b33376d1b5b34306d4c656164696e67207461620d0a541b5b376d616220202020201b5b6d1b5b33376d1b5b34306d7769746820746578740d0a5461621b5b376d20202020201b5b6d1b5b33376d1b5b34306d7769746820746578742023320d0a54657874201b5b33316d1b5b34306d77691b5b376d74681b5b33376d1b5b34306d206d691b5b6d1b5b33376d1b5b34306d78656420617474726962757465732e0d0a54657874207769746820756e69636f646520ffffffe2ffffff96ffffffb6201b5b376d636861721b5b6d1b5b33376d1b5b34306d6163746572730d0a1b5b6d1b5b6d1b5b33376d1b5b34306d1b5b6d1b5b3137421b5b4b1b5b32343b31481b5b324a1b5b3f34376c1b380d1b5b3f316c1b3e
CTRL Use alt charset
CTRL save cursor
CSI Use alternate screen buffer
CSI set scrolling region 1-24
S -1 ┋ ┋
A └ normal
CSI Replace mode
S -1 ┋ ┋
A └ normal, normal, normal
CSI Erase all
S 1 ┋Plain text ┋
A ··········└ carriage-return
S 2 ┋ Leading tab ┋
A └ inverse │
A ········└ normal │
A ···················└ carriage-return
S 3 ┋Tab with text ┋
A ·└ inverse │
A ········└ normal │
A ·················└ carriage-return
S 4 ┋Tab with text #2 ┋
A ···└ inverse │
A ········└ normal │
A ····················└ carriage-return
S 5 ┋Two tabs with text ┋
A ········└ inverse │ │
A ··········└ normal │ │
A ················└ inverse│
A ····················└ normal
A ·························└ carriage-return
S 6 ┋Text with mixed attributes. ┋
A ·····└ fg(#800000) │
A ·······└ inverse │
A ·········└ normal │
A ············└ normal │
A ···························└ carriage-return
S 7 ┋Text with unicode ▶ characters ┋
A ····················└ inverse │
A ························└ normal
A ······························└ carriage-return
S 8 ┋ ┋
A └ normal
CSI Erase all
CSI Use normal screen buffer
CTRL restore cursor
S 24 ┋ ┋
A └ carriage-return
CSI Normal cursor keys
CTRL Normal keypad

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
#! /bin/bash
run_test ./scripty -n -r ${srcdir}/vt52_curses_input.0 \
-e ${srcdir}/vt52_curses_output.0 -- ./drive_vt52_curses < /dev/null
run_test ./scripty -n -e ${srcdir}/vt52_curses_input.0 \
-- ./drive_vt52_curses < /dev/null
on_error_fail_with "single line vt52 did not work?"

File diff suppressed because one or more lines are too long

View File

@ -1,38 +1,48 @@
sleep 0.867286
write 0d
sleep 0.141596
write 0d
sleep 0.188837
write 0d
sleep 0.177586
write 0d
sleep 0.159950
write 0d
sleep 0.158958
write 0d
sleep 0.164105
write 0d
sleep 0.176968
write 0d
sleep 0.165942
write 0d
sleep 0.187011
write 0d
sleep 0.167987
write 0d
sleep 0.173959
write 0d
sleep 0.176091
write 0d
sleep 0.180728
write 0d
sleep 0.172983
write 0d
sleep 0.167819
write 0d
sleep 0.165876
write 0d
sleep 0.175857
write 0d
sleep 0.183068
write 0d
CTRL Use alt charset
CTRL save cursor
CSI Use alternate screen buffer
CSI set scrolling region 1-24
S -1 ┋ ┋
A └ normal
CSI Replace mode
CSI Erase all
S 1 ┋Gruß ┋
K 0d
S 1 ┋ ┋
A ····└ carriage-return
K 0d
CSI Erase Below
K 0d
S 1 ┋de ┋
K 0d
S 1 ┋ ┋
A ··└ carriage-return
CSI Erase Below
K 0d
S 1 ┋1 ┋
K 0d
S 1 ┋ 2 ┋
K 0d
S 1 ┋ 3 ┋
K 0d
S 1 ┋ ┋
A ···└ carriage-return
CSI Erase Below
K 0d
S 1 ┋abc ┋
K 0d
S 1 ┋ ┋
A ···└ carriage-return
CSI Erase Below
K 0d
CTRL bell
K 0d
S 1 ┋acdef ┋
K 0d0d
CSI Erase all
CSI Use normal screen buffer
CTRL restore cursor
S 24 ┋ ┋
A └ carriage-return
CSI Normal cursor keys
CTRL Normal keypad