roster.c (3097B)
1 /* 2 * Copy me if you can. 3 * by 20h 4 */ 5 6 #include <u.h> 7 #include <libc.h> 8 #include "dat.h" 9 #include "roster.h" 10 11 void 12 freerostern(rostern *r) 13 { 14 if(r != nil){ 15 if(r->name != nil) 16 free(r->name); 17 if(r->jid != nil) 18 free(r->jid); 19 if(r->status != nil) 20 free(r->status); 21 if(r->group != nil) 22 free(r->group); 23 if(r->show != nil) 24 free(r->show); 25 if(r->subsc != nil) 26 free(r->subsc); 27 free(r); 28 } 29 return; 30 } 31 32 void 33 freerosterl(rostern *r) 34 { 35 rostern *b; 36 37 if(r != nil){ 38 while(r->n != nil){ 39 b = r->n; 40 freerostern(r); 41 r = b; 42 } 43 freerostern(r); 44 } 45 46 return; 47 } 48 49 void 50 freejabberc(jabberc *j) 51 { 52 53 if(j != nil){ 54 if(j->stat != nil) 55 free(j->stat); 56 if(j->name != nil) 57 free(j->name); 58 if(j->reso != nil) 59 free(j->reso); 60 if(j->serv != nil) 61 free(j->serv); 62 if(j->jid != nil) 63 free(j->jid); 64 if(j->rost != nil) 65 freerosterl(j->rost); 66 if(j->show != nil) 67 free(j->show); 68 free(j); 69 } 70 return; 71 } 72 73 rostern * 74 mkrostern(void) 75 { 76 return reallocj(nil, sizeof(rostern), 2); 77 } 78 79 jabberc * 80 mkjabberc(void) 81 { 82 return reallocj(nil, sizeof(jabberc), 2); 83 } 84 85 rostern * 86 delrostern(rostern *r) 87 { 88 rostern *ret; 89 90 ret = nil; 91 92 //print("delrostern: %x r->n: %x r->p: %x\n", r, r->n, r->p); 93 if(r->n != nil && r->p != nil){ 94 r->n->p = r->p; 95 r->p->n = r->n; 96 ret = r->p; 97 } else { 98 if(r->n != nil){ 99 r->n->p = nil; 100 ret = r->n; 101 } else { 102 if(r->p != nil){ 103 r->p->n = nil; 104 ret = r->p; 105 } 106 } 107 } 108 freerostern(r); 109 110 return ret; 111 } 112 113 rostern * 114 lastrostern(rostern *r) 115 { 116 while(r->n != nil) 117 r = r->n; 118 119 return r; 120 } 121 122 rostern * 123 addrostern(rostern *r, rostern *n) 124 { 125 rostern *ret; 126 127 //print("addrostern: %x %x %x\n", r, n, n->jid); 128 ret = lastrostern(r); 129 ret->n = n; 130 n->p = ret; 131 n->n = nil; 132 133 return n; 134 } 135 136 rostern * 137 statusrostern(rostern *r, char *name, char *jid, char *status, char *show) 138 { 139 r = searchrostern(r, name, jid); 140 if(r != nil){ 141 if(show != nil){ 142 if(r->show != nil) 143 if(!strcmp(r->show, show)) 144 return nil; 145 if(r->show != nil) 146 free(r->show); 147 r->show = strdup(show); 148 } 149 if(status != nil){ 150 if(r->status != nil) 151 if(!strcmp(r->status, status)) 152 return nil; 153 if(r->status != nil) 154 free(r->status); 155 r->status = strdup(status); 156 } 157 } 158 159 return r; 160 } 161 162 char * 163 namerostern(rostern *r, char *jid, char *name) 164 { 165 166 r = searchrostern(r, name, jid); 167 if(r != nil){ 168 if(jid != nil) 169 if(r->name != nil) 170 return r->name; 171 if(name != nil) 172 if(r->jid != nil) 173 return r->jid; 174 } 175 176 if(jid != nil) 177 return jid; 178 return name; 179 } 180 181 rostern * 182 searchrostern(rostern *r, char *name, char *jid) 183 { 184 185 //print("searchrostern: r: %x n: %x j: %x\n", r, name, jid); 186 while(r != nil){ 187 if(name != nil && r->name != nil) 188 if(!strcmp(name, r->name)) 189 return r; 190 if(jid != nil && r->jid != nil) 191 if(!strncmp(jid, r->jid, strlen(jid)) || !strncmp(jid, r->jid, strlen(r->jid))) 192 return r; 193 r = r->n; 194 } 195 196 return nil; 197 } 198 199 rostern * 200 delname(rostern *r, char *name, char *jid) 201 { 202 rostern *ret; 203 204 ret = searchrostern(r, name, jid); 205 if(ret != nil){ 206 if(ret == r) 207 return delrostern(ret); 208 209 delrostern(ret); 210 } 211 212 return r; 213 }