aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatthoyts <patthoyts>2005-03-05 10:45:15 +0000
committerpatthoyts <patthoyts>2005-03-05 10:45:15 +0000
commitcace04153ec0bbeb804dea9ddf32595320b1cc39 (patch)
treee9c86911b2422f20c3d7aa1879d0e7c2438f760c
parentf461c42d9a83e1e4a18b02793d20d09d041d391e (diff)
downloadjimtcl-cace04153ec0bbeb804dea9ddf32595320b1cc39.zip
jimtcl-cace04153ec0bbeb804dea9ddf32595320b1cc39.tar.gz
jimtcl-cace04153ec0bbeb804dea9ddf32595320b1cc39.tar.bz2
Added Jim_GetAssocData api. This for permitting packages to register a
data structure with a Jim interpreter.
-rw-r--r--jim.c54
-rw-r--r--jim.h13
2 files changed, 64 insertions, 3 deletions
diff --git a/jim.c b/jim.c
index 2a0a4a6..0bd42d9 100644
--- a/jim.c
+++ b/jim.c
@@ -1,7 +1,7 @@
/* Jim - A small embeddable Tcl interpreter
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
*
- * $Id: jim.c,v 1.62 2005/03/05 09:46:12 antirez Exp $
+ * $Id: jim.c,v 1.63 2005/03/05 10:45:15 patthoyts Exp $
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -874,7 +874,7 @@ static void JimStringCopyHTKeyDestructor(void *privdata, const void *key)
Jim_Free((void*)key); /* ATTENTION: const cast */
}
-
+
static Jim_HashTableType JimStringCopyHashTableType = {
JimStringCopyHTHashFunction, /* hash function */
JimStringCopyHTKeyDup, /* key dup */
@@ -895,6 +895,28 @@ static Jim_HashTableType JimSharedStringsHashTableType = {
NULL /* val destructor */
};
+typedef struct AssocDataValue {
+ Jim_InterpDeleteProc *delProc;
+ void *data;
+} AssocDataValue;
+
+static void JimAssocDataHashTableValueDestructor(void *privdata, void *data)
+{
+ AssocDataValue *assocPtr = (AssocDataValue *)data;
+ if (assocPtr->delProc != NULL)
+ assocPtr->delProc((Jim_Interp *)privdata, assocPtr->data);
+ Jim_Free(data);
+}
+
+static Jim_HashTableType JimAssocDataHashTableType = {
+ JimStringCopyHTHashFunction, /* hash function */
+ JimStringCopyHTKeyDup, /* key dup */
+ NULL, /* val dup */
+ JimStringCopyHTKeyCompare, /* key compare */
+ JimStringCopyHTKeyDestructor, /* key destructor */
+ JimAssocDataHashTableValueDestructor /* val destructor */
+};
+
/* -----------------------------------------------------------------------------
* Stack - This is a simple generic stack implementation. It is used for
* example in the 'expr' expression compiler.
@@ -3632,6 +3654,7 @@ Jim_Interp *Jim_CreateInterp(void)
Jim_InitHashTable(&i->sharedStrings, &JimSharedStringsHashTableType,
NULL);
Jim_InitHashTable(&i->stub, &JimStringCopyHashTableType, NULL);
+ Jim_InitHashTable(&i->assocData, &JimAssocDataHashTableType, i);
i->framePtr = i->topFramePtr = JimCreateCallFrame(i);
i->emptyObj = Jim_NewEmptyStringObj(i);
i->result = i->emptyObj;
@@ -3673,6 +3696,7 @@ void Jim_FreeInterp(Jim_Interp *i)
Jim_FreeHashTable(&i->commands);
Jim_FreeHashTable(&i->references);
Jim_FreeHashTable(&i->stub);
+ Jim_FreeHashTable(&i->assocData);
/* Free the call frames list */
while(cf) {
prevcf = cf->parentCallFrame;
@@ -3812,6 +3836,29 @@ static void JimAppendStackTrace(Jim_Interp *interp, const char *procname,
Jim_NewIntObj(interp, linenr));
}
+int Jim_SetAssocData(Jim_Interp *interp, const char *key, Jim_InterpDeleteProc *delProc, void *data)
+{
+ AssocDataValue *assocEntryPtr = (AssocDataValue *)Jim_Alloc(sizeof(AssocDataValue));
+ assocEntryPtr->delProc = delProc;
+ assocEntryPtr->data = data;
+ return Jim_AddHashEntry(&interp->assocData, key, assocEntryPtr);
+}
+
+void *Jim_GetAssocData(Jim_Interp *interp, const char *key)
+{
+ Jim_HashEntry *entryPtr = Jim_FindHashEntry(&interp->assocData, key);
+ if (entryPtr != NULL) {
+ AssocDataValue *assocEntryPtr = (AssocDataValue *)entryPtr->val;
+ return assocEntryPtr->data;
+ }
+ return NULL;
+}
+
+int Jim_DeleteAssocData(Jim_Interp *interp, const char *key)
+{
+ return Jim_DeleteHashEntry(&interp->assocData, key);
+}
+
/* -----------------------------------------------------------------------------
* Shared strings.
* Every interpreter has an hash table where to put shared dynamically
@@ -7027,6 +7074,9 @@ void JimRegisterCoreApi(Jim_Interp *interp)
JIM_REGISTER_API(UnsetVariable);
JIM_REGISTER_API(GetVariableStr);
JIM_REGISTER_API(GetGlobalVariableStr);
+ JIM_REGISTER_API(GetAssocData);
+ JIM_REGISTER_API(SetAssocData);
+ JIM_REGISTER_API(DeleteAssocData);
}
/* -----------------------------------------------------------------------------
diff --git a/jim.h b/jim.h
index 8239f10..81604fa 100644
--- a/jim.h
+++ b/jim.h
@@ -1,7 +1,7 @@
/* Jim - A small embeddable Tcl interpreter
* Copyright 2005 Salvatore Sanfilippo <antirez@invece.org>
*
- * $Id: jim.h,v 1.34 2005/03/05 09:46:12 antirez Exp $
+ * $Id: jim.h,v 1.35 2005/03/05 10:45:15 patthoyts Exp $
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -430,6 +430,7 @@ typedef struct Jim_Interp {
struct Jim_HashTable stub; /* Stub hash table to export API */
void *getApiFuncPtr; /* Jim_GetApi() function pointer. */
struct Jim_CallFrame *freeFramesList; /* list of CallFrame structures. */
+ struct Jim_HashTable assocData; /* per-interp storage for use by packages */
} Jim_Interp;
/* Currently provided as macro that performs the increment.
@@ -678,6 +679,13 @@ JIM_STATIC void JIM_API(Jim_ReleaseSharedString) (Jim_Interp *interp,
JIM_STATIC void JIM_API(Jim_WrongNumArgs) (Jim_Interp *interp, int argc,
Jim_Obj *const *argv, const char *msg);
+/* package utilities */
+typedef void (Jim_InterpDeleteProc)(Jim_Interp *interp, void *data);
+JIM_STATIC void * JIM_API(Jim_GetAssocData)(Jim_Interp *interp, const char *key);
+JIM_STATIC int JIM_API(Jim_SetAssocData)(Jim_Interp *interp, const char *key,
+ Jim_InterpDeleteProc *delProc, void *data);
+JIM_STATIC int JIM_API(Jim_DeleteAssocData)(Jim_Interp *interp, const char *key);
+
/* API import/export functions */
JIM_STATIC void* JIM_API(Jim_GetApi) (Jim_Interp *interp, const char *funcname);
JIM_STATIC int JIM_API(Jim_RegisterApi) (Jim_Interp *interp,
@@ -785,6 +793,9 @@ static void Jim_InitExtension(Jim_Interp *interp, const char *version)
JIM_GET_API(UnsetVariable);
JIM_GET_API(GetVariableStr);
JIM_GET_API(GetGlobalVariableStr);
+ JIM_GET_API(GetAssocData);
+ JIM_GET_API(SetAssocData);
+ JIM_GET_API(DeleteAssocData);
Jim_SetResultString(interp, version, -1);
}