3 static struct UserNode **userList;
6 userList = calloc(VALID_NICK_CHARS_FIRST_LEN, sizeof(*userList));
10 int is_valid_nick(const char *nick) {
12 //first char must be one of: a-zA-Z{|}~[\]^_`
13 if (!strchr(VALID_NICK_CHARS_FIRST, *nick))
15 //all other chars must be one of: a-zA-Z0-9{|}~[\]^_`
16 for (i = 0; nick[i]; ++i)
17 if (!strchr(VALID_NICK_CHARS, nick[i]))
19 if (strlen(nick) > NICKLEN)
24 static int get_nicklist_entry(int nick) {
26 char *valid_chars = VALID_NICK_CHARS_FIRST;
27 for(i = 0; i < VALID_NICK_CHARS_FIRST_LEN; i++) {
28 if(valid_chars[i] == nick)
34 struct UserNode* getUserByNick(const char *nick) { //case sensitive
35 int userListIndex = get_nicklist_entry(*nick);
36 if(userListIndex == -1 || userList[userListIndex] == NULL)
38 struct UserNode *user;
39 for(user = userList[userListIndex]; user; user = user->next) {
40 if(!stricmp(nick, user->nick))
46 struct UserNode* searchUserByNick(const char *nick) { //case insensitive
48 return getUserByNick(nick);
51 struct UserNode *user;
53 //search in the lower case "section"
54 userListIndex = get_nicklist_entry(tolower(*nick));
55 if(userListIndex != -1 && userList[userListIndex] != NULL) {
56 for(user = userList[userListIndex]; user; user = user->next) {
57 if(!stricmp(nick, user->nick))
61 //search in the upper case "section"
62 userListIndex = get_nicklist_entry(toupper(*nick));
63 if(userListIndex != -1 && userList[userListIndex] != NULL) {
64 for(user = userList[userListIndex]; user; user = user->next) {
65 if(!stricmp(nick, user->nick))
72 struct UserNode* addUser(const char *nick) {
73 int userListIndex = get_nicklist_entry(*nick);
74 if(userListIndex == -1 || !is_valid_nick(nick))
76 struct UserNode *user = malloc(sizeof(*user));
79 perror("malloc() failed");
82 strcpy(user->nick, nick);
85 user->realname[0] = 0;
88 user->next = userList[userListIndex];
89 userList[userListIndex] = user;
92 int renameUser(struct UserNode* user, const char *new_nick) {
93 if(!is_valid_nick(new_nick))
95 if(user->nick[0] == *new_nick) {
96 strcpy(user->nick, new_nick);
99 int userListIndex = get_nicklist_entry(*new_nick);
101 strcpy(user->nick, new_nick);
102 user->next = userList[userListIndex];
103 userList[userListIndex] = user;
107 void delUser(struct UserNode* user, int freeUser) {
108 int userListIndex = get_nicklist_entry(user->nick[0]);
109 if(userListIndex == -1) return;
110 struct UserNode *cuser, *last_user = NULL;
111 for(cuser = userList[userListIndex]; cuser; cuser = cuser->next) {
114 last_user->next = user->next;
116 userList[userListIndex] = user->next;