Thu, 07 Mar 2002 20:57:16 +0000
[gaim-migrate @ 3034]
Offline messages in Yahoo! and a typo noticed by Brendan Sergei.
| 2086 | 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 | } |