#include #include #include "user.h" #include "sdbm.h" #include "nick.h" struct user_t *users; void user_init() { users = malloc(sizeof(struct user_t) * USERS_MAX); memset(users, 0, sizeof(struct user_t) * USERS_MAX); } struct user_t *user_get(char *_nick) { char *nick = nick_get(_nick); unsigned long hash = sdbm(nick); int index = hash % USERS_MAX; struct user_t *user = &users[index]; /* If hash doesn't match and there exists another user, fetch it. */ while(user->hash != hash && user->next) user = user->next; /* If hash still doesn't match and the user exists, add a new user. */ if(user->hash != hash && user->nick) { struct user_t *temp_user = malloc(sizeof(struct user_t)); user->next = temp_user; user = temp_user; /* Initialize nick to NULL so the user can be correctly added. */ user->nick = NULL; } /* Add the new user data to the current pointer if none was found. */ if(!user->nick) { user->hash = hash; user->nick = strdup(nick); memset(user->lines, 0, 24*4 * sizeof(unsigned long)); user->words = 0; user->next = NULL; } return user; } void user_free() { struct user_t *user; for(int i = 0; i < USERS_MAX; i++) { user = users[i].next; while(user) { struct user_t *temp = user->next; free(user->nick); free(user); user = temp; } } free(users); }