Mercurial > pidgin
comparison gtk/plugins/crazychat/crazychat.c @ 14191:009db0b357b5
This is a hand-crafted commit to migrate across subversion revisions
16854:16861, due to some vagaries of the way the original renames were
done. Witness that monotone can do in one revision what svn had to
spread across several.
author | Ethan Blanton <elb@pidgin.im> |
---|---|
date | Sat, 16 Dec 2006 04:59:55 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
14190:366be2ce35a7 | 14191:009db0b357b5 |
---|---|
1 #include <assert.h> | |
2 #include <stdlib.h> | |
3 #include <string.h> | |
4 #include "cc_interface.h" | |
5 | |
6 struct cc_session_node { | |
7 struct cc_session session; | |
8 struct cc_session_node *next; | |
9 }; | |
10 | |
11 struct cc_session *cc_find_session(struct crazychat *cc, char *handle) | |
12 { | |
13 struct cc_session_node *curr; | |
14 | |
15 assert(cc); | |
16 assert(handle); | |
17 | |
18 curr = cc->sessions; | |
19 while (curr) { | |
20 struct cc_session *session = &curr->session; | |
21 if (!strncmp(session->name, handle, strlen(session->name))) { | |
22 return session; | |
23 } | |
24 curr = curr->next; | |
25 } | |
26 return NULL; | |
27 } | |
28 | |
29 struct cc_session *cc_add_session(struct crazychat *cc, char *handle) | |
30 { | |
31 struct cc_session_node *curr; | |
32 | |
33 assert(cc); | |
34 assert(handle); | |
35 | |
36 if (!cc->sessions) { | |
37 cc->sessions = (struct cc_session_node*) | |
38 malloc(sizeof(*cc->sessions)); | |
39 memset(cc->sessions, 0, sizeof(*cc->sessions)); | |
40 cc->sessions->session.cc = cc; | |
41 cc->sessions->session.name = strdup(handle); | |
42 return &cc->sessions->session; | |
43 } else { | |
44 if (!strncmp(cc->sessions->session.name, handle, | |
45 strlen(cc->sessions->session.name))) { | |
46 return &cc->sessions->session; | |
47 } | |
48 } | |
49 | |
50 curr = cc->sessions; | |
51 while (curr->next) { | |
52 struct cc_session *session = &curr->next->session; | |
53 if (!strncmp(session->name, handle, strlen(session->name))) { | |
54 return session; | |
55 } | |
56 curr = curr->next; | |
57 } | |
58 curr->next = (struct cc_session_node*)malloc(sizeof(*curr->next)); | |
59 memset(curr->next, 0, sizeof(*curr->next)); | |
60 curr->next->session.cc = cc; | |
61 curr->next->session.name = strdup(handle); | |
62 return &curr->next->session; | |
63 } | |
64 | |
65 void cc_remove_session(struct crazychat *cc, struct cc_session *session) | |
66 { | |
67 struct cc_session_node *curr, *prev; | |
68 | |
69 assert(cc); | |
70 assert(session); | |
71 | |
72 assert(cc->sessions); | |
73 | |
74 curr = cc->sessions; | |
75 prev = NULL; | |
76 | |
77 while (curr) { | |
78 if (&curr->session == session) { | |
79 if (prev) { | |
80 prev->next = curr->next; | |
81 } else { | |
82 cc->sessions = curr->next; | |
83 } | |
84 /* destroy curr */ | |
85 free(curr); | |
86 g_source_remove(session->timer_id); | |
87 free(session->name); | |
88 free(session); | |
89 return; | |
90 } | |
91 prev = curr; | |
92 curr = curr->next; | |
93 } | |
94 | |
95 assert(0); | |
96 } |