Tcl Source Code

Hex Artifact Content
Login

Artifact 29b514a58d378fa5ee8d1324f2eb7f8c4b2cf789:

Attachment "1481986.patch" to ticket [1481986fff] added by dgp 2006-05-05 23:48:04.
0000: 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74  Index: generic/t
0010: 63 6c 4d 61 69 6e 2e 63 0a 3d 3d 3d 3d 3d 3d 3d  clMain.c.=======
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53  ============.RCS
0060: 20 66 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f   file: /cvsroot/
0070: 74 63 6c 2f 74 63 6c 2f 67 65 6e 65 72 69 63 2f  tcl/tcl/generic/
0080: 74 63 6c 4d 61 69 6e 2e 63 2c 76 0a 72 65 74 72  tclMain.c,v.retr
0090: 69 65 76 69 6e 67 20 72 65 76 69 73 69 6f 6e 20  ieving revision 
00a0: 31 2e 32 30 2e 32 2e 32 0a 64 69 66 66 20 2d 75  1.20.2.2.diff -u
00b0: 20 2d 72 31 2e 32 30 2e 32 2e 32 20 74 63 6c 4d   -r1.20.2.2 tclM
00c0: 61 69 6e 2e 63 0a 2d 2d 2d 20 67 65 6e 65 72 69  ain.c.--- generi
00d0: 63 2f 74 63 6c 4d 61 69 6e 2e 63 09 32 33 20 4f  c/tclMain.c.23 O
00e0: 63 74 20 32 30 30 35 20 32 32 3a 30 31 3a 33 30  ct 2005 22:01:30
00f0: 20 2d 30 30 30 30 09 31 2e 32 30 2e 32 2e 32 0a   -0000.1.20.2.2.
0100: 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 4d  +++ generic/tclM
0110: 61 69 6e 2e 63 09 35 20 4d 61 79 20 32 30 30 36  ain.c.5 May 2006
0120: 20 31 36 3a 34 34 3a 32 33 20 2d 30 30 30 30 0a   16:44:23 -0000.
0130: 40 40 20 2d 33 33 35 2c 39 30 20 2b 33 33 35 2c  @@ -335,90 +335,
0140: 38 39 20 40 40 0a 20 20 20 20 20 69 6e 43 68 61  89 @@.     inCha
0150: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  nnel = Tcl_GetSt
0160: 64 43 68 61 6e 6e 65 6c 28 54 43 4c 5f 53 54 44  dChannel(TCL_STD
0170: 49 4e 29 3b 0a 20 20 20 20 20 6f 75 74 43 68 61  IN);.     outCha
0180: 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  nnel = Tcl_GetSt
0190: 64 43 68 61 6e 6e 65 6c 28 54 43 4c 5f 53 54 44  dChannel(TCL_STD
01a0: 4f 55 54 29 3b 0a 20 20 20 20 20 77 68 69 6c 65  OUT);.     while
01b0: 20 28 28 69 6e 43 68 61 6e 6e 65 6c 20 21 3d 20   ((inChannel != 
01c0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
01d0: 4c 4c 29 20 26 26 20 21 54 63 6c 5f 49 6e 74 65  LL) && !Tcl_Inte
01e0: 72 70 44 65 6c 65 74 65 64 28 69 6e 74 65 72 70  rpDeleted(interp
01f0: 29 29 20 7b 0a 2d 09 69 66 20 28 74 74 79 29 20  )) {.-.if (tty) 
0200: 7b 0a 2d 09 20 20 20 20 50 72 6f 6d 70 74 28 69  {.-.    Prompt(i
0210: 6e 74 65 72 70 2c 20 26 70 72 6f 6d 70 74 29 3b  nterp, &prompt);
0220: 0a 2d 09 20 20 20 20 69 66 20 28 54 63 6c 5f 49  .-.    if (Tcl_I
0230: 6e 74 65 72 70 44 65 6c 65 74 65 64 28 69 6e 74  nterpDeleted(int
0240: 65 72 70 29 29 20 7b 0a 2d 09 09 62 72 65 61 6b  erp)) {.-..break
0250: 3b 0a 2b 09 69 66 20 28 6d 61 69 6e 4c 6f 6f 70  ;.+.if (mainLoop
0260: 50 72 6f 63 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  Proc == NULL) {.
0270: 2b 09 20 20 20 20 69 66 20 28 74 74 79 29 20 7b  +.    if (tty) {
0280: 0a 2b 09 09 50 72 6f 6d 70 74 28 69 6e 74 65 72  .+..Prompt(inter
0290: 70 2c 20 26 70 72 6f 6d 70 74 29 3b 0a 2b 09 09  p, &prompt);.+..
02a0: 69 66 20 28 54 63 6c 5f 49 6e 74 65 72 70 44 65  if (Tcl_InterpDe
02b0: 6c 65 74 65 64 28 69 6e 74 65 72 70 29 29 20 7b  leted(interp)) {
02c0: 0a 2b 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 2b  .+..    break;.+
02d0: 09 09 7d 0a 2b 09 09 69 6e 43 68 61 6e 6e 65 6c  ..}.+..inChannel
02e0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 64 43 68 61   = Tcl_GetStdCha
02f0: 6e 6e 65 6c 28 54 43 4c 5f 53 54 44 49 4e 29 3b  nnel(TCL_STDIN);
0300: 0a 2b 09 09 69 66 20 28 69 6e 43 68 61 6e 6e 65  .+..if (inChanne
0310: 6c 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  l == (Tcl_Channe
0320: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 2b 09 20 20 20  l) NULL) {.+.   
0330: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
0340: 2b 09 09 7d 0a 20 09 20 20 20 20 7d 0a 2d 09 20  +..}. .    }.-. 
0350: 20 20 20 69 6e 43 68 61 6e 6e 65 6c 20 3d 20 54     inChannel = T
0360: 63 6c 5f 47 65 74 53 74 64 43 68 61 6e 6e 65 6c  cl_GetStdChannel
0370: 28 54 43 4c 5f 53 54 44 49 4e 29 3b 0a 2d 09 20  (TCL_STDIN);.-. 
0380: 20 20 20 69 66 20 28 69 6e 43 68 61 6e 6e 65 6c     if (inChannel
0390: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
03a0: 29 20 4e 55 4c 4c 29 20 7b 0a 2d 09 20 20 20 20  ) NULL) {.-.    
03b0: 20 20 20 20 62 72 65 61 6b 3b 0a 2b 09 20 20 20      break;.+.   
03c0: 20 69 66 20 28 54 63 6c 5f 49 73 53 68 61 72 65   if (Tcl_IsShare
03d0: 64 28 63 6f 6d 6d 61 6e 64 50 74 72 29 29 20 7b  d(commandPtr)) {
03e0: 0a 2b 09 09 54 63 6c 5f 44 65 63 72 52 65 66 43  .+..Tcl_DecrRefC
03f0: 6f 75 6e 74 28 63 6f 6d 6d 61 6e 64 50 74 72 29  ount(commandPtr)
0400: 3b 0a 2b 09 09 63 6f 6d 6d 61 6e 64 50 74 72 20  ;.+..commandPtr 
0410: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
0420: 62 6a 28 63 6f 6d 6d 61 6e 64 50 74 72 29 3b 0a  bj(commandPtr);.
0430: 2b 09 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  +..Tcl_IncrRefCo
0440: 75 6e 74 28 63 6f 6d 6d 61 6e 64 50 74 72 29 3b  unt(commandPtr);
0450: 0a 20 09 20 20 20 20 7d 0a 2d 09 7d 0a 2d 09 69  . .    }.-.}.-.i
0460: 66 20 28 54 63 6c 5f 49 73 53 68 61 72 65 64 28  f (Tcl_IsShared(
0470: 63 6f 6d 6d 61 6e 64 50 74 72 29 29 20 7b 0a 2d  commandPtr)) {.-
0480: 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
0490: 43 6f 75 6e 74 28 63 6f 6d 6d 61 6e 64 50 74 72  Count(commandPtr
04a0: 29 3b 0a 2d 09 20 20 20 20 63 6f 6d 6d 61 6e 64  );.-.    command
04b0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
04c0: 61 74 65 4f 62 6a 28 63 6f 6d 6d 61 6e 64 50 74  ateObj(commandPt
04d0: 72 29 3b 0a 2d 09 20 20 20 20 54 63 6c 5f 49 6e  r);.-.    Tcl_In
04e0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6f 6d 6d 61  crRefCount(comma
04f0: 6e 64 50 74 72 29 3b 0a 2d 09 7d 0a 2d 20 20 20  ndPtr);.-.}.-   
0500: 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 54 63       length = Tc
0510: 6c 5f 47 65 74 73 4f 62 6a 28 69 6e 43 68 61 6e  l_GetsObj(inChan
0520: 6e 65 6c 2c 20 63 6f 6d 6d 61 6e 64 50 74 72 29  nel, commandPtr)
0530: 3b 0a 2d 09 69 66 20 28 6c 65 6e 67 74 68 20 3c  ;.-.if (length <
0540: 20 30 29 20 7b 0a 2d 09 20 20 20 20 69 66 20 28   0) {.-.    if (
0550: 54 63 6c 5f 49 6e 70 75 74 42 6c 6f 63 6b 65 64  Tcl_InputBlocked
0560: 28 69 6e 43 68 61 6e 6e 65 6c 29 29 20 7b 0a 2d  (inChannel)) {.-
0570: 0a 2d 09 09 2f 2a 0a 2d 09 09 20 2a 20 54 68 69  .-../*.-.. * Thi
0580: 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65  s can only happe
0590: 6e 20 69 66 20 73 74 64 69 6e 20 68 61 73 20 62  n if stdin has b
05a0: 65 65 6e 20 73 65 74 20 74 6f 0a 2d 09 09 20 2a  een set to.-.. *
05b0: 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 2e 20 20   non-blocking.  
05c0: 49 6e 20 74 68 61 74 20 63 61 73 65 20 63 79 63  In that case cyc
05d0: 6c 65 20 62 61 63 6b 20 61 6e 64 20 74 72 79 0a  le back and try.
05e0: 2d 09 09 20 2a 20 61 67 61 69 6e 2e 20 20 54 68  -.. * again.  Th
05f0: 69 73 20 73 65 74 73 20 75 70 20 61 20 74 69 67  is sets up a tig
0600: 68 74 20 70 6f 6c 6c 69 6e 67 20 6c 6f 6f 70 20  ht polling loop 
0610: 28 73 69 6e 63 65 0a 2d 09 09 20 2a 20 77 65 20  (since.-.. * we 
0620: 68 61 76 65 20 6e 6f 20 65 76 65 6e 74 20 6c 6f  have no event lo
0630: 6f 70 20 72 75 6e 6e 69 6e 67 29 2e 20 20 49 66  op running).  If
0640: 20 74 68 69 73 20 63 61 75 73 65 73 0a 2d 09 09   this causes.-..
0650: 20 2a 20 62 61 64 20 43 50 55 20 68 6f 67 67 69   * bad CPU hoggi
0660: 6e 67 2c 20 77 65 20 6d 69 67 68 74 20 74 72 79  ng, we might try
0670: 20 74 6f 67 67 6c 69 6e 67 20 74 68 65 20 62 6c   toggling the bl
0680: 6f 63 6b 69 6e 67 0a 2d 09 09 20 2a 20 6f 6e 20  ocking.-.. * on 
0690: 73 74 64 69 6e 20 69 6e 73 74 65 61 64 2e 0a 2d  stdin instead..-
06a0: 09 09 20 2a 2f 0a 2b 20 20 20 20 20 20 20 20 20  .. */.+         
06b0: 20 20 20 6c 65 6e 67 74 68 20 3d 20 54 63 6c 5f     length = Tcl_
06c0: 47 65 74 73 4f 62 6a 28 69 6e 43 68 61 6e 6e 65  GetsObj(inChanne
06d0: 6c 2c 20 63 6f 6d 6d 61 6e 64 50 74 72 29 3b 0a  l, commandPtr);.
06e0: 2b 09 20 20 20 20 69 66 20 28 6c 65 6e 67 74 68  +.    if (length
06f0: 20 3c 20 30 29 20 7b 0a 2b 09 09 69 66 20 28 54   < 0) {.+..if (T
0700: 63 6c 5f 49 6e 70 75 74 42 6c 6f 63 6b 65 64 28  cl_InputBlocked(
0710: 69 6e 43 68 61 6e 6e 65 6c 29 29 20 7b 0a 2b 0a  inChannel)) {.+.
0720: 2b 09 09 20 20 20 20 2f 2a 0a 2b 09 09 20 20 20  +..    /*.+..   
0730: 20 20 2a 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c    * This can onl
0740: 79 20 68 61 70 70 65 6e 20 69 66 20 73 74 64 69  y happen if stdi
0750: 6e 20 68 61 73 20 62 65 65 6e 20 73 65 74 20 74  n has been set t
0760: 6f 0a 2b 09 09 20 20 20 20 20 2a 20 6e 6f 6e 2d  o.+..     * non-
0770: 62 6c 6f 63 6b 69 6e 67 2e 20 20 49 6e 20 74 68  blocking.  In th
0780: 61 74 20 63 61 73 65 20 63 79 63 6c 65 20 62 61  at case cycle ba
0790: 63 6b 20 61 6e 64 20 74 72 79 0a 2b 09 09 20 20  ck and try.+..  
07a0: 20 20 20 2a 20 61 67 61 69 6e 2e 20 20 54 68 69     * again.  Thi
07b0: 73 20 73 65 74 73 20 75 70 20 61 20 74 69 67 68  s sets up a tigh
07c0: 74 20 70 6f 6c 6c 69 6e 67 20 6c 6f 6f 70 20 28  t polling loop (
07d0: 73 69 6e 63 65 0a 2b 09 09 20 20 20 20 20 2a 20  since.+..     * 
07e0: 77 65 20 68 61 76 65 20 6e 6f 20 65 76 65 6e 74  we have no event
07f0: 20 6c 6f 6f 70 20 72 75 6e 6e 69 6e 67 29 2e 20   loop running). 
0800: 20 49 66 20 74 68 69 73 20 63 61 75 73 65 73 0a   If this causes.
0810: 2b 09 09 20 20 20 20 20 2a 20 62 61 64 20 43 50  +..     * bad CP
0820: 55 20 68 6f 67 67 69 6e 67 2c 20 77 65 20 6d 69  U hogging, we mi
0830: 67 68 74 20 74 72 79 20 74 6f 67 67 6c 69 6e 67  ght try toggling
0840: 20 74 68 65 20 62 6c 6f 63 6b 69 6e 67 0a 2b 09   the blocking.+.
0850: 09 20 20 20 20 20 2a 20 6f 6e 20 73 74 64 69 6e  .     * on stdin
0860: 20 69 6e 73 74 65 61 64 2e 0a 2b 09 09 20 20 20   instead..+..   
0870: 20 20 2a 2f 0a 20 0a 2d 09 09 63 6f 6e 74 69 6e    */. .-..contin
0880: 75 65 3b 0a 2d 09 20 20 20 20 7d 0a 2b 09 09 20  ue;.-.    }.+.. 
0890: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 2b 09 09     continue;.+..
08a0: 7d 0a 20 0a 2d 09 20 20 20 20 2f 2a 20 0a 2d 09  }. .-.    /* .-.
08b0: 20 20 20 20 20 2a 20 45 69 74 68 65 72 20 45 4f       * Either EO
08c0: 46 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6f  F, or an error o
08d0: 6e 20 73 74 64 69 6e 3b 20 77 65 27 72 65 20 64  n stdin; we're d
08e0: 6f 6e 65 0a 2d 09 20 20 20 20 20 2a 2f 0a 2b 09  one.-.     */.+.
08f0: 09 2f 2a 20 0a 2b 09 09 20 2a 20 45 69 74 68 65  ./* .+.. * Eithe
0900: 72 20 45 4f 46 2c 20 6f 72 20 61 6e 20 65 72 72  r EOF, or an err
0910: 6f 72 20 6f 6e 20 73 74 64 69 6e 3b 20 77 65 27  or on stdin; we'
0920: 72 65 20 64 6f 6e 65 0a 2b 09 09 20 2a 2f 0a 20  re done.+.. */. 
0930: 0a 2d 09 20 20 20 20 62 72 65 61 6b 3b 0a 2d 09  .-.    break;.-.
0940: 7d 0a 2b 09 09 62 72 65 61 6b 3b 0a 2b 09 20 20  }.+..break;.+.  
0950: 20 20 7d 0a 20 0a 2d 20 20 20 20 20 20 20 20 2f    }. .-        /
0960: 2a 0a 2d 20 20 20 20 20 20 20 20 20 2a 20 41 64  *.-         * Ad
0970: 64 20 74 68 65 20 6e 65 77 6c 69 6e 65 20 72 65  d the newline re
0980: 6d 6f 76 65 64 20 62 79 20 54 63 6c 5f 47 65 74  moved by Tcl_Get
0990: 73 4f 62 6a 20 62 61 63 6b 20 74 6f 20 74 68 65  sObj back to the
09a0: 20 73 74 72 69 6e 67 2e 0a 2d 20 20 20 20 20 20   string..-      
09b0: 20 20 20 2a 2f 0a 2b 20 20 20 20 20 20 20 20 20     */.+         
09c0: 20 20 20 2f 2a 0a 2b 20 20 20 20 20 20 20 20 20     /*.+         
09d0: 20 20 20 20 2a 20 41 64 64 20 74 68 65 20 6e 65      * Add the ne
09e0: 77 6c 69 6e 65 20 72 65 6d 6f 76 65 64 20 62 79  wline removed by
09f0: 20 54 63 6c 5f 47 65 74 73 4f 62 6a 20 62 61 63   Tcl_GetsObj bac
0a00: 6b 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67 2e  k to the string.
0a10: 0a 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .+             *
0a20: 2f 0a 2b 0a 2b 09 20 20 20 20 69 66 20 28 54 63  /.+.+.    if (Tc
0a30: 6c 5f 49 73 53 68 61 72 65 64 28 63 6f 6d 6d 61  l_IsShared(comma
0a40: 6e 64 50 74 72 29 29 20 7b 0a 2b 09 09 54 63 6c  ndPtr)) {.+..Tcl
0a50: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6f  _DecrRefCount(co
0a60: 6d 6d 61 6e 64 50 74 72 29 3b 0a 2b 09 09 63 6f  mmandPtr);.+..co
0a70: 6d 6d 61 6e 64 50 74 72 20 3d 20 54 63 6c 5f 44  mmandPtr = Tcl_D
0a80: 75 70 6c 69 63 61 74 65 4f 62 6a 28 63 6f 6d 6d  uplicateObj(comm
0a90: 61 6e 64 50 74 72 29 3b 0a 2b 09 09 54 63 6c 5f  andPtr);.+..Tcl_
0aa0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6f 6d  IncrRefCount(com
0ab0: 6d 61 6e 64 50 74 72 29 3b 0a 2b 09 20 20 20 20  mandPtr);.+.    
0ac0: 7d 0a 2b 09 20 20 20 20 54 63 6c 5f 41 70 70 65  }.+.    Tcl_Appe
0ad0: 6e 64 54 6f 4f 62 6a 28 63 6f 6d 6d 61 6e 64 50  ndToObj(commandP
0ae0: 74 72 2c 20 22 5c 6e 22 2c 20 31 29 3b 0a 2b 09  tr, "\n", 1);.+.
0af0: 20 20 20 20 69 66 20 28 21 54 63 6c 4f 62 6a 43      if (!TclObjC
0b00: 6f 6d 6d 61 6e 64 43 6f 6d 70 6c 65 74 65 28 63  ommandComplete(c
0b10: 6f 6d 6d 61 6e 64 50 74 72 29 29 20 7b 0a 2b 09  ommandPtr)) {.+.
0b20: 09 70 72 6f 6d 70 74 20 3d 20 50 52 4f 4d 50 54  .prompt = PROMPT
0b30: 5f 43 4f 4e 54 49 4e 55 45 3b 0a 2b 09 09 63 6f  _CONTINUE;.+..co
0b40: 6e 74 69 6e 75 65 3b 0a 2b 09 20 20 20 20 7d 0a  ntinue;.+.    }.
0b50: 20 0a 2d 09 69 66 20 28 54 63 6c 5f 49 73 53 68   .-.if (Tcl_IsSh
0b60: 61 72 65 64 28 63 6f 6d 6d 61 6e 64 50 74 72 29  ared(commandPtr)
0b70: 29 20 7b 0a 2b 09 20 20 20 20 70 72 6f 6d 70 74  ) {.+.    prompt
0b80: 20 3d 20 50 52 4f 4d 50 54 5f 53 54 41 52 54 3b   = PROMPT_START;
0b90: 0a 2b 09 20 20 20 20 63 6f 64 65 20 3d 20 54 63  .+.    code = Tc
0ba0: 6c 5f 52 65 63 6f 72 64 41 6e 64 45 76 61 6c 4f  l_RecordAndEvalO
0bb0: 62 6a 28 69 6e 74 65 72 70 2c 20 63 6f 6d 6d 61  bj(interp, comma
0bc0: 6e 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f  ndPtr, TCL_EVAL_
0bd0: 47 4c 4f 42 41 4c 29 3b 0a 2b 09 20 20 20 20 69  GLOBAL);.+.    i
0be0: 6e 43 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47  nChannel = Tcl_G
0bf0: 65 74 53 74 64 43 68 61 6e 6e 65 6c 28 54 43 4c  etStdChannel(TCL
0c00: 5f 53 54 44 49 4e 29 3b 0a 2b 09 20 20 20 20 6f  _STDIN);.+.    o
0c10: 75 74 43 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f  utChannel = Tcl_
0c20: 47 65 74 53 74 64 43 68 61 6e 6e 65 6c 28 54 43  GetStdChannel(TC
0c30: 4c 5f 53 54 44 4f 55 54 29 3b 0a 2b 09 20 20 20  L_STDOUT);.+.   
0c40: 20 65 72 72 43 68 61 6e 6e 65 6c 20 3d 20 54 63   errChannel = Tc
0c50: 6c 5f 47 65 74 53 74 64 43 68 61 6e 6e 65 6c 28  l_GetStdChannel(
0c60: 54 43 4c 5f 53 54 44 45 52 52 29 3b 0a 20 09 20  TCL_STDERR);. . 
0c70: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
0c80: 75 6e 74 28 63 6f 6d 6d 61 6e 64 50 74 72 29 3b  unt(commandPtr);
0c90: 0a 2d 09 20 20 20 20 63 6f 6d 6d 61 6e 64 50 74  .-.    commandPt
0ca0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
0cb0: 65 4f 62 6a 28 63 6f 6d 6d 61 6e 64 50 74 72 29  eObj(commandPtr)
0cc0: 3b 0a 2b 09 20 20 20 20 63 6f 6d 6d 61 6e 64 50  ;.+.    commandP
0cd0: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  tr = Tcl_NewObj(
0ce0: 29 3b 0a 20 09 20 20 20 20 54 63 6c 5f 49 6e 63  );. .    Tcl_Inc
0cf0: 72 52 65 66 43 6f 75 6e 74 28 63 6f 6d 6d 61 6e  rRefCount(comman
0d00: 64 50 74 72 29 3b 0a 2d 09 7d 0a 2d 09 54 63 6c  dPtr);.-.}.-.Tcl
0d10: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 63 6f 6d  _AppendToObj(com
0d20: 6d 61 6e 64 50 74 72 2c 20 22 5c 6e 22 2c 20 31  mandPtr, "\n", 1
0d30: 29 3b 0a 2d 09 69 66 20 28 21 54 63 6c 4f 62 6a  );.-.if (!TclObj
0d40: 43 6f 6d 6d 61 6e 64 43 6f 6d 70 6c 65 74 65 28  CommandComplete(
0d50: 63 6f 6d 6d 61 6e 64 50 74 72 29 29 20 7b 0a 2d  commandPtr)) {.-
0d60: 09 20 20 20 20 70 72 6f 6d 70 74 20 3d 20 50 52  .    prompt = PR
0d70: 4f 4d 50 54 5f 43 4f 4e 54 49 4e 55 45 3b 0a 2d  OMPT_CONTINUE;.-
0d80: 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 2d  .    continue;.-
0d90: 09 7d 0a 2d 0a 2d 09 70 72 6f 6d 70 74 20 3d 20  .}.-.-.prompt = 
0da0: 50 52 4f 4d 50 54 5f 53 54 41 52 54 3b 0a 2d 09  PROMPT_START;.-.
0db0: 63 6f 64 65 20 3d 20 54 63 6c 5f 52 65 63 6f 72  code = Tcl_Recor
0dc0: 64 41 6e 64 45 76 61 6c 4f 62 6a 28 69 6e 74 65  dAndEvalObj(inte
0dd0: 72 70 2c 20 63 6f 6d 6d 61 6e 64 50 74 72 2c 20  rp, commandPtr, 
0de0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
0df0: 3b 0a 2d 09 69 6e 43 68 61 6e 6e 65 6c 20 3d 20  ;.-.inChannel = 
0e00: 54 63 6c 5f 47 65 74 53 74 64 43 68 61 6e 6e 65  Tcl_GetStdChanne
0e10: 6c 28 54 43 4c 5f 53 54 44 49 4e 29 3b 0a 2d 09  l(TCL_STDIN);.-.
0e20: 6f 75 74 43 68 61 6e 6e 65 6c 20 3d 20 54 63 6c  outChannel = Tcl
0e30: 5f 47 65 74 53 74 64 43 68 61 6e 6e 65 6c 28 54  _GetStdChannel(T
0e40: 43 4c 5f 53 54 44 4f 55 54 29 3b 0a 2d 09 65 72  CL_STDOUT);.-.er
0e50: 72 43 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47  rChannel = Tcl_G
0e60: 65 74 53 74 64 43 68 61 6e 6e 65 6c 28 54 43 4c  etStdChannel(TCL
0e70: 5f 53 54 44 45 52 52 29 3b 0a 2d 09 54 63 6c 5f  _STDERR);.-.Tcl_
0e80: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6f 6d  DecrRefCount(com
0e90: 6d 61 6e 64 50 74 72 29 3b 0a 2d 09 63 6f 6d 6d  mandPtr);.-.comm
0ea0: 61 6e 64 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  andPtr = Tcl_New
0eb0: 4f 62 6a 28 29 3b 0a 2d 09 54 63 6c 5f 49 6e 63  Obj();.-.Tcl_Inc
0ec0: 72 52 65 66 43 6f 75 6e 74 28 63 6f 6d 6d 61 6e  rRefCount(comman
0ed0: 64 50 74 72 29 3b 0a 2d 09 69 66 20 28 63 6f 64  dPtr);.-.if (cod
0ee0: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 2d  e != TCL_OK) {.-
0ef0: 09 20 20 20 20 69 66 20 28 65 72 72 43 68 61 6e  .    if (errChan
0f00: 6e 65 6c 29 20 7b 0a 2d 09 09 54 63 6c 5f 57 72  nel) {.-..Tcl_Wr
0f10: 69 74 65 4f 62 6a 28 65 72 72 43 68 61 6e 6e 65  iteObj(errChanne
0f20: 6c 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  l, Tcl_GetObjRes
0f30: 75 6c 74 28 69 6e 74 65 72 70 29 29 3b 0a 2d 09  ult(interp));.-.
0f40: 09 54 63 6c 5f 57 72 69 74 65 43 68 61 72 73 28  .Tcl_WriteChars(
0f50: 65 72 72 43 68 61 6e 6e 65 6c 2c 20 22 5c 6e 22  errChannel, "\n"
0f60: 2c 20 31 29 3b 0a 2d 09 20 20 20 20 7d 0a 2d 09  , 1);.-.    }.-.
0f70: 7d 20 65 6c 73 65 20 69 66 20 28 74 74 79 29 20  } else if (tty) 
0f80: 7b 0a 2d 09 20 20 20 20 72 65 73 75 6c 74 50 74  {.-.    resultPt
0f90: 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  r = Tcl_GetObjRe
0fa0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 2d 09  sult(interp);.-.
0fb0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
0fc0: 6f 75 6e 74 28 72 65 73 75 6c 74 50 74 72 29 3b  ount(resultPtr);
0fd0: 0a 2d 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74  .-.    Tcl_GetSt
0fe0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73 75  ringFromObj(resu
0ff0: 6c 74 50 74 72 2c 20 26 6c 65 6e 67 74 68 29 3b  ltPtr, &length);
1000: 0a 2d 09 20 20 20 20 69 66 20 28 28 6c 65 6e 67  .-.    if ((leng
1010: 74 68 20 3e 20 30 29 20 26 26 20 6f 75 74 43 68  th > 0) && outCh
1020: 61 6e 6e 65 6c 29 20 7b 0a 2d 09 09 54 63 6c 5f  annel) {.-..Tcl_
1030: 57 72 69 74 65 4f 62 6a 28 6f 75 74 43 68 61 6e  WriteObj(outChan
1040: 6e 65 6c 2c 20 72 65 73 75 6c 74 50 74 72 29 3b  nel, resultPtr);
1050: 0a 2d 09 09 54 63 6c 5f 57 72 69 74 65 43 68 61  .-..Tcl_WriteCha
1060: 72 73 28 6f 75 74 43 68 61 6e 6e 65 6c 2c 20 22  rs(outChannel, "
1070: 5c 6e 22 2c 20 31 29 3b 0a 2b 09 20 20 20 20 69  \n", 1);.+.    i
1080: 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f  f (code != TCL_O
1090: 4b 29 20 7b 0a 2b 09 09 69 66 20 28 65 72 72 43  K) {.+..if (errC
10a0: 68 61 6e 6e 65 6c 29 20 7b 0a 2b 09 09 20 20 20  hannel) {.+..   
10b0: 20 54 63 6c 5f 57 72 69 74 65 4f 62 6a 28 65 72   Tcl_WriteObj(er
10c0: 72 43 68 61 6e 6e 65 6c 2c 20 54 63 6c 5f 47 65  rChannel, Tcl_Ge
10d0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10e0: 70 29 29 3b 0a 2b 09 09 20 20 20 20 54 63 6c 5f  p));.+..    Tcl_
10f0: 57 72 69 74 65 43 68 61 72 73 28 65 72 72 43 68  WriteChars(errCh
1100: 61 6e 6e 65 6c 2c 20 22 5c 6e 22 2c 20 31 29 3b  annel, "\n", 1);
1110: 0a 2b 09 09 7d 0a 2b 09 20 20 20 20 7d 20 65 6c  .+..}.+.    } el
1120: 73 65 20 69 66 20 28 74 74 79 29 20 7b 0a 2b 09  se if (tty) {.+.
1130: 09 72 65 73 75 6c 74 50 74 72 20 3d 20 54 63 6c  .resultPtr = Tcl
1140: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
1150: 74 65 72 70 29 3b 0a 2b 09 09 54 63 6c 5f 49 6e  terp);.+..Tcl_In
1160: 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c  crRefCount(resul
1170: 74 50 74 72 29 3b 0a 2b 09 09 54 63 6c 5f 47 65  tPtr);.+..Tcl_Ge
1180: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72  tStringFromObj(r
1190: 65 73 75 6c 74 50 74 72 2c 20 26 6c 65 6e 67 74  esultPtr, &lengt
11a0: 68 29 3b 0a 2b 09 09 69 66 20 28 28 6c 65 6e 67  h);.+..if ((leng
11b0: 74 68 20 3e 20 30 29 20 26 26 20 6f 75 74 43 68  th > 0) && outCh
11c0: 61 6e 6e 65 6c 29 20 7b 0a 2b 09 09 20 20 20 20  annel) {.+..    
11d0: 54 63 6c 5f 57 72 69 74 65 4f 62 6a 28 6f 75 74  Tcl_WriteObj(out
11e0: 43 68 61 6e 6e 65 6c 2c 20 72 65 73 75 6c 74 50  Channel, resultP
11f0: 74 72 29 3b 0a 2b 09 09 20 20 20 20 54 63 6c 5f  tr);.+..    Tcl_
1200: 57 72 69 74 65 43 68 61 72 73 28 6f 75 74 43 68  WriteChars(outCh
1210: 61 6e 6e 65 6c 2c 20 22 5c 6e 22 2c 20 31 29 3b  annel, "\n", 1);
1220: 0a 2b 09 09 7d 0a 2b 09 09 54 63 6c 5f 44 65 63  .+..}.+..Tcl_Dec
1230: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74  rRefCount(result
1240: 50 74 72 29 3b 0a 20 09 20 20 20 20 7d 0a 2d 09  Ptr);. .    }.-.
1250: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1260: 6f 75 6e 74 28 72 65 73 75 6c 74 50 74 72 29 3b  ount(resultPtr);
1270: 0a 2d 09 7d 0a 2d 09 69 66 20 28 6d 61 69 6e 4c  .-.}.-.if (mainL
1280: 6f 6f 70 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29  oopProc != NULL)
1290: 20 7b 0a 2d 0a 2b 09 7d 20 65 6c 73 65 20 7b 09   {.-.+.} else {.
12a0: 2f 2a 20 28 6d 61 69 6e 4c 6f 6f 70 50 72 6f 63  /* (mainLoopProc
12b0: 20 21 3d 20 4e 55 4c 4c 29 20 2a 2f 0a 20 09 20   != NULL) */. . 
12c0: 20 20 20 2f 2a 0a 20 09 20 20 20 20 20 2a 20 49     /*. .     * I
12d0: 66 20 61 20 6d 61 69 6e 20 6c 6f 6f 70 20 68 61  f a main loop ha
12e0: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20 77  s been defined w
12f0: 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 69 6e 74  hile running int
1300: 65 72 61 63 74 69 76 65 6c 79 2c 0a 20 09 20 20  eractively,. .  
1310: 20 20 20 2a 20 77 65 20 77 61 6e 74 20 74 6f 20     * we want to 
1320: 73 74 61 72 74 20 61 20 66 69 6c 65 65 76 65 6e  start a fileeven
1330: 74 20 62 61 73 65 64 20 70 72 6f 6d 70 74 20 62  t based prompt b
1340: 79 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 61  y establishing a
1350: 0a 20 09 20 20 20 20 20 2a 20 63 68 61 6e 6e 65  . .     * channe
1360: 6c 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 73 74  l handler for st
1370: 64 69 6e 2e 0a 20 09 20 20 20 20 20 2a 2f 0a 2d  din.. .     */.-
1380: 0a 20 09 20 20 20 20 49 6e 74 65 72 61 63 74 69  . .    Interacti
1390: 76 65 53 74 61 74 65 20 2a 69 73 50 74 72 20 3d  veState *isPtr =
13a0: 20 4e 55 4c 4c 3b 0a 20 0a 20 09 20 20 20 20 69   NULL;. . .    i
13b0: 66 20 28 69 6e 43 68 61 6e 6e 65 6c 29 20 7b 0a  f (inChannel) {.
13c0: 49 6e 64 65 78 3a 20 74 65 73 74 73 2f 6d 61 69  Index: tests/mai
13d0: 6e 2e 74 65 73 74 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d  n.test.=========
13e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1400: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 52 43 53 20 66  ==========.RCS f
1420: 69 6c 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 63  ile: /cvsroot/tc
1430: 6c 2f 74 63 6c 2f 74 65 73 74 73 2f 6d 61 69 6e  l/tcl/tests/main
1440: 2e 74 65 73 74 2c 76 0a 72 65 74 72 69 65 76 69  .test,v.retrievi
1450: 6e 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 31 33  ng revision 1.13
1460: 2e 32 2e 32 0a 64 69 66 66 20 2d 75 20 2d 72 31  .2.2.diff -u -r1
1470: 2e 31 33 2e 32 2e 32 20 6d 61 69 6e 2e 74 65 73  .13.2.2 main.tes
1480: 74 0a 2d 2d 2d 20 74 65 73 74 73 2f 6d 61 69 6e  t.--- tests/main
1490: 2e 74 65 73 74 09 39 20 46 65 62 20 32 30 30 36  .test.9 Feb 2006
14a0: 20 31 35 3a 32 33 3a 35 32 20 2d 30 30 30 30 09   15:23:52 -0000.
14b0: 31 2e 31 33 2e 32 2e 32 0a 2b 2b 2b 20 74 65 73  1.13.2.2.+++ tes
14c0: 74 73 2f 6d 61 69 6e 2e 74 65 73 74 09 35 20 4d  ts/main.test.5 M
14d0: 61 79 20 32 30 30 36 20 31 36 3a 34 34 3a 32 33  ay 2006 16:44:23
14e0: 20 2d 30 30 30 30 0a 40 40 20 2d 34 39 39 2c 36   -0000.@@ -499,6
14f0: 20 2b 34 39 39 2c 32 37 20 40 40 0a 20 20 20 20   +499,27 @@.    
1500: 20 7d 20 2d 72 65 73 75 6c 74 20 22 61 70 70 6c   } -result "appl
1510: 69 63 61 74 69 6f 6e 2d 73 70 65 63 69 66 69 63  ication-specific
1520: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1530: 66 61 69 6c 65 64 3a 5c 0a 20 09 5c 6e 49 6e 20  failed:\. .\nIn 
1540: 73 63 72 69 70 74 5c 6e 45 78 69 74 20 4d 61 69  script\nExit Mai
1550: 6e 4c 6f 6f 70 5c 6e 49 6e 20 65 78 69 74 5c 6e  nLoop\nIn exit\n
1560: 65 76 65 6e 20 30 5c 6e 22 0a 20 0a 2b 20 20 20  even 0\n". .+   
1570: 20 74 65 73 74 20 54 63 6c 5f 4d 61 69 6e 2d 34   test Tcl_Main-4
1580: 2e 35 20 7b 0a 2b 09 54 63 6c 5f 4d 61 69 6e 3a  .5 {.+.Tcl_Main:
1590: 20 42 75 67 20 31 34 38 31 39 38 36 0a 2b 20 20   Bug 1481986.+  
15a0: 20 20 7d 20 2d 63 6f 6e 73 74 72 61 69 6e 74 73    } -constraints
15b0: 20 7b 0a 2b 09 65 78 65 63 20 54 63 6c 74 65 73   {.+.exec Tcltes
15c0: 74 0a 2b 20 20 20 20 7d 20 2d 73 65 74 75 70 20  t.+    } -setup 
15d0: 7b 0a 2b 09 73 65 74 20 72 63 20 5b 6d 61 6b 65  {.+.set rc [make
15e0: 46 69 6c 65 20 7b 0a 2b 09 09 74 65 73 74 73 65  File {.+..testse
15f0: 74 6d 61 69 6e 6c 6f 6f 70 0a 2b 09 09 61 66 74  tmainloop.+..aft
1600: 65 72 20 30 20 7b 70 75 74 73 20 22 45 76 65 6e  er 0 {puts "Even
1610: 74 20 63 61 6c 6c 62 61 63 6b 22 7d 0a 2b 09 7d  t callback"}.+.}
1620: 20 72 63 5d 0a 2b 20 20 20 20 7d 20 2d 62 6f 64   rc].+    } -bod
1630: 79 20 7b 0a 2b 09 73 65 74 20 66 20 5b 6f 70 65  y {.+.set f [ope
1640: 6e 20 22 7c 5b 6c 69 73 74 20 5b 69 6e 74 65 72  n "|[list [inter
1650: 70 72 65 74 65 72 5d 20 2d 61 70 70 69 6e 69 74  preter] -appinit
1660: 70 72 6f 63 73 65 74 72 63 66 69 6c 65 20 24 72  procsetrcfile $r
1670: 63 5d 22 20 77 2b 5d 0a 2b 09 61 66 74 65 72 20  c]" w+].+.after 
1680: 31 30 30 30 0a 2b 09 74 79 70 65 20 24 66 20 7b  1000.+.type $f {
1690: 70 75 74 73 20 7b 49 6e 74 65 72 61 63 74 69 76  puts {Interactiv
16a0: 65 20 6f 75 74 70 75 74 7d 0a 2b 09 20 20 20 20  e output}.+.    
16b0: 65 78 69 74 0a 2b 09 7d 0a 2b 09 72 65 61 64 20  exit.+.}.+.read 
16c0: 24 66 0a 2b 20 20 20 20 7d 20 2d 63 6c 65 61 6e  $f.+    } -clean
16d0: 75 70 20 7b 0a 2b 09 63 61 74 63 68 20 7b 63 6c  up {.+.catch {cl
16e0: 6f 73 65 20 24 66 7d 0a 2b 09 72 65 6d 6f 76 65  ose $f}.+.remove
16f0: 46 69 6c 65 20 72 63 0a 2b 20 20 20 20 7d 20 2d  File rc.+    } -
1700: 72 65 73 75 6c 74 20 22 45 76 65 6e 74 20 63 61  result "Event ca
1710: 6c 6c 62 61 63 6b 5c 6e 49 6e 74 65 72 61 63 74  llback\nInteract
1720: 69 76 65 20 6f 75 74 70 75 74 5c 6e 22 0a 2b 0a  ive output\n".+.
1730: 20 20 20 20 20 23 20 54 65 73 74 73 20 54 63 6c       # Tests Tcl
1740: 5f 4d 61 69 6e 2d 35 2e 2a 3a 20 69 6e 74 65 72  _Main-5.*: inter
1750: 61 63 74 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  active operation
1760: 73 0a 20 0a 20 20 20 20 20 74 65 73 74 20 54 63  s. .     test Tc
1770: 6c 5f 4d 61 69 6e 2d 35 2e 31 20 7b 0a           l_Main-5.1 {.