Mercurial > pidgin.yaz
comparison src/util.c @ 13152:4bb701a8736f
[gaim-migrate @ 15515]
gaim_utf8_strftime() will now provide %z itself if your C library doesn't have it. I'm going to use this shortly.
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Tue, 07 Feb 2006 07:25:45 +0000 |
parents | f62d14ba98f6 |
children | b230ed49c5d1 |
comparison
equal
deleted
inserted
replaced
13151:1646cd4f00ad | 13152:4bb701a8736f |
---|---|
482 | 482 |
483 | 483 |
484 /************************************************************************** | 484 /************************************************************************** |
485 * Date/Time Functions | 485 * Date/Time Functions |
486 **************************************************************************/ | 486 **************************************************************************/ |
487 | |
488 #ifndef HAVE_STRFTIME_Z_FORMAT | |
489 static const char *get_tmoff(const struct tm *tm) | |
490 { | |
491 static char buf[6]; | |
492 long off; | |
493 gint8 min; | |
494 gint8 hrs; | |
495 struct tm new_tm = *tm; | |
496 | |
497 mktime(&new_tm); | |
498 | |
499 if (new_tm.tm_isdst < 0) | |
500 g_return_val_if_reached(""); | |
501 | |
502 #ifdef _WIN32 | |
503 TIME_ZONE_INFORMATION tzi; | |
504 DWORD ret; | |
505 if ((ret = GetTimeZoneInformation(&tzi)) != TIME_ZONE_ID_INVALID) | |
506 { | |
507 off = tzi.Bias * 60; | |
508 if (ret == TIME_ZONE_ID_DAYLIGHT) | |
509 off -= tzi.DaylightBias * 60; | |
510 } | |
511 else | |
512 return ""; | |
513 #else | |
514 # ifdef HAVE_TM_GMTOFF | |
515 off = new_tm.tm_gmtoff; | |
516 # else | |
517 # ifdef HAVE_TIMEZONE | |
518 tzset(); | |
519 off = -timezone; | |
520 # endif /* HAVE_TIMEZONE */ | |
521 # endif /* !HAVE_TM_GMTOFF */ | |
522 #endif /* _WIN32 */ | |
523 | |
524 min = (off / 60) % 60; | |
525 hrs = ((off / 60) - min) / 60; | |
526 | |
527 if (g_snprintf(buf, sizeof(buf), "%+03d%02d", hrs, ABS(min)) > 5) | |
528 g_return_val_if_reached(""); | |
529 | |
530 return buf; | |
531 } | |
532 | |
533 static size_t gaim_internal_strftime(char *s, size_t max, const char *format, const struct tm *tm) | |
534 { | |
535 const char *start; | |
536 const char *c; | |
537 char *fmt = NULL; | |
538 | |
539 /* Yes, this is checked in gaim_utf8_strftime(), | |
540 * but better safe than sorry. -- rlaager */ | |
541 g_return_val_if_fail(format != NULL, 0); | |
542 | |
543 /* This is fairly efficient, and it only gets | |
544 * executed if the underlying system doesn't | |
545 * support the %z format string for strftime(), | |
546 * so I think it's good enough. -- rlaager */ | |
547 for (c = start = format; *c ; c++) | |
548 { | |
549 if (*c != '%') | |
550 continue; | |
551 | |
552 c++; | |
553 | |
554 if (*c == 'z') | |
555 { | |
556 char *tmp = g_strdup_printf("%s%.*s%s", | |
557 fmt ? fmt : "", | |
558 c - start - 1, | |
559 start, | |
560 get_tmoff(tm)); | |
561 g_free(fmt); | |
562 fmt = tmp; | |
563 start = c + 1; | |
564 } | |
565 } | |
566 | |
567 if (fmt != NULL) | |
568 { | |
569 size_t ret; | |
570 | |
571 if (*start) | |
572 { | |
573 char *tmp = g_strconcat(fmt, start, NULL); | |
574 g_free(fmt); | |
575 fmt = tmp; | |
576 } | |
577 | |
578 ret = strftime(s, max, fmt, tm); | |
579 g_free(fmt); | |
580 | |
581 return ret; | |
582 } | |
583 | |
584 return strftime(s, max, format, tm); | |
585 } | |
586 #else /* !HAVE_STRFTIME_Z_FORMAT */ | |
587 #define gaim_internal_strftime strftime | |
588 #endif | |
589 | |
487 const char * | 590 const char * |
488 gaim_utf8_strftime(const char *format, const struct tm *tm) | 591 gaim_utf8_strftime(const char *format, const struct tm *tm) |
489 { | 592 { |
490 static char buf[128]; | 593 static char buf[128]; |
491 char *utf8; | 594 char *utf8; |
500 | 603 |
501 /* A return value of 0 is either an error (in | 604 /* A return value of 0 is either an error (in |
502 * which case, the contents of the buffer are | 605 * which case, the contents of the buffer are |
503 * undefined) or the empty string (in which | 606 * undefined) or the empty string (in which |
504 * case, no harm is done here). */ | 607 * case, no harm is done here). */ |
505 if (strftime(buf, sizeof(buf), format, tm) == 0) | 608 if (gaim_internal_strftime(buf, sizeof(buf), format, tm) == 0) |
506 { | 609 { |
507 buf[0] = '\0'; | 610 buf[0] = '\0'; |
508 return buf; | 611 return buf; |
509 } | 612 } |
510 | 613 |