(#354) Integrate history with console
parent
cb1713d393
commit
5acfea07dc
|
@ -165,6 +165,7 @@ int console_handle_event(Console *console,
|
||||||
case SDLK_RETURN: {
|
case SDLK_RETURN: {
|
||||||
const char *source_code = edit_field_as_text(console->edit_field);
|
const char *source_code = edit_field_as_text(console->edit_field);
|
||||||
|
|
||||||
|
/* TODO: console pushes empty strings to the history */
|
||||||
if (history_push(console->history, source_code) < 0) {
|
if (history_push(console->history, source_code) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -209,6 +210,20 @@ int console_handle_event(Console *console,
|
||||||
gc_collect(console->gc, console->scope.expr);
|
gc_collect(console->gc, console->scope.expr);
|
||||||
edit_field_clean(console->edit_field);
|
edit_field_clean(console->edit_field);
|
||||||
} return 0;
|
} return 0;
|
||||||
|
|
||||||
|
case SDLK_UP: {
|
||||||
|
edit_field_replace(
|
||||||
|
console->edit_field,
|
||||||
|
history_current(console->history));
|
||||||
|
history_prev(console->history);
|
||||||
|
} return 0;
|
||||||
|
|
||||||
|
case SDLK_DOWN: {
|
||||||
|
edit_field_replace(
|
||||||
|
console->edit_field,
|
||||||
|
history_current(console->history));
|
||||||
|
history_next(console->history);
|
||||||
|
} return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,7 +245,16 @@ static void edit_field_insert_char(Edit_field *edit_field, char c)
|
||||||
|
|
||||||
void edit_field_clean(Edit_field *edit_field)
|
void edit_field_clean(Edit_field *edit_field)
|
||||||
{
|
{
|
||||||
|
assert(edit_field);
|
||||||
|
|
||||||
edit_field->cursor = 0;
|
edit_field->cursor = 0;
|
||||||
edit_field->buffer_size = 0;
|
edit_field->buffer_size = 0;
|
||||||
edit_field->buffer[0] = 0;
|
edit_field->buffer[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void edit_field_replace(Edit_field *edit_field, const char *text)
|
||||||
|
{
|
||||||
|
assert(edit_field);
|
||||||
|
assert(text);
|
||||||
|
/* TODO: edit_field_replace is not implemented */
|
||||||
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ int edit_field_handle_event(Edit_field *edit_field,
|
||||||
|
|
||||||
const char *edit_field_as_text(const Edit_field *edit_field);
|
const char *edit_field_as_text(const Edit_field *edit_field);
|
||||||
|
|
||||||
|
void edit_field_replace(Edit_field *edit_field, const char *text);
|
||||||
void edit_field_clean(Edit_field *edit_field);
|
void edit_field_clean(Edit_field *edit_field);
|
||||||
|
|
||||||
#endif // EDIT_FIELD_H_
|
#endif // EDIT_FIELD_H_
|
||||||
|
|
|
@ -12,8 +12,9 @@ struct History
|
||||||
Lt *lt;
|
Lt *lt;
|
||||||
|
|
||||||
char **buffer;
|
char **buffer;
|
||||||
size_t cursor;
|
size_t begin;
|
||||||
size_t capacity;
|
size_t capacity;
|
||||||
|
size_t cursor;
|
||||||
};
|
};
|
||||||
|
|
||||||
History *create_history(size_t capacity)
|
History *create_history(size_t capacity)
|
||||||
|
@ -34,6 +35,7 @@ History *create_history(size_t capacity)
|
||||||
history->lt = lt;
|
history->lt = lt;
|
||||||
|
|
||||||
history->capacity = capacity;
|
history->capacity = capacity;
|
||||||
|
history->begin = 0;
|
||||||
history->cursor = 0;
|
history->cursor = 0;
|
||||||
|
|
||||||
history->buffer = PUSH_LT(lt, calloc(capacity, sizeof(char*)), free);
|
history->buffer = PUSH_LT(lt, calloc(capacity, sizeof(char*)), free);
|
||||||
|
@ -63,25 +65,42 @@ int history_push(History *history, const char *command)
|
||||||
assert(history);
|
assert(history);
|
||||||
assert(command);
|
assert(command);
|
||||||
|
|
||||||
const size_t next_cursor = (history->cursor + 1) % history->capacity;
|
const size_t next_begin = (history->begin + 1) % history->capacity;
|
||||||
|
|
||||||
if (history->buffer[history->cursor] != NULL) {
|
if (history->buffer[history->begin] != NULL) {
|
||||||
free(history->buffer[history->cursor]);
|
free(history->buffer[history->begin]);
|
||||||
}
|
}
|
||||||
|
|
||||||
history->buffer[history->cursor] = string_duplicate(command, NULL);
|
history->buffer[history->begin] = string_duplicate(command, NULL);
|
||||||
|
|
||||||
if (history->buffer[history->cursor] == NULL) {
|
if (history->buffer[history->begin] == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
history->cursor = next_cursor;
|
history->begin = next_begin;
|
||||||
|
history->cursor = next_begin;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *history_get(History *history, size_t i)
|
const char *history_current(History *history)
|
||||||
{
|
{
|
||||||
assert(history);
|
assert(history);
|
||||||
return history->buffer[(history->cursor + i) % history->capacity];
|
return history->buffer[history->cursor];
|
||||||
|
}
|
||||||
|
|
||||||
|
void history_prev(History *history)
|
||||||
|
{
|
||||||
|
assert(history);
|
||||||
|
if (history->cursor == 0) {
|
||||||
|
history->cursor = history->capacity - 1;
|
||||||
|
} else {
|
||||||
|
history->cursor--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void history_next(History *history)
|
||||||
|
{
|
||||||
|
assert(history);
|
||||||
|
history->cursor = (history->cursor + 1) % history->capacity;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,8 @@ History *create_history(size_t capacity);
|
||||||
void destroy_history(History *history);
|
void destroy_history(History *history);
|
||||||
|
|
||||||
int history_push(History *history, const char *command);
|
int history_push(History *history, const char *command);
|
||||||
const char *history_get(History *history, size_t i);
|
const char *history_current(History *history);
|
||||||
|
void history_prev(History *history);
|
||||||
|
void history_next(History *history);
|
||||||
|
|
||||||
#endif // HISTORY_H_
|
#endif // HISTORY_H_
|
||||||
|
|
Loading…
Reference in New Issue