summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tkbltGrAxis.C6
-rw-r--r--generic/tkbltGrAxisOp.C48
-rw-r--r--generic/tkbltGrElemLine.C29
-rw-r--r--generic/tkbltGrElemOp.C64
-rw-r--r--generic/tkbltGrMarkerOp.C69
-rw-r--r--generic/tkbltVecCmd.C4
6 files changed, 172 insertions, 48 deletions
diff --git a/generic/tkbltGrAxis.C b/generic/tkbltGrAxis.C
index 418abbb..26560d0 100644
--- a/generic/tkbltGrAxis.C
+++ b/generic/tkbltGrAxis.C
@@ -902,6 +902,12 @@ void Axis::fixRange()
(ops->reqMin >= ops->reqMax)) {
ops->reqMin = ops->reqMax = NAN;
}
+ if (ops->reqMin < -DBL_MAX) {
+ ops->reqMin = -DBL_MAX;
+ }
+ if (ops->reqMax > DBL_MAX) {
+ ops->reqMax = DBL_MAX;
+ }
if (ops->logScale) {
if ((!isnan(ops->reqMin)) && (ops->reqMin <= 0.0))
ops->reqMin = NAN;
diff --git a/generic/tkbltGrAxisOp.C b/generic/tkbltGrAxisOp.C
index e467d53..fb3277e 100644
--- a/generic/tkbltGrAxisOp.C
+++ b/generic/tkbltGrAxisOp.C
@@ -98,8 +98,10 @@ static int CgetOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=5) {
+ Tcl_WrongNumArgs(interp, 3, objv, "axisId option");
return TCL_ERROR;
+ }
Axis* axisPtr;
if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK)
@@ -112,8 +114,10 @@ static int ConfigureOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc<4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "axisId ?option value?...");
return TCL_ERROR;
+ }
Axis* axisPtr;
if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK)
@@ -126,8 +130,10 @@ static int ActivateOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "axisId");
return TCL_ERROR;
+ }
Axis* axisPtr;
if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK)
@@ -160,8 +166,10 @@ static int CreateOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "axisId");
return TCL_ERROR;
+ }
if (graphPtr->createAxis(objc, objv) != TCL_OK)
return TCL_ERROR;
@@ -174,8 +182,10 @@ static int DeleteOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "axisId");
return TCL_ERROR;
+ }
Axis* axisPtr;
if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK)
@@ -194,8 +204,10 @@ static int InvTransformOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=5) {
+ Tcl_WrongNumArgs(interp, 3, objv, "axisId scoord");
return TCL_ERROR;
+ }
Axis* axisPtr;
if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK)
@@ -208,8 +220,10 @@ static int LimitsOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "axisId");
return TCL_ERROR;
+ }
Axis* axisPtr;
if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK)
@@ -222,8 +236,10 @@ static int MarginOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "axisId");
return TCL_ERROR;
+ }
Axis* axisPtr;
if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK)
@@ -237,6 +253,10 @@ static int NamesOp(ClientData clientData, Tcl_Interp* interp,
{
Graph* graphPtr = (Graph*)clientData;
Tcl_Obj *listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **)NULL);
+ if (objc<3) {
+ Tcl_WrongNumArgs(interp, 3, objv, "?pattern...?");
+ return TCL_ERROR;
+ }
if (objc == 3) {
Tcl_HashSearch cursor;
for (Tcl_HashEntry *hPtr = Tcl_FirstHashEntry(&graphPtr->axes_.table, &cursor); hPtr; hPtr = Tcl_NextHashEntry(&cursor)) {
@@ -267,8 +287,10 @@ static int TransformOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=5) {
+ Tcl_WrongNumArgs(interp, 3, objv, "axisId coord");
return TCL_ERROR;
+ }
Axis* axisPtr;
if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK)
@@ -281,8 +303,10 @@ static int TypeOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "axisId");
return TCL_ERROR;
+ }
Axis* axisPtr;
if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK)
@@ -295,8 +319,10 @@ static int ViewOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "axisId");
return TCL_ERROR;
+ }
Axis* axisPtr;
if (graphPtr->getAxis(objv[3], &axisPtr) != TCL_OK)
diff --git a/generic/tkbltGrElemLine.C b/generic/tkbltGrElemLine.C
index 19a572e..9e3f39a 100644
--- a/generic/tkbltGrElemLine.C
+++ b/generic/tkbltGrElemLine.C
@@ -309,7 +309,6 @@ void LineElement::map()
if (!ops->coords.x || !ops->coords.y ||
!ops->coords.x->nValues() || !ops->coords.y->nValues())
return;
- int np = NUMBEROFPOINTS(ops);
MapInfo mi;
getScreenPoints(&mi);
@@ -320,7 +319,7 @@ void LineElement::map()
// Map connecting line segments if they are to be displayed.
smooth_ = (Smoothing)ops->reqSmooth;
- if ((np > 1) && (ops->builtinPen.traceWidth > 0)) {
+ if ((mi.nScreenPts > 1) && (ops->builtinPen.traceWidth > 0)) {
// Do smoothing if necessary. This can extend the coordinate array,
// so both mi.points and mi.nPoints may change.
switch (smooth_) {
@@ -534,11 +533,27 @@ void LineElement::draw(Drawable drawable)
delete [] points;
}
+ // Error bars
+ for (ChainLink* link = Chain_FirstLink(ops->stylePalette); link;
+ link = Chain_NextLink(link)) {
+ LineStyle* stylePtr = (LineStyle*)Chain_GetValue(link);
+ LinePen* penPtr = (LinePen *)stylePtr->penPtr;
+ LinePenOptions* penOps = (LinePenOptions*)penPtr->ops();
+
+ if ((stylePtr->xeb.length > 0) && (penOps->errorBarShow & SHOW_X))
+ graphPtr_->drawSegments(drawable, penPtr->errorBarGC_,
+ stylePtr->xeb.segments, stylePtr->xeb.length);
+
+ if ((stylePtr->yeb.length > 0) && (penOps->errorBarShow & SHOW_Y))
+ graphPtr_->drawSegments(drawable, penPtr->errorBarGC_,
+ stylePtr->yeb.segments, stylePtr->yeb.length);
+ }
+
// traces
if ((Chain_GetLength(traces_) > 0) && (penOps->traceWidth > 0))
drawTraces(drawable, penPtr);
- // Symbols, error bars, values
+ // Symbols, values
if (ops->reqMaxSymbols > 0) {
int total = 0;
for (ChainLink* link = Chain_FirstLink(ops->stylePalette); link;
@@ -557,14 +572,6 @@ void LineElement::draw(Drawable drawable)
LinePen* penPtr = (LinePen *)stylePtr->penPtr;
LinePenOptions* penOps = (LinePenOptions*)penPtr->ops();
- if ((stylePtr->xeb.length > 0) && (penOps->errorBarShow & SHOW_X))
- graphPtr_->drawSegments(drawable, penPtr->errorBarGC_,
- stylePtr->xeb.segments, stylePtr->xeb.length);
-
- if ((stylePtr->yeb.length > 0) && (penOps->errorBarShow & SHOW_Y))
- graphPtr_->drawSegments(drawable, penPtr->errorBarGC_,
- stylePtr->yeb.segments, stylePtr->yeb.length);
-
if ((stylePtr->symbolPts.length > 0) &&
(penOps->symbol.type != SYMBOL_NONE))
drawSymbols(drawable, penPtr, stylePtr->symbolSize,
diff --git a/generic/tkbltGrElemOp.C b/generic/tkbltGrElemOp.C
index af6fc0c..1102c30 100644
--- a/generic/tkbltGrElemOp.C
+++ b/generic/tkbltGrElemOp.C
@@ -89,8 +89,8 @@ static int CgetOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc != 5) {
- Tcl_WrongNumArgs(interp, 3, objv, "cget option");
+ if (objc!=5) {
+ Tcl_WrongNumArgs(interp, 3, objv, "elemId option");
return TCL_ERROR;
}
@@ -113,8 +113,10 @@ static int ConfigureOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc<4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "elemId ?option value...?");
return TCL_ERROR;
+ }
Element* elemPtr;
if (graphPtr->getElement(objv[3], &elemPtr) != TCL_OK)
@@ -140,6 +142,11 @@ static int ActivateOp(ClientData clientData, Tcl_Interp* interp,
{
Graph* graphPtr = (Graph*)clientData;
+ if (objc<3) {
+ Tcl_WrongNumArgs(interp, 3, objv, "?elemId? ?index...?");
+ return TCL_ERROR;
+ }
+
// List all the currently active elements
if (objc == 3) {
Tcl_Obj *listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **)NULL);
@@ -211,8 +218,10 @@ static int ClosestOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<5)
+ if (objc<5) {
+ Tcl_WrongNumArgs(interp, 3, objv, "x y ?elemName?...");
return TCL_ERROR;
+ }
GraphOptions* gops = (GraphOptions*)graphPtr->ops_;
ClosestSearch* searchPtr = &gops->search;
@@ -283,8 +292,11 @@ static int CreateOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "elemId");
return TCL_ERROR;
+ }
if (graphPtr->createElement(objc, objv) != TCL_OK)
return TCL_ERROR;
@@ -299,6 +311,10 @@ static int CreateOp(ClientData clientData, Tcl_Interp* interp,
static int DeactivateOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
+ if (objc<4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "elemId...");
+ return TCL_ERROR;
+ }
Graph* graphPtr = (Graph*)clientData;
for (int ii=3; ii<objc; ii++) {
Element* elemPtr;
@@ -320,6 +336,10 @@ static int DeactivateOp(ClientData clientData, Tcl_Interp* interp,
static int DeleteOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
+ if (objc<4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "elemId...");
+ return TCL_ERROR;
+ }
Graph* graphPtr = (Graph*)clientData;
for (int ii=3; ii<objc; ii++) {
Element* elemPtr;
@@ -339,8 +359,11 @@ static int ExistsOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "elemId");
return TCL_ERROR;
+ }
Tcl_HashEntry *hPtr =
Tcl_FindHashEntry(&graphPtr->elements_.table, Tcl_GetString(objv[3]));
@@ -353,6 +376,11 @@ static int LowerOp(ClientData clientData, Tcl_Interp* interp,
{
Graph* graphPtr = (Graph*)clientData;
+ if (objc<4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "elemId...");
+ return TCL_ERROR;
+ }
+
// Move the links of lowered elements out of the display list into
// a temporary list
Chain* chain = new Chain();
@@ -400,6 +428,11 @@ static int NamesOp(ClientData clientData, Tcl_Interp* interp,
{
Graph* graphPtr = (Graph*)clientData;
+ if (objc<3) {
+ Tcl_WrongNumArgs(interp, 3, objv, "?pattern...?");
+ return TCL_ERROR;
+ }
+
Tcl_Obj *listObjPtr = Tcl_NewListObj(0, (Tcl_Obj **)NULL);
if (objc == 3) {
Tcl_HashSearch iter;
@@ -433,6 +466,11 @@ static int RaiseOp(ClientData clientData, Tcl_Interp* interp,
{
Graph* graphPtr = (Graph*)clientData;
+ if (objc<4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "elemId...");
+ return TCL_ERROR;
+ }
+
Chain* chain = new Chain();
for (int ii=3; ii<objc; ii++) {
Element* elemPtr;
@@ -476,8 +514,15 @@ static int ShowOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=3 || objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "?nameList?");
return TCL_ERROR;
+ }
+
+ if (objc == 3) {
+ Tcl_SetObjResult(interp, DisplayListObj(graphPtr));
+ return TCL_OK;
+ }
int elemObjc;
Tcl_Obj** elemObjv;
@@ -535,8 +580,11 @@ static int TypeOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "elemId");
return TCL_ERROR;
+ }
Element* elemPtr;
if (graphPtr->getElement(objv[3], &elemPtr) != TCL_OK)
diff --git a/generic/tkbltGrMarkerOp.C b/generic/tkbltGrMarkerOp.C
index 20933ab..5103a3d 100644
--- a/generic/tkbltGrMarkerOp.C
+++ b/generic/tkbltGrMarkerOp.C
@@ -121,6 +121,7 @@ static int CreateMarker(Graph* graphPtr, Tcl_Interp* interp,
Tcl_AppendResult(graphPtr->interp_, "marker \"", name,
"\" already exists in \"", Tcl_GetString(objv[0]),
"\"", NULL);
+ delete [] name;
return TCL_ERROR;
}
@@ -133,6 +134,8 @@ static int CreateMarker(Graph* graphPtr, Tcl_Interp* interp,
else if (!strcmp(type, "text"))
markerPtr = new TextMarker(graphPtr, name, hPtr);
else {
+ Tcl_DeleteHashEntry(hPtr);
+ delete [] name;
Tcl_AppendResult(interp, "unknown marker type ", type, NULL);
return TCL_ERROR;
}
@@ -141,6 +144,7 @@ static int CreateMarker(Graph* graphPtr, Tcl_Interp* interp,
if ((Tk_InitOptions(graphPtr->interp_, (char*)markerPtr->ops(), markerPtr->optionTable(), graphPtr->tkwin_) != TCL_OK) || (MarkerObjConfigure(graphPtr, markerPtr, interp, objc-offset, objv+offset) != TCL_OK)) {
delete markerPtr;
+ delete [] name;
return TCL_ERROR;
}
@@ -157,8 +161,10 @@ static int CgetOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=5) {
+ Tcl_WrongNumArgs(interp, 3, objv, "markerId option");
return TCL_ERROR;
+ }
Marker* markerPtr;
if (GetMarkerFromObj(interp, graphPtr, objv[3], &markerPtr) != TCL_OK)
@@ -179,8 +185,10 @@ static int ConfigureOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc<4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "markerId ?option value...?");
return TCL_ERROR;
+ }
Marker* markerPtr;
if (GetMarkerFromObj(interp, graphPtr, objv[3], &markerPtr) != TCL_OK)
@@ -219,15 +227,22 @@ static int BindOp(ClientData clientData, Tcl_Interp* interp,
}
Tcl_SetObjResult(interp, listObjPtr);
return TCL_OK;
+ } else if (objc >= 4) {
+ return graphPtr->bindTable_->configure(graphPtr->markerTag(Tcl_GetString(objv[3])), objc - 4, objv + 4);
+ } else {
+ Tcl_WrongNumArgs(interp, 3, objv, "markerId ?tag? ?sequence? ?command?");
+ return TCL_ERROR;
}
-
- return graphPtr->bindTable_->configure(graphPtr->markerTag(Tcl_GetString(objv[3])), objc - 4, objv + 4);
}
static int CreateOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
+ if (objc<4) {
+ Tcl_WrongNumArgs(interp, 2, objv, "markerId ?type? ?option value...?");
+ return TCL_ERROR;
+ }
if (CreateMarker(graphPtr, interp, objc, objv) != TCL_OK)
return TCL_ERROR;
// set in CreateMarker
@@ -243,29 +258,45 @@ static int DeleteOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
+
+ if (objc<4) {
+ Tcl_WrongNumArgs(interp, 2, objv, "markerId...");
+ return TCL_ERROR;
+ }
+
+ int res = TCL_OK;
+
for (int ii=3; ii<objc; ii++) {
Marker* markerPtr;
- if (GetMarkerFromObj(NULL, graphPtr, objv[ii], &markerPtr) != TCL_OK) {
- Tcl_AppendResult(interp, "can't find marker \"",
- Tcl_GetString(objv[ii]), "\" in \"",
- Tk_PathName(graphPtr->tkwin_), "\"", NULL);
- return TCL_ERROR;
+ const char* string = Tcl_GetString(objv[ii]);
+ Tcl_HashEntry* hPtr = Tcl_FindHashEntry(&graphPtr->markers_.table, string);
+ if (!hPtr) {
+ if (res == TCL_OK) {
+ Tcl_AppendResult(interp, "can't find markers in \"",
+ Tk_PathName(graphPtr->tkwin_), "\":", NULL);
+ }
+ Tcl_AppendResult(interp, " ", Tcl_GetString(objv[ii]));
+ res = TCL_ERROR;
+ } else {
+ markerPtr = (Marker*)Tcl_GetHashValue(hPtr);
+ delete markerPtr;
}
- delete markerPtr;
}
graphPtr->flags |= CACHE;
graphPtr->eventuallyRedraw();
- return TCL_OK;
+ return res;
}
static int ExistsOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "markerId");
return TCL_ERROR;
+ }
Tcl_HashEntry* hPtr =
Tcl_FindHashEntry(&graphPtr->markers_.table, Tcl_GetString(objv[3]));
@@ -278,8 +309,10 @@ static int FindOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=8) {
+ Tcl_WrongNumArgs(interp, 3, objv, "searchtype left top right bottom");
return TCL_ERROR;
+ }
const char* string = Tcl_GetString(objv[3]);
int mode;
@@ -378,8 +411,10 @@ static int RelinkOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=4 && objc!=5) {
+ Tcl_WrongNumArgs(interp, 3, objv, "markerId ?placeId?");
return TCL_ERROR;
+ }
Marker* markerPtr;
if (GetMarkerFromObj(interp, graphPtr, objv[3], &markerPtr) != TCL_OK)
@@ -411,8 +446,10 @@ static int TypeOp(ClientData clientData, Tcl_Interp* interp,
int objc, Tcl_Obj* const objv[])
{
Graph* graphPtr = (Graph*)clientData;
- if (objc<4)
+ if (objc!=4) {
+ Tcl_WrongNumArgs(interp, 3, objv, "markerId");
return TCL_ERROR;
+ }
Marker* markerPtr;
if (GetMarkerFromObj(interp, graphPtr, objv[3], &markerPtr) != TCL_OK)
@@ -450,7 +487,7 @@ static int GetMarkerFromObj(Tcl_Interp* interp, Graph* graphPtr,
}
if (interp) {
Tcl_AppendResult(interp, "can't find marker \"", string,
- "\" in \"", Tk_PathName(graphPtr->tkwin_), NULL);
+ "\" in \"", Tk_PathName(graphPtr->tkwin_), "\"", NULL);
}
return TCL_ERROR;
diff --git a/generic/tkbltVecCmd.C b/generic/tkbltVecCmd.C
index 5d49c37..8a03fe6 100644
--- a/generic/tkbltVecCmd.C
+++ b/generic/tkbltVecCmd.C
@@ -162,11 +162,11 @@ static int Blt_ExprDoubleFromObj(Tcl_Interp* interp, Tcl_Obj *objPtr,
if (Tcl_GetDoubleFromObj((Tcl_Interp *)NULL, objPtr, valuePtr) == TCL_OK)
return TCL_OK;
- // Interpret the empty string as NaN
+ // Interpret the empty string "" and "NaN" as NaN.
int length;
char *string;
string = Tcl_GetStringFromObj(objPtr, &length);
- if (length == 0) {
+ if (length == 0 || (length == 3 && strcmp(string, "NaN") == 0)) {
*valuePtr = NAN;
return TCL_OK;
}