diff options
author | hobbs <hobbs> | 2002-04-22 22:41:46 (GMT) |
---|---|---|
committer | hobbs <hobbs> | 2002-04-22 22:41:46 (GMT) |
commit | ae8818e783ef033c3aace0b9b7cb1cc4c8b68ae0 (patch) | |
tree | 614cb4f6866af5c95c83ff5e0cbe7da3c544659e /compat/strftime.c | |
parent | f53cd80c45d6ec6c944e55a1fc5f2702cfcf94be (diff) | |
download | tcl-ae8818e783ef033c3aace0b9b7cb1cc4c8b68ae0.zip tcl-ae8818e783ef033c3aace0b9b7cb1cc4c8b68ae0.tar.gz tcl-ae8818e783ef033c3aace0b9b7cb1cc4c8b68ae0.tar.bz2 |
* doc/clock.n:
* compat/strftime.c (_fmt): change strftime to correctly handle
localized %c, %x and %X on Windows. Added some notes about how
the other values could be further localized.
Diffstat (limited to 'compat/strftime.c')
-rw-r--r-- | compat/strftime.c | 63 |
1 files changed, 56 insertions, 7 deletions
diff --git a/compat/strftime.c b/compat/strftime.c index a2199a5..52a7fa1 100644 --- a/compat/strftime.c +++ b/compat/strftime.c @@ -8,7 +8,7 @@ * source. See the copyright notice below for details on redistribution * restrictions. The "license.terms" file does not apply to this file. * - * RCS: @(#) $Id: strftime.c,v 1.8 2001/11/23 01:26:30 das Exp $ + * RCS: @(#) $Id: strftime.c,v 1.9 2002/04/22 22:41:46 hobbs Exp $ */ /* @@ -45,7 +45,7 @@ */ #if defined(LIBC_SCCS) -static char *rcsid = "$Id: strftime.c,v 1.8 2001/11/23 01:26:30 das Exp $"; +static char *rcsid = "$Id: strftime.c,v 1.9 2002/04/22 22:41:46 hobbs Exp $"; #endif /* LIBC_SCCS */ #include <time.h> @@ -68,7 +68,13 @@ typedef struct { const char *t_fmt; const char *t_fmt_ampm; } _TimeLocale; - + +/* + * This is the C locale default. On Windows, if we wanted to make this + * localized, we would use GetLocaleInfo to get the correct values. + * It may be acceptable to do localization of month/day names, as the + * numerical values would be considered the locale-independent versions. + */ static const _TimeLocale _DefaultTimeLocale = { { @@ -144,6 +150,20 @@ _fmt(format, t) const char *format; const struct tm *t; { +#ifdef WIN32 +#define BUF_SIZ 256 + TCHAR buf[BUF_SIZ]; + SYSTEMTIME syst = { + t->tm_year + 1900, + t->tm_mon + 1, + t->tm_wday, + t->tm_mday, + t->tm_hour, + t->tm_min, + t->tm_sec, + 0, + }; +#endif for (; *format; ++format) { if (*format == '%') { ++format; @@ -188,10 +208,6 @@ _fmt(format, t) 2, '0')) return(0); continue; - case 'c': - if (!_fmt(_CurrentTimeLocale->d_t_fmt, t)) - return(0); - continue; case 'D': if (!_fmt("%m/%d/%y", t)) return(0); @@ -307,6 +323,38 @@ _fmt(format, t) if (!_conv(t->tm_wday, 1, '0')) return(0); continue; +#ifdef WIN32 + /* + * To properly handle the localized time routines on Windows, + * we must make use of the special localized calls. + */ + case 'c': + if (!GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, + &syst, NULL, buf, BUF_SIZ) || !_add(buf) + || !_add(" ")) { + return(0); + } + /* + * %c is created with LONGDATE + " " + TIME on Windows, + * so continue to %X case here. + */ + case 'X': + if (!GetTimeFormat(LOCALE_USER_DEFAULT, 0, + &syst, NULL, buf, BUF_SIZ) || !_add(buf)) { + return(0); + } + continue; + case 'x': + if (!GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, + &syst, NULL, buf, BUF_SIZ) || !_add(buf)) { + return(0); + } + continue; +#else + case 'c': + if (!_fmt(_CurrentTimeLocale->d_t_fmt, t)) + return(0); + continue; case 'x': if (!_fmt(_CurrentTimeLocale->d_fmt, t)) return(0); @@ -315,6 +363,7 @@ _fmt(format, t) if (!_fmt(_CurrentTimeLocale->t_fmt, t)) return(0); continue; +#endif case 'y': if (!_conv((t->tm_year + TM_YEAR_BASE) % 100, 2, '0')) |