summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xconfigure1
-rwxr-xr-xconfigure.in1
-rw-r--r--src/bltGrMarkerOp.C2
-rw-r--r--src/bltOp.C172
-rw-r--r--src/bltOp.h16
-rw-r--r--src/bltSwitch.C6
-rw-r--r--src/bltVector.C2
7 files changed, 193 insertions, 7 deletions
diff --git a/configure b/configure
index 04eaf55..6be0e7b 100755
--- a/configure
+++ b/configure
@@ -5564,6 +5564,7 @@ done
bltParse.C
bltPs.C
bltPsAfm.C
+ bltOp.C
bltSpline.C
bltSwitch.C
bltText.C
diff --git a/configure.in b/configure.in
index 4b9d8fd..1ef003b 100755
--- a/configure.in
+++ b/configure.in
@@ -109,6 +109,7 @@ TEA_ADD_SOURCES([
bltParse.C
bltPs.C
bltPsAfm.C
+ bltOp.C
bltSpline.C
bltSwitch.C
bltText.C
diff --git a/src/bltGrMarkerOp.C b/src/bltGrMarkerOp.C
index 196c759..55cfb6c 100644
--- a/src/bltGrMarkerOp.C
+++ b/src/bltGrMarkerOp.C
@@ -31,8 +31,8 @@ extern "C" {
#include "bltGraph.h"
#include "bltOp.h"
};
-#include "bltGrElem.h"
+#include "bltGrElem.h"
#include "bltGrMarkerOp.h"
#include "bltGrMarker.h"
#include "bltGrMarkerBitmap.h"
diff --git a/src/bltOp.C b/src/bltOp.C
new file mode 100644
index 0000000..2ef61c7
--- /dev/null
+++ b/src/bltOp.C
@@ -0,0 +1,172 @@
+/*
+ * Smithsonian Astrophysical Observatory, Cambridge, MA, USA
+ * This code has been modified under the terms listed below and is made
+ * available under the same terms.
+ */
+
+/*
+ * Copyright 1991-2004 George A Howlett.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+extern "C" {
+#include "bltOp.h"
+};
+
+static int BinaryOpSearch(Blt_OpSpec *specs, int nSpecs,
+ const char *string, int length)
+{
+ int low = 0;
+ int high = nSpecs - 1;
+ char c = string[0];
+ while (low <= high) {
+ int median = (low + high) >> 1;
+ Blt_OpSpec *specPtr = specs + median;
+
+ /* Test the first character */
+ int compare = c - specPtr->name[0];
+ if (compare == 0) {
+ /* Now test the entire string */
+ compare = strncmp(string, specPtr->name, length);
+ if (compare == 0) {
+ if ((int)length < specPtr->minChars) {
+ return -2; /* Ambiguous operation name */
+ }
+ }
+ }
+ if (compare < 0) {
+ high = median - 1;
+ } else if (compare > 0) {
+ low = median + 1;
+ } else {
+ return median; /* Op found. */
+ }
+ }
+ return -1; /* Can't find operation */
+}
+
+static int LinearOpSearch(Blt_OpSpec *specs, int nSpecs,
+ const char *string, int length)
+{
+ char c = string[0];
+ int nMatches = 0;
+ int last = -1;
+ int i;
+ Blt_OpSpec *specPtr;
+ for (specPtr = specs, i = 0; i < nSpecs; i++, specPtr++) {
+ if ((c == specPtr->name[0]) &&
+ (strncmp(string, specPtr->name, length) == 0)) {
+ last = i;
+ nMatches++;
+ if ((int)length == specPtr->minChars) {
+ break;
+ }
+ }
+ }
+ if (nMatches > 1)
+ return -2; /* Ambiguous operation name */
+
+ if (nMatches == 0)
+ return -1; /* Can't find operation */
+
+ return last; /* Op found. */
+}
+
+void* Blt_GetOpFromObj(Tcl_Interp* interp, int nSpecs, Blt_OpSpec *specs,
+ int operPos, int objc, Tcl_Obj* const objv[],
+ int flags)
+{
+ Blt_OpSpec *specPtr;
+ int n;
+
+ if (objc <= operPos) { /* No operation argument */
+ Tcl_AppendResult(interp, "wrong # args: ", (char *)NULL);
+ usage:
+ Tcl_AppendResult(interp, "should be one of...", (char *)NULL);
+ for (n = 0; n < nSpecs; n++) {
+ int i;
+
+ Tcl_AppendResult(interp, "\n ", (char *)NULL);
+ for (i = 0; i < operPos; i++) {
+ Tcl_AppendResult(interp, Tcl_GetString(objv[i]), " ",
+ (char *)NULL);
+ }
+ specPtr = specs + n;
+ Tcl_AppendResult(interp, specPtr->name, " ", specPtr->usage,
+ (char *)NULL);
+ }
+ return NULL;
+ }
+
+ int length;
+ const char* string = Tcl_GetStringFromObj(objv[operPos], &length);
+ if (flags & BLT_OP_LINEAR_SEARCH) {
+ n = LinearOpSearch(specs, nSpecs, string, length);
+ } else {
+ n = BinaryOpSearch(specs, nSpecs, string, length);
+ }
+ if (n == -2) {
+ char c;
+
+ Tcl_AppendResult(interp, "ambiguous", (char *)NULL);
+ if (operPos > 2) {
+ Tcl_AppendResult(interp, " ", Tcl_GetString(objv[operPos - 1]),
+ (char *)NULL);
+ }
+ Tcl_AppendResult(interp, " operation \"", string, "\" matches: ",
+ (char *)NULL);
+
+ c = string[0];
+ for (n = 0; n < nSpecs; n++) {
+ specPtr = specs + n;
+ if ((c == specPtr->name[0]) &&
+ (strncmp(string, specPtr->name, length) == 0)) {
+ Tcl_AppendResult(interp, " ", specPtr->name, (char *)NULL);
+ }
+ }
+ return NULL;
+
+ } else if (n == -1) { /* Can't find operation, display help */
+ Tcl_AppendResult(interp, "bad", (char *)NULL);
+ if (operPos > 2) {
+ Tcl_AppendResult(interp, " ", Tcl_GetString(objv[operPos - 1]),
+ (char *)NULL);
+ }
+ Tcl_AppendResult(interp, " operation \"", string, "\": ", (char *)NULL);
+ goto usage;
+ }
+ specPtr = specs + n;
+ if ((objc < specPtr->minArgs) ||
+ ((specPtr->maxArgs > 0) && (objc > specPtr->maxArgs))) {
+ int i;
+
+ Tcl_AppendResult(interp, "wrong # args: should be \"", (char *)NULL);
+ for (i = 0; i < operPos; i++) {
+ Tcl_AppendResult(interp, Tcl_GetString(objv[i]), " ",
+ (char *)NULL);
+ }
+ Tcl_AppendResult(interp, specPtr->name, " ", specPtr->usage, "\"",
+ (char *)NULL);
+ return NULL;
+ }
+ return specPtr->proc;
+}
+
diff --git a/src/bltOp.h b/src/bltOp.h
index 8ab1980..04c584f 100644
--- a/src/bltOp.h
+++ b/src/bltOp.h
@@ -30,6 +30,16 @@
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+#include <tcl.h>
+#ifdef USE_TCL_STUBS
+#include <tclInt.h>
+#endif
+
+#include <tk.h>
+#ifdef USE_TK_STUBS
+#include <tkInt.h>
+#endif
+
typedef struct {
const char *name; /* Name of operation */
int minChars; /* Minimum # characters to disambiguate */
@@ -51,7 +61,7 @@ typedef enum {
#define BLT_OP_BINARY_SEARCH 0
#define BLT_OP_LINEAR_SEARCH 1
-extern void *Blt_GetOpFromObj(Tcl_Interp* interp, int nSpecs,
- Blt_OpSpec *specs, int operPos, int objc, Tcl_Obj* const objv[],
- int flags);
+void *Blt_GetOpFromObj(Tcl_Interp* interp, int nSpecs,
+ Blt_OpSpec *specs, int operPos, int objc,
+ Tcl_Obj* const objv[], int flags);
diff --git a/src/bltSwitch.C b/src/bltSwitch.C
index 53a822c..8c33f07 100644
--- a/src/bltSwitch.C
+++ b/src/bltSwitch.C
@@ -29,13 +29,15 @@
#include <stdarg.h>
-#include "bltC.h"
-
extern "C" {
#include "bltInt.h"
#include "bltSwitch.h"
};
+#define COUNT_NNEG 0
+#define COUNT_POS 1
+#define COUNT_ANY 2
+
static int Blt_GetCountFromObj(Tcl_Interp* interp, Tcl_Obj *objPtr, int check,
long *valuePtr)
{
diff --git a/src/bltVector.C b/src/bltVector.C
index f7e520f..916568e 100644
--- a/src/bltVector.C
+++ b/src/bltVector.C
@@ -49,9 +49,9 @@
#include "bltInt.h"
#include "bltVecInt.h"
-#include "bltOp.h"
#include "bltNsUtil.h"
#include "bltSwitch.h"
+#include "bltOp.h"
#define DEF_ARRAY_SIZE 64
#define TRACE_ALL (TCL_TRACE_WRITES | TCL_TRACE_READS | TCL_TRACE_UNSETS)