summaryrefslogtreecommitdiff
path: root/nick.c
diff options
context:
space:
mode:
authorJon Bergli Heier <snakebite@jvnv.net>2009-08-21 02:36:28 +0200
committerJon Bergli Heier <snakebite@jvnv.net>2009-08-21 02:36:28 +0200
commit07e2208a51d7bc64d4639c6eb56a4c33d8d87d7d (patch)
treee8c07df5f7218452eae4efc931c54efd4965477e /nick.c
parent131f5592347929c3d28a4a9406e242e2cfdd5db9 (diff)
Added structs and functions for nick grouping.
Diffstat (limited to 'nick.c')
-rw-r--r--nick.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/nick.c b/nick.c
new file mode 100644
index 0000000..f1d2c38
--- /dev/null
+++ b/nick.c
@@ -0,0 +1,85 @@
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <stdio.h>
+
+#include "nick.h"
+
+struct nick_t *nicks;
+
+void nick_init() {
+ nicks = NULL;
+}
+
+int nick_add(char *name) {
+ struct nick_t *nick = malloc(sizeof(struct nick_t));
+ if(!nick) {
+ char *error = strerror(errno);
+ fprintf(stderr, "Could not allocate memory for nick: %s\n", error);
+ return 0;
+ }
+
+ if(nicks) {
+ struct nick_t *n = nicks;
+ while(n->next) n = n->next;
+ n->next = nick;
+ } else
+ nicks = nick;
+
+ nick->name = strdup(name);
+ nick->regexes = NULL;
+ nick->next = NULL;
+
+ return 1;
+}
+
+int nick_regex_add(struct nick_t *nick, char *re_s) {
+ struct nick_regex_t *nre = malloc(sizeof(struct nick_regex_t));
+ if(!nre) {
+ char *error = strerror(errno);
+ fprintf(stderr, "Could not allocate memory for nick regex: %s\n", error);
+ return 0;
+ }
+
+ const char *error;
+ int erroffset;
+ nre->re = pcre_compile(re_s, 0, &error, &erroffset, NULL);
+ if(!nre->re) {
+ /* Copied from re_error in regexset.c */
+ fprintf(stderr, "Nick RE failed to compile: %s\n", error);
+ fprintf(stderr, "%s\n", re_s);
+ for(int i = 0; i < erroffset; i++) fprintf(stderr, " ");
+ fprintf(stderr, "^\n");
+ free(nre);
+ return 0;
+ }
+
+ nre->next = NULL;
+
+ if(nick->regexes) {
+ struct nick_regex_t *n = nick->regexes;
+ while(n->next) n = n->next;
+ n->next = nre;
+ } else
+ nick->regexes = nre;
+
+ return 1;
+}
+
+void nick_free() {
+ struct nick_t *nick = nicks;
+ while(nick) {
+ free(nick->name);
+ struct nick_regex_t *re = nick->regexes;
+ while(re) {
+ pcre_free(re->re);
+ struct nick_regex_t *next = re->next;
+ free(re);
+ re = next;
+ }
+ struct nick_t *next = nick->next;
+ free(nick);
+ nick = next;
+ }
+ free(nicks);
+}