Mercurial > pidgin
comparison src/util.c @ 13104:e1e5462b7d81
[gaim-migrate @ 15466]
Rework lots of date parsing. I either introduced a whole lot of bugs, or I've made sure all dates are localized properly now. Only time will tell which it is... ;)
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Thu, 02 Feb 2006 19:50:51 +0000 |
parents | 5828d42e8684 |
children | e42983a1038c |
comparison
equal
deleted
inserted
replaced
13103:a6811e213977 | 13104:e1e5462b7d81 |
---|---|
482 | 482 |
483 | 483 |
484 /************************************************************************** | 484 /************************************************************************** |
485 * Date/Time Functions | 485 * Date/Time Functions |
486 **************************************************************************/ | 486 **************************************************************************/ |
487 const char * | |
488 gaim_utf8_strftime(const char *format, const struct tm *tm) | |
489 { | |
490 static char buf[128]; | |
491 char *utf8; | |
492 | |
493 strftime(buf, sizeof(buf), format, tm); | |
494 | |
495 if ((utf8 = gaim_utf8_try_convert(buf))) | |
496 { | |
497 gaim_strlcpy(buf, utf8); | |
498 g_free(utf8); | |
499 } | |
500 | |
501 return buf; | |
502 } | |
503 | |
504 const char * | |
505 gaim_date_format_short(const struct tm *tm) | |
506 { | |
507 return gaim_utf8_strftime("%x", tm); | |
508 } | |
509 | |
510 const char * | |
511 gaim_date_format_long(const struct tm *tm) | |
512 { | |
513 return gaim_utf8_strftime(_("%x %X"), tm); | |
514 } | |
515 | |
516 const char * | |
517 gaim_date_format_full(time_t time) | |
518 { | |
519 return gaim_utf8_strftime("%c", localtime(&time)); | |
520 } | |
521 | |
522 const char * | |
523 gaim_time_format(const struct tm *tm) | |
524 { | |
525 return gaim_utf8_strftime("%X", tm); | |
526 } | |
487 | 527 |
488 time_t | 528 time_t |
489 gaim_time_build(int year, int month, int day, int hour, int min, int sec) | 529 gaim_time_build(int year, int month, int day, int hour, int min, int sec) |
490 { | 530 { |
491 struct tm tm; | 531 struct tm tm; |
505 { | 545 { |
506 time_t retval = 0; | 546 time_t retval = 0; |
507 struct tm *t; | 547 struct tm *t; |
508 char buf[32]; | 548 char buf[32]; |
509 char *c; | 549 char *c; |
550 int year = 0; | |
510 int tzoff = 0; | 551 int tzoff = 0; |
511 | 552 |
512 time(&retval); | 553 time(&retval); |
513 t = localtime(&retval); | 554 t = localtime(&retval); |
514 | 555 |
515 snprintf(buf, sizeof(buf), "%s", timestamp); | 556 snprintf(buf, sizeof(buf), "%s", timestamp); |
516 c = buf; | 557 c = buf; |
517 | 558 |
518 /* 4 digit year */ | 559 /* 4 digit year */ |
519 if (!sscanf(c, "%04d", &t->tm_year)) return 0; | 560 if (sscanf(c, "%04d", &year) && year > 1900) |
520 c += 4; | 561 { |
521 if (*c == '-') | 562 c += 4; |
563 if (*c == '-') | |
564 c++; | |
565 t->tm_year -= 1900; | |
566 } | |
567 | |
568 /* 2 digit month */ | |
569 if (!sscanf(c, "%02d", &t->tm_mon)) | |
570 return 0; | |
571 c += 2; | |
572 if (*c == '-' || *c == '/') | |
522 c++; | 573 c++; |
523 | 574 t->tm_mon -= 1; |
524 t->tm_year -= 1900; | 575 |
525 | 576 /* 2 digit day */ |
526 /* 2 digit month */ | 577 if (!sscanf(c, "%02d", &t->tm_mday)) |
527 if (!sscanf(c, "%02d", &t->tm_mon)) return 0; | 578 return 0; |
528 c += 2; | 579 c += 2; |
529 if (*c == '-') | 580 if (*c == '/') |
581 { | |
530 c++; | 582 c++; |
531 | 583 |
532 t->tm_mon -= 1; | 584 if (!sscanf(c, "%04d", &t->tm_year)) |
533 | 585 return 0; |
534 /* 2 digit day */ | 586 t->tm_year -= 1900; |
535 if (!sscanf(c, "%02d", &t->tm_mday)) return 0; | 587 } |
536 c += 2; | 588 else if (*c == 'T' || *c == '.') { /* we have more than a date, keep going */ |
537 if (*c == 'T' || *c == '.') { /* we have more than a date, keep going */ | |
538 c++; /* skip the "T" */ | 589 c++; /* skip the "T" */ |
539 | 590 |
540 /* 2 digit hour */ | 591 /* 2 digit hour */ |
541 if (sscanf(c, "%02d:%02d:%02d", &t->tm_hour, &t->tm_min, &t->tm_sec) == 3 || | 592 if (sscanf(c, "%02d:%02d:%02d", &t->tm_hour, &t->tm_min, &t->tm_sec) == 3 || |
542 sscanf(c, "%02d%02d%02d", &t->tm_hour, &t->tm_min, &t->tm_sec) == 3) { | 593 sscanf(c, "%02d%02d%02d", &t->tm_hour, &t->tm_min, &t->tm_sec) == 3) { |
583 retval += tzoff; | 634 retval += tzoff; |
584 | 635 |
585 return retval; | 636 return retval; |
586 } | 637 } |
587 | 638 |
588 size_t gaim_strftime(char *s, size_t max, const char *format, const struct tm *tm) | |
589 { | |
590 return strftime(s, max, format, tm); | |
591 } | |
592 | 639 |
593 /************************************************************************** | 640 /************************************************************************** |
594 * Markup Functions | 641 * Markup Functions |
595 **************************************************************************/ | 642 **************************************************************************/ |
596 gboolean | 643 gboolean |
751 gaim_markup_extract_info_field(const char *str, int len, GString *dest, | 798 gaim_markup_extract_info_field(const char *str, int len, GString *dest, |
752 const char *start_token, int skip, | 799 const char *start_token, int skip, |
753 const char *end_token, char check_value, | 800 const char *end_token, char check_value, |
754 const char *no_value_token, | 801 const char *no_value_token, |
755 const char *display_name, gboolean is_link, | 802 const char *display_name, gboolean is_link, |
756 const char *link_prefix) | 803 const char *link_prefix, |
804 GaimInfoFieldFormatCallback format_cb) | |
757 { | 805 { |
758 const char *p, *q; | 806 const char *p, *q; |
759 | 807 |
760 g_return_val_if_fail(str != NULL, FALSE); | 808 g_return_val_if_fail(str != NULL, FALSE); |
761 g_return_val_if_fail(dest != NULL, FALSE); | 809 g_return_val_if_fail(dest != NULL, FALSE); |
803 g_string_append(dest, "<br><a href=\""); | 851 g_string_append(dest, "<br><a href=\""); |
804 | 852 |
805 if (link_prefix) | 853 if (link_prefix) |
806 g_string_append(dest, link_prefix); | 854 g_string_append(dest, link_prefix); |
807 | 855 |
808 g_string_append_len(dest, p, q - p); | 856 if (format_cb != NULL) |
857 { | |
858 char *reformatted = format_cb(p, q - p); | |
859 g_string_append(dest, reformatted); | |
860 g_free(reformatted); | |
861 } | |
862 else | |
863 g_string_append_len(dest, p, q - p); | |
809 g_string_append(dest, "\">"); | 864 g_string_append(dest, "\">"); |
810 | 865 |
811 if (link_prefix) | 866 if (link_prefix) |
812 g_string_append(dest, link_prefix); | 867 g_string_append(dest, link_prefix); |
813 | 868 |
814 g_string_append_len(dest, p, q - p); | 869 g_string_append_len(dest, p, q - p); |
815 g_string_append(dest, "</a>"); | 870 g_string_append(dest, "</a>"); |
816 } | 871 } |
817 else | 872 else |
818 { | 873 { |
819 g_string_append_len(dest, p, q - p); | 874 if (format_cb != NULL) |
875 { | |
876 char *reformatted = format_cb(p, q - p); | |
877 g_string_append(dest, reformatted); | |
878 g_free(reformatted); | |
879 } | |
880 else | |
881 g_string_append_len(dest, p, q - p); | |
820 } | 882 } |
821 | 883 |
822 g_string_append(dest, "<br>\n"); | 884 g_string_append(dest, "<br>\n"); |
823 | 885 |
824 return TRUE; | 886 return TRUE; |