git: e6529265153c - main - lang/expect: apply patches from upstream
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 09 Feb 2022 17:32:16 UTC
The branch main has been updated by gahr:
URL: https://cgit.FreeBSD.org/ports/commit/?id=e6529265153c3420c8441ceaf55fc7c8b58788bd
commit e6529265153c3420c8441ceaf55fc7c8b58788bd
Author: Pietro Cerutti <gahr@FreeBSD.org>
AuthorDate: 2022-02-09 17:21:32 +0000
Commit: Pietro Cerutti <gahr@FreeBSD.org>
CommitDate: 2022-02-09 17:31:55 +0000
lang/expect: apply patches from upstream
PR: 261829
Reported by: dim
---
lang/expect/Makefile | 2 +-
lang/expect/files/patch-modernize | 1039 +++++++++++++++++++++++++++++++++++++
2 files changed, 1040 insertions(+), 1 deletion(-)
diff --git a/lang/expect/Makefile b/lang/expect/Makefile
index e147d535ce31..d4b186a80ddd 100644
--- a/lang/expect/Makefile
+++ b/lang/expect/Makefile
@@ -2,7 +2,7 @@
PORTNAME= expect
PORTVERSION= 5.45.4
-PORTREVISION= 2
+PORTREVISION= 3
PORTEPOCH= 1
CATEGORIES= lang tcl tk
MASTER_SITES= SF/${PORTNAME}/Expect/${PORTVERSION}
diff --git a/lang/expect/files/patch-modernize b/lang/expect/files/patch-modernize
new file mode 100644
index 000000000000..15a33269c77a
--- /dev/null
+++ b/lang/expect/files/patch-modernize
@@ -0,0 +1,1039 @@
+Index: Dbg.c
+==================================================================
+--- Dbg.c
++++ Dbg.c
+@@ -171,16 +171,16 @@
+ Tcl_SetVar2Ex(interp, Dbg_VarName, name, Tcl_GetRange(objPtr,
+ info.matches[i].start, info.matches[i].end-1), 0);
+ }
+ }
+
+-/* return 1 to break, 0 to continue */
++/* return 1 to break, 0 to continue
++ * cmd: command about to be executed
++ * bp: breakpoint to test
++ */
+ static int
+-breakpoint_test(interp,cmd,bp)
+-Tcl_Interp *interp;
+-char *cmd; /* command about to be executed */
+-struct breakpoint *bp; /* breakpoint to test */
++breakpoint_test(Tcl_Interp *interp,const char *cmd,struct breakpoint *bp)
+ {
+ if (bp->re) {
+ int found = 0;
+ Tcl_Obj *cmdObj;
+ Tcl_RegExp re = Tcl_GetRegExpFromObj(NULL, bp->pat,
+@@ -237,11 +237,11 @@
+ * if global frame indicated). */
+ enum debug_cmd dir; /* look up or down the stack */
+ {
+ Interp *iPtr = (Interp *) interp;
+ int level, result;
+- CallFrame *framePtr; /* frame currently being searched */
++ CallFrame *framePtr = NULL; /* frame currently being searched */
+
+ CallFrame *curFramePtr = iPtr->varFramePtr;
+
+ /*
+ * Parse string to figure out which level number to go to.
+@@ -299,11 +299,10 @@
+ }
+ }
+ *framePtrPtr = framePtr;
+ return result;
+ }
+-
+
+ static char *printify(s)
+ char *s;
+ {
+ static int destlen = 0;
+@@ -656,10 +655,12 @@
+ case ret:
+ /* same comment as in "case next" */
+ if (goalFramePtr != iPtr->varFramePtr) goto finish;
+ goto start_interact;
+ /* DANGER: unhandled cases! none, up, down, where */
++ default:
++ break; /* Silence compiler warning */
+ }
+
+ start_interact:
+ if (print_command_first_time) {
+ print(interp,"%s: %s\n",
+@@ -714,10 +715,12 @@
+ goalFramePtr = goalFramePtr->callerVarPtr;
+ goto finish;
+ case where:
+ PrintStack(interp,iPtr->varFramePtr,viewFramePtr,objc,objv,level_text);
+ break;
++ default:
++ break; /* Silence compiler warning */
+ }
+
+ /* restore view and restart interactor */
+ iPtr->varFramePtr = viewFramePtr;
+ goto start_interact;
+
+Index: configure.in
+==================================================================
+--- configure.in
++++ configure.in
+@@ -217,10 +217,12 @@
+ # This needn't be done in the 2nd and 3rd tests.
+ AC_DEFINE(HAVE_OPENPTY)
+ LIBS="$LIBS -lutil"
+ ])
+ fi
++
++AC_CHECK_HEADER(libutil.h,AC_DEFINE(HAVE_LIBUTIL_H))
+
+ ######################################################################
+ # End of library/func checking
+ ######################################################################
+
+
+Index: exp_chan.c
+==================================================================
+--- exp_chan.c
++++ exp_chan.c
+@@ -23,20 +23,20 @@
+ # include <unistd.h>
+ #endif
+
+ #include <errno.h>
+
+-#include "tclInt.h" /* Internal definitions for Tcl. */
+-
+-#include "tcl.h"
++#include <tclInt.h> /* Internal definitions for Tcl. */
++#include <tcl.h>
+
+ #include "string.h"
+
+ #include "exp_rename.h"
+ #include "exp_prog.h"
+ #include "exp_command.h"
+ #include "exp_log.h"
++#include "exp_event.h"
+ #include "tcldbg.h" /* Dbg_StdinMode */
+
+ extern int expSetBlockModeProc _ANSI_ARGS_((int fd, int mode));
+ static int ExpBlockModeProc _ANSI_ARGS_((ClientData instanceData,
+ int mode));
+@@ -55,21 +55,18 @@
+ /*
+ * This structure describes the channel type structure for Expect-based IO:
+ */
+
+ Tcl_ChannelType expChannelType = {
+- "exp", /* Type name. */
+- ExpBlockModeProc, /* Set blocking/nonblocking mode.*/
+- ExpCloseProc, /* Close proc. */
+- ExpInputProc, /* Input proc. */
+- ExpOutputProc, /* Output proc. */
+- NULL, /* Seek proc. */
+- NULL, /* Set option proc. */
+- NULL, /* Get option proc. */
+- ExpWatchProc, /* Initialize notifier. */
+- ExpGetHandleProc, /* Get OS handles out of channel. */
+- NULL, /* Close2 proc */
++ .typeName = "exp", /* Type name. */
++ .version = TCL_CHANNEL_VERSION_2,
++ .blockModeProc = ExpBlockModeProc, /* Set blocking/nonblocking mode.*/
++ .closeProc = ExpCloseProc, /* Close proc. */
++ .inputProc = ExpInputProc, /* Input proc. */
++ .outputProc = ExpOutputProc, /* Output proc. */
++ .watchProc = ExpWatchProc, /* Initialize notifier. */
++ .getHandleProc = ExpGetHandleProc /* Get OS handles out of channel. */
+ };
+
+ typedef struct ThreadSpecificData {
+ /*
+ * List of all exp channels currently open. This is per thread and is
+@@ -434,14 +431,14 @@
+ ClientData *handlePtr; /* Where to store the handle. */
+ {
+ ExpState *esPtr = (ExpState *) instanceData;
+
+ if (direction & TCL_WRITABLE) {
+- *handlePtr = (ClientData) esPtr->fdin;
++ *handlePtr = (ClientData)(intptr_t)esPtr->fdin;
+ }
+ if (direction & TCL_READABLE) {
+- *handlePtr = (ClientData) esPtr->fdin;
++ *handlePtr = (ClientData)(intptr_t)esPtr->fdin;
+ } else {
+ return TCL_ERROR;
+ }
+ return TCL_OK;
+ }
+
+Index: exp_clib.c
+==================================================================
+--- exp_clib.c
++++ exp_clib.c
+@@ -47,10 +47,14 @@
+ #include <sys/strredir.h>
+ # ifdef SRIOCSREDIR
+ # undef TIOCCONS
+ # endif
+ #endif
++
++#ifdef HAVE_UNISTD_H
++#include <unistd.h>
++#endif
+
+ #include <signal.h>
+ /*#include <memory.h> - deprecated - ANSI C moves them into string.h */
+ #include "string.h"
+
+@@ -114,10 +118,11 @@
+ #include <stdlib.h> /* for malloc */
+ #endif
+
+ #include <tcl.h>
+ #include "expect.h"
++#include "exp_command.h"
+ #define TclRegError exp_TclRegError
+
+ /*
+ * regexp code - from tcl8.0.4/generic/regexp.c
+ */
+@@ -1805,10 +1810,17 @@
+ fp->match_end = fp->buffer;
+ return fp;
+
+ }
+
++/* ultrix (at least 4.1-2) fails to obtain controlling tty if setsid */
++/* is called. setpgrp works though. */
++#if defined(POSIX) && !defined(ultrix) || defined(__convex__)
++#define DO_SETSID
++#endif
++
++#if !defined(DO_SETSID) && (!defined(SYSV3) || defined(CRAY)) /* { */
+ static
+ void
+ exp_setpgrp()
+ {
+ #ifdef MIPS_BSD
+@@ -1821,10 +1833,11 @@
+ (void) setpgrp();
+ #else
+ (void) setpgrp(0,0);
+ #endif
+ }
++#endif /* } */
+
+ /* returns fd of master side of pty */
+ int
+ exp_spawnv(file,argv)
+ char *file;
+@@ -1831,11 +1844,13 @@
+ char *argv[]; /* some compiler complains about **argv? */
+ {
+ int cc;
+ int errorfd; /* place to stash fileno(stderr) in child */
+ /* while we're setting up new stderr */
++#if defined(TIOCNOTTY) && !defined(SYSV3) && !defined(DO_SETSID)
+ int ttyfd;
++#endif
+ int sync_fds[2];
+ int sync2_fds[2];
+ int status_pipe[2];
+ int child_errno;
+ char sync_byte;
+@@ -2006,19 +2021,10 @@
+
+ #ifdef CRAY
+ (void) close(exp_pty[0]);
+ #endif
+
+-/* ultrix (at least 4.1-2) fails to obtain controlling tty if setsid */
+-/* is called. setpgrp works though. */
+-#if defined(POSIX) && !defined(ultrix)
+-#define DO_SETSID
+-#endif
+-#ifdef __convex__
+-#define DO_SETSID
+-#endif
+-
+ #ifdef DO_SETSID
+ setsid();
+ #else
+ #ifdef SYSV3
+ #ifndef CRAY
+@@ -2037,11 +2043,16 @@
+
+ #endif /* SYSV3 */
+ #endif /* DO_SETSID */
+
+ /* save error fd while we're setting up new one */
++#ifdef F_DUPFD_CLOEXEC
++ errorfd = fcntl(2,F_DUPFD_CLOEXEC,3);
++#else
+ errorfd = fcntl(2,F_DUPFD,3);
++ fcntl(errorfd, F_SETFD, FD_CLOEXEC);
++#endif /* F_DUPFD_CLOXEC */
+ /* and here is the macro to restore it */
+ #define restore_error_fd {close(2);fcntl(errorfd,F_DUPFD,2);}
+
+ if (exp_autoallocpty) {
+
+@@ -2442,11 +2453,11 @@
+
+ struct f *f;
+ int return_val;
+ int sys_error = 0;
+ #define return_normally(x) {return_val = x; goto cleanup;}
+-#define return_errno(x) {sys_error = x; goto cleanup;}
++#define return_errno(x) {sys_error = x; return_val = -1; goto cleanup;}
+
+ f = fdfp2f(fd,fp);
+ if (!f) return_errno(ENOMEM);
+
+ exp_buffer = f->buffer;
+@@ -2851,11 +2862,13 @@
+ }
+
+ int
+ exp_disconnect()
+ {
++#if defined(TIOCNOTTY) && !defined(SYSV3) && !defined(POSIX)
+ int ttyfd;
++#endif
+
+ #ifndef EALREADY
+ #define EALREADY 37
+ #endif
+
+
+Index: exp_command.c
+==================================================================
+--- exp_command.c
++++ exp_command.c
+@@ -530,10 +530,17 @@
+ if (-1 == ioctl(fd,TIOCSPGRP,&pgrp)) perror("TIOCSPGRP");
+ if (-1 == tcsetpgrp(fd,pgrp)) perror("tcsetpgrp");
+ }
+ #endif
+
++/* ultrix (at least 4.1-2) fails to obtain controlling tty if setsid */
++/* is called. setpgrp works though. */
++#if defined(POSIX) && !defined(ultrix) || defined(__convex__)
++#define DO_SETSID
++#endif
++
++#if !defined(DO_SETSID) && (!defined(SYSV3) || defined(CRAY)) /* { */
+ static
+ void
+ expSetpgrp()
+ {
+ #ifdef MIPS_BSD
+@@ -546,11 +553,11 @@
+ (void) setpgrp();
+ #else
+ (void) setpgrp(0,0);
+ #endif
+ }
+-
++#endif /* } */
+
+ /*ARGSUSED*/
+ static void
+ set_slave_name(
+ ExpState *esPtr,
+@@ -579,13 +586,11 @@
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
+ {
+ ExpState *esPtr = 0;
+ int slave;
+ int pid;
+-#ifdef TIOCNOTTY
+- /* tell Saber to ignore non-use of ttyfd */
+- /*SUPPRESS 591*/
++#if defined(TIOCNOTTY) && !defined(SYSV3) && !defined(DO_SETSID)
+ int ttyfd;
+ #endif /* TIOCNOTTY */
+ int errorfd; /* place to stash fileno(stderr) in child */
+ /* while we're setting up new stderr */
+ int master, k;
+@@ -901,17 +906,21 @@
+ }
+ if (mode & TCL_READABLE) {
+ if (TCL_ERROR == Tcl_GetChannelHandle(channel, TCL_READABLE, &rfdc)) {
+ return TCL_ERROR;
+ }
+- rfd = (int)(long) rfdc;
++ rfd = (int)(intptr_t) rfdc;
++ } else {
++ rfd = -1;
+ }
+ if (mode & TCL_WRITABLE) {
+ if (TCL_ERROR == Tcl_GetChannelHandle(channel, TCL_WRITABLE, &wfdc)) {
+ return TCL_ERROR;
+ }
+- wfd = (int)(long) wfdc;
++ wfd = (int)(intptr_t) wfdc;
++ } else {
++ wfd = -1;
+ }
+ master = ((mode & TCL_READABLE)?rfd:wfd);
+
+ /* make a new copy of file descriptor */
+ if (-1 == (write_master = master = dup(master))) {
+@@ -1124,19 +1133,10 @@
+
+ #ifdef CRAY
+ (void) close(master);
+ #endif
+
+-/* ultrix (at least 4.1-2) fails to obtain controlling tty if setsid */
+-/* is called. setpgrp works though. */
+-#if defined(POSIX) && !defined(ultrix)
+-#define DO_SETSID
+-#endif
+-#ifdef __convex__
+-#define DO_SETSID
+-#endif
+-
+ #ifdef DO_SETSID
+ setsid();
+ #else
+ #ifdef SYSV3
+ #ifndef CRAY
+@@ -1159,11 +1159,16 @@
+
+ /* save stderr elsewhere to avoid BSD4.4 bogosity that warns */
+ /* if stty finds dev(stderr) != dev(stdout) */
+
+ /* save error fd while we're setting up new one */
++#ifdef F_DUPFD_CLOEXEC
++ errorfd = fcntl(2,F_DUPFD_CLOEXEC,3);
++#else
+ errorfd = fcntl(2,F_DUPFD,3);
++ fcntl(errorfd, F_SETFD, FD_CLOEXEC);
++#endif /* F_DUPFD_CLOXEC */
+ /* and here is the macro to restore it */
+ #define restore_error_fd {close(2);fcntl(errorfd,F_DUPFD,2);}
+
+ close(0);
+ close(1);
+@@ -1974,11 +1979,11 @@
+ #define SEND_STYLE_SLOW 0x04
+ #define SEND_STYLE_ZERO 0x10
+ #define SEND_STYLE_BREAK 0x20
+ int send_style = SEND_STYLE_PLAIN;
+ int want_cooked = TRUE;
+- char *string; /* string to send */
++ char *string = NULL; /* string to send */
+ int len = -1; /* length of string to send */
+ int zeros; /* count of how many ascii zeros to send */
+
+ char *chanName = 0;
+ struct exp_state_list *state_list;
+@@ -2533,11 +2538,11 @@
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
+ {
+ /* Magic configuration stuff. */
+ int i, opt, val;
+
+- static CONST84 char* options [] = {
++ static const char* options [] = {
+ "-strictwrite", NULL
+ };
+ enum options {
+ EXP_STRICTWRITE
+ };
+@@ -3112,13 +3117,11 @@
+ int objc,
+ Tcl_Obj *CONST objv[]) /* Argument objects. */
+ {
+ ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
+
+-#ifdef TIOCNOTTY
+- /* tell CenterLine to ignore non-use of ttyfd */
+- /*SUPPRESS 591*/
++#if defined(TIOCNOTTY) && !defined(SYSV3) && !defined(DO_SETSID)
+ int ttyfd;
+ #endif /* TIOCNOTTY */
+
+ if (objc > 1) {
+ exp_error(interp,"usage: disconnect");
+
+Index: exp_event.c
+==================================================================
+--- exp_event.c
++++ exp_event.c
+@@ -22,10 +22,11 @@
+
+ #include "tcl.h"
+ #include "exp_prog.h"
+ #include "exp_command.h" /* for ExpState defs */
+ #include "exp_event.h"
++#include "exp_log.h"
+
+ typedef struct ThreadSpecificData {
+ int rr; /* round robin ptr */
+ } ThreadSpecificData;
+
+@@ -118,10 +119,13 @@
+ exp_arm_background_channelhandler_force(esPtr);
+ break;
+ case disarm_req_while_blocked:
+ exp_disarm_background_channelhandler_force(esPtr);
+ break;
++ default:
++ expDiagLog("Unexpected value %d of bg-handler in %s",
++ esPtr->bg_status, __func__);
+ }
+ }
+
+ /* this can only be called at the beginning of the bg handler in which */
+ /* case we know the status must be "armed" */
+
+Index: exp_inter.c
+==================================================================
+--- exp_inter.c
++++ exp_inter.c
+@@ -402,12 +402,12 @@
+ ExpState *esPtr,
+ int skipBytes,
+ int matchBytes)
+ {
+ int seenBytes; /* either printed or echoed */
+- int echoBytes;
+- int offsetBytes;
++ int echoBytes = 0;
++ int offsetBytes = 0;
+
+ /* write is unlikely to fail, since we just read from same descriptor */
+ seenBytes = esPtr->printed + esPtr->echoed;
+ if (skipBytes >= seenBytes) {
+ echoBytes = matchBytes;
+@@ -704,13 +704,10 @@
+ return 0;
+ }
+
+ #define finish(x) { status = x; goto done; }
+
+-static char return_cmd[] = "return";
+-static char interpreter_cmd[] = "interpreter";
+-
+ /*ARGSUSED*/
+ int
+ Exp_InteractObjCmd(
+ ClientData clientData,
+ Tcl_Interp *interp,
+@@ -1342,19 +1339,19 @@
+ for (;;) {
+ int te; /* result of Tcl_Eval */
+ int rc; /* return code from ready. This is further refined by matcher. */
+ int cc; /* # of chars from read() */
+ struct action *action = 0;
+- time_t previous_time;
++ time_t previous_time = 0;
+ time_t current_time;
+- int matchLen; /* # of chars matched */
++ int matchLen = 0; /* # of chars matched */
+ int skip; /* # of chars not involved in match */
+ int print; /* # of chars to print */
+ int oldprinted; /* old version of u->printed */
+ int change; /* if action requires cooked mode */
+ int attempt_match = TRUE;
+- struct input *soonest_input;
++ struct input *soonest_input = NULL;
+ int timeout; /* current as opposed to default_timeout */
+ Tcl_Time temp_time;
+
+ /* calculate how long to wait */
+ /* by finding shortest remaining timeout */
+
+Index: exp_log.c
+==================================================================
+--- exp_log.c
++++ exp_log.c
+@@ -88,10 +88,12 @@
+ int wc;
+ ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
+
+ if (esPtr->valid)
+ wc = expWriteCharsUni(esPtr,buf,lenChars);
++ else
++ wc = -1;
+
+ if (tsdPtr->logChannel && ((esPtr->fdout == 1) || expDevttyIs(esPtr))) {
+ Tcl_DString ds;
+ Tcl_DStringInit (&ds);
+ Tcl_UniCharToUtfDString (buf,lenChars,&ds);
+
+Index: exp_pty.c
+==================================================================
+--- exp_pty.c
++++ exp_pty.c
+@@ -133,11 +133,13 @@
+ alarm(0);
+ return(cc);
+ }
+
+ static RETSIGTYPE (*oldAlarmHandler)();
++#ifndef O_NOCTTY
+ static RETSIGTYPE (*oldHupHandler)();
++#endif
+ static time_t current_time; /* time when testing began */
+
+ /* if TRUE, begin testing, else end testing */
+ /* returns -1 for failure, 0 for success */
+ int
+
+Index: exp_trap.c
+==================================================================
+--- exp_trap.c
++++ exp_trap.c
+@@ -295,15 +295,14 @@
+ return -1;
+ }
+
+ /*ARGSUSED*/
+ int
+-Exp_TrapObjCmd(clientData, interp, objc, objv)
+-ClientData clientData;
+-Tcl_Interp *interp;
+-int objc;
+-Tcl_Obj *CONST objv[];
++Exp_TrapObjCmd(ClientData clientData,
++ Tcl_Interp *interp,
++ int objc,
++ Tcl_Obj *CONST objv[])
+ {
+ char *action = 0;
+ int n; /* number of signals in list */
+ Tcl_Obj **list; /* list of signals */
+ char *arg;
+@@ -317,11 +316,13 @@
+ Tcl_Interp *new_interp = interp;/* interp in which to evaluate */
+ /* action when signal occurs */
+
+ objc--; objv++;
+
+- while (objc) {
++ if (objc <= 0) goto usage_error;
++
++ do {
+ arg = Tcl_GetString(*objv);
+
+ if (streq(arg,"-code")) {
+ objc--; objv++;
+ new_code = TRUE;
+@@ -336,11 +337,11 @@
+ show_number = TRUE;
+ } else if (streq(arg,"-max")) {
+ objc--; objv++;
+ show_max = TRUE;
+ } else break;
+- }
++ } while(objc);
+
+ if (show_name || show_number || show_max) {
+ if (objc > 0) goto usage_error;
+ if (show_max) {
+ Tcl_SetObjResult(interp,Tcl_NewIntObj(NSIG-1));
+
+Index: exp_tty.c
+==================================================================
+--- exp_tty.c
++++ exp_tty.c
+@@ -583,22 +583,24 @@
+ char buf[MAX_ARGLIST];
+ char *bufp = buf;
+ int total_len = 0, arg_len;
+
+ int stty_args_recognized = TRUE;
+- int cmd_is_stty = FALSE;
++ int cmd_is_stty;
+ int cooked = FALSE;
+- int was_raw, was_echo;
++ const char *was_raw = "-raw", *was_echo = "-echo";
+
+ if (argc == 1) return TCL_OK;
+
+- if (streq(argv[1],"stty")) {
++ cmd_is_stty = streq(argv[1],"stty");
++ if (cmd_is_stty) {
+ expDiagLogU("system stty is deprecated, use stty\r\n");
+
+- cmd_is_stty = TRUE;
+- was_raw = exp_israw();
+- was_echo = exp_isecho();
++ if (exp_israw())
++ was_raw++;
++ if (exp_isecho())
++ was_echo++;
+ }
+
+ if (argc > 2 && cmd_is_stty) {
+ exp_ioctled_devtty = TRUE;
+
+@@ -633,15 +635,11 @@
+ }
+ exp_error(interp,"system stty: ioctl(user): %s\r\n",Tcl_PosixError(interp));
+ return(TCL_ERROR);
+ }
+ if (cmd_is_stty) {
+- char buf [11];
+- sprintf(buf,"%sraw %secho",
+- (was_raw?"":"-"),
+- (was_echo?"":"-"));
+- Tcl_SetResult (interp, buf, TCL_VOLATILE);
++ Tcl_AppendResult (interp, was_raw, " ", was_echo, NULL);
+ }
+ return(TCL_OK);
+ }
+ }
+
+@@ -697,15 +695,11 @@
+ tty_cooked = tty_current;
+ }
+ }
+
+ if (cmd_is_stty) {
+- char buf [11];
+- sprintf(buf,"%sraw %secho",
+- (was_raw?"":"-"),
+- (was_echo?"":"-"));
+- Tcl_SetResult (interp, buf, TCL_VOLATILE);
++ Tcl_AppendResult (interp, was_raw, " ", was_echo, NULL);
+ }
+
+ /* following macros stolen from Tcl's tclUnix.h file */
+ /* we can't include the whole thing because it depends on other macros */
+ /* that come out of Tcl's Makefile, sigh */
+
+Index: exp_tty.h
+==================================================================
+--- exp_tty.h
++++ exp_tty.h
+@@ -17,13 +17,14 @@
+
+ void exp_tty_raw(int set);
+ void exp_tty_echo(int set);
+ void exp_tty_break(Tcl_Interp *interp, int fd);
+ int exp_tty_raw_noecho(Tcl_Interp *interp, exp_tty *tty_old, int *was_raw, int *was_echo);
++int exp_tty_cooked_echo(Tcl_Interp *interp, exp_tty *tty_old, int *was_raw, int *was_echo);
+ int exp_israw(void);
+ int exp_isecho(void);
+
+ void exp_tty_set(Tcl_Interp *interp, exp_tty *tty, int raw, int echo);
+ int exp_tty_set_simple(exp_tty *tty);
+ int exp_tty_get_simple(exp_tty *tty);
+
+ #endif /* __EXP_TTY_H__ */
+
+Index: exp_win.c
+==================================================================
+--- exp_win.c
++++ exp_win.c
+@@ -76,24 +76,24 @@
+ #endif
+
+ static exp_winsize winsize = {0, 0};
+ static exp_winsize win2size = {0, 0};
+
+-int exp_window_size_set(fd)
+-int fd;
++int exp_window_size_set(int fd)
+ {
++ return
+ #ifdef TIOCSWINSZ
+ ioctl(fd,TIOCSWINSZ,&winsize);
+ #endif
+ #if defined(TIOCSSIZE) && !defined(TIOCSWINSZ)
+ ioctl(fd,TIOCSSIZE,&winsize);
+ #endif
+ }
+
+-int exp_window_size_get(fd)
+-int fd;
++int exp_window_size_get(int fd)
+ {
++ return
+ #ifdef TIOCGWINSZ
+ ioctl(fd,TIOCGWINSZ,&winsize);
+ #endif
+ #if defined(TIOCGSIZE) && !defined(TIOCGWINSZ)
+ ioctl(fd,TIOCGSIZE,&winsize);
+@@ -103,12 +103,11 @@
+ winsize.columns = 0;
+ #endif
+ }
+
+ void
+-exp_win_rows_set(rows)
+-char *rows;
++exp_win_rows_set(const char *rows)
+ {
+ winsize.rows = atoi(rows);
+ exp_window_size_set(exp_dev_tty);
+ }
+
+@@ -120,12 +119,11 @@
+ sprintf(rows,"%d",winsize.rows);
+ return rows;
+ }
+
+ void
+-exp_win_columns_set(columns)
+-char *columns;
++exp_win_columns_set(const char *columns)
+ {
+ winsize.columns = atoi(columns);
+ exp_window_size_set(exp_dev_tty);
+ }
+
+@@ -140,23 +138,23 @@
+
+ /*
+ * separate copy of everything above - used for handling user stty requests
+ */
+
+-int exp_win2_size_set(fd)
+-int fd;
++static void
++exp_win2_size_set(int fd)
+ {
+ #ifdef TIOCSWINSZ
+ ioctl(fd,TIOCSWINSZ,&win2size);
+ #endif
+ #if defined(TIOCSSIZE) && !defined(TIOCSWINSZ)
+ ioctl(fd,TIOCSSIZE,&win2size);
+ #endif
+ }
+
+-int exp_win2_size_get(fd)
+-int fd;
++static void
++exp_win2_size_get(int fd)
+ {
+ #ifdef TIOCGWINSZ
+ ioctl(fd,TIOCGWINSZ,&win2size);
+ #endif
+ #if defined(TIOCGSIZE) && !defined(TIOCGWINSZ)
+@@ -163,22 +161,19 @@
+ ioctl(fd,TIOCGSIZE,&win2size);
+ #endif
+ }
+
+ void
+-exp_win2_rows_set(fd,rows)
+-int fd;
+-char *rows;
++exp_win2_rows_set(int fd,const char *rows)
+ {
+ exp_win2_size_get(fd);
+ win2size.rows = atoi(rows);
+ exp_win2_size_set(fd);
+ }
+
+ char*
+-exp_win2_rows_get(fd)
+-int fd;
++exp_win2_rows_get(int fd)
+ {
+ static char rows [20];
+ exp_win2_size_get(fd);
+ sprintf(rows,"%d",win2size.rows);
+ #if !defined(EXP_WIN)
+@@ -187,22 +182,19 @@
+ #endif
+ return rows;
+ }
+
+ void
+-exp_win2_columns_set(fd,columns)
+-int fd;
+-char *columns;
++exp_win2_columns_set(int fd,const char *columns)
+ {
+ exp_win2_size_get(fd);
+ win2size.columns = atoi(columns);
+ exp_win2_size_set(fd);
+ }
+
+ char*
+-exp_win2_columns_get(fd)
+-int fd;
++exp_win2_columns_get(int fd)
+ {
+ static char columns [20];
+ exp_win2_size_get(fd);
+ sprintf(columns,"%d",win2size.columns);
+ return columns;
+
+Index: exp_win.h
+==================================================================
+--- exp_win.h
++++ exp_win.h
+@@ -9,14 +9,14 @@
+ #include <tcl.h> /* For _ANSI_ARGS_ */
+
+ int exp_window_size_set();
+ int exp_window_size_get();
+
+-void exp_win_rows_set _ANSI_ARGS_ ((char* rows));
++void exp_win_rows_set _ANSI_ARGS_ ((const char* rows));
+ char* exp_win_rows_get _ANSI_ARGS_ ((void));
+-void exp_win_columns_set _ANSI_ARGS_ ((char* columns));
++void exp_win_columns_set _ANSI_ARGS_ ((const char* columns));
+ char* exp_win_columns_get _ANSI_ARGS_ ((void));
+
+-void exp_win2_rows_set _ANSI_ARGS_ ((int fd, char* rows));
++void exp_win2_rows_set _ANSI_ARGS_ ((int fd, const char* rows));
+ char* exp_win2_rows_get _ANSI_ARGS_ ((int fd));
+-void exp_win2_columns_set _ANSI_ARGS_ ((int fd, char* columns));
++void exp_win2_columns_set _ANSI_ARGS_ ((int fd, const char* columns));
+ char* exp_win2_columns_get _ANSI_ARGS_ ((int fd));
+
+Index: expect.c
+==================================================================
+--- expect.c
++++ expect.c
+@@ -2535,28 +2535,28 @@
+ int i; /* misc temporary */
+ struct exp_cmd_descriptor eg;
+ struct exp_state_list *state_list; /* list of ExpStates to watch */
+ struct exp_state_list *slPtr; /* temp for interating over state_list */
+ ExpState **esPtrs;
+- int mcount; /* number of esPtrs to watch */
++ int mcount = 0; /* number of esPtrs to watch */
+
+ struct eval_out eo; /* final case of interest */
+
+ int result; /* Tcl result */
+
+ time_t start_time_total; /* time at beginning of this procedure */
+ time_t start_time = 0; /* time when restart label hit */
+ time_t current_time = 0; /* current time (when we last looked)*/
+- time_t end_time; /* future time at which to give up */
++ time_t end_time = 0; /* future time at which to give up */
+
+ ExpState *last_esPtr; /* for differentiating when multiple f's */
+ /* to print out better debugging messages */
+ int last_case; /* as above but for case */
+ int first_time = 1; /* if not "restarted" */
+
+ int key; /* identify this expect command instance */
+- int configure_count; /* monitor exp_configure_count */
++ int configure_count = 0; /* monitor exp_configure_count */
+
+ int timeout; /* seconds */
+ int remtime; /* remaining time in timeout */
+ int reset_timer; /* should timer be reset after continue? */
+ Tcl_Time temp_time;
+@@ -2945,16 +2945,18 @@
+ if (!chan) {
+ esPtr = expStateCurrent(interp,0,0,0);
+ } else {
+ esPtr = expStateFromChannelName(interp,chan,0,0,0,(char*)cmd);
+ }
+- if (!esPtr) return(TCL_ERROR);
++ if (!esPtr)
++ return(TCL_ERROR);
++
++ *esOut = esPtr;
+ }
+
+ *at = i;
+ *Default = def;
+- *esOut = esPtr;
*** 90 LINES SKIPPED ***