From 015569f090acda5702eafe6487b534fa76d354d5 Mon Sep 17 00:00:00 2001 From: Steve Bennett Date: Sat, 13 Jun 2020 20:00:50 +1000 Subject: [PATCH] core: info commands failed to match under some conditions Now that proc names are stored as-is in the commands table, info commands needs to take into account matching both foo::test and ::foo::test against the pattern ::foo::* Signed-off-by: Steve Bennett --- jim.c | 45 +++++++++++++++++++++++++++------------------ tests/namespace.test | 7 +++++++ 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/jim.c b/jim.c index e53330a..8c6cfc8 100644 --- a/jim.c +++ b/jim.c @@ -11255,7 +11255,7 @@ void Jim_WrongNumArgs(Jim_Interp *interp, int argc, Jim_Obj *const *argv, const * May add the key and/or value to the list. */ typedef void JimHashtableIteratorCallbackType(Jim_Interp *interp, Jim_Obj *listObjPtr, - Jim_HashEntry *he, int type); + Jim_Obj *keyObjPtr, void *value, Jim_Obj *patternObjPtr, int type); #define JimTrivialMatch(pattern) (strpbrk((pattern), "*[?\\") == NULL) @@ -11274,16 +11274,16 @@ static Jim_Obj *JimHashtablePatternMatch(Jim_Interp *interp, Jim_HashTable *ht, if (patternObjPtr && JimTrivialMatch(Jim_String(patternObjPtr))) { he = Jim_FindHashEntry(ht, patternObjPtr); if (he) { - callback(interp, listObjPtr, he, type); + callback(interp, listObjPtr, Jim_GetHashEntryKey(he), Jim_GetHashEntryVal(he), + patternObjPtr, type); } } else { Jim_HashTableIterator htiter; JimInitHashTableIterator(ht, &htiter); while ((he = Jim_NextHashEntry(&htiter)) != NULL) { - if (!patternObjPtr || Jim_StringMatchObj(interp, patternObjPtr, he->key, 0)) { - callback(interp, listObjPtr, he, type); - } + callback(interp, listObjPtr, Jim_GetHashEntryKey(he), Jim_GetHashEntryVal(he), + patternObjPtr, type); } } return listObjPtr; @@ -11298,23 +11298,30 @@ static Jim_Obj *JimHashtablePatternMatch(Jim_Interp *interp, Jim_HashTable *ht, * Adds matching command names (procs, channels) to the list. */ static void JimCommandMatch(Jim_Interp *interp, Jim_Obj *listObjPtr, - Jim_HashEntry *he, int type) + Jim_Obj *keyObj, void *value, Jim_Obj *patternObj, int type) { - Jim_Cmd *cmdPtr = Jim_GetHashEntryVal(he); - Jim_Obj *objPtr; + Jim_Cmd *cmdPtr = (Jim_Cmd *)value; if (type == JIM_CMDLIST_PROCS && !cmdPtr->isproc) { /* not a proc */ return; } - objPtr = (Jim_Obj *)he->key; - Jim_IncrRefCount(objPtr); + Jim_IncrRefCount(keyObj); - if (type != JIM_CMDLIST_CHANNELS || Jim_AioFilehandle(interp, objPtr)) { - Jim_ListAppendElement(interp, listObjPtr, objPtr); + if (type != JIM_CMDLIST_CHANNELS || Jim_AioFilehandle(interp, keyObj)) { + int match = 1; + if (patternObj) { + int plen, slen; + const char *pattern = Jim_GetStringNoQualifier(patternObj, &plen); + const char *str = Jim_GetStringNoQualifier(keyObj, &slen); + match = JimGlobMatch(pattern, plen, str, slen, 0); + } + if (match) { + Jim_ListAppendElement(interp, listObjPtr, keyObj); + } } - Jim_DecrRefCount(interp, objPtr); + Jim_DecrRefCount(interp, keyObj); } static Jim_Obj *JimCommandsList(Jim_Interp *interp, Jim_Obj *patternObjPtr, int type) @@ -11334,14 +11341,16 @@ static Jim_Obj *JimCommandsList(Jim_Interp *interp, Jim_Obj *patternObjPtr, int * Adds matching variable names to the list. */ static void JimVariablesMatch(Jim_Interp *interp, Jim_Obj *listObjPtr, - Jim_HashEntry *he, int type) + Jim_Obj *keyObj, void *value, Jim_Obj *patternObj, int type) { - Jim_Var *varPtr = Jim_GetHashEntryVal(he); + Jim_Var *varPtr = (Jim_Var *)value; if ((type & JIM_VARLIST_MASK) != JIM_VARLIST_LOCALS || varPtr->linkFramePtr == NULL) { - Jim_ListAppendElement(interp, listObjPtr, (Jim_Obj *)he->key); - if (type & JIM_VARLIST_VALUES) { - Jim_ListAppendElement(interp, listObjPtr, varPtr->objPtr); + if (patternObj == NULL || Jim_StringMatchObj(interp, patternObj, keyObj, 0)) { + Jim_ListAppendElement(interp, listObjPtr, keyObj); + if (type & JIM_VARLIST_VALUES) { + Jim_ListAppendElement(interp, listObjPtr, varPtr->objPtr); + } } } } diff --git a/tests/namespace.test b/tests/namespace.test index eca28de..216d214 100644 --- a/tests/namespace.test +++ b/tests/namespace.test @@ -531,6 +531,13 @@ test namespace-12.3 {namespace import loop} -setup { namespace delete one two three } -returnCodes error -match glob -result {import pattern * would create a loop*} +test namespace-12.4 {namespace import} { + namespace eval ::test_ns_one {} + proc ::test_ns_one::testcmd args { return 2 } + namespace import ::test_ns_one::* + testcmd +} 2 + foreach cmd [info commands test_ns_*] { rename $cmd "" } -- 2.11.4.GIT