diff options
author | patthoyts <patthoyts> | 2005-03-05 10:45:15 +0000 |
---|---|---|
committer | patthoyts <patthoyts> | 2005-03-05 10:45:15 +0000 |
commit | cace04153ec0bbeb804dea9ddf32595320b1cc39 (patch) | |
tree | e9c86911b2422f20c3d7aa1879d0e7c2438f760c | |
parent | f461c42d9a83e1e4a18b02793d20d09d041d391e (diff) | |
download | jimtcl-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.c | 54 | ||||
-rw-r--r-- | jim.h | 13 |
2 files changed, 64 insertions, 3 deletions
@@ -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); } /* ----------------------------------------------------------------------------- @@ -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); } |