| |
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 } |