hikari/src/input_buffer.c

126 lines
2.5 KiB
C
Raw Permalink Normal View History

2020-02-05 04:02:33 -06:00
#include <hikari/input_buffer.h>
#include <assert.h>
#include <ctype.h>
#include <stdbool.h>
2020-02-05 04:02:33 -06:00
#include <string.h>
#include <hikari/utf8.h>
static bool
is_empty(struct hikari_input_buffer *input_buffer)
{
2024-02-24 01:00:11 -06:00
size_t pos = input_buffer->pos;
2024-02-24 01:00:11 -06:00
assert(pos == 0 ? input_buffer->buffer[0] == '\0' : true);
2024-02-24 01:00:11 -06:00
return pos == 0;
}
static bool
current_char(struct hikari_input_buffer *input_buffer, char *current)
{
2024-02-24 01:00:11 -06:00
size_t pos = input_buffer->pos;
if (is_empty(input_buffer)) {
return false;
} else {
*current = input_buffer->buffer[pos - 1];
return true;
}
}
2020-02-05 04:02:33 -06:00
struct hikari_input_buffer *
hikari_input_buffer_init(
2024-02-24 01:00:11 -06:00
struct hikari_input_buffer *input_buffer, char *content)
2020-02-05 04:02:33 -06:00
{
2024-02-24 01:00:11 -06:00
strncpy(input_buffer->buffer, content, sizeof(input_buffer->buffer) - 1);
2020-02-05 04:02:33 -06:00
2024-02-24 01:00:11 -06:00
input_buffer->pos =
strnlen(input_buffer->buffer, sizeof(input_buffer->buffer));
2020-02-05 04:02:33 -06:00
2024-02-24 01:00:11 -06:00
return input_buffer;
2020-02-05 04:02:33 -06:00
}
void
hikari_input_buffer_add_char(
2024-02-24 01:00:11 -06:00
struct hikari_input_buffer *input_buffer, char input)
2020-02-05 04:02:33 -06:00
{
2024-02-24 01:00:11 -06:00
if (input_buffer->pos == sizeof(input_buffer->buffer) - 1) {
return;
}
2020-02-05 04:02:33 -06:00
2024-02-24 01:00:11 -06:00
input_buffer->buffer[input_buffer->pos] = input;
input_buffer->pos++;
2020-02-05 04:02:33 -06:00
}
void
hikari_input_buffer_add_utf32_char(
2024-02-24 01:00:11 -06:00
struct hikari_input_buffer *input_buffer, uint32_t codepoint)
2020-02-05 04:02:33 -06:00
{
2024-02-24 01:00:11 -06:00
size_t length = utf8_chsize(codepoint);
2020-02-05 04:02:33 -06:00
2024-02-24 01:00:11 -06:00
if (input_buffer->pos + length > sizeof(input_buffer->buffer) - 1) {
return;
}
2020-02-05 04:02:33 -06:00
2024-02-24 01:00:11 -06:00
utf8_encode(&input_buffer->buffer[input_buffer->pos], length, codepoint);
input_buffer->pos += length;
2020-02-05 04:02:33 -06:00
}
void
hikari_input_buffer_remove_char(struct hikari_input_buffer *input_buffer)
{
2024-02-24 01:00:11 -06:00
if (is_empty(input_buffer)) {
return;
}
2020-02-05 04:02:33 -06:00
2024-02-24 01:00:11 -06:00
input_buffer->pos--;
input_buffer->buffer[input_buffer->pos] = '\0';
2020-02-05 04:02:33 -06:00
}
void
hikari_input_buffer_remove_word(struct hikari_input_buffer *input_buffer)
{
2024-02-24 01:00:11 -06:00
if (is_empty(input_buffer)) {
return;
}
2024-02-24 01:00:11 -06:00
for (;;) {
hikari_input_buffer_remove_char(input_buffer);
2024-02-24 01:00:11 -06:00
char current;
bool has_char = current_char(input_buffer, &current);
2024-02-24 01:00:11 -06:00
if (!has_char || isspace(current)) {
break;
}
}
}
2020-02-05 04:02:33 -06:00
void
hikari_input_buffer_clear(struct hikari_input_buffer *input_buffer)
{
2024-02-24 01:00:11 -06:00
memset(input_buffer->buffer, 0, sizeof(input_buffer->buffer));
input_buffer->pos = 0;
2020-02-05 04:02:33 -06:00
}
void
hikari_input_buffer_replace(
2024-02-24 01:00:11 -06:00
struct hikari_input_buffer *input_buffer, char *content)
2020-02-05 04:02:33 -06:00
{
2024-02-24 01:00:11 -06:00
hikari_input_buffer_clear(input_buffer);
char *c = content;
2020-02-05 04:02:33 -06:00
2024-02-24 01:00:11 -06:00
for (int i = 0; i < sizeof(input_buffer->buffer) && *c != '\0'; i++) {
hikari_input_buffer_add_char(input_buffer, *c);
c++;
}
2020-02-05 04:02:33 -06:00
}
char *
hikari_input_buffer_read(struct hikari_input_buffer *input_buffer)
{
2024-02-24 01:00:11 -06:00
return input_buffer->buffer;
2020-02-05 04:02:33 -06:00
}