diff options
Diffstat (limited to 'generic/tclLink.c')
-rw-r--r-- | generic/tclLink.c | 88 |
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 |