68 lines
1.6 KiB
C
68 lines
1.6 KiB
C
#include "line-ed.h"
|
|
|
|
#include <fx/ds/array.h>
|
|
#include <fx/ds/string.h>
|
|
|
|
void alloc_empty_history_entry(struct line_ed *ed)
|
|
{
|
|
fx_string *str = (fx_string *)fx_array_at(
|
|
ed->l_history, fx_array_size(ed->l_history) - 1);
|
|
if (!str || fx_string_get_size(str, FX_STRLEN_NORMAL) > 0) {
|
|
str = fx_string_create();
|
|
fx_array_append(ed->l_history, (fx_object *)str);
|
|
}
|
|
|
|
ed->l_history_pos = fx_array_size(ed->l_history) - 1;
|
|
}
|
|
|
|
void save_buf_to_history(struct line_ed *ed)
|
|
{
|
|
fx_string *cur = (fx_string *)fx_array_get(ed->l_history, ed->l_history_pos);
|
|
fx_string_replace_all(cur, ed->l_buf);
|
|
}
|
|
|
|
void append_buf_to_history(struct line_ed *ed)
|
|
{
|
|
fx_string *cur = (fx_string *)fx_array_get(ed->l_history, ed->l_history_pos);
|
|
char s[] = {'\n', 0};
|
|
fx_string_append_cstr(cur, s);
|
|
fx_string_append_cstr(cur, ed->l_buf);
|
|
}
|
|
|
|
void load_buf_from_history(struct line_ed *ed)
|
|
{
|
|
fx_string *cur = (fx_string *)fx_array_at(ed->l_history, ed->l_history_pos);
|
|
size_t len
|
|
= MIN((size_t)(ed->l_buf_end - ed->l_buf - 1),
|
|
fx_string_get_size(cur, FX_STRLEN_NORMAL));
|
|
|
|
memcpy(ed->l_buf, fx_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 = fx_array_size(ed->l_history);
|
|
if (nlines < 2) {
|
|
return NULL;
|
|
}
|
|
|
|
fx_string *last = (fx_string *)fx_array_at(ed->l_history, nlines - 2);
|
|
return fx_string_ptr(last);
|
|
}
|