Tcl Source Code

Artifact [1c53e8b6b3]
Login

Artifact 1c53e8b6b3ef4a52ecb63e0dfd86352063395995:

Attachment "1242844.patch" to ticket [1242844fff] added by dgp 2005-08-31 22:47:49.
Index: generic/tcl.h
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tcl.h,v
retrieving revision 1.201
diff -u -r1.201 tcl.h
--- generic/tcl.h	7 Jun 2005 20:37:40 -0000	1.201
+++ generic/tcl.h	31 Aug 2005 15:45:24 -0000
@@ -1096,6 +1096,14 @@
 #define TCL_LINK_BOOLEAN	3
 #define TCL_LINK_STRING		4
 #define TCL_LINK_WIDE_INT	5
+#define TCL_LINK_CHAR		6
+#define TCL_LINK_UCHAR		7
+#define TCL_LINK_SHORT		8
+#define TCL_LINK_USHORT		9
+#define TCL_LINK_UINT		10
+#define TCL_LINK_LONG		11
+#define TCL_LINK_ULONG		12
+#define TCL_LINK_FLOAT		13
 #define TCL_LINK_READ_ONLY	0x80
 
 
Index: generic/tclLink.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/tclLink.c,v
retrieving revision 1.11
diff -u -r1.11 tclLink.c
--- generic/tclLink.c	26 Aug 2005 13:41:23 -0000	1.11
+++ generic/tclLink.c	31 Aug 2005 15:45:24 -0000
@@ -16,6 +16,7 @@
  */
 
 #include "tclInt.h"
