Move color selection to format.c
This commit is contained in:
		
							父節點
							
								
									117e6ac9d6
								
							
						
					
					
						當前提交
						0d7854c0d4
					
				
							
								
								
									
										1
									
								
								chat.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								chat.h
									
									
									
									
									
								
							@ -93,6 +93,7 @@ struct Format {
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
void formatReset(struct Format *format);
 | 
					void formatReset(struct Format *format);
 | 
				
			||||||
bool formatParse(struct Format *format, const wchar_t *split);
 | 
					bool formatParse(struct Format *format, const wchar_t *split);
 | 
				
			||||||
 | 
					enum IRCColor formatColor(const char *str);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void handle(char *line);
 | 
					void handle(char *line);
 | 
				
			||||||
void input(struct Tag tag, char *line);
 | 
					void input(struct Tag tag, char *line);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										25
									
								
								format.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								format.c
									
									
									
									
									
								
							@ -14,12 +14,33 @@
 | 
				
			|||||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
					 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <wchar.h>
 | 
					 | 
				
			||||||
#include <stdlib.h>
 | 
					 | 
				
			||||||
#include <stdbool.h>
 | 
					#include <stdbool.h>
 | 
				
			||||||
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <wchar.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "chat.h"
 | 
					#include "chat.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Adapted from <https://github.com/cbreeden/fxhash/blob/master/lib.rs>.
 | 
				
			||||||
 | 
					static uint32_t hashChar(uint32_t hash, char ch) {
 | 
				
			||||||
 | 
						hash = (hash << 5) | (hash >> 27);
 | 
				
			||||||
 | 
						hash ^= ch;
 | 
				
			||||||
 | 
						hash *= 0x27220A95;
 | 
				
			||||||
 | 
						return hash;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum IRCColor formatColor(const char *str) {
 | 
				
			||||||
 | 
						if (!str) return IRCDefault;
 | 
				
			||||||
 | 
						uint32_t hash = 0;
 | 
				
			||||||
 | 
						for (; str[0]; ++str) {
 | 
				
			||||||
 | 
							hash = hashChar(hash, str[0]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						while (IRCBlack == (hash & IRCLightGray)) {
 | 
				
			||||||
 | 
							hash = hashChar(hash, '\0');
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return (hash & IRCLightGray);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void formatReset(struct Format *format) {
 | 
					void formatReset(struct Format *format) {
 | 
				
			||||||
	format->bold = false;
 | 
						format->bold = false;
 | 
				
			||||||
	format->italic = false;
 | 
						format->italic = false;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										54
									
								
								handle.c
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								handle.c
									
									
									
									
									
								
							@ -17,7 +17,6 @@
 | 
				
			|||||||
#include <ctype.h>
 | 
					#include <ctype.h>
 | 
				
			||||||
#include <err.h>
 | 
					#include <err.h>
 | 
				
			||||||
#include <stdarg.h>
 | 
					#include <stdarg.h>
 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
@ -25,25 +24,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "chat.h"
 | 
					#include "chat.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Adapted from <https://github.com/cbreeden/fxhash/blob/master/lib.rs>.
 | 
					 | 
				
			||||||
static uint32_t hashChar(uint32_t hash, char ch) {
 | 
					 | 
				
			||||||
	hash = (hash << 5) | (hash >> 27);
 | 
					 | 
				
			||||||
	hash ^= ch;
 | 
					 | 
				
			||||||
	hash *= 0x27220A95;
 | 
					 | 
				
			||||||
	return hash;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
static int color(const char *str) {
 | 
					 | 
				
			||||||
	if (!str) return IRCGray;
 | 
					 | 
				
			||||||
	uint32_t hash = 0;
 | 
					 | 
				
			||||||
	for (; str[0]; ++str) {
 | 
					 | 
				
			||||||
		hash = hashChar(hash, str[0]);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	while (IRCBlack == (hash & IRCLightGray)) {
 | 
					 | 
				
			||||||
		hash = hashChar(hash, '\0');
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return (hash & IRCLightGray);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static char *paramField(char **params) {
 | 
					static char *paramField(char **params) {
 | 
				
			||||||
	char *rest = *params;
 | 
						char *rest = *params;
 | 
				
			||||||
	if (rest[0] == ':') {
 | 
						if (rest[0] == ':') {
 | 
				
			||||||
@ -163,7 +143,7 @@ static void handleJoin(char *prefix, char *params) {
 | 
				
			|||||||
	uiFmt(
 | 
						uiFmt(
 | 
				
			||||||
		tag, UICold,
 | 
							tag, UICold,
 | 
				
			||||||
		"\3%d%s\3 arrives in \3%d%s\3",
 | 
							"\3%d%s\3 arrives in \3%d%s\3",
 | 
				
			||||||
		color(user), nick, color(chan), chan
 | 
							formatColor(user), nick, formatColor(chan), chan
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
	logFmt(tag, NULL, "%s arrives in %s", nick, chan);
 | 
						logFmt(tag, NULL, "%s arrives in %s", nick, chan);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -184,14 +164,14 @@ static void handlePart(char *prefix, char *params) {
 | 
				
			|||||||
		uiFmt(
 | 
							uiFmt(
 | 
				
			||||||
			tag, UICold,
 | 
								tag, UICold,
 | 
				
			||||||
			"\3%d%s\3 leaves \3%d%s\3, \"%s\"",
 | 
								"\3%d%s\3 leaves \3%d%s\3, \"%s\"",
 | 
				
			||||||
			color(user), nick, color(chan), chan, dequote(mesg)
 | 
								formatColor(user), nick, formatColor(chan), chan, dequote(mesg)
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
		logFmt(tag, NULL, "%s leaves %s, \"%s\"", nick, chan, dequote(mesg));
 | 
							logFmt(tag, NULL, "%s leaves %s, \"%s\"", nick, chan, dequote(mesg));
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		uiFmt(
 | 
							uiFmt(
 | 
				
			||||||
			tag, UICold,
 | 
								tag, UICold,
 | 
				
			||||||
			"\3%d%s\3 leaves \3%d%s\3",
 | 
								"\3%d%s\3 leaves \3%d%s\3",
 | 
				
			||||||
			color(user), nick, color(chan), chan
 | 
								formatColor(user), nick, formatColor(chan), chan
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
		logFmt(tag, NULL, "%s leaves %s", nick, chan);
 | 
							logFmt(tag, NULL, "%s leaves %s", nick, chan);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -214,7 +194,9 @@ static void handleKick(char *prefix, char *params) {
 | 
				
			|||||||
		uiFmt(
 | 
							uiFmt(
 | 
				
			||||||
			tag, (kicked ? UIHot : UICold),
 | 
								tag, (kicked ? UIHot : UICold),
 | 
				
			||||||
			"\3%d%s\3 kicks \3%d%s\3 out of \3%d%s\3, \"%s\"",
 | 
								"\3%d%s\3 kicks \3%d%s\3 out of \3%d%s\3, \"%s\"",
 | 
				
			||||||
			color(user), nick, color(kick), kick, color(chan), chan,
 | 
								formatColor(user), nick,
 | 
				
			||||||
 | 
								formatColor(kick), kick,
 | 
				
			||||||
 | 
								formatColor(chan), chan,
 | 
				
			||||||
			dequote(mesg)
 | 
								dequote(mesg)
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
		logFmt(
 | 
							logFmt(
 | 
				
			||||||
@ -225,7 +207,9 @@ static void handleKick(char *prefix, char *params) {
 | 
				
			|||||||
		uiFmt(
 | 
							uiFmt(
 | 
				
			||||||
			tag, (kicked ? UIHot : UICold),
 | 
								tag, (kicked ? UIHot : UICold),
 | 
				
			||||||
			"\3%d%s\3 kicks \3%d%s\3 out of \3%d%s\3",
 | 
								"\3%d%s\3 kicks \3%d%s\3 out of \3%d%s\3",
 | 
				
			||||||
			color(user), nick, color(kick), kick, color(chan), chan
 | 
								formatColor(user), nick,
 | 
				
			||||||
 | 
								formatColor(kick), kick,
 | 
				
			||||||
 | 
								formatColor(chan), chan
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
		logFmt(tag, NULL, "%s kicks %s out of %s", nick, kick, chan);
 | 
							logFmt(tag, NULL, "%s kicks %s out of %s", nick, kick, chan);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -244,11 +228,11 @@ static void handleQuit(char *prefix, char *params) {
 | 
				
			|||||||
			uiFmt(
 | 
								uiFmt(
 | 
				
			||||||
				tag, UICold,
 | 
									tag, UICold,
 | 
				
			||||||
				"\3%d%s\3 leaves, \"%s\"",
 | 
									"\3%d%s\3 leaves, \"%s\"",
 | 
				
			||||||
				color(user), nick, dequote(mesg)
 | 
									formatColor(user), nick, dequote(mesg)
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
			logFmt(tag, NULL, "%s leaves, \"%s\"", nick, dequote(mesg));
 | 
								logFmt(tag, NULL, "%s leaves, \"%s\"", nick, dequote(mesg));
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			uiFmt(tag, UICold, "\3%d%s\3 leaves", color(user), nick);
 | 
								uiFmt(tag, UICold, "\3%d%s\3 leaves", formatColor(user), nick);
 | 
				
			||||||
			logFmt(tag, NULL, "%s leaves", nick);
 | 
								logFmt(tag, NULL, "%s leaves", nick);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -263,7 +247,7 @@ static void handleReplyTopic(char *prefix, char *params) {
 | 
				
			|||||||
	uiFmt(
 | 
						uiFmt(
 | 
				
			||||||
		tag, UICold,
 | 
							tag, UICold,
 | 
				
			||||||
		"The sign in \3%d%s\3 reads, \"%s\"",
 | 
							"The sign in \3%d%s\3 reads, \"%s\"",
 | 
				
			||||||
		color(chan), chan, topic
 | 
							formatColor(chan), chan, topic
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
	logFmt(tag, NULL, "The sign in %s reads, \"%s\"", chan, topic);
 | 
						logFmt(tag, NULL, "The sign in %s reads, \"%s\"", chan, topic);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -279,7 +263,7 @@ static void handleTopic(char *prefix, char *params) {
 | 
				
			|||||||
	uiFmt(
 | 
						uiFmt(
 | 
				
			||||||
		tag, UICold,
 | 
							tag, UICold,
 | 
				
			||||||
		"\3%d%s\3 places a new sign in \3%d%s\3, \"%s\"",
 | 
							"\3%d%s\3 places a new sign in \3%d%s\3, \"%s\"",
 | 
				
			||||||
		color(user), nick, color(chan), chan, topic
 | 
							formatColor(user), nick, formatColor(chan), chan, topic
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
	logFmt(tag, NULL, "%s places a new sign in %s, \"%s\"", nick, chan, topic);
 | 
						logFmt(tag, NULL, "%s places a new sign in %s, \"%s\"", nick, chan, topic);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -309,7 +293,7 @@ static void handleReplyWho(char *prefix, char *params) {
 | 
				
			|||||||
	int len = snprintf(
 | 
						int len = snprintf(
 | 
				
			||||||
		&who.buf[who.len], cap,
 | 
							&who.buf[who.len], cap,
 | 
				
			||||||
		"%s\3%d%s\3",
 | 
							"%s\3%d%s\3",
 | 
				
			||||||
		(who.len ? ", " : ""), color(user), nick
 | 
							(who.len ? ", " : ""), formatColor(user), nick
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
	if ((size_t)len < cap) who.len += len;
 | 
						if ((size_t)len < cap) who.len += len;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -322,7 +306,7 @@ static void handleReplyEndOfWho(char *prefix, char *params) {
 | 
				
			|||||||
	uiFmt(
 | 
						uiFmt(
 | 
				
			||||||
		tag, UICold,
 | 
							tag, UICold,
 | 
				
			||||||
		"In \3%d%s\3 are %s",
 | 
							"In \3%d%s\3 are %s",
 | 
				
			||||||
		color(chan), chan, who.buf
 | 
							formatColor(chan), chan, who.buf
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
	who.len = 0;
 | 
						who.len = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -340,7 +324,7 @@ static void handleNick(char *prefix, char *params) {
 | 
				
			|||||||
		uiFmt(
 | 
							uiFmt(
 | 
				
			||||||
			tag, UICold,
 | 
								tag, UICold,
 | 
				
			||||||
			"\3%d%s\3 is now known as \3%d%s\3",
 | 
								"\3%d%s\3 is now known as \3%d%s\3",
 | 
				
			||||||
			color(user), prev, color(user), next
 | 
								formatColor(user), prev, formatColor(user), next
 | 
				
			||||||
		);
 | 
							);
 | 
				
			||||||
		logFmt(tag, NULL, "%s is now known as %s", prev, next);
 | 
							logFmt(tag, NULL, "%s is now known as %s", prev, next);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -360,7 +344,7 @@ static void handleCTCP(struct Tag tag, char *nick, char *user, char *mesg) {
 | 
				
			|||||||
	uiFmt(
 | 
						uiFmt(
 | 
				
			||||||
		tag, (ping ? UIHot : UIWarm),
 | 
							tag, (ping ? UIHot : UIWarm),
 | 
				
			||||||
		"%c\3%d* %s\17 %s",
 | 
							"%c\3%d* %s\17 %s",
 | 
				
			||||||
		ping["\17\26"], color(user), nick, params
 | 
							ping["\17\26"], formatColor(user), nick, params
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
	logFmt(tag, NULL, "* %s %s", nick, params);
 | 
						logFmt(tag, NULL, "* %s %s", nick, params);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -384,7 +368,7 @@ static void handlePrivmsg(char *prefix, char *params) {
 | 
				
			|||||||
	uiFmt(
 | 
						uiFmt(
 | 
				
			||||||
		tag, (hot ? UIHot : UIWarm),
 | 
							tag, (hot ? UIHot : UIWarm),
 | 
				
			||||||
		"%c\3%d%c%s%c\17 %s",
 | 
							"%c\3%d%c%s%c\17 %s",
 | 
				
			||||||
		ping["\17\26"], color(user), self["<("], nick, self[">)"], mesg
 | 
							ping["\17\26"], formatColor(user), self["<("], nick, self[">)"], mesg
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
	logFmt(tag, NULL, "<%s> %s", nick, mesg);
 | 
						logFmt(tag, NULL, "<%s> %s", nick, mesg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -403,7 +387,7 @@ static void handleNotice(char *prefix, char *params) {
 | 
				
			|||||||
	uiFmt(
 | 
						uiFmt(
 | 
				
			||||||
		tag, (ping ? UIHot : UIWarm),
 | 
							tag, (ping ? UIHot : UIWarm),
 | 
				
			||||||
		"%c\3%d-%s-\17 %s",
 | 
							"%c\3%d-%s-\17 %s",
 | 
				
			||||||
		ping["\17\26"], color(user), nick, mesg
 | 
							ping["\17\26"], formatColor(user), nick, mesg
 | 
				
			||||||
	);
 | 
						);
 | 
				
			||||||
	logFmt(tag, NULL, "-%s- %s", nick, mesg);
 | 
						logFmt(tag, NULL, "-%s- %s", nick, mesg);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user