mirror of
https://github.com/javalsai/lidm.git
synced 2025-09-03 11:48:00 +02:00
feat: utf8 support & partial ui.c refactor
This commit is contained in:
75
src/efield.c
75
src/efield.c
@@ -2,78 +2,83 @@
|
||||
|
||||
#include "efield.h"
|
||||
#include "ui.h"
|
||||
#include "util.h"
|
||||
|
||||
// NOLINTBEGIN(clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling)
|
||||
|
||||
struct editable_field field_new(char* content) {
|
||||
struct editable_field efield_new(char* content) {
|
||||
struct editable_field efield;
|
||||
if (content != NULL) {
|
||||
efield.length = efield.pos = strlen(content);
|
||||
memcpy(efield.content, content, efield.length);
|
||||
efield.pos = strlen(content);
|
||||
memcpy(efield.content, content, strlen(content) + 1);
|
||||
} else {
|
||||
field_trim(&efield, 0);
|
||||
efield_trim(&efield, 0);
|
||||
}
|
||||
efield.content[efield.length] = '\0';
|
||||
|
||||
return efield;
|
||||
}
|
||||
|
||||
void field_trim(struct editable_field* self, u_char pos) {
|
||||
self->length = self->pos = pos;
|
||||
self->content[self->length] = '\0';
|
||||
void efield_trim(struct editable_field* self, u_char pos) {
|
||||
self->pos = pos;
|
||||
self->content[pos + 1] = '\0';
|
||||
}
|
||||
|
||||
// NOLINTNEXTLINE(modernize-macro-to-enum)
|
||||
#define BACKSPACE_CODE 127
|
||||
void field_update(struct editable_field* self, char* update) {
|
||||
void efield_update(struct editable_field* self, char* update) {
|
||||
u_char insert_len = strlen(update);
|
||||
if (insert_len == 0) return;
|
||||
|
||||
if (self->pos > self->length) self->pos = self->length; // WTF
|
||||
if (self->pos > strlen(self->content))
|
||||
self->pos = strlen(self->content); // WTF tho
|
||||
|
||||
if (insert_len == 1) {
|
||||
// backspace
|
||||
if (*update == BACKSPACE_CODE) {
|
||||
if (self->pos == 0) return;
|
||||
if (self->pos < self->length) {
|
||||
memmove(&self->content[self->pos - 1], &self->content[self->pos],
|
||||
self->length - self->pos);
|
||||
}
|
||||
(self->pos)--;
|
||||
(self->length)--;
|
||||
self->content[self->length] = '\0';
|
||||
char* curr = &self->content[self->pos];
|
||||
char* prev = utf8back(curr);
|
||||
memmove(prev, curr, strlen(self->content) - self->pos + 1);
|
||||
|
||||
self->pos -= curr - prev;
|
||||
return;
|
||||
}
|
||||
// TODO: Del
|
||||
}
|
||||
|
||||
// append
|
||||
if (self->length + self->pos >= 255) {
|
||||
if (strlen(update) + self->pos + 1 >= 255) {
|
||||
print_err("field too long");
|
||||
}
|
||||
if (self->pos < self->length) {
|
||||
// move with immediate buffer
|
||||
memmove(&self->content[self->pos + insert_len], &self->content[self->pos],
|
||||
self->length - self->pos);
|
||||
}
|
||||
|
||||
// move the after pos, including nullbyte
|
||||
memmove(&self->content[self->pos + insert_len], &self->content[self->pos],
|
||||
strlen(self->content) - self->pos + 1);
|
||||
memcpy(&self->content[self->pos], update, insert_len);
|
||||
|
||||
self->pos += insert_len;
|
||||
self->length += insert_len;
|
||||
self->content[self->length] = '\0';
|
||||
}
|
||||
|
||||
// returns bool depending if it was able to "use" the seek
|
||||
bool field_seek(struct editable_field* self, char seek) {
|
||||
if (self->length == 0) return false;
|
||||
bool efield_seek(struct editable_field* self, char seek) {
|
||||
if (strlen(self->content) == 0) return false;
|
||||
|
||||
if (seek < 0 && -seek > self->pos)
|
||||
self->pos = 0;
|
||||
else if (seek > 0 && 255 - self->pos < seek)
|
||||
self->pos = 255;
|
||||
else
|
||||
self->pos += seek;
|
||||
u_char count = seek;
|
||||
if (seek < 0) {
|
||||
count = -seek;
|
||||
}
|
||||
|
||||
if (self->pos > self->length) self->pos = self->length;
|
||||
char* orig = &self->content[self->pos];
|
||||
char* ptr = orig;
|
||||
while (ptr > self->content && orig > 0 && *ptr != '\0') {
|
||||
if (seek < 0)
|
||||
ptr = utf8back(ptr);
|
||||
else
|
||||
ptr = utf8seek(ptr);
|
||||
count--;
|
||||
}
|
||||
|
||||
return true;
|
||||
return ptr != orig;
|
||||
}
|
||||
|
||||
// NOLINTEND(clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling)
|
||||
|
Reference in New Issue
Block a user