diff options
-rw-r--r-- | cache.c | 21 | ||||
-rw-r--r-- | chat.h | 8 | ||||
-rw-r--r-- | command.c | 4 | ||||
-rw-r--r-- | handle.c | 39 | ||||
-rw-r--r-- | window.c | 2 |
5 files changed, 37 insertions, 37 deletions
diff --git a/cache.c b/cache.c index a125944..30ebef4 100644 --- a/cache.c +++ b/cache.c @@ -36,11 +36,13 @@ struct Node { uint id; char *key; - enum Color color; + struct Entry entry; struct Node *prev; struct Node *next; }; +static const struct Entry DefaultEntry = { .color = Default }; + static uint gen; static struct Node *head; static struct Node *tail; @@ -50,7 +52,7 @@ static struct Node *alloc(uint id, const char *key) { if (!node) err(EX_OSERR, "calloc"); node->id = id; node->key = strdup(key); - node->color = Default; + node->entry = DefaultEntry; if (!node->key) err(EX_OSERR, "strdup"); return node; } @@ -105,13 +107,13 @@ static struct Node *insert(bool touch, uint id, const char *key) { } } -void cacheInsert(bool touch, uint id, const char *key) { - insert(touch, id, key); +struct Entry *cacheInsert(bool touch, uint id, const char *key) { + return &insert(touch, id, key)->entry; } -void cacheInsertColor(bool touch, uint id, const char *key, enum Color color) { - struct Node *node = insert(touch, id, key); - if (color != Default) node->color = color; +const struct Entry *cacheGet(uint id, const char *key) { + struct Node *node = find(id, key); + return (node ? &node->entry : &DefaultEntry); } void cacheReplace(bool touch, const char *old, const char *new) { @@ -126,11 +128,6 @@ void cacheReplace(bool touch, const char *old, const char *new) { } } -enum Color cacheColor(uint id, const char *key) { - struct Node *node = find(id, key); - return (node ? node->color : Default); -} - const char *cacheComplete(struct Cursor *curs, uint id, const char *prefix) { size_t len = strlen(prefix); if (curs->gen != gen) curs->node = NULL; diff --git a/chat.h b/chat.h index 1bc5f8f..aa2e6ab 100644 --- a/chat.h +++ b/chat.h @@ -396,14 +396,16 @@ int bufferReflow( struct Buffer *buffer, int cols, enum Heat thresh, size_t tail ); +struct Entry { + enum Color color; +}; struct Cursor { uint gen; struct Node *node; }; -void cacheInsert(bool touch, uint id, const char *key); -void cacheInsertColor(bool touch, uint id, const char *key, enum Color color); +struct Entry *cacheInsert(bool touch, uint id, const char *key); +const struct Entry *cacheGet(uint id, const char *key); void cacheReplace(bool touch, const char *old, const char *new); -enum Color cacheColor(uint id, const char *key); 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); diff --git a/command.c b/command.c index 0926c33..3acbe76 100644 --- a/command.c +++ b/command.c @@ -139,7 +139,7 @@ static void commandMsg(uint id, char *params) { char *nick = strsep(¶ms, " "); uint msg = idFor(nick); if (idColors[msg] == Default) { - idColors[msg] = cacheColor(id, nick); + idColors[msg] = cacheGet(id, nick)->color; } if (params) { splitMessage("PRIVMSG", msg, params); @@ -380,7 +380,7 @@ static void commandQuery(uint id, char *params) { if (!params) return; uint query = idFor(params); if (idColors[query] == Default) { - idColors[query] = cacheColor(id, params); + idColors[query] = cacheGet(id, params)->color; } windowShow(windowFor(query)); } diff --git a/handle.c b/handle.c index 2dfa3ae..4b5ff7f 100644 --- a/handle.c +++ b/handle.c @@ -372,13 +372,13 @@ static void handleJoin(struct Message *msg) { set(&self.host, msg->host); } idColors[id] = hash(msg->params[0]); - cacheInsertColor(true, None, msg->params[0], idColors[id]); + cacheInsert(true, None, msg->params[0])->color = idColors[id]; if (replies[ReplyJoin]) { windowShow(windowFor(id)); replies[ReplyJoin]--; } } - cacheInsertColor(true, id, msg->nick, hash(msg->user)); + cacheInsert(true, id, msg->nick)->color = hash(msg->user); if (msg->params[2] && !strcasecmp(msg->params[2], msg->nick)) { msg->params[2] = NULL; } @@ -432,14 +432,14 @@ static void handleKick(struct Message *msg) { require(msg, true, 2); uint id = idFor(msg->params[0]); bool kicked = !strcmp(msg->params[1], self.nick); - cacheInsertColor(true, id, msg->nick, hash(msg->user)); + cacheInsert(true, id, msg->nick)->color = hash(msg->user); urlScan(id, msg->nick, msg->params[2]); uiFormat( id, (kicked ? Hot : Cold), tagTime(msg), "%s\3%02d%s\17\tkicks \3%02d%s\3 out of \3%02d%s\3%s%s", (kicked ? "\26" : ""), hash(msg->user), msg->nick, - cacheColor(id, msg->params[1]), msg->params[1], + cacheGet(id, msg->params[1])->color, msg->params[1], hash(msg->params[0]), msg->params[0], (msg->params[2] ? ": " : ""), (msg->params[2] ?: "") ); @@ -555,7 +555,7 @@ static void handleErrorUserOnChannel(struct Message *msg) { uiFormat( id, Warm, tagTime(msg), "\3%02d%s\3 is already in \3%02d%s\3", - cacheColor(id, msg->params[1]), msg->params[1], + cacheGet(id, msg->params[1])->color, msg->params[1], hash(msg->params[2]), msg->params[2] ); } @@ -571,7 +571,8 @@ static void handleReplyNames(struct Message *msg) { char *nick = &prefixes[strspn(prefixes, network.prefixes)]; char *user = strsep(&name, "@"); enum Color color = (user ? hash(user) : Default); - cacheInsertColor(false, id, nick, color); + struct Entry *entry = cacheInsert(false, id, nick); + if (user) entry->color = color; if (!replies[ReplyNames] && !replies[ReplyNamesAuto]) continue; ptr = seprintf( ptr, end, "%s\3%02d%s\3", (ptr > buf ? ", " : ""), color, prefixes @@ -897,7 +898,7 @@ static void handleMode(struct Message *msg) { id, Cold, tagTime(msg), "\3%02d%s\3\t%s \3%02d%c%s\3 %s%s in \3%02d%s\3", hash(msg->user), msg->nick, verb, - cacheColor(id, nick), prefix, nick, + cacheGet(id, nick)->color, prefix, nick, mode, name, hash(msg->params[0]), msg->params[0] ); logFormat( @@ -1035,7 +1036,7 @@ static void handleReplyBanList(struct Message *msg) { id, Warm, tagTime(msg), "Banned from \3%02d%s\3 since %s by \3%02d%s\3: %s", hash(msg->params[1]), msg->params[1], - since, cacheColor(id, msg->params[3]), msg->params[3], + since, cacheGet(id, msg->params[3])->color, msg->params[3], msg->params[2] ); } else { @@ -1058,7 +1059,7 @@ static void onList(const char *list, struct Message *msg) { id, Warm, tagTime(msg), "On the \3%02d%s\3 %s list since %s by \3%02d%s\3: %s", hash(msg->params[1]), msg->params[1], list, - since, cacheColor(id, msg->params[3]), msg->params[3], + since, cacheGet(id, msg->params[3])->color, msg->params[3], msg->params[2] ); } else { @@ -1091,7 +1092,7 @@ static void handleReplyList(struct Message *msg) { static void handleReplyWhoisUser(struct Message *msg) { require(msg, false, 6); - cacheInsertColor(true, Network, msg->params[1], hash(msg->params[2])); + cacheInsert(true, Network, msg->params[1])->color = hash(msg->params[2]); uiFormat( Network, Warm, tagTime(msg), "\3%02d%s\3\tis %s!%s@%s (%s\17)", @@ -1106,7 +1107,7 @@ static void handleReplyWhoisServer(struct Message *msg) { uiFormat( Network, Warm, tagTime(msg), "\3%02d%s\3\t%s connected to %s (%s)", - cacheColor(Network, msg->params[1]), msg->params[1], + cacheGet(Network, msg->params[1])->color, msg->params[1], (replies[ReplyWhowas] ? "was" : "is"), msg->params[2], msg->params[3] ); } @@ -1130,7 +1131,7 @@ static void handleReplyWhoisIdle(struct Message *msg) { uiFormat( Network, Warm, tagTime(msg), "\3%02d%s\3\tis idle for %lu %s%s%s%s", - cacheColor(Network, msg->params[1]), msg->params[1], + cacheGet(Network, msg->params[1])->color, msg->params[1], idle, unit, (idle != 1 ? "s" : ""), (msg->params[3] ? ", signed on " : ""), (msg->params[3] ? signon : "") ); @@ -1152,7 +1153,7 @@ static void handleReplyWhoisChannels(struct Message *msg) { uiFormat( Network, Warm, tagTime(msg), "\3%02d%s\3\tis in %s", - cacheColor(Network, msg->params[1]), msg->params[1], buf + cacheGet(Network, msg->params[1])->color, msg->params[1], buf ); } @@ -1166,7 +1167,7 @@ static void handleReplyWhoisGeneric(struct Message *msg) { uiFormat( Network, Warm, tagTime(msg), "\3%02d%s\3\t%s%s%s", - cacheColor(Network, msg->params[1]), msg->params[1], + cacheGet(Network, msg->params[1])->color, msg->params[1], msg->params[2], (msg->params[3] ? " " : ""), (msg->params[3] ?: "") ); } @@ -1180,7 +1181,7 @@ static void handleReplyEndOfWhois(struct Message *msg) { static void handleReplyWhowasUser(struct Message *msg) { require(msg, false, 6); - cacheInsertColor(true, Network, msg->params[1], hash(msg->params[2])); + cacheInsert(true, Network, msg->params[1])->color = hash(msg->params[2]); uiFormat( Network, Warm, tagTime(msg), "\3%02d%s\3\twas %s!%s@%s (%s)", @@ -1200,7 +1201,7 @@ static void handleReplyAway(struct Message *msg) { require(msg, false, 3); // Might be part of a WHOIS response. uint id; - if (cacheColor(Network, msg->params[1]) != Default) { + if (cacheGet(Network, msg->params[1])->color != Default) { id = Network; } else { id = idFor(msg->params[1]); @@ -1208,7 +1209,7 @@ static void handleReplyAway(struct Message *msg) { uiFormat( id, (id == Network ? Warm : Cold), tagTime(msg), "\3%02d%s\3\tis away: %s", - cacheColor(id, msg->params[1]), msg->params[1], msg->params[2] + cacheGet(id, msg->params[1])->color, msg->params[1], msg->params[2] ); logFormat( id, tagTime(msg), "%s is away: %s", @@ -1279,7 +1280,7 @@ static char *colorMentions(char *ptr, char *end, uint id, const char *msg) { size_t len = strcspn(msg, ",:<> "); char *p = seprintf(ptr, end, "%.*s", (int)len, msg); - enum Color color = cacheColor(id, ptr); + enum Color color = cacheGet(id, ptr)->color; if (color != Default) { ptr = seprintf(ptr, end, "\3%02d%.*s\3", color, (int)len, msg); } else { @@ -1319,7 +1320,7 @@ static void handlePrivmsg(struct Message *msg) { heat = filterCheck(heat, id, msg); if (heat > Warm && !mine && !query) highlight = true; if (!notice && !mine && heat > Ice) { - cacheInsertColor(true, id, msg->nick, hash(msg->user)); + cacheInsert(true, id, msg->nick)->color = hash(msg->user); } if (heat > Ice) urlScan(id, msg->nick, msg->params[1]); diff --git a/window.c b/window.c index 72a3571..0c675e9 100644 --- a/window.c +++ b/window.c @@ -118,7 +118,7 @@ uint windowFor(uint id) { window->thresh = windowThreshold; } window->buffer = bufferAlloc(); - cacheInsertColor(false, None, idNames[id], idColors[id]); + cacheInsert(false, None, idNames[id])->color = idColors[id]; return windowPush(window); } |