changeset 946:2ec05b9db2ee

irccd: use net set.h macros
author David Demelier <markand@malikania.fr>
date Fri, 15 Jan 2021 14:44:52 +0100
parents 8ddeceeee0f2
children 95201fd9ad88
files irccd/main.c lib/irccd/irccd.c lib/irccd/irccd.h lib/irccd/jsapi-plugin.c lib/irccd/jsapi-server.c lib/irccd/jsapi-timer.c lib/irccd/peer.c lib/irccd/server.c
diffstat 8 files changed, 64 insertions(+), 110 deletions(-) [+]
line wrap: on
line diff
--- a/irccd/main.c	Fri Jan 15 14:18:54 2021 +0100
+++ b/irccd/main.c	Fri Jan 15 14:44:52 2021 +0100
@@ -36,9 +36,8 @@
 
 	irc_server_join(&s, "#test", NULL);
 
-	irc_init();
 	irc_log_set_verbose(true);
-	irc_add_server(&s);
-	irc_run();
-
+	irc_bot_init();
+	irc_bot_add_server(&s);
+	irc_bot_run();
 }
--- a/lib/irccd/irccd.c	Fri Jan 15 14:18:54 2021 +0100
+++ b/lib/irccd/irccd.c	Fri Jan 15 14:44:52 2021 +0100
@@ -27,31 +27,14 @@
 #include "event.h"
 #include "irccd.h"
 #include "log.h"
+#include "peer.h"
 #include "plugin.h"
+#include "rule.h"
 #include "server.h"
-#include "peer.h"
+#include "set.h"
 #include "transport.h"
-#include "rule.h"
 #include "util.h"
 
-#define APPEND(a, l, o, f)                                              \
-do {                                                                    \
-        a = irc_util_reallocarray(a, ++l, sizeof (*o));                 \
-        memcpy(&a[l - 1], o, sizeof (*o));                              \
-        qsort(a, l, sizeof (*o), f);                                    \
-} while (0)
-
-#define REMOVE(a, l, f)                                                 \
-do {                                                                    \
-        if (--l == 0) {                                                 \
-                free(a);                                                \
-                a = NULL;                                               \
-        } else {                                                        \
-                qsort(a, l + 1, sizeof (*a), f);                        \
-                a = irc_util_reallocarray(a, --l, sizeof (*a));         \
-        }                                                               \
-} while (0)
-
 struct pkg {
 	struct pollfd *fds;
 	size_t fdsz;
@@ -67,39 +50,21 @@
 static int pipes[2];
 
 static int
-cmp_server(const void *d1, const void *d2)
+cmp_server(const struct irc_server *s1, const struct irc_server *s2)
 {
-	return strcmp(
-		((const struct irc_server *)d1)->name,
-		((const struct irc_server *)d2)->name
-	);
+	return strcmp(s1->name, s2->name);
 }
 
 static int
-cmp_plugin(const void *d1, const void *d2)
+cmp_plugin(const struct irc_plugin *p1, const struct irc_plugin *p2)
 {
-	return strcmp(
-		((const struct irc_plugin *)d1)->name,
-		((const struct irc_plugin *)d2)->name
-	);
+	return strcmp(p1->name, p2->name);
 }
 
 static int
-cmp_peer(const void *d1, const void *d2)
-{
-	return ((const struct irc_peer *)d2)->fd - ((const struct irc_peer *)d1)->fd;
-}
-
-static int
-cmp_server_name(const void *d1, const void *d2)
+cmp_peer(const struct irc_peer *p1, const struct irc_peer *p2)
 {
-	return strcmp(d1, ((const struct irc_server *)d2)->name);
-}
-
-static int
-cmp_plugin_name(const void *d1, const void *d2)
-{
-	return strcmp(d1, ((const struct irc_plugin *)d2)->name);
+	return p1->fd - p2->fd;
 }
 
 static struct pkg
@@ -174,14 +139,15 @@
 
 		/* Accept new transport client. */
 		if (irc_transport_flush(&pkg->fds[i], &peer))
-			APPEND(irc.peers, irc.peersz, &peer, cmp_peer);
+			IRC_SET_ALLOC_PUSH(&irc.peers, &irc.peersz, &peer, cmp_peer);
 
 		/* Flush clients. */
-		for (size_t p = 0; p < irc.peersz; ++p) {
+		for (size_t p = 0; p < irc.peersz; ) {
 			if (!irc_peer_flush(&irc.peers[p], &pkg->fds[i])) {
 				irc_peer_finish(&irc.peers[p]);
-				REMOVE(irc.peers, irc.peersz, cmp_peer);
-			}
+				IRC_SET_ALLOC_REMOVE(&irc.peers, &irc.peersz, &irc.peers[p]);
+			} else
+				++p;
 		}
 	}
 
@@ -204,7 +170,7 @@
 }
 
 void
-irc_init(void)
+irc_bot_init(void)
 {
 	irc_log_to_console();
 
@@ -213,28 +179,30 @@
 }
 
 void
