comparison src/util.c @ 7107:9220c7490cd1

[gaim-migrate @ 7672] This is a big one: normalize() -> gaim_normalize, linkify_text() -> gaim_markup_linkify(), gaim_get_size_string() -> gaim_str_size_to_units(), and moved clean_pid() to main.c. committer: Tailor Script <tailor@pidgin.im>
author Christian Hammond <chipx86@chipx86.com>
date Wed, 01 Oct 2003 06:17:28 +0000
parents db6bd3e794d8
children 6faeeecab0dc
comparison
equal deleted inserted replaced
7106:db6bd3e794d8 7107:9220c7490cd1
134 ret = g_strdup_printf("%d %s.", min, ngettext("minute","minutes",min)); 134 ret = g_strdup_printf("%d %s.", min, ngettext("minute","minutes",min));
135 } 135 }
136 } 136 }
137 137
138 return ret; 138 return ret;
139 }
140
141 char *linkify_text(const char *text)
142 {
143 const char *c, *t, *q = NULL;
144 char *tmp;
145 char url_buf[BUF_LEN * 4];
146 GString *ret = g_string_new("");
147 /* Assumes you have a buffer able to cary at least BUF_LEN * 2 bytes */
148
149 c = text;
150 while (*c) {
151 if(!q && (*c == '\"' || *c == '\'')) {
152 q = c;
153 } else if(q) {
154 if(*c == *q)
155 q = NULL;
156 } else if (!g_ascii_strncasecmp(c, "<A", 2)) {
157 while (1) {
158 if (!g_ascii_strncasecmp(c, "/A>", 3)) {
159 break;
160 }
161 ret = g_string_append_c(ret, *c);
162 c++;
163 if (!(*c))
164 break;
165 }
166 } else if ((*c=='h') && (!g_ascii_strncasecmp(c, "http://", 7) ||
167 (!g_ascii_strncasecmp(c, "https://", 8)))) {
168 t = c;
169 while (1) {
170 if (badchar(*t)) {
171
172 if (*(t) == ',' && (*(t + 1) != ' ')) {
173 t++;
174 continue;
175 }
176
177 if (*(t - 1) == '.')
178 t--;
179 strncpy(url_buf, c, t - c);
180 url_buf[t - c] = 0;
181 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
182 url_buf, url_buf);
183 c = t;
184 break;
185 }
186 if (!t)
187 break;
188 t++;
189
190 }
191 } else if (!g_ascii_strncasecmp(c, "www.", 4)) {
192 if (c[4] != '.') {
193 t = c;
194 while (1) {
195 if (badchar(*t)) {
196 if (t - c == 4) {
197 break;
198 }
199
200 if (*(t) == ',' && (*(t + 1) != ' ')) {
201 t++;
202 continue;
203 }
204
205 if (*(t - 1) == '.')
206 t--;
207 strncpy(url_buf, c, t - c);
208 url_buf[t - c] = 0;
209 g_string_append_printf(ret,
210 "<A HREF=\"http://%s\">%s</A>", url_buf,
211 url_buf);
212 c = t;
213 break;
214 }
215 if (!t)
216 break;
217 t++;
218 }
219 }
220 } else if (!g_ascii_strncasecmp(c, "ftp://", 6)) {
221 t = c;
222 while (1) {
223 if (badchar(*t)) {
224 if (*(t - 1) == '.')
225 t--;
226 strncpy(url_buf, c, t - c);
227 url_buf[t - c] = 0;
228 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
229 url_buf, url_buf);
230 c = t;
231 break;
232 }
233 if (!t)
234 break;
235 t++;
236
237 }
238 } else if (!g_ascii_strncasecmp(c, "ftp.", 4)) {
239 if (c[4] != '.') {
240 t = c;
241 while (1) {
242 if (badchar(*t)) {
243 if (t - c == 4) {
244 break;
245 }
246 if (*(t - 1) == '.')
247 t--;
248 strncpy(url_buf, c, t - c);
249 url_buf[t - c] = 0;
250 g_string_append_printf(ret,
251 "<A HREF=\"ftp://%s\">%s</A>", url_buf,
252 url_buf);
253 c = t;
254 break;
255 }
256 if (!t)
257 break;
258 t++;
259 }
260 }
261 } else if (!g_ascii_strncasecmp(c, "mailto:", 7)) {
262 t = c;
263 while (1) {
264 if (badchar(*t)) {
265 if (*(t - 1) == '.')
266 t--;
267 strncpy(url_buf, c, t - c);
268 url_buf[t - c] = 0;
269 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
270 url_buf, url_buf);
271 c = t;
272 break;
273 }
274 if (!t)
275 break;
276 t++;
277
278 }
279 } else if (c != text && (*c == '@')) {
280 char *tmp;
281 int flag;
282 int len = 0;
283 const char illegal_chars[] = "!@#$%^&*()[]{}/|\\<>\":;\r\n \0";
284 url_buf[0] = 0;
285
286 if (strchr(illegal_chars,*(c - 1)) || strchr(illegal_chars, *(c + 1)))
287 flag = 0;
288 else
289 flag = 1;
290
291 t = c;
292 while (flag) {
293 if (badchar(*t)) {
294 ret = g_string_truncate(ret, ret->len - (len - 1));
295 break;
296 } else {
297 len++;
298 tmp = g_malloc(len + 1);
299 tmp[len] = 0;
300 tmp[0] = *t;
301 strncpy(tmp + 1, url_buf, len - 1);
302 strcpy(url_buf, tmp);
303 url_buf[len] = 0;
304 g_free(tmp);
305 t--;
306 if (t < text) {
307 ret = g_string_assign(ret, "");
308 break;
309 }
310 }
311 }
312
313 t = c + 1;
314
315 while (flag) {
316 if (badchar(*t)) {
317 char *d;
318
319 for (d = url_buf + strlen(url_buf) - 1; *d == '.'; d--, t--)
320 *d = '\0';
321
322 g_string_append_printf(ret, "<A HREF=\"mailto:%s\">%s</A>",
323 url_buf, url_buf);
324 c = t;
325
326 break;
327 } else {
328 strncat(url_buf, t, 1);
329 len++;
330 url_buf[len] = 0;
331 }
332
333 t++;
334 }
335 }
336
337 if (*c == 0)
338 break;
339
340 ret = g_string_append_c(ret, *c);
341 c++;
342
343 }
344 tmp = ret->str;
345 g_string_free(ret, FALSE);
346 return tmp;
347 } 139 }
348 140
349 141
350 static const char alphabet[] = 142 static const char alphabet[] =
351 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" 143 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
500 292
501 *raw = data; 293 *raw = data;
502 return len/2; 294 return len/2;
503 } 295 }
504 296
505 char *normalize(const char *s) 297 char *gaim_normalize(const char *s)
506 { 298 {
507 static char buf[BUF_LEN]; 299 static char buf[BUF_LEN];
508 char *tmp; 300 char *tmp;
509 int i, j; 301 int i, j;
510 302
534 time_t tme; 326 time_t tme;
535 time(&tme); 327 time(&tme);
536 strftime(date, sizeof(date), "%H:%M:%S", localtime(&tme)); 328 strftime(date, sizeof(date), "%H:%M:%S", localtime(&tme));
537 return date; 329 return date;
538 } 330 }
539
540 void clean_pid(void)
541 {
542 #ifndef _WIN32
543 int status;
544 pid_t pid;
545
546 do {
547 pid = waitpid(-1, &status, WNOHANG);
548 } while (pid != 0 && pid != (pid_t)-1);
549 if(pid == (pid_t)-1 && errno != ECHILD) {
550 char errmsg[BUFSIZ];
551 snprintf(errmsg, BUFSIZ, "Warning: waitpid() returned %d", pid);
552 perror(errmsg);
553 }
554 #endif
555 }
556
557 331
558 /* Look for %n, %d, or %t in msg, and replace with the sender's name, date, 332 /* Look for %n, %d, or %t in msg, and replace with the sender's name, date,
559 or time */ 333 or time */
560 char *away_subs(const char *msg, const char *name) 334 char *away_subs(const char *msg, const char *name)
561 { 335 {
1002 } 776 }
1003 777
1004 return ret; 778 return ret;
1005 } 779 }
1006 780
1007 char *gaim_get_size_string(size_t size) 781 char *
782 gaim_str_size_to_units(size_t size)
1008 { 783 {
1009 static const char *size_str[4] = { "bytes", "KB", "MB", "GB" }; 784 static const char *size_str[4] = { "bytes", "KB", "MB", "GB" };
1010 float size_mag; 785 float size_mag;
1011 int size_index = 0; 786 int size_index = 0;
1012 787
1609 str2[j] = '\0'; 1384 str2[j] = '\0';
1610 1385
1611 return str2; 1386 return str2;
1612 } 1387 }
1613 1388
1389 char *
1390 gaim_markup_linkify(const char *text)
1391 {
1392 const char *c, *t, *q = NULL;
1393 char *tmp;
1394 char url_buf[BUF_LEN * 4];
1395 GString *ret = g_string_new("");
1396 /* Assumes you have a buffer able to cary at least BUF_LEN * 2 bytes */
1397
1398 c = text;
1399 while (*c) {
1400 if(!q && (*c == '\"' || *c == '\'')) {
1401 q = c;
1402 } else if(q) {
1403 if(*c == *q)
1404 q = NULL;
1405 } else if (!g_ascii_strncasecmp(c, "<A", 2)) {
1406 while (1) {
1407 if (!g_ascii_strncasecmp(c, "/A>", 3)) {
1408 break;
1409 }
1410 ret = g_string_append_c(ret, *c);
1411 c++;
1412 if (!(*c))
1413 break;
1414 }
1415 } else if ((*c=='h') && (!g_ascii_strncasecmp(c, "http://", 7) ||
1416 (!g_ascii_strncasecmp(c, "https://", 8)))) {
1417 t = c;
1418 while (1) {
1419 if (badchar(*t)) {
1420
1421 if (*(t) == ',' && (*(t + 1) != ' ')) {
1422 t++;
1423 continue;
1424 }
1425
1426 if (*(t - 1) == '.')
1427 t--;
1428 strncpy(url_buf, c, t - c);
1429 url_buf[t - c] = 0;
1430 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
1431 url_buf, url_buf);
1432 c = t;
1433 break;
1434 }
1435 if (!t)
1436 break;
1437 t++;
1438
1439 }
1440 } else if (!g_ascii_strncasecmp(c, "www.", 4)) {
1441 if (c[4] != '.') {
1442 t = c;
1443 while (1) {
1444 if (badchar(*t)) {
1445 if (t - c == 4) {
1446 break;
1447 }
1448
1449 if (*(t) == ',' && (*(t + 1) != ' ')) {
1450 t++;
1451 continue;
1452 }
1453
1454 if (*(t - 1) == '.')
1455 t--;
1456 strncpy(url_buf, c, t - c);
1457 url_buf[t - c] = 0;
1458 g_string_append_printf(ret,
1459 "<A HREF=\"http://%s\">%s</A>", url_buf,
1460 url_buf);
1461 c = t;
1462 break;
1463 }
1464 if (!t)
1465 break;
1466 t++;
1467 }
1468 }
1469 } else if (!g_ascii_strncasecmp(c, "ftp://", 6)) {
1470 t = c;
1471 while (1) {
1472 if (badchar(*t)) {
1473 if (*(t - 1) == '.')
1474 t--;
1475 strncpy(url_buf, c, t - c);
1476 url_buf[t - c] = 0;
1477 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
1478 url_buf, url_buf);
1479 c = t;
1480 break;
1481 }
1482 if (!t)
1483 break;
1484 t++;
1485
1486 }
1487 } else if (!g_ascii_strncasecmp(c, "ftp.", 4)) {
1488 if (c[4] != '.') {
1489 t = c;
1490 while (1) {
1491 if (badchar(*t)) {
1492 if (t - c == 4) {
1493 break;
1494 }
1495 if (*(t - 1) == '.')
1496 t--;
1497 strncpy(url_buf, c, t - c);
1498 url_buf[t - c] = 0;
1499 g_string_append_printf(ret,
1500 "<A HREF=\"ftp://%s\">%s</A>", url_buf,
1501 url_buf);
1502 c = t;
1503 break;
1504 }
1505 if (!t)
1506 break;
1507 t++;
1508 }
1509 }
1510 } else if (!g_ascii_strncasecmp(c, "mailto:", 7)) {
1511 t = c;
1512 while (1) {
1513 if (badchar(*t)) {
1514 if (*(t - 1) == '.')
1515 t--;
1516 strncpy(url_buf, c, t - c);
1517 url_buf[t - c] = 0;
1518 g_string_append_printf(ret, "<A HREF=\"%s\">%s</A>",
1519 url_buf, url_buf);
1520 c = t;
1521 break;
1522 }
1523 if (!t)
1524 break;
1525 t++;
1526
1527 }
1528 } else if (c != text && (*c == '@')) {
1529 char *tmp;
1530 int flag;
1531 int len = 0;
1532 const char illegal_chars[] = "!@#$%^&*()[]{}/|\\<>\":;\r\n \0";
1533 url_buf[0] = 0;
1534
1535 if (strchr(illegal_chars,*(c - 1)) || strchr(illegal_chars, *(c + 1)))
1536 flag = 0;
1537 else
1538 flag = 1;
1539
1540 t = c;
1541 while (flag) {
1542 if (badchar(*t)) {
1543 ret = g_string_truncate(ret, ret->len - (len - 1));
1544 break;
1545 } else {
1546 len++;
1547 tmp = g_malloc(len + 1);
1548 tmp[len] = 0;
1549 tmp[0] = *t;
1550 strncpy(tmp + 1, url_buf, len - 1);
1551 strcpy(url_buf, tmp);
1552 url_buf[len] = 0;
1553 g_free(tmp);
1554 t--;
1555 if (t < text) {
1556 ret = g_string_assign(ret, "");
1557 break;
1558 }
1559 }
1560 }
1561
1562 t = c + 1;
1563
1564 while (flag) {
1565 if (badchar(*t)) {
1566 char *d;
1567
1568 for (d = url_buf + strlen(url_buf) - 1; *d == '.'; d--, t--)
1569 *d = '\0';
1570
1571 g_string_append_printf(ret, "<A HREF=\"mailto:%s\">%s</A>",
1572 url_buf, url_buf);
1573 c = t;
1574
1575 break;
1576 } else {
1577 strncat(url_buf, t, 1);
1578 len++;
1579 url_buf[len] = 0;
1580 }
1581
1582 t++;
1583 }
1584 }
1585
1586 if (*c == 0)
1587 break;
1588
1589 ret = g_string_append_c(ret, *c);
1590 c++;
1591
1592 }
1593 tmp = ret->str;
1594 g_string_free(ret, FALSE);
1595 return tmp;
1596 }
1597
1614 gboolean 1598 gboolean
1615 gaim_url_parse(const char *url, char **ret_host, int *ret_port, 1599 gaim_url_parse(const char *url, char **ret_host, int *ret_port,
1616 char **ret_path) 1600 char **ret_path)
1617 { 1601 {
1618 char scan_info[255]; 1602 char scan_info[255];