diff options
author | Steve Bennett <steveb@workware.net.au> | 2010-09-16 09:45:18 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2010-10-15 11:02:53 +1000 |
commit | 6c3dfbc2842400da314f139a043b908cda499839 (patch) | |
tree | c2a87929f4e7b4aec639252c7a3b88f5d9e4765f /jim.c | |
parent | 03f330c8223deddc8050205d3c275e6e260684b4 (diff) | |
download | jimtcl-6c3dfbc2842400da314f139a043b908cda499839.zip jimtcl-6c3dfbc2842400da314f139a043b908cda499839.tar.gz jimtcl-6c3dfbc2842400da314f139a043b908cda499839.tar.bz2 |
Add support for 'info references'
Signed-off-by: Steve Bennett <steveb@workware.net.au>
Diffstat (limited to 'jim.c')
-rw-r--r-- | jim.c | 37 |
1 files changed, 32 insertions, 5 deletions
@@ -4321,7 +4321,7 @@ int SetReferenceFromAny(Jim_Interp *interp, Jim_Obj *objPtr) if (!isrefchar(start[12 + i])) goto badformat; } - /* Extract info from the refernece. */ + /* Extract info from the reference. */ memcpy(refId, start + 14 + JIM_REFERENCE_TAGLEN, 20); refId[20] = '\0'; /* Try to convert the ID into a jim_wide */ @@ -12730,9 +12730,28 @@ static int Jim_FinalizeCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const return JIM_OK; } -/* TODO */ +/* [info references] */ +static int JimInfoReferences(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + Jim_Obj *listObjPtr; + Jim_HashTableIterator *htiter; + Jim_HashEntry *he; + + listObjPtr = Jim_NewListObj(interp, NULL, 0); -/* [info references] (list of all the references/finalizers) */ + htiter = Jim_GetHashTableIterator(&interp->references); + while ((he = Jim_NextHashEntry(htiter)) != NULL) { + char buf[JIM_REFERENCE_SPACE]; + Jim_Reference *refPtr = he->val; + const jim_wide *refId = he->key; + + JimFormatReference(buf, refPtr, *refId); + Jim_ListAppendElement(interp, listObjPtr, Jim_NewStringObj(interp, buf, -1)); + } + Jim_FreeHashTableIterator(htiter); + Jim_SetResult(interp, listObjPtr); + return JIM_OK; +} #endif /* [rename] */ @@ -12869,13 +12888,14 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg static const char *commands[] = { "body", "commands", "procs", "exists", "globals", "level", "frame", "locals", "vars", "version", "patchlevel", "complete", "args", "hostname", - "script", "source", "stacktrace", "nameofexecutable", "returncodes", NULL + "script", "source", "stacktrace", "nameofexecutable", "returncodes", + "references", NULL }; enum { INFO_BODY, INFO_COMMANDS, INFO_PROCS, INFO_EXISTS, INFO_GLOBALS, INFO_LEVEL, INFO_FRAME, INFO_LOCALS, INFO_VARS, INFO_VERSION, INFO_PATCHLEVEL, INFO_COMPLETE, INFO_ARGS, INFO_HOSTNAME, INFO_SCRIPT, INFO_SOURCE, INFO_STACKTRACE, INFO_NAMEOFEXECUTABLE, - INFO_RETURNCODES + INFO_RETURNCODES, INFO_REFERENCES, }; if (argc < 2) { @@ -13065,6 +13085,13 @@ static int Jim_InfoCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *arg return JIM_ERR; } break; + case INFO_REFERENCES: +#ifdef JIM_REFERENCES + return JimInfoReferences(interp, argc, argv); +#else + Jim_SetResultString(interp, "not supported", -1); + return JIM_ERR; +#endif } return JIM_OK; } |