-irc_add_server(const struct irc_server *s)
+irc_bot_add_server(const struct irc_server *s)
 {
 	assert(s);
 
-	APPEND(irc.servers, irc.serversz, s, cmp_server);
-
+	IRC_SET_ALLOC_PUSH(&irc.servers, &irc.serversz, s, cmp_server);
 	irc_server_connect(&irc.servers[irc.serversz - 1]);
 }
 
 struct irc_server *
-irc_find_server(const char *name)
+irc_bot_find_server(const char *name)
 {
-	return bsearch(name, irc.servers, irc.serversz, sizeof (*irc.servers),
-	    cmp_server_name);
+	struct irc_server key = {0};
+
+	strlcpy(key.name, name, sizeof (key.name));
+
+	return IRC_SET_FIND(irc.servers, irc.serversz, &key, cmp_server);
 }
 
 void
-irc_del_server(const char *name)
+irc_bot_remove_server(const char *name)
 {
 	struct irc_server *s;
 
-	if (!(s = irc_find_server(name)))
+	if (!(s = irc_bot_find_server(name)))
 		return;
 
 	irc_server_disconnect(s);
@@ -246,15 +214,15 @@
 	});
 
 	/* Finally remove from array. */
-	REMOVE(irc.servers, irc.serversz, cmp_server);
+	IRC_SET_ALLOC_REMOVE(&irc.servers, &irc.serversz, s);
 }
 
 void
-irc_add_plugin(const struct irc_plugin *p)
+irc_bot_add_plugin(const struct irc_plugin *p)
 {
 	assert(p);
 
-	APPEND(irc.plugins, irc.pluginsz, p, cmp_plugin);
+	IRC_SET_ALLOC_PUSH(&irc.plugins, &irc.pluginsz, p, cmp_plugin);
 
 	irc_log_info("plugin %s: %s", p->name, p->description);
 	irc_log_info("plugin %s: version %s, from %s (%s license)", p->name,
@@ -264,24 +232,27 @@
 }
 
 struct irc_plugin *
-irc_find_plugin(const char *name)
+irc_bot_find_plugin(const char *name)
 {
-	return bsearch(name, irc.plugins, irc.pluginsz, sizeof (*irc.plugins),
-	    cmp_plugin_name);
+	struct irc_plugin key = {0};
+
+	strlcpy(key.name, name, sizeof (key.name));
+
+	return IRC_SET_FIND(irc.plugins, irc.pluginsz, &key, cmp_plugin);
 }
 
 void
-irc_del_plugin(const char *name)
+irc_bot_remove_plugin(const char *name)
 {
 	struct irc_plugin *p;
 
-	if (!(p = irc_find_plugin(name)))
+	if (!(p = irc_bot_find_plugin(name)))
 		return;
 
 	irc_plugin_unload(p);
 	irc_plugin_finish(p);
 
-	REMOVE(irc.plugins, irc.pluginsz, cmp_plugin);
+	IRC_SET_ALLOC_REMOVE(&irc.plugins, &irc.pluginsz, p);
 }
 
 bool
@@ -315,7 +286,7 @@
 }
 
 void
