Implement cycling tab complete

Not properly hooked up to the UI yet.
master
Curtis McEnroe 2018-08-07 22:40:05 -04:00
parent ee49c36655
commit 43eee8da71
No known key found for this signature in database
GPG Key ID: CEA2F97ADCFCD77C
2 changed files with 39 additions and 7 deletions

3
chat.h
View File

@ -64,6 +64,9 @@ void input(char *line);
void tabTouch(const char *word); void tabTouch(const char *word);
void tabRemove(const char *word); void tabRemove(const char *word);
void tabReplace(const char *prev, const char *next); void tabReplace(const char *prev, const char *next);
const char *tabNext(const char *prefix);
void tabAccept(void);
void tabReject(void);
wchar_t *ambstowcs(const char *src); wchar_t *ambstowcs(const char *src);
char *awcstombs(const wchar_t *src); char *awcstombs(const wchar_t *src);

43
tab.c
View File

@ -40,12 +40,16 @@ static void remove(struct Entry *entry) {
if (head == entry) head = entry->next; if (head == entry) head = entry->next;
} }
void tabTouch(const char *word) { static void touch(struct Entry *entry) {
for (struct Entry *entry = head; entry; entry = entry->next) {
if (strcmp(entry->word, word)) continue;
if (head == entry) return; if (head == entry) return;
remove(entry); remove(entry);
prepend(entry); prepend(entry);
}
void tabTouch(const char *word) {
for (struct Entry *entry = head; entry; entry = entry->next) {
if (strcmp(entry->word, word)) continue;
touch(entry);
return; return;
} }
@ -55,18 +59,43 @@ void tabTouch(const char *word) {
prepend(entry); prepend(entry);
} }
void tabReplace(const char *prev, const char *next) {
tabTouch(prev);
free(head->word);
head->word = strdup(next);
}
static struct Entry *match;
void tabRemove(const char *word) { void tabRemove(const char *word) {
for (struct Entry *entry = head; entry; entry = entry->next) { for (struct Entry *entry = head; entry; entry = entry->next) {
if (strcmp(entry->word, word)) continue; if (strcmp(entry->word, word)) continue;
remove(entry); remove(entry);
if (match == entry) match = entry->next;
free(entry->word); free(entry->word);
free(entry); free(entry);
return; return;
} }
} }
void tabReplace(const char *prev, const char *next) { const char *tabNext(const char *prefix) {
tabTouch(prev); size_t len = strlen(prefix);
free(head->word); struct Entry *start = (match ? match->next : head);
head->word = strdup(next); for (struct Entry *entry = start; entry; entry = entry->next) {
if (strncasecmp(entry->word, prefix, len)) continue;
match = entry;
return entry->word;
}
if (!match) return NULL;
match = NULL;
return tabNext(prefix);
}
void tabAccept(void) {
if (match) touch(match);
match = NULL;
}
void tabReject(void) {
match = NULL;
} }