Mercurial > pidgin.yaz
comparison plugins/jabber/str.c @ 1347:afa63ac2fd84
[gaim-migrate @ 1357]
jabber for those not fortunate enough to have libjabber and libxode on their systems
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Thu, 21 Dec 2000 14:54:13 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1346:83f78eb7c472 | 1347:afa63ac2fd84 |
---|---|
1 /* | |
2 * This program is free software; you can redistribute it and/or modify | |
3 * it under the terms of the GNU General Public License as published by | |
4 * the Free Software Foundation; either version 2 of the License, or | |
5 * (at your option) any later version. | |
6 * | |
7 * This program is distributed in the hope that it will be useful, | |
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
10 * GNU General Public License for more details. | |
11 * | |
12 * You should have received a copy of the GNU General Public License | |
13 * along with this program; if not, write to the Free Software | |
14 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
15 * | |
16 * Jabber | |
17 * Copyright (C) 1998-1999 The Jabber Team http://jabber.org/ | |
18 */ | |
19 | |
20 #include "libxode.h" | |
21 | |
22 char *j_strdup(const char *str) | |
23 { | |
24 if(str == NULL) | |
25 return NULL; | |
26 else | |
27 return strdup(str); | |
28 } | |
29 | |
30 char *j_strcat(char *dest, char *txt) | |
31 { | |
32 if(!txt) return(dest); | |
33 | |
34 while(*txt) | |
35 *dest++ = *txt++; | |
36 *dest = '\0'; | |
37 | |
38 return(dest); | |
39 } | |
40 | |
41 int j_strcmp(const char *a, const char *b) | |
42 { | |
43 if(a == NULL || b == NULL) | |
44 return -1; | |
45 else | |
46 return strcmp(a, b); | |
47 } | |
48 | |
49 int j_strcasecmp(const char *a, const char *b) | |
50 { | |
51 if(a == NULL || b == NULL) | |
52 return -1; | |
53 else | |
54 return strcasecmp(a, b); | |
55 } | |
56 | |
57 int j_strncmp(const char *a, const char *b, int i) | |
58 { | |
59 if(a == NULL || b == NULL) | |
60 return -1; | |
61 else | |
62 return strncmp(a, b, i); | |
63 } | |
64 | |
65 int j_strncasecmp(const char *a, const char *b, int i) | |
66 { | |
67 if(a == NULL || b == NULL) | |
68 return -1; | |
69 else | |
70 return strncasecmp(a, b, i); | |
71 } | |
72 | |
73 int j_strlen(const char *a) | |
74 { | |
75 if(a == NULL) | |
76 return 0; | |
77 else | |
78 return strlen(a); | |
79 } | |
80 | |
81 int j_atoi(const char *a, int def) | |
82 { | |
83 if(a == NULL) | |
84 return def; | |
85 else | |
86 return atoi(a); | |
87 } | |
88 | |
89 spool spool_new(pool p) | |
90 { | |
91 spool s; | |
92 | |
93 s = pmalloc(p, sizeof(struct spool_struct)); | |
94 s->p = p; | |
95 s->len = 0; | |
96 s->last = NULL; | |
97 s->first = NULL; | |
98 return s; | |
99 } | |
100 | |
101 void spool_add(spool s, char *str) | |
102 { | |
103 struct spool_node *sn; | |
104 int len; | |
105 | |
106 if(str == NULL) | |
107 return; | |
108 | |
109 len = strlen(str); | |
110 if(len == 0) | |
111 return; | |
112 | |
113 sn = pmalloc(s->p, sizeof(struct spool_node)); | |
114 sn->c = pstrdup(s->p, str); | |
115 sn->next = NULL; | |
116 | |
117 s->len += len; | |
118 if(s->last != NULL) | |
119 s->last->next = sn; | |
120 s->last = sn; | |
121 if(s->first == NULL) | |
122 s->first = sn; | |
123 } | |
124 | |
125 void spooler(spool s, ...) | |
126 { | |
127 va_list ap; | |
128 char *arg = NULL; | |
129 | |
130 if(s == NULL) | |
131 return; | |
132 | |
133 va_start(ap, s); | |
134 | |
135 /* loop till we hit our end flag, the first arg */ | |
136 while(1) | |
137 { | |
138 arg = va_arg(ap,char *); | |
139 if((int)arg == (int)s) | |
140 break; | |
141 else | |
142 spool_add(s, arg); | |
143 } | |
144 | |
145 va_end(ap); | |
146 } | |
147 | |
148 char *spool_print(spool s) | |
149 { | |
150 char *ret,*tmp; | |
151 struct spool_node *next; | |
152 | |
153 if(s == NULL || s->len == 0 || s->first == NULL) | |
154 return NULL; | |
155 | |
156 ret = pmalloc(s->p, s->len + 1); | |
157 *ret = '\0'; | |
158 | |
159 next = s->first; | |
160 tmp = ret; | |
161 while(next != NULL) | |
162 { | |
163 tmp = j_strcat(tmp,next->c); | |
164 next = next->next; | |
165 } | |
166 | |
167 return ret; | |
168 } | |
169 | |
170 /* convenience :) */ | |
171 char *spools(pool p, ...) | |
172 { | |
173 va_list ap; | |
174 spool s; | |
175 char *arg = NULL; | |
176 | |
177 if(p == NULL) | |
178 return NULL; | |
179 | |
180 s = spool_new(p); | |
181 | |
182 va_start(ap, p); | |
183 | |
184 /* loop till we hit our end flag, the first arg */ | |
185 while(1) | |
186 { | |
187 arg = va_arg(ap,char *); | |
188 if((int)arg == (int)p) | |
189 break; | |
190 else | |
191 spool_add(s, arg); | |
192 } | |
193 | |
194 va_end(ap); | |
195 | |
196 return spool_print(s); | |
197 } | |
198 | |
199 | |
200 char *strunescape(pool p, char *buf) | |
201 { | |
202 int i,j=0; | |
203 char *temp; | |
204 | |
205 if (p == NULL || buf == NULL) return(NULL); | |
206 | |
207 if (strchr(buf,'&') == NULL) return(buf); | |
208 | |
209 temp = pmalloc(p,strlen(buf)+1); | |
210 | |
211 if (temp == NULL) return(NULL); | |
212 | |
213 for(i=0;i<strlen(buf);i++) | |
214 { | |
215 if (buf[i]=='&') | |
216 { | |
217 if (strncmp(&buf[i],"&",5)==0) | |
218 { | |
219 temp[j] = '&'; | |
220 i += 4; | |
221 } else if (strncmp(&buf[i],""",6)==0) { | |
222 temp[j] = '\"'; | |
223 i += 5; | |
224 } else if (strncmp(&buf[i],"'",6)==0) { | |
225 temp[j] = '\''; | |
226 i += 5; | |
227 } else if (strncmp(&buf[i],"<",4)==0) { | |
228 temp[j] = '<'; | |
229 i += 3; | |
230 } else if (strncmp(&buf[i],">",4)==0) { | |
231 temp[j] = '>'; | |
232 i += 3; | |
233 } | |
234 } else { | |
235 temp[j]=buf[i]; | |
236 } | |
237 j++; | |
238 } | |
239 temp[j]='\0'; | |
240 return(temp); | |
241 } | |
242 | |
243 | |
244 char *strescape(pool p, char *buf) | |
245 { | |
246 int i,j,oldlen,newlen; | |
247 char *temp; | |
248 | |
249 if (p == NULL || buf == NULL) return(NULL); | |
250 | |
251 oldlen = newlen = strlen(buf); | |
252 for(i=0;i<oldlen;i++) | |
253 { | |
254 switch(buf[i]) | |
255 { | |
256 case '&': | |
257 newlen+=5; | |
258 break; | |
259 case '\'': | |
260 newlen+=6; | |
261 break; | |
262 case '\"': | |
263 newlen+=6; | |
264 break; | |
265 case '<': | |
266 newlen+=4; | |
267 break; | |
268 case '>': | |
269 newlen+=4; | |
270 break; | |
271 } | |
272 } | |
273 | |
274 if(oldlen == newlen) return buf; | |
275 | |
276 temp = pmalloc(p,newlen+1); | |
277 | |
278 if (temp==NULL) return(NULL); | |
279 | |
280 for(i=j=0;i<oldlen;i++) | |
281 { | |
282 switch(buf[i]) | |
283 { | |
284 case '&': | |
285 memcpy(&temp[j],"&",5); | |
286 j += 5; | |
287 break; | |
288 case '\'': | |
289 memcpy(&temp[j],"'",6); | |
290 j += 6; | |
291 break; | |
292 case '\"': | |
293 memcpy(&temp[j],""",6); | |
294 j += 6; | |
295 break; | |
296 case '<': | |
297 memcpy(&temp[j],"<",4); | |
298 j += 4; | |
299 break; | |
300 case '>': | |
301 memcpy(&temp[j],">",4); | |
302 j += 4; | |
303 break; | |
304 default: | |
305 temp[j++] = buf[i]; | |
306 } | |
307 } | |
308 temp[j] = '\0'; | |
309 return temp; | |
310 } | |
311 | |
312 char *zonestr(char *file, int line) | |
313 { | |
314 static char buff[64]; | |
315 int i; | |
316 | |
317 i = snprintf(buff,63,"%s:%d",file,line); | |
318 buff[i] = '\0'; | |
319 | |
320 return buff; | |
321 } | |
322 | |
323 void str_b64decode(char* str) | |
324 { | |
325 char *cur; | |
326 int d, dlast, phase; | |
327 unsigned char c; | |
328 static int table[256] = { | |
329 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 00-0F */ | |
330 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 10-1F */ | |
331 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63, /* 20-2F */ | |
332 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1, /* 30-3F */ | |
333 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14, /* 40-4F */ | |
334 15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1, /* 50-5F */ | |
335 -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40, /* 60-6F */ | |
336 41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1, /* 70-7F */ | |
337 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 80-8F */ | |
338 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* 90-9F */ | |
339 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* A0-AF */ | |
340 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* B0-BF */ | |
341 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* C0-CF */ | |
342 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* D0-DF */ | |
343 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, /* E0-EF */ | |
344 -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 /* F0-FF */ | |
345 }; | |
346 | |
347 phase = 0; | |
348 for (cur = str; *cur != '\0'; ++cur ) | |
349 { | |
350 d = table[(int)*cur]; | |
351 if(d != -1) | |
352 { | |
353 switch(phase) | |
354 { | |
355 case 0: | |
356 ++phase; | |
357 break; | |
358 case 1: | |
359 c = ((dlast << 2) | ((d & 0x30) >> 4)); | |
360 *str++ = c; | |
361 ++phase; | |
362 break; | |
363 case 2: | |
364 c = (((dlast & 0xf) << 4) | ((d & 0x3c) >> 2)); | |
365 *str++ = c; | |
366 ++phase; | |
367 break; | |
368 case 3: | |
369 c = (((dlast & 0x03 ) << 6) | d); | |
370 *str++ = c; | |
371 phase = 0; | |
372 break; | |
373 } | |
374 dlast = d; | |
375 } | |
376 } | |
377 *str = '\0'; | |
378 } |