-irc_post(void (*exec)(void *), void *data)
+irc_bot_post(void (*exec)(void *), void *data)
 {
 	struct defer df = {
 		.exec = exec,
@@ -327,7 +298,7 @@
 }
 
 void
-irc_run(void)
+irc_bot_run(void)
 {
 	struct pkg pkg;
 
--- a/lib/irccd/irccd.h	Fri Jan 15 14:18:54 2021 +0100
+++ b/lib/irccd/irccd.h	Fri Jan 15 14:44:52 2021 +0100
@@ -43,25 +43,25 @@
 } irc;
 
 void
-irc_init(void);
+irc_bot_init(void);
 
 void
-irc_add_server(const struct irc_server *);
+irc_bot_add_server(const struct irc_server *);
 
 struct irc_server *
-irc_find_server(const char *);
+irc_bot_find_server(const char *);
 
 void
-irc_del_server(const char *);
+irc_bot_remove_server(const char *);
 
 void
-irc_add_plugin(const struct irc_plugin *);
+irc_bot_add_plugin(const struct irc_plugin *);
 
 struct irc_plugin *
-irc_find_plugin(const char *);
+irc_bot_find_plugin(const char *);
 
 void
-irc_del_plugin(const char *);
+irc_bot_remove_plugin(const char *);
 
 bool
 irc_bot_insert_rule(const struct irc_rule *, size_t);
@@ -70,9 +70,9 @@
 irc_bot_remove_rule(size_t);
 
 void
-irc_post(void (*)(void *), void *);
+irc_bot_post(void (*)(void *), void *);
 
 void
-irc_run(void);
+irc_bot_run(void);
 
 #endif /* !IRCCD_H */
--- a/lib/irccd/jsapi-plugin.c	Fri Jan 15 14:18:54 2021 +0100
+++ b/lib/irccd/jsapi-plugin.c	Fri Jan 15 14:44:52 2021 +0100
@@ -136,7 +136,7 @@
 	struct irc_plugin *p;
 
 	if (duk_get_top(ctx) >= 1)
-		p = irc_find_plugin(duk_require_string(ctx, 0));
+		p = irc_bot_find_plugin(duk_require_string(ctx, 0));
 	else
 		p = irc_jsapi_plugin_self(ctx);
 
--- a/lib/irccd/jsapi-server.c	Fri Jan 15 14:18:54 2021 +0100
+++ b/lib/irccd/jsapi-server.c	Fri Jan 15 14:44:52 2021 +0100
@@ -38,7 +38,7 @@
 
 	duk_push_this(ctx);
 	duk_get_prop_string(ctx, -1, SIGNATURE);
-	sv = irc_find_server(duk_to_string(ctx, -1));
+	sv = irc_bot_find_server(duk_to_string(ctx, -1));
 	duk_pop_2(ctx);
 
 	if (!sv)
@@ -56,7 +56,7 @@
 		duk_error(ctx, DUK_ERR_TYPE_ERROR, "not a Server object");
 
 	duk_get_prop_string(ctx, index, SIGNATURE);
-	sv = irc_find_server(duk_to_string(ctx, -1));
+	sv = irc_bot_find_server(duk_to_string(ctx, -1));
 	duk_pop(ctx);
 
 	return sv;
--- a/lib/irccd/jsapi-timer.c	Fri Jan 15 14:18:54 2021 +0100
+++ b/lib/irccd/jsapi-timer.c	Fri Jan 15 14:44:52 2021 +0100
@@ -148,11 +148,10 @@
 	 * 2. It has been stopped by the user (tm->stopped is true).
 	 * 3. The plugin is shutting down (tm->kill is true).
 	 */
-	printf("FINISHED: %d, %d\n", rc, tm->status);
 	if (rc == ETIMEDOUT && tm->status == TIMER_ACTIVE)
-		irc_post(timer_expired, tm);
+		irc_bot_post(timer_expired, tm);
 	else
-		irc_post(timer_aborted, tm);
+		irc_bot_post(timer_aborted, tm);
 
 	return NULL;
 }
--- a/lib/irccd/peer.c	Fri Jan 15 14:18:54 2021 +0100
+++ b/lib/irccd/peer.c	Fri Jan 15 14:44:52 2021 +0100
@@ -67,7 +67,7 @@
 {
 	struct irc_server *s;
 
-	if (!(s = irc_find_server(id))) {
+	if (!(s = irc_bot_find_server(id))) {
 		irc_peer_send(p, "server %s not found", id);
 		return NULL;
 	}
--- a/lib/irccd/server.c	Fri Jan 15 14:18:54 2021 +0100
+++ b/lib/irccd/server.c	Fri Jan 15 14:44:52 2021 +0100
@@ -34,10 +34,11 @@
 #       include <openssl/err.h>
 #endif
 
+#include "channel.h"
 #include "event.h"
 #include "log.h"
 #include "server.h"
-#include "channel.h"
+#include "set.h"
 #include "util.h"
 
 struct origin {
@@ -74,12 +75,9 @@
 }
 
 static int
-compare_chan(const void *d1, const void *d2)
+cmp_channel(const struct irc_channel *c1, const struct irc_channel *c2)
 {
-	return strcmp(
-		((const struct irc_channel *)d1)->name,
-		((const struct irc_channel *)d2)->name
-	);
+	return strcmp(c1->name, c2->name);
 }
 
 static const struct origin *
@@ -98,12 +96,6 @@
 	return &origin;
 }
 
-static inline void
-sort(struct irc_server *s)
-{
-	qsort(s->channels, s->channelsz, sizeof (*s->channels), compare_chan);
-}
-
 static struct irc_channel *
 add_channel(struct irc_server *s, const char *name, const char *password, bool joined)
 {
@@ -116,10 +108,7 @@
 	if (password)
 		strlcpy(ch.password, password, sizeof (ch.password));
 
-	s->channels = irc_util_reallocarray(s->channels, ++s->channelsz, sizeof (ch));
-
-	memcpy(&s->channels[s->channelsz - 1], &ch, sizeof (ch));
-	sort(s);
+	IRC_SET_ALLOC_PUSH(&s->channels, &s->channelsz, &ch, cmp_channel);
 
 	return irc_server_find(s, name);
 }
@@ -127,11 +116,7 @@
 static void
 remove_channel(struct irc_server *s, struct irc_channel *ch)
 {
-	/* Null channel name will be moved at the end. */
-	memset(ch, 0, sizeof (*ch));
-
-	s->channels = irc_util_reallocarray(s->channels, --s->channelsz, sizeof (*ch));
-	sort(s);
+	IRC_SET_ALLOC_REMOVE(&s->channels, &s->channelsz, ch);
 }
 
 static void
@@ -842,7 +827,7 @@
 
 	strlcpy(key.name, name, sizeof (key.name));
 
-	return bsearch(&key, s->channels, s->channelsz, sizeof (key), compare_chan);
+	return IRC_SET_FIND(s->channels, s->channelsz, &key, cmp_channel);
 }
 
 bool