aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jim.c36
-rw-r--r--jim.h6
2 files changed, 39 insertions, 3 deletions
diff --git a/jim.c b/jim.c
index 4489f50..4a7d2de 100644
--- a/jim.c
+++ b/jim.c
@@ -15416,6 +15416,19 @@ int Jim_CheckShowCommands(Jim_Interp *interp, Jim_Obj *objPtr, const char *const
return JIM_ERR;
}
+/* internal rep is stored in ptrIntvalue
+ * ptr = tablePtr
+ * int1 = flags
+ * int2 = index
+ */
+static const Jim_ObjType getEnumObjType = {
+ "get-enum",
+ NULL,
+ NULL,
+ NULL,
+ JIM_TYPE_REFERENCES
+};
+
int Jim_GetEnum(Jim_Interp *interp, Jim_Obj *objPtr,
const char *const *tablePtr, int *indexPtr, const char *name, int flags)
{
@@ -15424,15 +15437,24 @@ int Jim_GetEnum(Jim_Interp *interp, Jim_Obj *objPtr,
int i;
int match = -1;
int arglen;
- const char *arg = Jim_GetString(objPtr, &arglen);
+ const char *arg;
+
+ if (objPtr->typePtr == &getEnumObjType) {
+ if (objPtr->internalRep.ptrIntValue.ptr == tablePtr && objPtr->internalRep.ptrIntValue.int1 == flags) {
+ *indexPtr = objPtr->internalRep.ptrIntValue.int2;
+ return JIM_OK;
+ }
+ }
+
+ arg = Jim_GetString(objPtr, &arglen);
*indexPtr = -1;
for (entryPtr = tablePtr, i = 0; *entryPtr != NULL; entryPtr++, i++) {
if (Jim_CompareStringImmediate(interp, objPtr, *entryPtr)) {
/* Found an exact match */
- *indexPtr = i;
- return JIM_OK;
+ match = i;
+ goto found;
}
if (flags & JIM_ENUM_ABBREV) {
/* Accept an unambiguous abbreviation.
@@ -15453,6 +15475,14 @@ int Jim_GetEnum(Jim_Interp *interp, Jim_Obj *objPtr,
/* If we had an unambiguous partial match */
if (match >= 0) {
+ found:
+ /* Record the match in the object */
+ Jim_FreeIntRep(interp, objPtr);
+ objPtr->typePtr = &getEnumObjType;
+ objPtr->internalRep.ptrIntValue.ptr = (void *)tablePtr;
+ objPtr->internalRep.ptrIntValue.int1 = flags;
+ objPtr->internalRep.ptrIntValue.int2 = match;
+ /* Return the result */
*indexPtr = match;
return JIM_OK;
}
diff --git a/jim.h b/jim.h
index bf8acb2..85a6918 100644
--- a/jim.h
+++ b/jim.h
@@ -293,6 +293,12 @@ typedef struct Jim_Obj {
void *ptr1;
void *ptr2;
} twoPtrValue;
+ /* Generic pointer, int, int value */
+ struct {
+ void *ptr;
+ int int1;
+ int int2;
+ } ptrIntValue;
/* Variable object */
struct {
struct Jim_Var *varPtr;