summary refs log tree commit diff
path: root/tag.c
blob: 649ac495a2648f5cbb4742b877d6a4c498ea1523 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
/* Copyright (C) 2018  C. McEnroe <june@causal.agency>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#include <err.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>

#include "chat.h"

static struct {
	char *name[TagsLen];
	enum IRCColor color[TagsLen];
	size_t len;
} tags = {
	.name = { "<none>", "<status>", "<raw>" },
	.color = { IRCBlack, IRCDefault, IRCRed },
	.len = 3,
};

const struct Tag TagNone   = { 0, "<none>", IRCBlack };
const struct Tag TagStatus = { 1, "<status>", IRCDefault };
const struct Tag TagRaw    = { 2, "<raw>", IRCRed };

struct Tag tagFind(const char *name) {
	for (size_t id = 0; id < tags.len; ++id) {
		if (strcmp(tags.name[id], name)) continue;
		return (struct Tag) { id, tags.name[id], tags.color[id] };
	}
	return TagNone;
}

struct Tag tagFor(const char *name, enum IRCColor color) {
	struct Tag tag = tagFind(name);
	if (tag.id != TagNone.id) {
		tag.color = tags.color[tag.id] = color;
		return tag;
	}
	if (tags.len == TagsLen) return TagStatus;

	size_t id = tags.len++;
	tags.name[id] = strdup(name);
	tags.color[id] = color;
	if (!tags.name[id]) err(EX_OSERR, "strdup");
	return (struct Tag) { id, tags.name[id], color };
}
ing '\0', but if it does so even in the case of truncation, it is awkward for the caller to detect. This implementation returns end in the truncation case, so that (ptr == end) indicates truncation. 2021-05-27Add pounce-notify to README 2.4June McEnroe 2021-05-27Fix ENVIRONMENT formatting in pounce-notify(1)June McEnroe 2021-05-27Add note about Libera.Chat SASL-only rangesJune McEnroe 2021-05-25Add QUIRKS fileJune McEnroe 2021-05-19Replace freenode with tilde.chatJune McEnroe 2021-05-04notify: Reword pounce-notify manualJune McEnroe 2021-05-02Clean up Makefiles, configure scriptsJune McEnroe Default MANDIR to ${PREFIX}/man since it turns out man-db includes /usr/local/man by default. Add support for BINDIR. Separate libs out into LDADD variables. 2021-04-30palaver: Exit on getopt failureJune McEnroe Oops. 2021-04-30notify: Implement pounce-notifyJune McEnroe