Submitted By: Bryan Kadzban Date: 2008-01-12 Initial Package Version: 5.43 Upstream status: Not Submitted - Test Version Origin: LFS ticket 2126 (http://wiki.linuxfromscratch.org/lfs/ticket/2126) Description: Removes references to functions that Tcl 8.5 no longer exposes. diff -Naur expect-5.43/exp_command.c expect-5.43-patched/exp_command.c --- expect-5.43/exp_command.c 2004-08-20 13:18:01.000000000 -0400 +++ expect-5.43-patched/exp_command.c 2008-01-12 11:42:45.000000000 -0500 @@ -2265,6 +2265,8 @@ /*NOTREACHED*/ } +static struct exp_cmd_data cmd_data[]; + /*ARGSUSED*/ static int Exp_CloseObjCmd(clientData, interp, objc, objv) @@ -2311,12 +2313,23 @@ /* Historical note: we used "close" long before there was a */ /* Tcl builtin by the same name. */ + /* The code that registered this function as the handler for */ + /* the "close" command stored away the old handler in the */ + /* exp_cmd_data for the "close" command. */ + + struct exp_cmd_data *cmd_ptr; Tcl_CmdInfo info; + + for(cmd_ptr = &cmd_data[0]; cmd_ptr->name; cmd_ptr++) { + if(strncmp(cmd_ptr->name, "close", 5) == 0) + break; + } + Tcl_ResetResult(interp); if (0 == Tcl_GetCommandInfo(interp,"close",&info)) { info.clientData = 0; } - return(Tcl_CloseObjCmd(info.clientData,interp,objc_orig,objv_orig)); + return(cmd_ptr->old_objProc(info.clientData,interp,objc_orig,objv_orig)); } if (chanName) { @@ -2961,7 +2974,10 @@ /* if successful (i.e., TCL_RETURN is returned) */ /* modify the result, so that we will handle it specially */ - int result = Tcl_ReturnObjCmd(clientData,interp,objc,objv); + Tcl_CmdInfo info; + Tcl_GetCommandInfo(interp, "return", &info); + + int result = info.objProc(clientData,interp,objc,objv); if (result == TCL_RETURN) result = EXP_TCL_RETURN; return result; @@ -3062,8 +3078,7 @@ for (;c->name;c++) { /* if already defined, don't redefine */ - if ((c->flags & EXP_REDEFINE) || - !(Tcl_FindHashEntry(&globalNsPtr->cmdTable,c->name) || + if (!(Tcl_FindHashEntry(&globalNsPtr->cmdTable,c->name) || Tcl_FindHashEntry(&currNsPtr->cmdTable,c->name))) { if (c->objproc) Tcl_CreateObjCommand(interp,c->name, @@ -3072,6 +3087,21 @@ Tcl_CreateCommand(interp,c->name,c->proc, c->data,exp_deleteProc); } + else if (c->flags & EXP_REDEFINE) { /* unless the REDEFINE flag is present */ + Tcl_CmdInfo info; + + if (Tcl_GetCommandInfo(interp, c->name, &info)) { + c->old_proc = info.proc; + c->old_objProc = info.objProc; + } + + if (c->objproc) + Tcl_CreateObjCommand(interp,c->name, + c->objproc,c->data,exp_deleteObjProc); + else + Tcl_CreateCommand(interp,c->name,c->proc, + c->data,exp_deleteProc); + } if (!(c->name[0] == 'e' && c->name[1] == 'x' && c->name[2] == 'p') diff -Naur expect-5.43/exp_command.h expect-5.43-patched/exp_command.h --- expect-5.43/exp_command.h 2008-01-12 11:44:11.000000000 -0500 +++ expect-5.43-patched/exp_command.h 2008-01-12 11:26:05.000000000 -0500 @@ -297,6 +297,8 @@ Tcl_CmdProc *proc; ClientData data; int flags; + Tcl_CmdProc *old_proc; /* these store the procedure for the old command, */ + Tcl_ObjCmdProc *old_objProc; /* if any */ }; EXTERN void exp_create_commands _ANSI_ARGS_((Tcl_Interp *,