📄 pr12096.patch
字号:
diff -Naupr expect-5.39-old/confdefs.h expect-5.39-new/confdefs.h--- expect-5.39-old/confdefs.h 1969-12-31 16:00:00.000000000 -0800+++ expect-5.39-new/confdefs.h 2004-01-25 15:02:09.000000000 -0800@@ -0,0 +1 @@+diff -Naupr expect-5.39-old/exp_chan.c expect-5.39-new/exp_chan.c--- expect-5.39-old/exp_chan.c 2003-07-31 11:35:07.000000000 -0700+++ expect-5.39-new/exp_chan.c 2004-01-25 15:03:31.000000000 -0800@@ -527,6 +527,7 @@ expCreateChannel(interp,fdin,fdout,pid) esPtr->buffer = Tcl_NewStringObj("",0); Tcl_IncrRefCount(esPtr->buffer); esPtr->umsize = exp_default_match_max;+ esPtr->umsize_changed = exp_default_match_max_changed; /* this will reallocate object with an appropriate sized buffer */ expAdjust(esPtr); diff -Naupr expect-5.39-old/exp_command.h expect-5.39-new/exp_command.h--- expect-5.39-old/exp_command.h 2002-10-02 11:25:03.000000000 -0700+++ expect-5.39-new/exp_command.h 2004-01-25 15:03:31.000000000 -0800@@ -25,6 +25,7 @@ would appreciate credit if this program EXTERN char * exp_get_var _ANSI_ARGS_((Tcl_Interp *,char *)); EXTERN int exp_default_match_max;+EXTERN int exp_default_match_max_changed; EXTERN int exp_default_parity; EXTERN int exp_default_rm_nulls; @@ -97,6 +98,7 @@ typedef struct ExpState { int msize; /* # of bytes that buffer can hold (max) */ int umsize; /* # of bytes (min) that is guaranteed to match */ /* this comes from match_max command */+ int umsize_changed; /* is umsize changed by user? */ int printed; /* # of bytes written to stdout (if logging on) */ /* but not actually returned via a match yet */ int echoed; /* additional # of bytes (beyond "printed" above) */diff -Naupr expect-5.39-old/expect.c expect-5.39-new/expect.c--- expect-5.39-old/expect.c 2002-10-08 09:14:22.000000000 -0700+++ expect-5.39-new/expect.c 2004-01-25 15:03:31.000000000 -0800@@ -41,8 +41,17 @@ would appreciate credit if this program #include "tcldbg.h" #endif +/* The initial length is 2000. We increment it by 2000. The maximum+ is 8MB (0x800000). */+#define EXP_MATCH_MAX 2000+#define EXP_MATCH_INC 2000+#define EXP_MATCH_STEP_LIMIT 0x700000+#define EXP_MATCH_LIMIT 0x800000+#define EXP_MATCH_LIMIT_QUOTE "0x800000"+ /* initial length of strings that we can guarantee patterns can match */-int exp_default_match_max = 2000;+int exp_default_match_max = EXP_MATCH_MAX;+int exp_default_match_max_changed = 0; #define INIT_EXPECT_TIMEOUT_LIT "10" /* seconds */ #define INIT_EXPECT_TIMEOUT 10 /* seconds */ int exp_default_parity = TRUE;@@ -1618,6 +1627,76 @@ expNullStrip(obj,offsetBytes) return newsize; } +/* returns # of bytes until we see a newline at the end or EOF. */+/*ARGSUSED*/+static int+expReadNewLine(interp,esPtr,save_flags) /* INTL */+Tcl_Interp *interp;+ExpState *esPtr;+int save_flags;+{+ int size;+ int exp_size;+ int full_size;+ int count;+ char *str;++ count = 0;+ for (;;) {+ exp_size = expSizeGet(esPtr);++ /* When we reach the limit, we will only read one char at a+ time. */+ if (esPtr->umsize >= EXP_MATCH_STEP_LIMIT)+ size = TCL_UTF_MAX;+ else+ size = exp_size;++ if (exp_size + TCL_UTF_MAX >= esPtr->msize) {+ if (esPtr->umsize >= EXP_MATCH_LIMIT) {+ expDiagLogU("WARNING: interact buffer is full. probably your program\r\n");+ expDiagLogU("is not interactive or has a very long output line. The\r\n");+ expDiagLogU("current limit is " EXP_MATCH_LIMIT_QUOTE ".\r\n");+ expDiagLogU("Dumping first half of buffer in order to continue\r\n");+ expDiagLogU("Recommend you enlarge the buffer.\r\n");+ exp_buffer_shuffle(interp,esPtr,save_flags,EXPECT_OUT,"expect");+ return count;+ }+ else {+ esPtr->umsize += EXP_MATCH_INC;+ expAdjust(esPtr);+ }+ }++ full_size = esPtr->msize - (size / TCL_UTF_MAX);+ size = Tcl_ReadChars(esPtr->channel,+ esPtr->buffer,+ full_size,+ 1 /* append */);+ if (size > 0) {+ count += size;+ /* We try again if there are more to read and we haven't+ seen a newline at the end. */+ if (size == full_size) {+ str = Tcl_GetStringFromObj(esPtr->buffer, &size);+ if (str[size - 1] != '\n')+ continue;+ }+ }+ else {+ /* It is even trickier. We got an error from read. We have+ to recover from it. Let's make sure the size of+ buffer is correct. It can be corrupted. */+ str = Tcl_GetString(esPtr->buffer);+ Tcl_SetObjLength(esPtr->buffer, strlen(str));+ }++ break;+ }++ return count;+}+ /* returns # of bytes read or (non-positive) error of form EXP_XXX */ /* returns 0 for end of file */ /* If timeout is non-zero, set an alarm before doing the read, else assume */@@ -1632,6 +1711,8 @@ int save_flags; { int cc = EXP_TIMEOUT; int size = expSizeGet(esPtr);+ int full_size;+ int count; if (size + TCL_UTF_MAX >= esPtr->msize) exp_buffer_shuffle(interp,esPtr,save_flags,EXPECT_OUT,"expect");@@ -1648,11 +1729,43 @@ int save_flags; } #endif - + /* FIXME: If we ask less than what is available in the tcl buffer+ when tcl has seen EOF, we will throw away the remaining data+ since the next read will get EOF. Since expect is line-oriented,+ we exand our buffer to get EOF or the next newline at the end of+ the input buffer. I don't know if it is the right fix. H.J. */+ count = 0;+ full_size = esPtr->msize - (size / TCL_UTF_MAX); cc = Tcl_ReadChars(esPtr->channel,- esPtr->buffer,- esPtr->msize - (size / TCL_UTF_MAX),- 1 /* append */);+ esPtr->buffer,+ full_size,+ 1 /* append */);+ if (cc > 0) {+ count += cc;+ /* It gets very tricky. There are more to read. We will expand+ our buffer and get EOF or a newline at the end unless the+ buffer length has been changed. */+ if (cc == full_size) {+ char *str;+ str = Tcl_GetStringFromObj(esPtr->buffer, &size);+ if (str[size - 1] != '\n') {+ if (esPtr->umsize_changed) {+ char buf[20]; /* big enough for 64bit int in hex. */+ snprintf(buf,sizeof(buf),"0x%x", esPtr->umsize);+ expDiagLogU("WARNING: interact buffer is not large enough to hold\r\n");+ expDiagLogU("all output. probably your program is not interactive or\r\n");+ expDiagLogU("has a very long output line. The current limit is ");+ expDiagLogU(buf);+ expDiagLogU(".\r\n");+ }+ else {+ cc = expReadNewLine(interp,esPtr,save_flags);+ if (cc > 0)+ count += cc;+ }+ }+ }+ } i_read_errno = errno; #ifdef SIMPLE_EVENT@@ -1673,7 +1786,7 @@ int save_flags; } } #endif- return cc; + return count > 0 ? count : cc; } /*@@ -2746,8 +2859,14 @@ char **argv; return(TCL_ERROR); } - if (Default) exp_default_match_max = size;- else esPtr->umsize = size;+ if (Default) {+ exp_default_match_max = size;+ exp_default_match_max_changed = 1;+ }+ else {+ esPtr->umsize = size;+ esPtr->umsize_changed = 1;+ } return(TCL_OK); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -