summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2012-11-16 15:35:22 (GMT)
committerdgp <dgp@users.sourceforge.net>2012-11-16 15:35:22 (GMT)
commit758a0f5c2e969817509e566bad7546a9d9c66a49 (patch)
tree722371c376c77a67d407c22ccea5c8b8aba2d75a /generic
parente0ad3b3ebfef863621c1cdd5ca28546b9a4caea3 (diff)
downloadtcl-758a0f5c2e969817509e566bad7546a9d9c66a49.zip
tcl-758a0f5c2e969817509e566bad7546a9d9c66a49.tar.gz
tcl-758a0f5c2e969817509e566bad7546a9d9c66a49.tar.bz2
3587651 fix [info functions] (Re-implementation in Tcl)
Diffstat (limited to 'generic')
-rw-r--r--generic/tclCmdIL.c39
1 files changed, 31 insertions, 8 deletions
diff --git a/generic/tclCmdIL.c b/generic/tclCmdIL.c
index af7fe60..152e61d 100644
--- a/generic/tclCmdIL.c
+++ b/generic/tclCmdIL.c
@@ -1338,19 +1338,42 @@ InfoFunctionsCmd(
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
- 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;
}
/*