#include "line-ed.h" #include #include void alloc_empty_history_entry(struct line_ed *ed) { b_string *str = (b_string *)b_array_at( ed->l_history, b_array_size(ed->l_history) - 1); if (!str || b_string_get_size(str, B_STRLEN_NORMAL) > 0) { str = b_string_create(); b_array_append(ed->l_history, (b_object *)str); } ed->l_history_pos = b_array_size(ed->l_history) - 1; } void save_buf_to_history(struct line_ed *ed) { b_string *cur = (b_string *)b_array_get(ed->l_history, ed->l_history_pos); b_string_replace_all(cur, ed->l_buf); } void append_buf_to_history(struct line_ed *ed) { b_string *cur = (b_string *)b_array_get(ed->l_history, ed->l_history_pos); char s[] = {'\n', 0}; b_string_append_cstr(cur, s); b_string_append_cstr(cur, ed->l_buf); } void load_buf_from_history(struct line_ed *ed) { b_string *cur = (b_string *)b_array_at(ed->l_history, ed->l_history_pos); size_t len = MIN((size_t)(ed->l_buf_end - ed->l_buf - 1), b_string_get_size(cur, B_STRLEN_NORMAL)); memcpy(ed->l_buf, b_string_ptr(cur), len); ed->l_buf[len] = '\0'; unsigned int x = 0, y = 0; for (size_t i = 0; ed->l_buf[i]; i++) { if (ed->l_buf[i] == '\n') { x = 0; y++; } else { x++; } } ed->l_buf_ptr = ed->l_buf + len; ed->l_line_end = ed->l_buf_ptr; ed->l_cursor_x = x; ed->l_cursor_y = y; } const char *last_history_line(struct line_ed *ed) { size_t nlines = b_array_size(ed->l_history); if (nlines < 2) { return NULL; } b_string *last = (b_string *)b_array_at(ed->l_history, nlines - 2); return b_string_ptr(last); }