+#include "tclPort.h"
 
 /*
  * For each linked variable there is a data structure of the following type,
@@ -35,6 +36,14 @@
 	int i;
 	double d;
 	Tcl_WideInt w;
+	char c;
+	unsigned char uc;
+	short s;
+	unsigned short us;
+	unsigned int ui;
+	long l;
+	unsigned long ul;
+	float f;
     } lastValue;		/* Last known value of C variable; used to
 				 * avoid string conversions. */
     int flags;			/* Miscellaneous one-bit values; see below for
@@ -233,6 +242,9 @@
     CONST char *value;
     char **pp;
     Tcl_Obj *valueObj;
+    int valueInt;
+    Tcl_WideInt valueWide;
+    double valueDouble;
 
     /*
      * If the variable is being unset, then just re-create it (with a trace)
@@ -280,6 +292,30 @@
 	case TCL_LINK_WIDE_INT:
 	    changed = *(Tcl_WideInt *)(linkPtr->addr) != linkPtr->lastValue.w;
 	    break;
+	case TCL_LINK_CHAR:
+	    changed = *(char *)(linkPtr->addr) != linkPtr->lastValue.c;
+	    break;
+	case TCL_LINK_UCHAR:
+	    changed = *(unsigned char *)(linkPtr->addr) != linkPtr->lastValue.uc;
+	    break;
+	case TCL_LINK_SHORT:
+	    changed = *(short *)(linkPtr->addr) != linkPtr->lastValue.s;
+	    break;
+	case TCL_LINK_USHORT:
+	    changed = *(unsigned short *)(linkPtr->addr) != linkPtr->lastValue.us;
+	    break;
+	case TCL_LINK_UINT:
+	    changed = *(unsigned int *)(linkPtr->addr) != linkPtr->lastValue.ui;
+	    break;
+	case TCL_LINK_LONG:
+	    changed = *(long *)(linkPtr->addr) != linkPtr->lastValue.l;
+	    break;
+	case TCL_LINK_ULONG:
+	    changed = *(unsigned long *)(linkPtr->addr) != linkPtr->lastValue.ul;
+	    break;
+	case TCL_LINK_FLOAT:
+	    changed = *(float *)(linkPtr->addr) != linkPtr->lastValue.f;
+	    break;
 	case TCL_LINK_STRING:
 	    changed = 1;
 	    break;
@@ -356,6 +392,94 @@
 	*(int *)(linkPtr->addr) = linkPtr->lastValue.i;
 	break;
 
+    case TCL_LINK_CHAR:
+	if (Tcl_GetIntFromObj(interp, valueObj, &valueInt)
+	    != TCL_OK || valueInt < SCHAR_MIN || valueInt > SCHAR_MAX) {
+	    Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
+		    TCL_GLOBAL_ONLY);
+	    return "variable must have char value";
+	}
+	linkPtr->lastValue.c = (char)valueInt;
+	*(char *)(linkPtr->addr) = linkPtr->lastValue.c;
+	break;
+
+    case TCL_LINK_UCHAR:
+	if (Tcl_GetIntFromObj(interp, valueObj, &valueInt)
+	    != TCL_OK || valueInt < 0 || valueInt > UCHAR_MAX) {
+	    Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
+		    TCL_GLOBAL_ONLY);
+	    return "variable must have unsigned char value";
+	}
+	linkPtr->lastValue.uc = (unsigned char) valueInt;
+	*(unsigned char *)(linkPtr->addr) = linkPtr->lastValue.uc;
+	break;
+
+    case TCL_LINK_SHORT:
+	if (Tcl_GetIntFromObj(interp, valueObj, &valueInt)
+	    != TCL_OK || valueInt < SHRT_MIN || valueInt > SHRT_MAX) {
+	    Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
+		    TCL_GLOBAL_ONLY);
+	    return "variable must have short value";
+	}
+	linkPtr->lastValue.s = (short)valueInt;
+	*(short *)(linkPtr->addr) = linkPtr->lastValue.s;
+	break;
+
+    case TCL_LINK_USHORT:
+	if (Tcl_GetIntFromObj(interp, valueObj, &valueInt)
+	    != TCL_OK || valueInt < 0 || valueInt > USHRT_MAX) {
+	    Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
+		    TCL_GLOBAL_ONLY);
+	    return "variable must have unsigned short value";
+	}
+	linkPtr->lastValue.us = (unsigned short)valueInt;
+	*(unsigned short *)(linkPtr->addr) = linkPtr->lastValue.us;
+	break;
+
+    case TCL_LINK_UINT:
+	if (Tcl_GetWideIntFromObj(interp, valueObj, &valueWide)
+	    != TCL_OK || valueWide < 0 || valueWide > UINT_MAX) {
+	    Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
+		    TCL_GLOBAL_ONLY);
+	    return "variable must have unsigned int value";
+	}
+	linkPtr->lastValue.ui = (unsigned int)valueWide;
+	*(unsigned int *)(linkPtr->addr) = linkPtr->lastValue.ui;
+	break;
+
+    case TCL_LINK_LONG:
+	if (Tcl_GetWideIntFromObj(interp, valueObj, &valueWide)
+	    != TCL_OK || valueWide < LONG_MIN || valueWide > LONG_MAX) {
+	    Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
+		    TCL_GLOBAL_ONLY);
+	    return "variable must have long value";
+	}
+	linkPtr->lastValue.l = (long)valueWide;
+	*(long *)(linkPtr->addr) = linkPtr->lastValue.l;
+	break;
+
+    case TCL_LINK_ULONG:
+	if (Tcl_GetWideIntFromObj(interp, valueObj, &valueWide)
+	    != TCL_OK || valueWide < 0 || valueWide > ULONG_MAX) {
+	    Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
+		    TCL_GLOBAL_ONLY);
+	    return "variable must have unsigned long value";
+	}
+	linkPtr->lastValue.ul = (unsigned long)valueWide;
+	*(unsigned long *)(linkPtr->addr) = linkPtr->lastValue.ul;
+	break;
+
+    case TCL_LINK_FLOAT:
+	if (Tcl_GetDoubleFromObj(interp, valueObj, &valueDouble)
+	    != TCL_OK || valueDouble < FLT_MIN || valueDouble > FLT_MAX) {
+	    Tcl_ObjSetVar2(interp, linkPtr->varName, NULL, ObjValue(linkPtr),
+		    TCL_GLOBAL_ONLY);
+	    return "variable must have float value";
+	}
+	linkPtr->lastValue.f = (float)valueDouble;
+	*(float *)(linkPtr->addr) = linkPtr->lastValue.f;
+	break;
+
     case TCL_LINK_STRING:
 	value = Tcl_GetStringFromObj(valueObj, &valueLength);
 	valueLength++;
@@ -410,6 +534,30 @@
     case TCL_LINK_BOOLEAN:
 	linkPtr->lastValue.i = *(int *)(linkPtr->addr);
 	return Tcl_NewBooleanObj(linkPtr->lastValue.i != 0);
+    case TCL_LINK_CHAR:
+	linkPtr->lastValue.c = *(char *)(linkPtr->addr);
+	return Tcl_NewIntObj(linkPtr->lastValue.c);
+    case TCL_LINK_UCHAR:
+	linkPtr->lastValue.uc = *(unsigned char *)(linkPtr->addr);
+	return Tcl_NewIntObj(linkPtr->lastValue.uc);
+    case TCL_LINK_SHORT:
+	linkPtr->lastValue.s = *(short *)(linkPtr->addr);
+	return Tcl_NewIntObj(linkPtr->lastValue.s);
+    case TCL_LINK_USHORT:
+	linkPtr->lastValue.us = *(unsigned short *)(linkPtr->addr);
+	return Tcl_NewIntObj(linkPtr->lastValue.us);
+    case TCL_LINK_UINT:
+	linkPtr->lastValue.ui = *(unsigned int *)(linkPtr->addr);
+	return Tcl_NewWideIntObj(linkPtr->lastValue.ui);
+    case TCL_LINK_LONG:
+	linkPtr->lastValue.l = *(long *)(linkPtr->addr);
+	return Tcl_NewWideIntObj(linkPtr->lastValue.l);
+    case TCL_LINK_ULONG:
+	linkPtr->lastValue.ul = *(unsigned long *)(linkPtr->addr);
+	return Tcl_NewWideIntObj(linkPtr->lastValue.ul);
+    case TCL_LINK_FLOAT:
+	linkPtr->lastValue.f = *(float *)(linkPtr->addr);
+	return Tcl_NewDoubleObj(linkPtr->lastValue.f);
     case TCL_LINK_STRING:
 	p = *(char **)(linkPtr->addr);
 	if (p == NULL) {