summaryrefslogtreecommitdiffstats
path: root/generic/tclLink.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclLink.c')
-rw-r--r--generic/tclLink.c88
1 files changed, 35 insertions, 53 deletions
diff --git a/generic/tclLink.c b/generic/tclLink.c
index 1507804..9a39139 100644
--- a/generic/tclLink.c
+++ b/generic/tclLink.c
@@ -36,8 +36,6 @@ typedef struct Link {
unsigned int ui;
short s;
unsigned short us;
- long l;
- unsigned long ul;
Tcl_WideInt w;
Tcl_WideUInt uw;
float f;
@@ -59,6 +57,14 @@ typedef struct Link {
#define LINK_READ_ONLY 1
#define LINK_BEING_UPDATED 2
+#ifndef TCL_NO_DEPRECATED
+
+/* Within tclLink.c, we need legacy values for those two. Can be removed in Tcl 9 */
+#undef TCL_LINK_LONG
+#define TCL_LINK_LONG 11
+#undef TCL_LINK_ULONG
+#define TCL_LINK_ULONG 12
+#endif /* TCL_NO_DEPRECATED */
/*
* Forward references to functions defined later in this file:
@@ -129,6 +135,13 @@ Tcl_LinkVar(
Tcl_IncrRefCount(linkPtr->varName);
linkPtr->addr = addr;
linkPtr->type = type & ~TCL_LINK_READ_ONLY;
+#ifndef TCL_NO_DEPRECATED
+ if (linkPtr->type == TCL_LINK_LONG) {
+ linkPtr->type = ((sizeof(long) != sizeof(int)) ? TCL_LINK_WIDE_INT : TCL_LINK_INT);
+ } else if (linkPtr->type == TCL_LINK_ULONG) {
+ linkPtr->type = ((sizeof(long) != sizeof(int)) ? TCL_LINK_WIDE_UINT : TCL_LINK_UINT);
+ }
+#endif /* TCL_NO_DEPRECATED */
if (type & TCL_LINK_READ_ONLY) {
linkPtr->flags = LINK_READ_ONLY;
} else {
@@ -308,9 +321,11 @@ LinkTraceProc(
if (flags & TCL_TRACE_READS) {
switch (linkPtr->type) {
case TCL_LINK_INT:
+#ifndef TCL_NO_DEPRECATED
case TCL_LINK_BOOLEAN:
changed = (LinkedVar(int) != linkPtr->lastValue.i);
break;
+#endif
case TCL_LINK_DOUBLE:
changed = (LinkedVar(double) != linkPtr->lastValue.d);
break;
@@ -335,12 +350,6 @@ LinkTraceProc(
case TCL_LINK_UINT:
changed = (LinkedVar(unsigned int) != linkPtr->lastValue.ui);
break;
- case TCL_LINK_LONG:
- changed = (LinkedVar(long) != linkPtr->lastValue.l);
- break;
- case TCL_LINK_ULONG:
- changed = (LinkedVar(unsigned long) != linkPtr->lastValue.ul);
- break;
case TCL_LINK_FLOAT:
changed = (LinkedVar(float) != linkPtr->lastValue.f);
break;
@@ -386,7 +395,7 @@ LinkTraceProc(
&& GetInvalidIntFromObj(valueObj, &linkPtr->lastValue.i) != TCL_OK) {
Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
TCL_GLOBAL_ONLY);
- return (char *) "variable must have integer value";
+ return (char *) "variable must have integer or boolean value";
}
LinkedVar(int) = linkPtr->lastValue.i;
break;
@@ -396,7 +405,7 @@ LinkTraceProc(
&& GetInvalidWideFromObj(valueObj, &linkPtr->lastValue.w) != TCL_OK) {
Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
TCL_GLOBAL_ONLY);
- return (char *) "variable must have integer value";
+ return (char *) "variable must have integer or boolean value";
}
LinkedVar(Tcl_WideInt) = linkPtr->lastValue.w;
break;
@@ -419,6 +428,7 @@ LinkTraceProc(
LinkedVar(double) = linkPtr->lastValue.d;
break;
+#ifndef TCL_NO_DEPRECATED
case TCL_LINK_BOOLEAN:
if (Tcl_GetBooleanFromObj(NULL, valueObj, &linkPtr->lastValue.i) != TCL_OK) {
Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
@@ -427,6 +437,7 @@ LinkTraceProc(
}
LinkedVar(int) = linkPtr->lastValue.i;
break;
+#endif
case TCL_LINK_CHAR:
if ((Tcl_GetIntFromObj(NULL, valueObj, &valueInt) != TCL_OK
@@ -434,7 +445,7 @@ LinkTraceProc(
|| valueInt < SCHAR_MIN || valueInt > SCHAR_MAX) {
Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
TCL_GLOBAL_ONLY);
- return (char *) "variable must have char value";
+ return (char *) "variable must have char or boolean value";
}
LinkedVar(char) = linkPtr->lastValue.c = (char)valueInt;
break;
@@ -445,7 +456,7 @@ LinkTraceProc(
|| valueInt < 0 || valueInt > UCHAR_MAX) {
Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
TCL_GLOBAL_ONLY);
- return (char *) "variable must have unsigned char value";
+ return (char *) "variable must have unsigned char or boolean value";
}
LinkedVar(unsigned char) = linkPtr->lastValue.uc = (unsigned char) valueInt;
break;
@@ -456,7 +467,7 @@ LinkTraceProc(
|| valueInt < SHRT_MIN || valueInt > SHRT_MAX) {
Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
TCL_GLOBAL_ONLY);
- return (char *) "variable must have short value";
+ return (char *) "variable must have short or boolean value";
}
LinkedVar(short) = linkPtr->lastValue.s = (short)valueInt;
break;
@@ -467,7 +478,7 @@ LinkTraceProc(
|| valueInt < 0 || valueInt > USHRT_MAX) {
Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
TCL_GLOBAL_ONLY);
- return (char *) "variable must have unsigned short value";
+ return (char *) "variable must have unsigned short or boolean value";
}
LinkedVar(unsigned short) = linkPtr->lastValue.us = (unsigned short)valueInt;
break;
@@ -478,33 +489,11 @@ LinkTraceProc(
|| valueWide < 0 || valueWide > UINT_MAX) {
Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
TCL_GLOBAL_ONLY);
- return (char *) "variable must have unsigned int value";
+ return (char *) "variable must have unsigned int or boolean value";
}
LinkedVar(unsigned int) = linkPtr->lastValue.ui = (unsigned int)valueWide;
break;
- case TCL_LINK_LONG:
- if ((Tcl_GetWideIntFromObj(NULL, valueObj, &valueWide) != TCL_OK
- && GetInvalidWideFromObj(valueObj, &valueWide) != TCL_OK)
- || valueWide < LONG_MIN || valueWide > LONG_MAX) {
- Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
- TCL_GLOBAL_ONLY);
- return (char *) "variable must have long value";
- }
- LinkedVar(long) = linkPtr->lastValue.l = (long)valueWide;
- break;
-
- case TCL_LINK_ULONG:
- if ((Tcl_GetWideIntFromObj(NULL, valueObj, &valueWide) != TCL_OK
- && GetInvalidWideFromObj(valueObj, &valueWide) != TCL_OK)
- || valueWide < 0 || (Tcl_WideUInt) valueWide > ULONG_MAX) {
- Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
- TCL_GLOBAL_ONLY);
- return (char *) "variable must have unsigned long value";
- }
- LinkedVar(unsigned long) = linkPtr->lastValue.ul = (unsigned long)valueWide;
- break;
-
case TCL_LINK_WIDE_UINT:
/*
* FIXME: represent as a bignum.
@@ -513,7 +502,7 @@ LinkTraceProc(
&& GetInvalidWideFromObj(valueObj, &valueWide) != TCL_OK) {
Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
TCL_GLOBAL_ONLY);
- return (char *) "variable must have unsigned wide int value";
+ return (char *) "variable must have unsigned wide int or boolean value";
}
LinkedVar(Tcl_WideUInt) = linkPtr->lastValue.uw = (Tcl_WideUInt)valueWide;
break;
@@ -579,9 +568,11 @@ ObjValue(
case TCL_LINK_DOUBLE:
linkPtr->lastValue.d = LinkedVar(double);
return Tcl_NewDoubleObj(linkPtr->lastValue.d);
+#ifndef TCL_NO_DEPRECATED
case TCL_LINK_BOOLEAN:
linkPtr->lastValue.i = LinkedVar(int);
return Tcl_NewBooleanObj(linkPtr->lastValue.i);
+#endif
case TCL_LINK_CHAR:
linkPtr->lastValue.c = LinkedVar(char);
return Tcl_NewIntObj(linkPtr->lastValue.c);
@@ -597,12 +588,6 @@ ObjValue(
case TCL_LINK_UINT:
linkPtr->lastValue.ui = LinkedVar(unsigned int);
return Tcl_NewWideIntObj((Tcl_WideInt) linkPtr->lastValue.ui);
- case TCL_LINK_LONG:
- linkPtr->lastValue.l = LinkedVar(long);
- return Tcl_NewWideIntObj((Tcl_WideInt) linkPtr->lastValue.l);
- case TCL_LINK_ULONG:
- linkPtr->lastValue.ul = LinkedVar(unsigned long);
- return Tcl_NewWideIntObj((Tcl_WideInt) linkPtr->lastValue.ul);
case TCL_LINK_FLOAT:
linkPtr->lastValue.f = LinkedVar(float);
return Tcl_NewDoubleObj(linkPtr->lastValue.f);
@@ -674,10 +659,10 @@ SetInvalidRealFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr) {
/*
- * This function checks for integer representations, which are valid
- * when linking with C variables, but which are invalid in other
- * contexts in Tcl. Handled are "+", "-", "", "0x", "0b" and "0o"
- * (upperand lowercase). See bug [39f6304c2e].
+ * This function checks for integer or boolean representations,
+ * which are valid when linking with C variables, but which are
+ * invalid in other contexts in Tcl. Handled are "", "0x", "0b"
+ * and "0o" (upperand lowercase). See bug [39f6304c2e].
*/
int
GetInvalidIntFromObj(Tcl_Obj *objPtr, int *intPtr)
@@ -688,11 +673,8 @@ GetInvalidIntFromObj(Tcl_Obj *objPtr, int *intPtr)
((objPtr->length == 2) && (str[0] == '0') && strchr("xXbBoO", str[1]))) {
*intPtr = 0;
return TCL_OK;
- } else if ((objPtr->length == 1) && strchr("+-", str[0])) {
- *intPtr = (str[0] == '+');
- return TCL_OK;
}
- return TCL_ERROR;
+ return Tcl_GetBooleanFromObj(NULL, objPtr, intPtr);
}
int
@@ -710,7 +692,7 @@ GetInvalidWideFromObj(Tcl_Obj *objPtr, Tcl_WideInt *widePtr)
/*
* This function checks for double representations, which are valid
* when linking with C variables, but which are invalid in other
- * contexts in Tcl. Handled are "+", "-", "", ".", "0x", "0b" and "0o"
+ * contexts in Tcl. Handled are booleans, "", ".", "0x", "0b" and "0o"
* (upper- and lowercase) and sequences like "1e-". See bug [39f6304c2e].
*/
int