diff options
Diffstat (limited to 'nick.c')
-rw-r--r-- | nick.c | 85 |
1 files changed, 85 insertions, 0 deletions
@@ -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); +} |