summaryrefslogtreecommitdiffstats
path: root/compat/strftime.c
diff options
context:
space:
mode:
authorhobbs <hobbs>2002-04-22 22:41:46 (GMT)
committerhobbs <hobbs>2002-04-22 22:41:46 (GMT)
commitae8818e783ef033c3aace0b9b7cb1cc4c8b68ae0 (patch)
tree614cb4f6866af5c95c83ff5e0cbe7da3c544659e /compat/strftime.c
parentf53cd80c45d6ec6c944e55a1fc5f2702cfcf94be (diff)
downloadtcl-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.c63
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'))