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