summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--cache.c79
-rw-r--r--chat.h10
-rw-r--r--handle.c6
3 files changed, 57 insertions, 38 deletions
diff --git a/cache.c b/cache.c
index 30ebef4..970bd9c 100644
--- a/cache.c
+++ b/cache.c
@@ -107,15 +107,15 @@ static struct Node *insert(bool touch, uint id, const char *key) {
 	}
 }
 
-struct Entry *cacheInsert(bool touch, uint id, const char *key) {
-	return &insert(touch, id, key)->entry;
-}
-
 const struct Entry *cacheGet(uint id, const char *key) {
 	struct Node *node = find(id, key);
 	return (node ? &node->entry : &DefaultEntry);
 }
 
+struct Entry *cacheInsert(bool touch, uint id, const char *key) {
+	return &insert(touch, id, key)->entry;
+}
+
 void cacheReplace(bool touch, const char *old, const char *new) {
 	struct Node *next = NULL;
 	for (struct Node *node = head; node; node = next) {
@@ -128,6 +128,32 @@ void cacheReplace(bool touch, const char *old, const char *new) {
 	}
 }
 
+void cacheRemove(uint id, const char *key) {
+	gen++;
+	struct Node *next = NULL;
+	for (struct Node *node = head; node; node = next) {
+		next = node->next;
+		if (id && node->id != id) continue;
+		if (strcmp(node->key, key)) continue;
+		detach(node);
+		free(node->key);
+		free(node);
+		if (id) break;
+	}
+}
+
+void cacheClear(uint id) {
+	gen++;
+	struct Node *next = NULL;
+	for (struct Node *node = head; node; node = next) {
+		next = node->next;
+		if (node->id != id) continue;
+		detach(node);
+		free(node->key);
+		free(node);
+	}
+}
+
 const char *cacheComplete(struct Cursor *curs, uint id, const char *prefix) {
 	size_t len = strlen(prefix);
 	if (curs->gen != gen) curs->node = NULL;
@@ -138,6 +164,7 @@ const char *cacheComplete(struct Cursor *curs, uint id, const char *prefix) {
 	) {
 		if (curs->node->id && curs->node->id != id) continue;
 		if (strncasecmp(curs->node->key, prefix, len)) continue;
+		curs->entry = &curs->node->entry;
 		return curs->node->key;
 	}
 	return NULL;
@@ -152,12 +179,27 @@ const char *cacheSearch(struct Cursor *curs, uint id, const char *substr) {
 	) {
 		if (curs->node->id && curs->node->id != id) continue;
 		if (!strstr(curs->node->key, substr)) continue;
+		curs->entry = &curs->node->entry;
 		return curs->node->key;
 	}
 	return NULL;
 }
 
-uint cacheID(struct Cursor *curs, const char *key) {
+const char *cacheNextKey(struct Cursor *curs, uint id) {
+	if (curs->gen != gen) curs->node = NULL;
+	for (
+		curs->gen = gen, curs->node = (curs->node ? curs->node->next : head);
+		curs->node;
+		curs->node = curs->node->next
+	) {
+		if (curs->node->id != id) continue;
+		curs->entry = &curs->node->entry;
+		return curs->node->key;
+	}
+	return NULL;
+}
+
+uint cacheNextID(struct Cursor *curs, const char *key) {
 	if (curs->gen != gen) curs->node = NULL;
 	for (
 		curs->gen = gen, curs->node = (curs->node ? curs->node->next : head);
@@ -166,6 +208,7 @@ uint cacheID(struct Cursor *curs, const char *key) {
 	) {
 		if (!curs->node->id) continue;
 		if (strcmp(curs->node->key, key)) continue;
+		curs->entry = &curs->node->entry;
 		return curs->node->id;
 	}
 	return None;
@@ -181,29 +224,3 @@ void cacheAccept(struct Cursor *curs) {
 void cacheReject(struct Cursor *curs) {
 	curs->node = NULL;
 }
-
-void cacheRemove(uint id, const char *key) {
-	gen++;
-	struct Node *next = NULL;
-	for (struct Node *node = head; node; node = next) {
-		next = node->next;
-		if (id && node->id != id) continue;
-		if (strcmp(node->key, key)) continue;
-		detach(node);
-		free(node->key);
-		free(node);
-		if (id) break;
-	}
-}
-
-void cacheClear(uint id) {
-	gen++;
-	struct Node *next = NULL;
-	for (struct Node *node = head; node; node = next) {
-		next = node->next;
-		if (node->id != id) continue;
-		detach(node);
-		free(node->key);
-		free(node);
-	}
-}
diff --git a/chat.h b/chat.h
index 628d416..c7053c7 100644
--- a/chat.h
+++ b/chat.h
@@ -403,17 +403,19 @@ struct Entry {
 struct Cursor {
 	uint gen;
 	struct Node *node;
+	struct Entry *entry;
 };
-struct Entry *cacheInsert(bool touch, uint id, const char *key);
 const struct Entry *cacheGet(uint id, const char *key);
+struct Entry *cacheInsert(bool touch, uint id, const char *key);
 void cacheReplace(bool touch, const char *old, const char *new);
+void cacheRemove(uint id, const char *key);
+void cacheClear(uint id);
 const char *cacheComplete(struct Cursor *curs, uint id, const char *prefix);
 const char *cacheSearch(struct Cursor *curs, uint id, const char *substr);
-uint cacheID(struct Cursor *curs, const char *key);
+uint cacheNextID(struct Cursor *curs, const char *key);
+const char *cacheNextKey(struct Cursor *curs, uint id);
 void cacheAccept(struct Cursor *curs);
 void cacheReject(struct Cursor *curs);
-void cacheRemove(uint id, const char *key);
-void cacheClear(uint id);
 
 extern struct Util urlOpenUtil;
 extern struct Util urlCopyUtil;
diff --git a/handle.c b/handle.c
index b8434c6..a075d02 100644
--- a/handle.c
+++ b/handle.c
@@ -459,7 +459,7 @@ static void handleNick(struct Message *msg) {
 		inputUpdate();
 	}
 	struct Cursor curs = {0};
-	for (uint id; (id = cacheID(&curs, msg->nick));) {
+	for (uint id; (id = cacheNextID(&curs, msg->nick));) {
 		if (!strcmp(idNames[id], msg->nick)) {
 			set(&idNames[id], msg->params[0]);
 		}
@@ -480,7 +480,7 @@ static void handleNick(struct Message *msg) {
 static void handleSetname(struct Message *msg) {
 	require(msg, true, 1);
 	struct Cursor curs = {0};
-	for (uint id; (id = cacheID(&curs, msg->nick));) {
+	for (uint id; (id = cacheNextID(&curs, msg->nick));) {
 		uiFormat(
 			id, filterCheck(Cold, id, msg), tagTime(msg),
 			"\3%02d%s\3\tis now known as \3%02d%s\3 (%s\17)",
@@ -493,7 +493,7 @@ static void handleSetname(struct Message *msg) {
 static void handleQuit(struct Message *msg) {
 	require(msg, true, 0);
 	struct Cursor curs = {0};
-	for (uint id; (id = cacheID(&curs, msg->nick));) {
+	for (uint id; (id = cacheNextID(&curs, msg->nick));) {
 		enum Heat heat = filterCheck(Cold, id, msg);
 		if (heat > Ice) urlScan(id, msg->nick, msg->params[0]);
 		uiFormat(