summaryrefslogtreecommitdiffstats
path: root/generic/tclClockFmt.c
diff options
context:
space:
mode:
authorsebres <sebres@users.sourceforge.net>2017-01-10 22:28:25 (GMT)
committersebres <sebres@users.sourceforge.net>2017-01-10 22:28:25 (GMT)
commit5afae758b98de2da47b30d6aa4b40a5d5a604fbc (patch)
tree9bea9e914a912fb419e1f480d397197c4362a28a /generic/tclClockFmt.c
parent7b6cd1089c2d3a6eeb8f12b106af40c18017c8f3 (diff)
downloadtcl-5afae758b98de2da47b30d6aa4b40a5d5a604fbc.zip
tcl-5afae758b98de2da47b30d6aa4b40a5d5a604fbc.tar.gz
tcl-5afae758b98de2da47b30d6aa4b40a5d5a604fbc.tar.bz2
improve LocalizeFormat, internal caching of localized formats inside msgcat for locale and format objects
smart reference introduced in dict (smart pointer with 0 object reference but increase dict-reference, provide changeable locale dict)
Diffstat (limited to 'generic/tclClockFmt.c')
-rw-r--r--generic/tclClockFmt.c75
1 files changed, 54 insertions, 21 deletions
diff --git a/generic/tclClockFmt.c b/generic/tclClockFmt.c
index a3c7f20..184b52a 100644
--- a/generic/tclClockFmt.c
+++ b/generic/tclClockFmt.c
@@ -308,14 +308,14 @@ Tcl_ObjType ClockFmtObjType = {
#define ObjClockFmtScn(objPtr) \
(ClockFmtScnStorage *)objPtr->internalRep.twoPtrValue.ptr1;
-#define SetObjLitStorage(objPtr, lit) \
- objPtr->internalRep.twoPtrValue.ptr2 = lit
-#define ObjLitStorage(objPtr) \
- (ClockLitStorage *)objPtr->internalRep.twoPtrValue.ptr2;
-
-#define ClockFmtObj_SetObjIntRep(objPtr, fss, lit) \
- objPtr->internalRep.twoPtrValue.ptr1 = fss, \
- objPtr->internalRep.twoPtrValue.ptr2 = lit, \
+#define SetObjLocFmtKey(objPtr, key) \
+ Tcl_InitObjRef((Tcl_Obj *)objPtr->internalRep.twoPtrValue.ptr2, key)
+#define ObjLocFmtKey(objPtr) \
+ ((Tcl_Obj *)objPtr->internalRep.twoPtrValue.ptr2)
+
+#define ClockFmtObj_SetObjIntRep(objPtr, fss, key) \
+ objPtr->internalRep.twoPtrValue.ptr1 = fss; \
+ Tcl_InitObjRef((Tcl_Obj *)objPtr->internalRep.twoPtrValue.ptr2, key); \
objPtr->typePtr = &ClockFmtObjType;
/*
@@ -327,7 +327,6 @@ ClockFmtObj_DupInternalRep(srcPtr, copyPtr)
Tcl_Obj *copyPtr;
{
ClockFmtScnStorage *fss = ObjClockFmtScn(srcPtr);
- // ClockLitStorage *lit = ObjLitStorage(srcPtr);
if (fss != NULL) {
Tcl_MutexLock(&ClockFmtMutex);
@@ -335,7 +334,7 @@ ClockFmtObj_DupInternalRep(srcPtr, copyPtr)
Tcl_MutexUnlock(&ClockFmtMutex);
}
- ClockFmtObj_SetObjIntRep(copyPtr, fss, NULL);
+ ClockFmtObj_SetObjIntRep(copyPtr, fss, ObjLocFmtKey(srcPtr));
/* if no format representation, dup string representation */
if (fss == NULL) {
@@ -352,7 +351,6 @@ ClockFmtObj_FreeInternalRep(objPtr)
Tcl_Obj *objPtr;
{
ClockFmtScnStorage *fss = ObjClockFmtScn(objPtr);
- // ClockLitStorage *lit = ObjLitStorage(objPtr);
if (fss != NULL) {
Tcl_MutexLock(&ClockFmtMutex);
/* decrement object reference count of format/scan storage */
@@ -368,7 +366,7 @@ ClockFmtObj_FreeInternalRep(objPtr)
Tcl_MutexUnlock(&ClockFmtMutex);
}
SetObjClockFmtScn(objPtr, NULL);
- SetObjLitStorage(objPtr, NULL);
+ Tcl_UnsetObjRef(ObjLocFmtKey(objPtr));
objPtr->typePtr = NULL;
};
/*
@@ -379,16 +377,18 @@ ClockFmtObj_SetFromAny(interp, objPtr)
Tcl_Interp *interp;
Tcl_Obj *objPtr;
{
- ClockFmtScnStorage *fss;
- const char *strFmt = TclGetString(objPtr);
-
- if (!strFmt || (fss = FindOrCreateFmtScnStorage(interp, strFmt)) == NULL) {
- return TCL_ERROR;
- }
-
+ /* validate string representation before free old internal represenation */
+ (void)TclGetString(objPtr);
+
+ /* free old internal represenation */
if (objPtr->typePtr && objPtr->typePtr->freeIntRepProc)
objPtr->typePtr->freeIntRepProc(objPtr);
- ClockFmtObj_SetObjIntRep(objPtr, fss, NULL);
+
+ /* initial state of format object */
+ objPtr->internalRep.twoPtrValue.ptr1 = NULL;
+ objPtr->internalRep.twoPtrValue.ptr2 = NULL;
+ objPtr->typePtr = &ClockFmtObjType;
+
return TCL_OK;
};
/*
@@ -415,6 +415,33 @@ ClockFmtObj_UpdateString(objPtr)
/*
*----------------------------------------------------------------------
+ */
+MODULE_SCOPE Tcl_Obj*
+ClockFrmObjGetLocFmtKey(
+ Tcl_Interp *interp,
+ Tcl_Obj *objPtr)
+{
+ Tcl_Obj *keyObj;
+
+ if (objPtr->typePtr != &ClockFmtObjType) {
+ if (ClockFmtObj_SetFromAny(interp, objPtr) != TCL_OK) {
+ return NULL;
+ }
+ }
+
+ keyObj = ObjLocFmtKey(objPtr);
+ if (keyObj) {
+ return keyObj;
+ }
+
+ keyObj = Tcl_ObjPrintf("FMT_%s", TclGetString(objPtr));
+ SetObjLocFmtKey(objPtr, keyObj);
+
+ return keyObj;
+}
+
+/*
+ *----------------------------------------------------------------------
*
* Tcl_GetClockFrmScnFromObj --
*
@@ -731,7 +758,7 @@ static ClockScanTokenMap ScnWordTokenMap = {
ClockScanToken *
ClockGetOrParseScanFormat(
Tcl_Interp *interp, /* Tcl interpreter */
- Tcl_Obj *formatObj) /* Format container */
+ Tcl_Obj *formatObj) /* Format container */
{
ClockFmtScnStorage *fss;
ClockScanToken *tok;
@@ -889,6 +916,12 @@ ClockScan(
unsigned short int flags = 0;
int ret = TCL_ERROR;
+ /* get localized format */
+
+ if (ClockLocalizeFormat(opts) == NULL) {
+ return TCL_ERROR;
+ }
+
if ((tok = ClockGetOrParseScanFormat(interp, opts->formatObj)) == NULL) {
return TCL_ERROR;
}