--- /dev/null
+
+#include "ChanUser.h"
+#include "ChanNode.h"
+#include "UserNode.h"
+
+struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
+ struct ChanUser *chanuser = malloc(sizeof(*chan));
+ if (!chanuser)
+ {
+ perror("malloc() failed");
+ return NULL;
+ }
+ chanuser->flags = 0;
+ chanuser->user = user;
+ chanuser->chan = chan;
+
+ chanuser->changeTime = 0;
+
+ chanuser->next_user = chan->user;
+ chan->user = chanuser;
+ chan->usercount++;
+
+ chanuser->next_chan = user->channel;
+ user->channel = chanuser;
+
+ return chanuser;
+}
+
+struct ChanUser* addInvisibleChanUser(struct ChanNode *chan, struct UserNode *user) {
+ struct ChanUser *chanuser = malloc(sizeof(*chan));
+ if (!chanuser)
+ {
+ perror("malloc() failed");
+ return NULL;
+ }
+ chanuser->flags = CHANUSERFLAG_INVISIBLE;
+ chanuser->user = user;
+ chanuser->chan = chan;
+
+ chanuser->changeTime = 0;
+
+ chanuser->next_user = chan->user;
+ chan->user = chanuser;
+ chan->usercount++;
+
+ return chanuser;
+}
+
+int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
+ struct ChanUser *chanuser;
+ for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
+ if(chanuser->chan == chan)
+ return 1;
+ }
+ return 0;
+}
+
+struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) {
+ struct ChanUser *chanuser;
+ for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
+ if(chanuser->chan == chan)
+ return chanuser;
+ }
+ return NULL;
+}
+
+struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last) {
+ if(last == NULL)
+ return chan->user;
+ else
+ return last->next_user;
+}
+
+struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) {
+ if(last == NULL)
+ return user->channel;
+ else
+ return last->next_chan;
+}
+
+void delChanUser(struct ChanUser *chanuser, int freeChanUser) {
+ struct ChanUser *cchanuser, *last;
+ //remove it from the user's channel-list
+ if(!(chanuser->flags & CHANUSERFLAG_INVISIBLE)) {
+ last = NULL;
+ for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
+ if(cchanuser == chanuser) {
+ if(last)
+ last->next_chan = chanuser->next_chan;
+ else
+ chanuser->user->channel = chanuser->next_chan;
+ break;
+ } else
+ last = cchanuser;
+ }
+ }
+
+ //remove it from the channel's user-list
+ last = NULL;
+ for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
+ if(cchanuser == chanuser) {
+ chanuser->chan->usercount--;
+ if(last)
+ last->next_user = chanuser->next_user;
+ else
+ chanuser->chan->user = chanuser->next_user;
+ break;
+ } else
+ last = cchanuser;
+ }
+
+ if(freeChanUser)
+ free(chanuser);
+ else {
+ chanuser->next_chan = NULL;
+ chanuser->next_user = NULL;
+ }
+}
+
+void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int freeChanUser) {
+ struct ChanUser *cchanuser, *last;
+ if(remove_from_userlist) {
+ //remove it from the channel's user-list
+ last = NULL;
+ for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
+ if(cchanuser == chanuser) {
+ chanuser->chan->usercount--;
+ if(last)
+ last->next_user = chanuser->next_user;
+ else
+ chanuser->chan->user = chanuser->next_user;
+ break;
+ } else
+ last = cchanuser;
+ }
+ chanuser->next_user = NULL;
+ }
+ if(remove_from_channellist) {
+ //remove it from the user's channel-list
+ last = NULL;
+ for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
+ if(cchanuser == chanuser) {
+ if(last)
+ last->next_chan = chanuser->next_chan;
+ else
+ chanuser->user->channel = chanuser->next_chan;
+ break;
+ } else
+ last = cchanuser;
+ }
+ chanuser->next_chan = NULL;
+ }
+
+ if(freeChanUser)
+ free(chanuser);
+}
+