From 07e2208a51d7bc64d4639c6eb56a4c33d8d87d7d Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Fri, 21 Aug 2009 02:36:28 +0200 Subject: Added structs and functions for nick grouping. --- nick.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 nick.c (limited to 'nick.c') 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 +#include +#include +#include + +#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); +} -- cgit v1.2.3