Mercurial > pidgin
annotate src/protocols/oscar/util.c @ 8622:ffed55cbdd67
[gaim-migrate @ 9373]
Any objections to this?
committer: Tailor Script <tailor@pidgin.im>
| author | Mark Doliner <mark@kingant.net> |
|---|---|
| date | Fri, 09 Apr 2004 02:49:30 +0000 |
| parents | 990314a962fb |
| children | 4274f888477e |
| rev | line source |
|---|---|
| 2086 | 1 /* |
| 4246 | 2 * A little bit of this |
| 3 * A little bit of that | |
| 4 * It started with a kiss | |
| 5 * Now we're up to bat | |
| 2086 | 6 */ |
| 7 | |
| 2672 | 8 #define FAIM_INTERNAL |
| 2086 | 9 #include <aim.h> |
| 10 #include <ctype.h> | |
| 11 | |
| 4246 | 12 #ifdef _WIN32 |
| 13 #include "win32dep.h" | |
| 14 #endif | |
| 15 | |
| 16 faim_internal void faimdprintf(aim_session_t *sess, int dlevel, const char *format, ...) | |
| 17 { | |
| 18 if (!sess) { | |
| 19 fprintf(stderr, "faimdprintf: no session! boo! (%d, %s)\n", dlevel, format); | |
| 20 return; | |
| 21 } | |
| 22 if ((dlevel <= sess->debug) && sess->debugcb) { | |
| 23 va_list ap; | |
| 24 va_start(ap, format); | |
| 25 sess->debugcb(sess, dlevel, format, ap); | |
| 26 va_end(ap); | |
| 27 } | |
| 28 | |
| 29 return; | |
| 30 } | |
| 31 | |
| 5927 | 32 faim_export int aimutil_putstr(char *dest, const char *src, int len) |
| 2086 | 33 { |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
34 memcpy(dest, src, len); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
35 return len; |
| 2086 | 36 } |
| 37 | |
| 38 /* | |
| 39 * Tokenizing functions. Used to portably replace strtok/sep. | |
| 40 * -- DMP. | |
| 41 * | |
| 42 */ | |
| 6323 | 43 faim_export int aimutil_tokslen(char *toSearch, int theindex, char dl) |
| 2086 | 44 { |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
45 int curCount = 1; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
46 char *next; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
47 char *last; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
48 int toReturn; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
49 |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
50 last = toSearch; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
51 next = strchr(toSearch, dl); |
| 2086 | 52 |
| 6323 | 53 while(curCount < theindex && next != NULL) { |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
54 curCount++; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
55 last = next + 1; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
56 next = strchr(last, dl); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
57 } |
| 2086 | 58 |
| 6323 | 59 if ((curCount < theindex) || (next == NULL)) |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
60 toReturn = strlen(toSearch) - (curCount - 1); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
61 else |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
62 toReturn = next - toSearch - (curCount - 1); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
63 |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
64 return toReturn; |
| 2086 | 65 } |
| 66 | |
| 67 faim_export int aimutil_itemcnt(char *toSearch, char dl) | |
| 68 { | |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
69 int curCount; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
70 char *next; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
71 |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
72 curCount = 1; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
73 |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
74 next = strchr(toSearch, dl); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
75 |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
76 while(next != NULL) { |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
77 curCount++; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
78 next = strchr(next + 1, dl); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
79 } |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
80 |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
81 return curCount; |
| 2086 | 82 } |
| 83 | |
| 6323 | 84 faim_export char *aimutil_itemindex(char *toSearch, int theindex, char dl) |
| 2086 | 85 { |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
86 int curCount; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
87 char *next; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
88 char *last; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
89 char *toReturn; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
90 |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
91 curCount = 0; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
92 |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
93 last = toSearch; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
94 next = strchr(toSearch, dl); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
95 |
| 6323 | 96 while (curCount < theindex && next != NULL) { |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
97 curCount++; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
98 last = next + 1; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
99 next = strchr(last, dl); |
| 2086 | 100 } |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
101 |
| 6323 | 102 if (curCount < theindex) { |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
103 toReturn = malloc(sizeof(char)); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
104 *toReturn = '\0'; |
| 2086 | 105 } |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
106 next = strchr(last, dl); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
107 |
| 6323 | 108 if (curCount < theindex) { |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
109 toReturn = malloc(sizeof(char)); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
110 *toReturn = '\0'; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
111 } else { |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
112 if (next == NULL) { |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
113 toReturn = malloc((strlen(last) + 1) * sizeof(char)); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
114 strcpy(toReturn, last); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
115 } else { |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
116 toReturn = malloc((next - last + 1) * sizeof(char)); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
117 memcpy(toReturn, last, (next - last)); |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
118 toReturn[next - last] = '\0'; |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
119 } |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
120 } |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
121 return toReturn; |
| 2086 | 122 } |
| 123 | |
| 4617 | 124 /** |
| 125 * Calculate the checksum of a given icon. | |
| 126 * | |
| 127 */ | |
| 128 faim_export fu16_t aimutil_iconsum(const fu8_t *buf, int buflen) | |
| 129 { | |
| 130 fu32_t sum; | |
| 131 int i; | |
| 132 | |
| 133 for (i=0, sum=0; i+1<buflen; i+=2) | |
| 134 sum += (buf[i+1] << 8) + buf[i]; | |
| 135 if (i < buflen) | |
| 136 sum += buf[i]; | |
| 137 sum = ((sum & 0xffff0000) >> 16) + (sum & 0x0000ffff); | |
| 138 | |
| 139 return sum; | |
| 140 } | |
| 141 | |
| 142 faim_export int aim_util_getlocalip(fu8_t *ip) | |
| 143 { | |
| 144 struct hostent *hptr; | |
| 145 char localhost[129]; | |
| 146 | |
| 147 /* XXX if available, use getaddrinfo() */ | |
| 148 /* XXX allow client to specify which IP to use for multihomed boxes */ | |
| 149 | |
| 150 if (gethostname(localhost, 128) < 0) | |
| 151 return -1; | |
| 152 | |
| 153 if (!(hptr = gethostbyname(localhost))) | |
| 154 return -1; | |
| 155 memcpy(ip, hptr->h_addr_list[0], 4); | |
| 156 | |
| 157 return 0; | |
| 158 } | |
| 159 | |
| 8092 | 160 /** |
| 161 * Check if the given screen name is a valid AIM or ICQ screen name. | |
| 162 * | |
| 163 * @return 1 if the screen name is valid, 0 if not. | |
| 164 */ | |
| 165 faim_export int aim_snvalid(const char *sn) | |
| 166 { | |
| 167 int isICQ = 0; | |
| 168 int i = 0; | |
| 169 | |
| 170 if (!sn) | |
| 171 return 0; | |
| 172 | |
| 173 if (isdigit(sn[0])) | |
| 174 isICQ = 1; | |
| 175 | |
| 176 while (sn[i] != '\0') { | |
| 177 /* If it started with a digit then it betta be all digits, ho */ | |
| 178 if (isICQ) { | |
| 179 if (!isdigit(sn[i])) | |
| 180 return 0; | |
| 181 } else { | |
| 8437 | 182 if (!isalnum(sn[i]) && (sn[i] != ' ') && (sn[i] != '@') && (sn[i] != '.')) |
| 8092 | 183 return 0; |
| 184 } | |
| 185 i++; | |
| 186 } | |
| 187 | |
| 188 return 1; | |
| 189 } | |
| 190 | |
| 2086 | 191 /* |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
192 * int snlen(const char *) |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
193 * |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
194 * This takes a screen name and returns its length without |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
195 * spaces. If there are no spaces in the SN, then the |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
196 * return is equal to that of strlen(). |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
197 * |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
198 */ |
| 2086 | 199 faim_export int aim_snlen(const char *sn) |
| 200 { | |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
201 int i = 0; |
| 2086 | 202 |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
203 if (!sn) |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
204 return 0; |
| 2086 | 205 |
| 5556 | 206 while (*sn != '\0') { |
| 207 if (*sn != ' ') | |
| 208 i++; | |
| 209 sn++; | |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
210 } |
| 2086 | 211 |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
212 return i; |
| 2086 | 213 } |
| 214 | |
| 215 /* | |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
216 * int sncmp(const char *, const char *) |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
217 * |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
218 * This takes two screen names and compares them using the rules |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
219 * on screen names for AIM/AOL. Mainly, this means case and space |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
220 * insensitivity (all case differences and spacing differences are |
| 5628 | 221 * ignored, with the exception that screen names can not start with |
| 222 * a space). | |
|
2246
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
223 * |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
224 * Return: 0 if equal |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
225 * non-0 if different |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
226 * |
|
933346315b9b
[gaim-migrate @ 2256]
Eric Warmenhoven <eric@warmenhoven.org>
parents:
2086
diff
changeset
|
227 */ |
| 2086 | 228 faim_export int aim_sncmp(const char *sn1, const char *sn2) |
| 229 { | |
| 230 | |
| 5928 | 231 do { |
| 5556 | 232 while (*sn2 == ' ') |
| 5724 | 233 sn2++; |
| 5556 | 234 while (*sn1 == ' ') |
| 5724 | 235 sn1++; |
| 5928 | 236 if (toupper(*sn1) != toupper(*sn2)) |
| 237 return 1; | |
| 238 } while ((*sn1 != '\0') && sn1++ && sn2++); | |
| 2086 | 239 |
| 5928 | 240 return 0; |
| 2086 | 241 } |
