diff options
| author | donal.k.fellows@manchester.ac.uk <dkf> | 2012-11-20 12:13:43 (GMT) |
|---|---|---|
| committer | donal.k.fellows@manchester.ac.uk <dkf> | 2012-11-20 12:13:43 (GMT) |
| commit | 3e55ef9d38f9ad0ce68ab947b51a37b144046100 (patch) | |
| tree | fb090e3289193ec27321e51dab2e78b60ac9de05 /generic/tclCmdIL.c | |
| parent | abcad102a592db423039b297a5885beb9034ad5b (diff) | |
| parent | 884171d33416e69905bbb16e8734dd1d760ed08a (diff) | |
| download | tcl-3e55ef9d38f9ad0ce68ab947b51a37b144046100.zip tcl-3e55ef9d38f9ad0ce68ab947b51a37b144046100.tar.gz tcl-3e55ef9d38f9ad0ce68ab947b51a37b144046100.tar.bz2 | |
merge dkf-compile-misc-info
Diffstat (limited to 'generic/tclCmdIL.c')
| -rw-r--r-- | generic/tclCmdIL.c | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c index 7be017d..155e8e4 100644 --- a/generic/tclCmdIL.c +++ b/generic/tclCmdIL.c @@ -1492,19 +1492,42 @@ InfoFunctionsCmd( int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { - const char *pattern; + Tcl_Obj *script; + int code; - if (objc == 1) { - pattern = NULL; - } else if (objc == 2) { - pattern = TclGetString(objv[1]); - } else { + if (objc > 2) { Tcl_WrongNumArgs(interp, 1, objv, "?pattern?"); return TCL_ERROR; } - Tcl_SetObjResult(interp, Tcl_ListMathFuncs(interp, pattern)); - return TCL_OK; + script = Tcl_NewStringObj( +" ::apply [::list {{pattern *}} {\n" +" ::set cmds {}\n" +" ::foreach cmd [::info commands ::tcl::mathfunc::$pattern] {\n" +" ::lappend cmds [::namespace tail $cmd]\n" +" }\n" +" ::foreach cmd [::info commands tcl::mathfunc::$pattern] {\n" +" ::set cmd [::namespace tail $cmd]\n" +" ::if {$cmd ni $cmds} {\n" +" ::lappend cmds $cmd\n" +" }\n" +" }\n" +" ::return $cmds\n" +" } [::namespace current]] ", -1); + + if (objc == 2) { + Tcl_Obj *arg = Tcl_NewListObj(1, &(objv[1])); + + Tcl_AppendObjToObj(script, arg); + Tcl_DecrRefCount(arg); + } + + Tcl_IncrRefCount(script); + code = Tcl_EvalObjEx(interp, script, 0); + + Tcl_DecrRefCount(script); + + return code; } /* |
