fixed syntax of last commit
[NeonServV5.git] / ChanUser.c
1
2 #include "ChanUser.h"
3 #include "ChanNode.h"
4 #include "UserNode.h"
5
6 struct ChanUser* addChanUser(struct ChanNode *chan, struct UserNode *user) {
7     struct ChanUser *chanuser = malloc(sizeof(*chan));
8     if (!chanuser)
9     {
10         perror("malloc() failed");
11         return NULL;
12     }
13     chanuser->user = user;
14     chanuser->chan = chan;
15
16     chanuser->next_user = chan->user;
17     chan->user = chanuser;
18
19     chanuser->next_chan = user->channel;
20     user->channel = chanuser;
21
22     return chanuser;
23 }
24
25 int isUserOnChan(struct UserNode *user, struct ChanNode *chan) {
26     struct ChanUser *chanuser;
27     for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
28         if(chanuser->chan == chan)
29             return 1;
30     }
31     return 0;
32 }
33
34 struct ChanUser* getChanUser(struct UserNode *user, struct ChanNode *chan) {
35     struct ChanUser *chanuser;
36     for(chanuser = user->channel; chanuser; chanuser = chanuser->next_chan) {
37         if(chanuser->chan == chan)
38             return chanuser;
39     }
40     return NULL;
41 }
42
43 struct ChanUser* getChannelUsers(struct ChanNode *chan, struct ChanUser *last) {
44     if(last == NULL)
45         return chan->user;
46     else
47         return last->next_user;
48 }
49
50 struct ChanUser* getUserChannels(struct UserNode *user, struct ChanUser *last) {
51     if(last == NULL)
52         return user->channel;
53     else
54         return last->next_chan;
55 }
56
57 void delChanUser(struct ChanUser *chanuser, int freeChanUser) {
58     struct ChanUser *cchanuser, *last;
59     //remove it from the user's channel-list
60     last = NULL;
61     for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
62         if(cchanuser == chanuser) {
63             if(last) 
64                 last->next_chan = chanuser->next_chan;
65             else
66                 chanuser->user->channel = chanuser->next_chan;
67             break;
68         } else
69             last = cchanuser;
70     }
71
72     //remove it from the channel's user-list
73     last = NULL;
74     for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
75         if(cchanuser == chanuser) {
76             if(last) 
77                 last->next_user = chanuser->next_user;
78             else
79                 chanuser->chan->user = chanuser->next_user;
80             break;
81         } else
82             last = cchanuser;
83     }
84     
85     if(freeChanUser)
86         free(chanuser);
87     else {
88         chanuser->next_chan = NULL;
89         chanuser->next_user = NULL;
90     }
91 }
92
93 void removeChanUserFromLists(struct ChanUser *chanuser, int remove_from_userlist, int remove_from_channellist, int freeChanUser) {
94     struct ChanUser *cchanuser, *last;
95     if(remove_from_userlist) {
96         //remove it from the channel's user-list
97         last = NULL;
98         for(cchanuser = chanuser->chan->user; cchanuser; cchanuser = cchanuser->next_user) {
99             if(cchanuser == chanuser) {
100                 if(last) 
101                     last->next_user = chanuser->next_user;
102                 else
103                     chanuser->chan->user = chanuser->next_user;
104                 break;
105             } else
106                 last = cchanuser;
107         }
108         chanuser->next_user = NULL;
109     }
110     if(remove_from_channellist) {
111         //remove it from the user's channel-list
112         last = NULL;
113         for(cchanuser = chanuser->user->channel; cchanuser; cchanuser = cchanuser->next_chan) {
114             if(cchanuser == chanuser) {
115                 if(last) 
116                     last->next_chan = chanuser->next_chan;
117                 else
118                     chanuser->user->channel = chanuser->next_chan;
119                 break;
120             } else
121                 last = cchanuser;
122         }
123         chanuser->next_chan = NULL;
124     }
125     
126     if(freeChanUser)
127         free(chanuser);
128 }
129