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;