parent
ee49c36655
commit
43eee8da71
3
chat.h
3
chat.h
|
@ -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
43
tab.c
|
@ -40,12 +40,16 @@ static void remove(struct Entry *entry) {
|
||||||
if (head == entry) head = entry->next;
|
if (head == entry) head = entry->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void touch(struct Entry *entry) {
|
||||||
|
if (head == entry) return;
|
||||||
|
remove(entry);
|
||||||
|
prepend(entry);
|
||||||
|
}
|
||||||
|
|
||||||
void tabTouch(const char *word) {
|
void tabTouch(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;
|
||||||
if (head == entry) return;
|
touch(entry);
|
||||||
remove(entry);
|
|
||||||
prepend(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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue