summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJune McEnroe2022-07-30 15:25:25 -0400
committerJune McEnroe2022-07-30 15:25:25 -0400
commit8d654bc3a4142e85bc05516b656f2bb4b67ba8d7 (patch)
tree0349a4a2637dbbe54729e035c4aa3356d9ae5517
parent34c440779731759ecf92a62e7b1f84756bcb78ae (diff)
Refactor colorMentions to be seprintf-like
-rw-r--r--handle.c84
1 files changed, 40 insertions, 44 deletions
diff --git a/handle.c b/handle.c
index 4b667c7..21d3c39 100644
--- a/handle.c
+++ b/handle.c
@@ -1255,42 +1255,37 @@ static bool isMention(const struct Message *msg) {
return false;
}
-static void colorMentions(char *buf, size_t cap, uint id, struct Message *msg) {
- *buf = '\0';
-
- char *split = strstr(msg->params[1], ": ");
+static char *colorMentions(char *ptr, char *end, uint id, const char *msg) {
+ // Consider words before a colon, or only the first two.
+ const char *split = strstr(msg, ": ");
if (!split) {
- split = strchr(msg->params[1], ' ');
+ split = strchr(msg, ' ');
if (split) split = strchr(&split[1], ' ');
}
- if (!split) split = &msg->params[1][strlen(msg->params[1])];
- for (char *ch = msg->params[1]; ch < split; ++ch) {
- if (iscntrl(*ch)) return;
+ if (!split) split = &msg[strlen(msg)];
+ // Bail if there is existing formatting.
+ for (const char *ch = msg; ch < split; ++ch) {
+ if (iscntrl(*ch)) goto rest;
}
- char delimit = *split;
- char *mention = msg->params[1];
- msg->params[1] = (delimit ? &split[1] : split);
- *split = '\0';
- char *ptr = buf, *end = &buf[cap];
- while (*mention) {
- size_t skip = strspn(mention, ",<> ");
- ptr = seprintf(ptr, end, "%.*s", (int)skip, mention);
- mention += skip;
-
- size_t len = strcspn(mention, ",<> ");
- char punct = mention[len];
- mention[len] = '\0';
- enum Color color = completeColor(id, mention);
+ while (msg < split) {
+ size_t skip = strspn(msg, ",:<> ");
+ ptr = seprintf(ptr, end, "%.*s", (int)skip, msg);
+ msg += skip;
+
+ size_t len = strcspn(msg, ",:<> ");
+ char *p = seprintf(ptr, end, "%.*s", (int)len, msg);
+ enum Color color = completeColor(id, ptr);
if (color != Default) {
- ptr = seprintf(ptr, end, "\3%02d%s\3", color, mention);
+ ptr = seprintf(ptr, end, "\3%02d%.*s\3", color, (int)len, msg);
} else {
- ptr = seprintf(ptr, end, "%s", mention);
+ ptr = p;
}
- mention[len] = punct;
- mention += len;
+ msg += len;
}
- seprintf(ptr, end, "%c", delimit);
+
+rest:
+ return seprintf(ptr, end, "%s", msg);
}
static void handlePrivmsg(struct Message *msg) {
@@ -1314,7 +1309,8 @@ static void handlePrivmsg(struct Message *msg) {
bool notice = (msg->cmd[0] == 'N');
bool action = !notice && isAction(msg);
bool highlight = !mine && isMention(msg);
- enum Heat heat = filterCheck((highlight || query ? Hot : Warm), id, msg);
+ enum Heat heat = (!notice && (highlight || query) ? Hot : Warm);
+ heat = filterCheck(heat, id, msg);
if (heat > Warm && !mine && !query) highlight = true;
if (!notice && !mine && heat > Ice) {
completeTouch(id, msg->nick, hash(msg->user));
@@ -1322,34 +1318,34 @@ static void handlePrivmsg(struct Message *msg) {
if (heat > Ice) urlScan(id, msg->nick, msg->params[1]);
char buf[1024];
+ char *ptr = buf, *end = &buf[sizeof(buf)];
if (notice) {
if (id != Network) {
logFormat(id, tagTime(msg), "-%s- %s", msg->nick, msg->params[1]);
}
- uiFormat(
- id, filterCheck(Warm, id, msg), tagTime(msg),
- "\3%d-%s-\3%d\t%s",
- hash(msg->user), msg->nick, LightGray, msg->params[1]
+ ptr = seprintf(
+ ptr, end, "\3%d-%s-\3%d\t",
+ hash(msg->user), msg->nick, LightGray
);
} else if (action) {
logFormat(id, tagTime(msg), "* %s %s", msg->nick, msg->params[1]);
- colorMentions(buf, sizeof(buf), id, msg);
- uiFormat(
- id, heat, tagTime(msg),
- "%s\35\3%d* %s\17\35\t%s%s",
- (highlight ? "\26" : ""), hash(msg->user), msg->nick,
- buf, msg->params[1]
+ ptr = seprintf(
+ ptr, end, "%s\35\3%d* %s\17\35\t",
+ (highlight ? "\26" : ""), hash(msg->user), msg->nick
);
} else {
logFormat(id, tagTime(msg), "<%s> %s", msg->nick, msg->params[1]);
- colorMentions(buf, sizeof(buf), id, msg);
- uiFormat(
- id, heat, tagTime(msg),
- "%s\3%d<%s>\17\t%s%s",
- (highlight ? "\26" : ""), hash(msg->user), msg->nick,
- buf, msg->params[1]
+ ptr = seprintf(
+ ptr, end, "%s\3%d<%s>\17\t",
+ (highlight ? "\26" : ""), hash(msg->user), msg->nick
);
}
+ if (notice) {
+ ptr = seprintf(ptr, end, "%s", msg->params[1]);
+ } else {
+ ptr = colorMentions(ptr, end, id, msg->params[1]);
+ }
+ uiWrite(id, heat, tagTime(msg), buf);
}
static void handlePing(struct Message *msg) {