summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2017-06-02 20:10:16 (GMT)
committersebres <sebres@users.sourceforge.net>2017-06-02 20:10:16 (GMT)
commit30c661cf163c455ea226a7c3640c2f760c894983 (patch)
treeaec293e9ff553bb60a700b5db641ab66c3976bf9
parent3a142b1b89b234ba6146d2c1a96840eda096f010 (diff)
downloadtcl-30c661cf163c455ea226a7c3640c2f760c894983.zip
tcl-30c661cf163c455ea226a7c3640c2f760c894983.tar.gz
tcl-30c661cf163c455ea226a7c3640c2f760c894983.tar.bz2
fix default locale: differentiate between no locale specified or "C" (en) and current locale (corresponds system language, resp. env(LANG))
-rw-r--r--generic/tclClock.c70
-rw-r--r--generic/tclDate.h2
-rw-r--r--library/clock.tcl5
3 files changed, 55 insertions, 22 deletions
diff --git a/generic/tclClock.c b/generic/tclClock.c
index c3e55a8..8f1bb8d 100644
--- a/generic/tclClock.c
+++ b/generic/tclClock.c
@@ -246,6 +246,8 @@ TclClockInit(
data->PrevSetupTimeZone = NULL;
data->PrevSetupTZData = NULL;
+ data->DefaultLocale = NULL;
+ data->DefaultLocaleDict = NULL;
data->CurrentLocale = NULL;
data->CurrentLocaleDict = NULL;
data->LastUsedLocaleUnnorm = NULL;
@@ -316,6 +318,8 @@ ClockConfigureClear(
Tcl_UnsetObjRef(data->PrevSetupTimeZone);
Tcl_UnsetObjRef(data->PrevSetupTZData);
+ Tcl_UnsetObjRef(data->DefaultLocale);
+ data->DefaultLocaleDict = NULL;
Tcl_UnsetObjRef(data->CurrentLocale);
data->CurrentLocaleDict = NULL;
Tcl_UnsetObjRef(data->LastUsedLocaleUnnorm);
@@ -534,6 +538,7 @@ ClockGetCurrentLocale(
Tcl_SetObjRef(dataPtr->CurrentLocale, Tcl_GetObjResult(interp));
dataPtr->CurrentLocaleDict = NULL;
+ Tcl_ResetResult(interp);
return dataPtr->CurrentLocale;
}
@@ -589,9 +594,16 @@ NormLocaleObj(
Tcl_Obj *localeObj,
Tcl_Obj **mcDictObj)
{
- const char *loc;
- if ( localeObj == NULL || localeObj == dataPtr->CurrentLocale
+ const char *loc, *loc2;
+ if ( localeObj == NULL
|| localeObj == dataPtr->literals[LIT_C]
+ || localeObj == dataPtr->DefaultLocale
+ ) {
+ *mcDictObj = dataPtr->DefaultLocaleDict;
+ return dataPtr->DefaultLocale ?
+ dataPtr->DefaultLocale : dataPtr->literals[LIT_C];
+ }
+ if ( localeObj == dataPtr->CurrentLocale
|| localeObj == dataPtr->literals[LIT_CURRENT]
) {
if (dataPtr->CurrentLocale == NULL) {
@@ -622,9 +634,8 @@ NormLocaleObj(
)
) {
*mcDictObj = dataPtr->CurrentLocaleDict;
- localeObj = dataPtr->CurrentLocale;
+ return dataPtr->CurrentLocale;
}
- else
if ( dataPtr->LastUsedLocale != NULL
&& ( localeObj == dataPtr->LastUsedLocale
|| (localeObj->length == dataPtr->LastUsedLocale->length
@@ -634,9 +645,8 @@ NormLocaleObj(
) {
*mcDictObj = dataPtr->LastUsedLocaleDict;
Tcl_SetObjRef(dataPtr->LastUsedLocaleUnnorm, localeObj);
- localeObj = dataPtr->LastUsedLocale;
+ return dataPtr->LastUsedLocale;
}
- else
if ( dataPtr->PrevUsedLocale != NULL
&& ( localeObj == dataPtr->PrevUsedLocale
|| (localeObj->length == dataPtr->PrevUsedLocale->length
@@ -646,36 +656,40 @@ NormLocaleObj(
) {
*mcDictObj = dataPtr->PrevUsedLocaleDict;
Tcl_SetObjRef(dataPtr->PrevUsedLocaleUnnorm, localeObj);
- localeObj = dataPtr->PrevUsedLocale;
+ return dataPtr->PrevUsedLocale;
}
- else
if (
(localeObj->length == 1 /* C */
- && strncasecmp(loc, Literals[LIT_C], localeObj->length) == 0)
- || (localeObj->length == 7 /* current */
- && strncasecmp(loc, Literals[LIT_CURRENT], localeObj->length) == 0)
+ && strcasecmp(loc, Literals[LIT_C]) == 0)
+ || (dataPtr->DefaultLocale && (loc2 = TclGetString(dataPtr->DefaultLocale))
+ && localeObj->length == dataPtr->DefaultLocale->length
+ && strcasecmp(loc, loc2) == 0)
+ ) {
+ *mcDictObj = dataPtr->DefaultLocaleDict;
+ return dataPtr->DefaultLocale ?
+ dataPtr->DefaultLocale : dataPtr->literals[LIT_C];
+ }
+ if ( localeObj->length == 7 /* current */
+ && strcasecmp(loc, Literals[LIT_CURRENT]) == 0
) {
if (dataPtr->CurrentLocale == NULL) {
ClockGetCurrentLocale(dataPtr, interp);
}
*mcDictObj = dataPtr->CurrentLocaleDict;
- localeObj = dataPtr->CurrentLocale;
+ return dataPtr->CurrentLocale;
}
- else
if (
(localeObj->length == 6 /* system */
- && strncasecmp(loc, Literals[LIT_SYSTEM], localeObj->length) == 0)
+ && strcasecmp(loc, Literals[LIT_SYSTEM]) == 0)
) {
SavePrevLocaleObj(dataPtr);
Tcl_SetObjRef(dataPtr->LastUsedLocaleUnnorm, localeObj);
localeObj = ClockGetSystemLocale(dataPtr, interp);
Tcl_SetObjRef(dataPtr->LastUsedLocale, localeObj);
*mcDictObj = NULL;
+ return localeObj;
}
- else
- {
- *mcDictObj = NULL;
- }
+ *mcDictObj = NULL;
return localeObj;
}
@@ -763,6 +777,11 @@ ClockMCDict(ClockFmtScnCmdArgs *opts)
opts->mcDictObj);
}
+ if ( opts->localeObj == dataPtr->literals[LIT_C]
+ || opts->localeObj == dataPtr->DefaultLocale
+ ) {
+ dataPtr->DefaultLocaleDict = opts->mcDictObj;
+ }
if ( opts->localeObj == dataPtr->CurrentLocale ) {
dataPtr->CurrentLocaleDict = opts->mcDictObj;
} else if ( opts->localeObj == dataPtr->LastUsedLocale ) {
@@ -952,13 +971,13 @@ ClockConfigureObjCmd(
ClockClientData *dataPtr = clientData;
static const char *const options[] = {
- "-system-tz", "-setup-tz", "-default-locale",
+ "-system-tz", "-setup-tz", "-default-locale", "-current-locale",
"-clear",
"-year-century", "-century-switch",
NULL
};
enum optionInd {
- CLOCK_SYSTEM_TZ, CLOCK_SETUP_TZ, CLOCK_CURRENT_LOCALE,
+ CLOCK_SYSTEM_TZ, CLOCK_SETUP_TZ, CLOCK_DEFAULT_LOCALE, CLOCK_CURRENT_LOCALE,
CLOCK_CLEAR_CACHE,
CLOCK_YEAR_CENTURY, CLOCK_CENTURY_SWITCH
};
@@ -1004,6 +1023,17 @@ ClockConfigureObjCmd(
Tcl_SetObjResult(interp, dataPtr->LastSetupTimeZone);
}
break;
+ case CLOCK_DEFAULT_LOCALE:
+ if (i < objc) {
+ if (dataPtr->DefaultLocale != objv[i]) {
+ Tcl_SetObjRef(dataPtr->DefaultLocale, objv[i]);
+ dataPtr->DefaultLocaleDict = NULL;
+ }
+ }
+ if (i+1 >= objc && dataPtr->DefaultLocale != NULL) {
+ Tcl_SetObjResult(interp, dataPtr->DefaultLocale);
+ }
+ break;
case CLOCK_CURRENT_LOCALE:
if (i < objc) {
if (dataPtr->CurrentLocale != objv[i]) {
diff --git a/generic/tclDate.h b/generic/tclDate.h
index ff2c39d..bf762b1 100644
--- a/generic/tclDate.h
+++ b/generic/tclDate.h
@@ -300,6 +300,8 @@ typedef struct ClockClientData {
Tcl_Obj *PrevSetupTimeZone;
Tcl_Obj *PrevSetupTZData;
+ Tcl_Obj *DefaultLocale;
+ Tcl_Obj *DefaultLocaleDict;
Tcl_Obj *CurrentLocale;
Tcl_Obj *CurrentLocaleDict;
Tcl_Obj *LastUsedLocaleUnnorm;
diff --git a/library/clock.tcl b/library/clock.tcl
index 7134cbc..8b54463 100644
--- a/library/clock.tcl
+++ b/library/clock.tcl
@@ -298,7 +298,8 @@ proc ::tcl::clock::Initialize {} {
# Default configuration
- configure -default-locale [mclocale]
+ configure -current-locale [mclocale]
+ #configure -default-locale C
#configure -year-century 2000 \
# -century-switch 38
@@ -2058,7 +2059,7 @@ proc ::tcl::clock::WeekdayOnOrBefore { weekday j } {
proc ::tcl::clock::ChangeCurrentLocale {args} {
- configure -default-locale [lindex $args 0]
+ configure -current-locale [lindex $args 0]
variable FormatProc
variable LocaleNumeralCache