Allow configuring the upper bound of the hash function

This allows limiting the nick colors used to the 16-color terminal set
without modifying the TERM environment variable. Produces different
results from just using the default configuration in a 16-color
terminal, but what can you do?
master
C. McEnroe 2021-01-09 17:58:29 -05:00
parent bf70fcbfed
commit a324795b86
3 changed files with 19 additions and 7 deletions

View File

@ -1,4 +1,4 @@
.Dd December 30, 2020 .Dd January 9, 2021
.Dt CATGIRL 1 .Dt CATGIRL 1
.Os .Os
. .
@ -77,9 +77,14 @@ The default is the first available of
.Xr xclip 1 , .Xr xclip 1 ,
.Xr xsel 1 . .Xr xsel 1 .
. .
.It Fl H Ar hash , Cm hash = Ar hash .It Fl H Ar init,bound , Cm hash = Ar init,bound
Set the initial value of Set the initial value of
the nick color hash function. the nick color hash function
and the maximum IRC color value used.
The default is 0,75.
To use only colors from
the 16-color terminal set,
use 0,15.
. .
.It Fl N Ar util , Cm notify = Ar util .It Fl N Ar util , Cm notify = Ar util
Send notifications using a utility. Send notifications using a utility.

12
chat.c
View File

@ -87,8 +87,6 @@ static void exitSave(void) {
} }
} }
uint32_t hashInit;
uint execID; uint execID;
int execPipe[2] = { -1, -1 }; int execPipe[2] = { -1, -1 };
int utilPipe[2] = { -1, -1 }; int utilPipe[2] = { -1, -1 };
@ -117,6 +115,14 @@ static void utilRead(void) {
} }
} }
uint32_t hashInit;
uint32_t hashBound = 75;
static void parseHash(char *str) {
hashInit = strtoul(str, &str, 0);
if (*str) hashBound = strtoul(&str[1], NULL, 0);
}
static volatile sig_atomic_t signals[NSIG]; static volatile sig_atomic_t signals[NSIG];
static void signalHandler(int signal) { static void signalHandler(int signal) {
signals[signal] = 1; signals[signal] = 1;
@ -179,7 +185,7 @@ int main(int argc, char *argv[]) {
switch (opt) { switch (opt) {
break; case '!': insecure = true; break; case '!': insecure = true;
break; case 'C': utilPush(&urlCopyUtil, optarg); break; case 'C': utilPush(&urlCopyUtil, optarg);
break; case 'H': hashInit = strtoul(optarg, NULL, 0); break; case 'H': parseHash(optarg);
break; case 'N': utilPush(&uiNotifyUtil, optarg); break; case 'N': utilPush(&uiNotifyUtil, optarg);
break; case 'O': utilPush(&urlOpenUtil, optarg); break; case 'O': utilPush(&urlOpenUtil, optarg);
break; case 'R': self.restricted = true; break; case 'R': self.restricted = true;

3
chat.h
View File

@ -137,6 +137,7 @@ static inline uint idFor(const char *name) {
} }
extern uint32_t hashInit; extern uint32_t hashInit;
extern uint32_t hashBound;
static inline enum Color hash(const char *str) { static inline enum Color hash(const char *str) {
if (*str == '~') str++; if (*str == '~') str++;
uint32_t hash = hashInit; uint32_t hash = hashInit;
@ -145,7 +146,7 @@ static inline enum Color hash(const char *str) {
hash ^= *str; hash ^= *str;
hash *= 0x27220A95; hash *= 0x27220A95;
} }
return Blue + hash % 74; return Blue + hash % (hashBound + 1 - Blue);
} }
extern struct Network { extern struct Network {