Tcl Source Code

Hex Artifact Content
Login

Artifact 66631353c429df494d3fe25d27d32df8842a1492:

Attachment "RestrictedDDE.patch" to ticket [649859ffff] added by patthoyts 2002-12-07 08:07:01.
0000: 49 6e 64 65 78 3a 20 74 63 6c 57 69 6e 44 64 65  Index: tclWinDde
0010: 2e 63 0d 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .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 0d 0a 52 43 53 20 66 69 6c  =======..RCS fil
0060: 65 3a 20 2f 63 76 73 72 6f 6f 74 2f 74 63 6c 2f  e: /cvsroot/tcl/
0070: 74 63 6c 2f 77 69 6e 2f 74 63 6c 57 69 6e 44 64  tcl/win/tclWinDd
0080: 65 2e 63 2c 76 0d 0a 72 65 74 72 69 65 76 69 6e  e.c,v..retrievin
0090: 67 20 72 65 76 69 73 69 6f 6e 20 31 2e 38 0d 0a  g revision 1.8..
00a0: 64 69 66 66 20 2d 63 20 2d 72 31 2e 38 20 74 63  diff -c -r1.8 tc
00b0: 6c 57 69 6e 44 64 65 2e 63 0d 0a 2a 2a 2a 20 74  lWinDde.c..*** t
00c0: 63 6c 57 69 6e 44 64 65 2e 63 09 31 38 20 4a 61  clWinDde.c.18 Ja
00d0: 6e 20 32 30 30 32 20 31 34 3a 30 37 3a 34 30 20  n 2002 14:07:40 
00e0: 2d 30 30 30 30 09 31 2e 38 0d 0a 2d 2d 2d 20 74  -0000.1.8..--- t
00f0: 63 6c 57 69 6e 44 64 65 2e 63 09 37 20 44 65 63  clWinDde.c.7 Dec
0100: 20 32 30 30 32 20 30 30 3a 35 36 3a 34 33 20 2d   2002 00:56:43 -
0110: 30 30 30 30 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  0000..**********
0120: 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 20 33 35 2c 34 30  *****..*** 35,40
0130: 20 2a 2a 2a 2a 0d 0a 2d 2d 2d 20 33 35 2c 34 31   ****..--- 35,41
0140: 20 2d 2d 2d 2d 0d 0a 20 20 09 09 09 09 2f 2a 20   ----..  ..../* 
0150: 54 68 65 20 6e 65 78 74 20 69 6e 74 65 72 70 20  The next interp 
0160: 74 68 69 73 20 61 70 70 6c 69 63 61 74 69 6f 6e  this application
0170: 20 6b 6e 6f 77 73 0d 0a 20 20 09 09 09 09 20 2a   knows..  .... *
0180: 20 61 62 6f 75 74 2e 20 2a 2f 0d 0a 20 20 20 20   about. */..    
0190: 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 09 09 09    char *name;...
01a0: 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 27 73  /* Interpreter's
01b0: 20 6e 61 6d 65 20 28 6d 61 6c 6c 6f 63 2d 65 64   name (malloc-ed
01c0: 29 2e 20 2a 2f 0d 0a 2b 20 20 20 20 20 54 63 6c  ). */..+     Tcl
01d0: 5f 4f 62 6a 20 2a 68 61 6e 64 6c 65 72 50 74 72  _Obj *handlerPtr
01e0: 3b 09 2f 2a 20 54 68 65 20 73 65 72 76 65 72 20  ;./* The server 
01f0: 68 61 6e 64 6c 65 72 20 63 6f 6d 6d 61 6e 64 20  handler command 
0200: 2a 2f 0d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e  */..      Tcl_In
0210: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 09 09 2f  terp *interp;../
0220: 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65  * The interprete
0230: 72 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  r attached to th
0240: 69 73 20 6e 61 6d 65 2e 20 2a 2f 0d 0a 20 20 7d  is name. */..  }
0250: 20 52 65 67 69 73 74 65 72 65 64 49 6e 74 65 72   RegisteredInter
0260: 70 3b 0d 0a 20 20 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a  p;..  ..********
0270: 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 20 39 37 2c  *******..*** 97,
0280: 31 30 32 20 2a 2a 2a 2a 0d 0a 2d 2d 2d 20 39 38  102 ****..--- 98
0290: 2c 31 30 34 20 2d 2d 2d 2d 0d 0a 20 20 09 54 63  ,104 ----..  .Tc
02a0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
02b0: 76 5b 5d 29 3b 09 2f 2a 20 54 68 65 20 61 72 67  v[]);./* The arg
02c0: 75 6d 65 6e 74 73 20 2a 2f 0d 0a 20 20 0d 0a 20  uments */..  .. 
02d0: 20 45 58 54 45 52 4e 20 69 6e 74 20 44 64 65 5f   EXTERN int Dde_
02e0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
02f0: 2a 69 6e 74 65 72 70 29 3b 0d 0a 2b 20 45 58 54  *interp);..+ EXT
0300: 45 52 4e 20 69 6e 74 20 44 64 65 5f 53 61 66 65  ERN int Dde_Safe
0310: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
0320: 2a 69 6e 74 65 72 70 29 3b 0d 0a 20 20 0c 0d 0a  *interp);..  ...
0330: 20 20 2f 2a 0d 0a 20 20 20 2a 2d 2d 2d 2d 2d 2d    /*..   *------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0380: 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**************
0390: 2a 0d 0a 2a 2a 2a 20 31 33 39 2c 31 34 34 20 2a  *..*** 139,144 *
03a0: 2a 2a 2a 0d 0a 2d 2d 2d 20 31 34 31 2c 31 37 32  ***..--- 141,172
03b0: 20 2d 2d 2d 2d 0d 0a 20 20 20 20 20 20 72 65 74   ----..      ret
03c0: 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  urn Tcl_PkgProvi
03d0: 64 65 28 69 6e 74 65 72 70 2c 20 54 43 4c 5f 44  de(interp, TCL_D
03e0: 44 45 5f 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c  DE_PACKAGE_NAME,
03f0: 20 54 43 4c 5f 44 44 45 5f 56 45 52 53 49 4f 4e   TCL_DDE_VERSION
0400: 29 3b 0d 0a 20 20 7d 0d 0a 20 20 0c 0d 0a 2b 20  );..  }..  ...+ 
0410: 2f 2a 0d 0a 2b 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /*..+  *--------
0420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a  --------------..
0460: 2b 20 20 2a 0d 0a 2b 20 20 2a 20 44 64 65 5f 53  +  *..+  * Dde_S
0470: 61 66 65 49 6e 69 74 20 2d 2d 0d 0a 2b 20 20 2a  afeInit --..+  *
0480: 0d 0a 2b 20 20 2a 09 54 68 69 73 20 70 72 6f 63  ..+  *.This proc
0490: 65 64 75 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  edure initialize
04a0: 73 20 74 68 65 20 64 64 65 20 63 6f 6d 6d 61 6e  s the dde comman
04b0: 64 20 77 69 74 68 69 6e 20 61 20 73 61 66 65 20  d within a safe 
04c0: 69 6e 74 65 72 70 0d 0a 2b 20 20 2a 0d 0a 2b 20  interp..+  *..+ 
04d0: 20 2a 20 52 65 73 75 6c 74 73 3a 0d 0a 2b 20 20   * Results:..+  
04e0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
04f0: 20 72 65 73 75 6c 74 2e 0d 0a 2b 20 20 2a 0d 0a   result...+  *..
0500: 2b 20 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  +  * Side effect
0510: 73 3a 0d 0a 2b 20 20 2a 09 4e 6f 6e 65 2e 0d 0a  s:..+  *.None...
0520: 2b 20 20 2a 0d 0a 2b 20 20 2a 2d 2d 2d 2d 2d 2d  +  *..+  *------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 0d 0a 2b 20 20 2a 2f 0d 0a 2b 20 0d 0a 2b 20 69  ..+  */..+ ..+ i
0580: 6e 74 0d 0a 2b 20 44 64 65 5f 53 61 66 65 49 6e  nt..+ Dde_SafeIn
0590: 69 74 28 0d 0a 2b 20 20 20 20 20 54 63 6c 5f 49  it(..+     Tcl_I
05a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 0d 0a  nterp *interp)..
05b0: 2b 20 7b 0d 0a 2b 20 20 20 20 20 69 6e 74 20 72  + {..+     int r
05c0: 65 73 75 6c 74 20 3d 20 44 64 65 5f 49 6e 69 74  esult = Dde_Init
05d0: 28 69 6e 74 65 72 70 29 3b 0d 0a 2b 20 20 20 20  (interp);..+    
05e0: 20 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 54   if (result == T
05f0: 43 4c 5f 4f 4b 29 20 7b 0d 0a 2b 20 09 54 63 6c  CL_OK) {..+ .Tcl
0600: 5f 48 69 64 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  _HideCommand(int
0610: 65 72 70 2c 20 22 64 64 65 22 2c 20 22 64 64 65  erp, "dde", "dde
0620: 22 29 3b 0d 0a 2b 20 20 20 20 20 7d 0d 0a 2b 20  ");..+     }..+ 
0630: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
0640: 74 3b 0d 0a 2b 20 7d 0d 0a 20 20 0c 0d 0a 20 20  t;..+ }..  ...  
0650: 2f 2a 0d 0a 20 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /*..   *--------
0660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a  --------------..
06a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d  ***************.
06b0: 0a 2a 2a 2a 20 32 33 33 2c 32 34 32 20 2a 2a 2a  .*** 233,242 ***
06c0: 2a 0d 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  *..  static char
06d0: 20 2a 0d 0a 20 20 44 64 65 53 65 74 53 65 72 76   *..  DdeSetServ
06e0: 65 72 4e 61 6d 65 28 0d 0a 20 20 20 20 20 20 54  erName(..      T
06f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0700: 70 2c 0d 0a 21 20 20 20 20 20 63 68 61 72 20 2a  p,..!     char *
0710: 6e 61 6d 65 09 09 09 2f 2a 20 54 68 65 20 6e 61  name.../* The na
0720: 6d 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  me that will be 
0730: 75 73 65 64 20 74 6f 0d 0a 20 20 09 09 09 09 20  used to..  .... 
0740: 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 69  * refer to the i
0750: 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 6c 61  nterpreter in la
0760: 74 65 72 0d 0a 20 20 09 09 09 09 20 2a 20 22 73  ter..  .... * "s
0770: 65 6e 64 22 20 63 6f 6d 6d 61 6e 64 73 2e 20 20  end" commands.  
0780: 4d 75 73 74 20 62 65 20 67 6c 6f 62 61 6c 6c 79  Must be globally
0790: 0d 0a 20 20 09 09 09 09 20 2a 20 75 6e 69 71 75  ..  .... * uniqu
07a0: 65 2e 20 2a 2f 0d 0a 20 20 20 20 20 20 29 0d 0a  e. */..      )..
07b0: 20 20 7b 0d 0a 20 20 20 20 20 20 69 6e 74 20 73    {..      int s
07c0: 75 66 66 69 78 2c 20 6f 66 66 73 65 74 3b 0d 0a  uffix, offset;..
07d0: 2d 2d 2d 20 32 36 31 2c 32 37 32 20 2d 2d 2d 2d  --- 261,272 ----
07e0: 0d 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ..  static char 
07f0: 2a 0d 0a 20 20 44 64 65 53 65 74 53 65 72 76 65  *..  DdeSetServe
0800: 72 4e 61 6d 65 28 0d 0a 20 20 20 20 20 20 54 63  rName(..      Tc
0810: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0820: 2c 0d 0a 21 20 20 20 20 20 63 68 61 72 20 2a 6e  ,..!     char *n
0830: 61 6d 65 2c 09 09 09 2f 2a 20 54 68 65 20 6e 61  ame,.../* The na
0840: 6d 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  me that will be 
0850: 75 73 65 64 20 74 6f 0d 0a 20 20 09 09 09 09 20  used to..  .... 
0860: 2a 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 69  * refer to the i
0870: 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 6c 61  nterpreter in la
0880: 74 65 72 0d 0a 20 20 09 09 09 09 20 2a 20 22 73  ter..  .... * "s
0890: 65 6e 64 22 20 63 6f 6d 6d 61 6e 64 73 2e 20 20  end" commands.  
08a0: 4d 75 73 74 20 62 65 20 67 6c 6f 62 61 6c 6c 79  Must be globally
08b0: 0d 0a 20 20 09 09 09 09 20 2a 20 75 6e 69 71 75  ..  .... * uniqu
08c0: 65 2e 20 2a 2f 0d 0a 2b 20 20 20 20 20 54 63 6c  e. */..+     Tcl
08d0: 5f 4f 62 6a 20 2a 68 61 6e 64 6c 65 72 50 74 72  _Obj *handlerPtr
08e0: 09 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65  ../* Name of the
08f0: 20 6f 70 74 69 6f 6e 61 6c 20 70 72 6f 63 2f 63   optional proc/c
0900: 6f 6d 6d 61 6e 64 20 74 6f 20 68 61 6e 64 6c 65  ommand to handle
0910: 0d 0a 2b 20 09 09 09 09 20 2a 20 69 6e 63 6f 6d  ..+ .... * incom
0920: 69 6e 67 20 44 64 65 20 65 76 61 6c 27 73 20 2a  ing Dde eval's *
0930: 2f 0d 0a 20 20 20 20 20 20 29 0d 0a 20 20 7b 0d  /..      )..  {.
0940: 0a 20 20 20 20 20 20 69 6e 74 20 73 75 66 66 69  .      int suffi
0950: 78 2c 20 6f 66 66 73 65 74 3b 0d 0a 2a 2a 2a 2a  x, offset;..****
0960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a  ***********..***
0970: 20 33 30 30 2c 33 30 38 20 2a 2a 2a 2a 0d 0a 2d   300,308 ****..-
0980: 2d 2d 20 33 33 30 2c 33 34 35 20 2d 2d 2d 2d 0d  -- 330,345 ----.
0990: 0a 20 20 20 20 20 20 72 69 50 74 72 2d 3e 69 6e  .      riPtr->in
09a0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0d 0a  terp = interp;..
09b0: 20 20 20 20 20 20 72 69 50 74 72 2d 3e 6e 61 6d        riPtr->nam
09c0: 65 20 3d 20 63 6b 61 6c 6c 6f 63 28 73 74 72 6c  e = ckalloc(strl
09d0: 65 6e 28 6e 61 6d 65 29 20 2b 20 31 29 3b 0d 0a  en(name) + 1);..
09e0: 20 20 20 20 20 20 72 69 50 74 72 2d 3e 6e 65 78        riPtr->nex
09f0: 74 50 74 72 20 3d 20 74 73 64 50 74 72 2d 3e 69  tPtr = tsdPtr->i
0a00: 6e 74 65 72 70 4c 69 73 74 50 74 72 3b 0d 0a 2b  nterpListPtr;..+
0a10: 20 20 20 20 20 72 69 50 74 72 2d 3e 68 61 6e 64       riPtr->hand
0a20: 6c 65 72 50 74 72 20 3d 20 68 61 6e 64 6c 65 72  lerPtr = handler
0a30: 50 74 72 3b 0d 0a 2b 20 20 20 20 20 69 66 20 28  Ptr;..+     if (
0a40: 72 69 50 74 72 2d 3e 68 61 6e 64 6c 65 72 50 74  riPtr->handlerPt
0a50: 72 20 21 3d 20 4e 55 4c 4c 29 0d 0a 2b 20 09 54  r != NULL)..+ .T
0a60: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
0a70: 72 69 50 74 72 2d 3e 68 61 6e 64 6c 65 72 50 74  riPtr->handlerPt
0a80: 72 29 3b 0d 0a 20 20 20 20 20 20 74 73 64 50 74  r);..      tsdPt
0a90: 72 2d 3e 69 6e 74 65 72 70 4c 69 73 74 50 74 72  r->interpListPtr
0aa0: 20 3d 20 72 69 50 74 72 3b 0d 0a 20 20 20 20 20   = riPtr;..     
0ab0: 20 73 74 72 63 70 79 28 72 69 50 74 72 2d 3e 6e   strcpy(riPtr->n
0ac0: 61 6d 65 2c 20 6e 61 6d 65 29 3b 0d 0a 20 20 0d  ame, name);..  .
0ad0: 0a 2b 20 20 20 20 20 69 66 20 28 54 63 6c 5f 49  .+     if (Tcl_I
0ae0: 73 53 61 66 65 28 69 6e 74 65 72 70 29 29 20 7b  sSafe(interp)) {
0af0: 0d 0a 2b 20 09 54 63 6c 5f 45 78 70 6f 73 65 43  ..+ .Tcl_ExposeC
0b00: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
0b10: 64 64 65 22 2c 20 22 64 64 65 22 29 3b 0d 0a 2b  dde", "dde");..+
0b20: 20 20 20 20 20 7d 0d 0a 2b 20 0d 0a 20 20 20 20       }..+ ..    
0b30: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
0b40: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
0b50: 64 64 65 22 2c 20 54 63 6c 5f 44 64 65 4f 62 6a  dde", Tcl_DdeObj
0b60: 43 6d 64 2c 0d 0a 20 20 09 20 20 20 20 28 43 6c  Cmd,..  .    (Cl
0b70: 69 65 6e 74 44 61 74 61 29 20 72 69 50 74 72 2c  ientData) riPtr,
0b80: 20 44 65 6c 65 74 65 50 72 6f 63 29 3b 0d 0a 20   DeleteProc);.. 
0b90: 20 20 20 20 20 69 66 20 28 54 63 6c 5f 49 73 53       if (Tcl_IsS
0ba0: 61 66 65 28 69 6e 74 65 72 70 29 29 20 7b 0d 0a  afe(interp)) {..
0bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d  ***************.
0bc0: 0a 2a 2a 2a 20 33 32 31 2c 33 32 36 20 2a 2a 2a  .*** 321,326 ***
0bd0: 2a 0d 0a 2d 2d 2d 20 33 35 38 2c 33 39 35 20 2d  *..--- 358,395 -
0be0: 2d 2d 2d 0d 0a 20 20 2f 2a 0d 0a 20 20 20 2a 2d  ---..  /*..   *-
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 20  -------------.. 
0c30: 20 20 2a 0d 0a 2b 20 20 2a 20 44 64 65 47 65 74    *..+  * DdeGet
0c40: 52 65 67 69 73 74 72 61 74 69 6f 6e 50 74 72 0d  RegistrationPtr.
0c50: 0a 2b 20 20 2a 0d 0a 2b 20 20 2a 09 52 65 74 72  .+  *..+  *.Retr
0c60: 69 65 76 65 20 74 68 65 20 72 65 67 69 73 74 72  ieve the registr
0c70: 61 74 69 6f 6e 20 69 6e 66 6f 20 66 6f 72 20 61  ation info for a
0c80: 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0d 0a  n interpreter...
0c90: 2b 20 20 2a 0d 0a 2b 20 20 2a 20 52 65 73 75 6c  +  *..+  * Resul
0ca0: 74 73 3a 0d 0a 2b 20 20 2a 09 52 65 74 75 72 6e  ts:..+  *.Return
0cb0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
0cc0: 68 65 20 72 65 67 69 73 74 72 61 74 69 6f 6e 20  he registration 
0cd0: 73 74 72 75 63 74 75 72 65 20 6f 72 20 4e 55 4c  structure or NUL
0ce0: 4c 0d 0a 2b 20 20 2a 0d 0a 2b 20 20 2a 20 53 69  L..+  *..+  * Si
0cf0: 64 65 20 65 66 66 65 63 74 73 3a 0d 0a 2b 20 20  de effects:..+  
0d00: 2a 09 4e 6f 6e 65 0d 0a 2b 20 20 2a 0d 0a 2b 20  *.None..+  *..+ 
0d10: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 0d 0a 2b 20 20 2a 2f 0d 0a 2b 20 73 74 61 74 69  ..+  */..+ stati
0d60: 63 20 52 65 67 69 73 74 65 72 65 64 49 6e 74 65  c RegisteredInte
0d70: 72 70 20 2a 0d 0a 2b 20 44 64 65 47 65 74 52 65  rp *..+ DdeGetRe
0d80: 67 69 73 74 72 61 74 69 6f 6e 50 74 72 28 0d 0a  gistrationPtr(..
0d90: 2b 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  +     Tcl_Interp
0da0: 20 2a 69 6e 74 65 72 70 0d 0a 2b 20 20 20 20 20   *interp..+     
0db0: 29 0d 0a 2b 20 7b 0d 0a 2b 20 20 20 20 20 52 65  )..+ {..+     Re
0dc0: 67 69 73 74 65 72 65 64 49 6e 74 65 72 70 20 2a  gisteredInterp *
0dd0: 72 69 50 74 72 3b 0d 0a 2b 20 20 20 20 20 54 68  riPtr;..+     Th
0de0: 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61  readSpecificData
0df0: 20 2a 74 73 64 50 74 72 20 3d 20 54 43 4c 5f 54   *tsdPtr = TCL_T
0e00: 53 44 5f 49 4e 49 54 28 26 64 61 74 61 4b 65 79  SD_INIT(&dataKey
0e10: 29 3b 0d 0a 2b 20 0d 0a 2b 20 20 20 20 20 66 6f  );..+ ..+     fo
0e20: 72 20 28 72 69 50 74 72 20 3d 20 74 73 64 50 74  r (riPtr = tsdPt
0e30: 72 2d 3e 69 6e 74 65 72 70 4c 69 73 74 50 74 72  r->interpListPtr
0e40: 3b 20 72 69 50 74 72 20 21 3d 20 4e 55 4c 4c 3b  ; riPtr != NULL;
0e50: 20 0d 0a 2b 20 09 20 20 20 20 72 69 50 74 72 20   ..+ .    riPtr 
0e60: 3d 20 72 69 50 74 72 2d 3e 6e 65 78 74 50 74 72  = riPtr->nextPtr
0e70: 29 20 7b 0d 0a 2b 20 09 69 66 20 28 72 69 50 74  ) {..+ .if (riPt
0e80: 72 2d 3e 69 6e 74 65 72 70 20 3d 3d 20 69 6e 74  r->interp == int
0e90: 65 72 70 29 20 7b 0d 0a 2b 20 09 20 20 20 20 62  erp) {..+ .    b
0ea0: 72 65 61 6b 3b 0d 0a 2b 20 09 7d 0d 0a 2b 20 20  reak;..+ .}..+  
0eb0: 20 20 20 7d 0d 0a 2b 20 20 20 20 20 72 65 74 75     }..+     retu
0ec0: 72 6e 20 72 69 50 74 72 3b 0d 0a 2b 20 7d 0d 0a  rn riPtr;..+ }..
0ed0: 2b 20 0c 0d 0a 2b 20 2f 2a 0d 0a 2b 20 20 2a 2d  + ...+ /*..+  *-
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0d 0a 2b  -------------..+
0f20: 20 20 2a 0d 0a 20 20 20 2a 20 44 65 6c 65 74 65    *..   * Delete
0f30: 50 72 6f 63 0d 0a 20 20 20 2a 0d 0a 20 20 20 2a  Proc..   *..   *
0f40: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
0f50: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
0f60: 68 65 20 63 6f 6d 6d 61 6e 64 20 22 64 64 65 22  he command "dde"
0f70: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0d 0a   is destroyed...
0f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d  ***************.
0f90: 0a 2a 2a 2a 20 33 35 39 2c 33 36 34 20 2a 2a 2a  .*** 359,364 ***
0fa0: 2a 0d 0a 2d 2d 2d 20 34 32 38 2c 34 33 35 20 2d  *..--- 428,435 -
0fb0: 2d 2d 2d 0d 0a 20 20 09 7d 0d 0a 20 20 20 20 20  ---..  .}..     
0fc0: 20 7d 0d 0a 20 20 20 20 20 20 63 6b 66 72 65 65   }..      ckfree
0fd0: 28 72 69 50 74 72 2d 3e 6e 61 6d 65 29 3b 0d 0a  (riPtr->name);..
0fe0: 2b 20 20 20 20 20 69 66 20 28 72 69 50 74 72 2d  +     if (riPtr-
0ff0: 3e 68 61 6e 64 6c 65 72 50 74 72 29 0d 0a 2b 20  >handlerPtr)..+ 
1000: 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
1010: 74 28 72 69 50 74 72 2d 3e 68 61 6e 64 6c 65 72  t(riPtr->handler
1020: 50 74 72 29 3b 0d 0a 20 20 20 20 20 20 54 63 6c  Ptr);..      Tcl
1030: 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 28  _EventuallyFree(
1040: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 43 4c 5f  clientData, TCL_
1050: 44 59 4e 41 4d 49 43 29 3b 0d 0a 20 20 7d 0d 0a  DYNAMIC);..  }..
1060: 20 20 0c 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    ...***********
1070: 2a 2a 2a 2a 0d 0a 2a 2a 2a 20 33 39 35 2c 34 30  ****..*** 395,40
1080: 31 20 2a 2a 2a 2a 0d 0a 20 20 20 20 20 20 54 63  1 ****..      Tc
1090: 6c 5f 4f 62 6a 20 2a 72 65 74 75 72 6e 50 61 63  l_Obj *returnPac
10a0: 6b 61 67 65 50 74 72 3b 0d 0a 20 20 20 20 20 20  kagePtr;..      
10b0: 69 6e 74 20 72 65 73 75 6c 74 3b 0d 0a 20 20 0d  int result;..  .
10c0: 0a 21 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .!     result = 
10d0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 72 69  Tcl_EvalObjEx(ri
10e0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 64 64 65  Ptr->interp, dde
10f0: 4f 62 6a 65 63 74 50 74 72 2c 20 54 43 4c 5f 45  ObjectPtr, TCL_E
1100: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0d 0a 20 20  VAL_GLOBAL);..  
1110: 20 20 20 20 72 65 74 75 72 6e 50 61 63 6b 61 67      returnPackag
1120: 65 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  ePtr = Tcl_NewLi
1130: 73 74 4f 62 6a 28 30 2c 20 28 54 63 6c 5f 4f 62  stObj(0, (Tcl_Ob
1140: 6a 20 2a 2a 29 20 4e 55 4c 4c 29 3b 0d 0a 20 20  j **) NULL);..  
1150: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1160: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c  ppendElement(NUL
1170: 4c 2c 20 72 65 74 75 72 6e 50 61 63 6b 61 67 65  L, returnPackage
1180: 50 74 72 2c 0d 0a 20 20 09 20 20 20 20 54 63 6c  Ptr,..  .    Tcl
1190: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73 75 6c  _NewIntObj(resul
11a0: 74 29 29 3b 0d 0a 2d 2d 2d 20 34 36 36 2c 34 38  t));..--- 466,48
11b0: 36 20 2d 2d 2d 2d 0d 0a 20 20 20 20 20 20 54 63  6 ----..      Tc
11c0: 6c 5f 4f 62 6a 20 2a 72 65 74 75 72 6e 50 61 63  l_Obj *returnPac
11d0: 6b 61 67 65 50 74 72 3b 0d 0a 20 20 20 20 20 20  kagePtr;..      
11e0: 69 6e 74 20 72 65 73 75 6c 74 3b 0d 0a 20 20 0d  int result;..  .
11f0: 0a 21 20 20 20 20 20 69 66 20 28 72 69 50 74 72  .!     if (riPtr
1200: 2d 3e 68 61 6e 64 6c 65 72 50 74 72 20 3d 3d 20  ->handlerPtr == 
1210: 4e 55 4c 4c 20 26 26 20 54 63 6c 5f 49 73 53 61  NULL && Tcl_IsSa
1220: 66 65 28 72 69 50 74 72 2d 3e 69 6e 74 65 72 70  fe(riPtr->interp
1230: 29 29 20 7b 0d 0a 21 20 09 54 63 6c 5f 53 65 74  )) {..! .Tcl_Set
1240: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
1250: 74 4f 62 6a 52 65 73 75 6c 74 28 72 69 50 74 72  tObjResult(riPtr
1260: 2d 3e 69 6e 74 65 72 70 29 2c 0d 0a 21 20 09 20  ->interp),..! . 
1270: 20 20 20 20 20 20 20 22 70 65 72 6d 69 73 73 69         "permissi
1280: 6f 6e 20 64 65 6e 69 65 64 3a 20 61 20 68 61 6e  on denied: a han
1290: 64 6c 65 72 20 70 72 6f 63 65 64 75 72 65 20 6d  dler procedure m
12a0: 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 66  ust be defined f
12b0: 6f 72 20 75 73 65 20 69 6e 20 61 20 73 61 66 65  or use in a safe
12c0: 20 69 6e 74 65 72 70 22 2c 20 2d 31 29 3b 0d 0a   interp", -1);..
12d0: 21 20 09 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f  ! .result = TCL_
12e0: 45 52 52 4f 52 3b 0d 0a 21 20 20 20 20 20 7d 0d  ERROR;..!     }.
12f0: 0a 21 20 0d 0a 21 20 20 20 20 20 69 66 20 28 72  .! ..!     if (r
1300: 69 50 74 72 2d 3e 68 61 6e 64 6c 65 72 50 74 72  iPtr->handlerPtr
1310: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 21 20 09   != NULL) {..! .
1320: 2f 2a 20 70 72 65 66 69 78 20 74 68 65 20 70 61  /* prefix the pa
1330: 73 73 65 64 20 69 6e 20 61 72 67 75 6d 65 6e 74  ssed in argument
1340: 73 20 77 69 74 68 20 74 68 65 20 68 61 6e 64 6c  s with the handl
1350: 65 72 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0d 0a 21  er command */..!
1360: 20 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4c   .result = Tcl_L
1370: 69 73 74 4f 62 6a 52 65 70 6c 61 63 65 28 72 69  istObjReplace(ri
1380: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 64 64 65  Ptr->interp, dde
1390: 4f 62 6a 65 63 74 50 74 72 2c 20 30 2c 20 30 2c  ObjectPtr, 0, 0,
13a0: 20 31 2c 20 26 28 72 69 50 74 72 2d 3e 68 61 6e   1, &(riPtr->han
13b0: 64 6c 65 72 50 74 72 29 29 3b 0d 0a 21 20 20 20  dlerPtr));..!   
13c0: 20 20 7d 0d 0a 21 20 0d 0a 21 20 20 20 20 20 69    }..! ..!     i
13d0: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c  f (result == TCL
13e0: 5f 4f 4b 29 20 7b 0d 0a 21 20 09 72 65 73 75 6c  _OK) {..! .resul
13f0: 74 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  t = Tcl_EvalObjE
1400: 78 28 72 69 50 74 72 2d 3e 69 6e 74 65 72 70 2c  x(riPtr->interp,
1410: 20 64 64 65 4f 62 6a 65 63 74 50 74 72 2c 20 54   ddeObjectPtr, T
1420: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
1430: 0d 0a 21 20 20 20 20 20 7d 0d 0a 21 20 0d 0a 20  ..!     }..! .. 
1440: 20 20 20 20 20 72 65 74 75 72 6e 50 61 63 6b 61       returnPacka
1450: 67 65 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  gePtr = Tcl_NewL
1460: 69 73 74 4f 62 6a 28 30 2c 20 28 54 63 6c 5f 4f  istObj(0, (Tcl_O
1470: 62 6a 20 2a 2a 29 20 4e 55 4c 4c 29 3b 0d 0a 20  bj **) NULL);.. 
1480: 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
1490: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55  AppendElement(NU
14a0: 4c 4c 2c 20 72 65 74 75 72 6e 50 61 63 6b 61 67  LL, returnPackag
14b0: 65 50 74 72 2c 0d 0a 20 20 09 20 20 20 20 54 63  ePtr,..  .    Tc
14c0: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73 75  l_NewIntObj(resu
14d0: 6c 74 29 29 3b 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  lt));..*********
14e0: 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 20 35 37 36 2c  ******..*** 576,
14f0: 35 39 31 20 2a 2a 2a 2a 0d 0a 20 20 09 09 09 20  591 ****..  ... 
1500: 20 20 20 72 65 74 75 72 6e 53 74 72 69 6e 67 2c     returnString,
1510: 20 6c 65 6e 2b 31 2c 20 30 2c 20 64 64 65 49 74   len+1, 0, ddeIt
1520: 65 6d 2c 20 43 46 5f 54 45 58 54 2c 0d 0a 20 20  em, CF_TEXT,..  
1530: 09 09 09 20 20 20 20 30 29 3b 0d 0a 20 20 09 09  ...    0);..  ..
1540: 7d 20 65 6c 73 65 20 7b 0d 0a 21 20 09 09 20 20  } else {..! ..  
1550: 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 61 72 69 61    Tcl_Obj *varia
1560: 62 6c 65 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  bleObjPtr = Tcl_
1570: 47 65 74 56 61 72 32 45 78 28 0d 0a 21 20 09 09  GetVar2Ex(..! ..
1580: 09 20 20 20 20 63 6f 6e 76 50 74 72 2d 3e 72 69  .    convPtr->ri
1590: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 75 74 69  Ptr->interp, uti
15a0: 6c 53 74 72 69 6e 67 2c 20 4e 55 4c 4c 2c 20 0d  lString, NULL, .
15b0: 0a 21 20 09 09 09 20 20 20 20 54 43 4c 5f 47 4c  .! ...    TCL_GL
15c0: 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0d 0a 21 20 09  OBAL_ONLY);..! .
15d0: 09 20 20 20 20 69 66 20 28 76 61 72 69 61 62 6c  .    if (variabl
15e0: 65 4f 62 6a 50 74 72 20 21 3d 20 4e 55 4c 4c 29  eObjPtr != NULL)
15f0: 20 7b 0d 0a 21 20 09 09 09 72 65 74 75 72 6e 53   {..! ...returnS
1600: 74 72 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53  tring = Tcl_GetS
1610: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 61 72  tringFromObj(var
1620: 69 61 62 6c 65 4f 62 6a 50 74 72 2c 0d 0a 21 20  iableObjPtr,..! 
1630: 09 09 09 09 26 6c 65 6e 29 3b 0d 0a 21 20 09 09  ....&len);..! ..
1640: 09 64 64 65 52 65 74 75 72 6e 20 3d 20 44 64 65  .ddeReturn = Dde
1650: 43 72 65 61 74 65 44 61 74 61 48 61 6e 64 6c 65  CreateDataHandle
1660: 28 64 64 65 49 6e 73 74 61 6e 63 65 2c 0d 0a 21  (ddeInstance,..!
1670: 20 09 09 09 09 72 65 74 75 72 6e 53 74 72 69 6e   ....returnStrin
1680: 67 2c 20 6c 65 6e 2b 31 2c 20 30 2c 20 64 64 65  g, len+1, 0, dde
1690: 49 74 65 6d 2c 20 43 46 5f 54 45 58 54 2c 20 30  Item, CF_TEXT, 0
16a0: 29 3b 0d 0a 21 20 09 09 20 20 20 20 7d 20 65 6c  );..! ..    } el
16b0: 73 65 20 7b 0d 0a 20 20 09 09 09 64 64 65 52 65  se {..  ...ddeRe
16c0: 74 75 72 6e 20 3d 20 4e 55 4c 4c 3b 0d 0a 20 20  turn = NULL;..  
16d0: 09 09 20 20 20 20 7d 0d 0a 20 20 09 09 7d 0d 0a  ..    }..  ..}..
16e0: 20 20 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46    ..Tcl_DStringF
16f0: 72 65 65 28 26 64 53 74 72 69 6e 67 29 3b 0d 0a  ree(&dString);..
1700: 2d 2d 2d 20 36 36 31 2c 36 38 30 20 2d 2d 2d 2d  --- 661,680 ----
1710: 0d 0a 20 20 09 09 09 20 20 20 20 72 65 74 75 72  ..  ...    retur
1720: 6e 53 74 72 69 6e 67 2c 20 6c 65 6e 2b 31 2c 20  nString, len+1, 
1730: 30 2c 20 64 64 65 49 74 65 6d 2c 20 43 46 5f 54  0, ddeItem, CF_T
1740: 45 58 54 2c 0d 0a 20 20 09 09 09 20 20 20 20 30  EXT,..  ...    0
1750: 29 3b 0d 0a 20 20 09 09 7d 20 65 6c 73 65 20 7b  );..  ..} else {
1760: 0d 0a 21 20 09 09 20 20 20 20 69 66 20 28 54 63  ..! ..    if (Tc
1770: 6c 5f 49 73 53 61 66 65 28 63 6f 6e 76 50 74 72  l_IsSafe(convPtr
1780: 2d 3e 72 69 50 74 72 2d 3e 69 6e 74 65 72 70 29  ->riPtr->interp)
1790: 29 20 7b 0d 0a 20 20 09 09 09 64 64 65 52 65 74  ) {..  ...ddeRet
17a0: 75 72 6e 20 3d 20 4e 55 4c 4c 3b 0d 0a 2b 20 09  urn = NULL;..+ .
17b0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 2b  .    } else {..+
17c0: 20 09 09 09 54 63 6c 5f 4f 62 6a 20 2a 76 61 72   ...Tcl_Obj *var
17d0: 69 61 62 6c 65 4f 62 6a 50 74 72 20 3d 20 54 63  iableObjPtr = Tc
17e0: 6c 5f 47 65 74 56 61 72 32 45 78 28 0d 0a 2b 20  l_GetVar2Ex(..+ 
17f0: 09 09 09 09 63 6f 6e 76 50 74 72 2d 3e 72 69 50  ....convPtr->riP
1800: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 75 74 69 6c  tr->interp, util
1810: 53 74 72 69 6e 67 2c 20 4e 55 4c 4c 2c 20 0d 0a  String, NULL, ..
1820: 2b 20 09 09 09 09 54 43 4c 5f 47 4c 4f 42 41 4c  + ....TCL_GLOBAL
1830: 5f 4f 4e 4c 59 29 3b 0d 0a 2b 20 09 09 09 69 66  _ONLY);..+ ...if
1840: 20 28 76 61 72 69 61 62 6c 65 4f 62 6a 50 74 72   (variableObjPtr
1850: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0d 0a 2b 20 09   != NULL) {..+ .
1860: 09 09 20 20 20 20 72 65 74 75 72 6e 53 74 72 69  ..    returnStri
1870: 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ng = Tcl_GetStri
1880: 6e 67 46 72 6f 6d 4f 62 6a 28 76 61 72 69 61 62  ngFromObj(variab
1890: 6c 65 4f 62 6a 50 74 72 2c 0d 0a 2b 20 09 09 09  leObjPtr,..+ ...
18a0: 20 20 20 20 09 20 20 20 20 26 6c 65 6e 29 3b 0d      .    &len);.
18b0: 0a 2b 20 09 09 09 20 20 20 20 64 64 65 52 65 74  .+ ...    ddeRet
18c0: 75 72 6e 20 3d 20 44 64 65 43 72 65 61 74 65 44  urn = DdeCreateD
18d0: 61 74 61 48 61 6e 64 6c 65 28 64 64 65 49 6e 73  ataHandle(ddeIns
18e0: 74 61 6e 63 65 2c 0d 0a 2b 20 09 09 09 20 20 20  tance,..+ ...   
18f0: 20 09 20 20 20 20 72 65 74 75 72 6e 53 74 72 69   .    returnStri
1900: 6e 67 2c 20 6c 65 6e 2b 31 2c 20 30 2c 20 64 64  ng, len+1, 0, dd
1910: 65 49 74 65 6d 2c 20 43 46 5f 54 45 58 54 2c 20  eItem, CF_TEXT, 
1920: 30 29 3b 0d 0a 2b 20 09 09 09 7d 20 65 6c 73 65  0);..+ ...} else
1930: 20 7b 0d 0a 2b 20 09 09 09 20 20 20 20 64 64 65   {..+ ...    dde
1940: 52 65 74 75 72 6e 20 3d 20 4e 55 4c 4c 3b 0d 0a  Return = NULL;..
1950: 2b 20 09 09 09 7d 0d 0a 20 20 09 09 20 20 20 20  + ...}..  ..    
1960: 7d 0d 0a 20 20 09 09 7d 0d 0a 20 20 09 09 54 63  }..  ..}..  ..Tc
1970: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
1980: 53 74 72 69 6e 67 29 3b 0d 0a 2a 2a 2a 2a 2a 2a  String);..******
1990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 20 38  *********..*** 8
19a0: 33 39 2c 38 34 34 20 2a 2a 2a 2a 0d 0a 2d 2d 2d  39,844 ****..---
19b0: 20 39 32 38 2c 39 33 34 20 2d 2d 2d 2d 0d 0a 20   928,934 ----.. 
19c0: 20 09 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c   .  (char *) NUL
19d0: 4c 7d 3b 0d 0a 20 20 20 20 20 20 73 74 61 74 69  L};..      stati
19e0: 63 20 43 4f 4e 53 54 20 63 68 61 72 20 2a 64 64  c CONST char *dd
19f0: 65 4f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 22 2d  eOptions[] = {"-
1a00: 61 73 79 6e 63 22 2c 20 28 63 68 61 72 20 2a 29  async", (char *)
1a10: 20 4e 55 4c 4c 7d 3b 0d 0a 20 20 20 20 20 20 73   NULL};..      s
1a20: 74 61 74 69 63 20 43 4f 4e 53 54 20 63 68 61 72  tatic CONST char
1a30: 20 2a 64 64 65 52 65 71 4f 70 74 69 6f 6e 73 5b   *ddeReqOptions[
1a40: 5d 20 3d 20 7b 22 2d 62 69 6e 61 72 79 22 2c 20  ] = {"-binary", 
1a50: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 7d 3b 0d  (char *) NULL};.
1a60: 0a 2b 20 20 20 20 20 73 74 61 74 69 63 20 43 4f  .+     static CO
1a70: 4e 53 54 20 63 68 61 72 20 2a 64 64 65 53 72 76  NST char *ddeSrv
1a80: 4f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 22 2d 68  Options[] = {"-h
1a90: 61 6e 64 6c 65 72 22 2c 20 28 63 68 61 72 20 2a  andler", (char *
1aa0: 29 20 4e 55 4c 4c 7d 3b 0d 0a 20 20 20 20 20 20  ) NULL};..      
1ab0: 69 6e 74 20 69 6e 64 65 78 2c 20 61 72 67 49 6e  int index, argIn
1ac0: 64 65 78 3b 0d 0a 20 20 20 20 20 20 69 6e 74 20  dex;..      int 
1ad0: 61 73 79 6e 63 20 3d 20 30 2c 20 62 69 6e 61 72  async = 0, binar
1ae0: 79 20 3d 20 30 3b 0d 0a 20 20 20 20 20 20 69 6e  y = 0;..      in
1af0: 74 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f  t result = TCL_O
1b00: 4b 3b 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  K;..************
1b10: 2a 2a 2a 0d 0a 2a 2a 2a 20 38 35 36 2c 38 36 32  ***..*** 856,862
1b20: 20 2a 2a 2a 2a 0d 0a 20 20 20 20 20 20 48 44 44   ****..      HDD
1b30: 45 44 41 54 41 20 64 64 65 52 65 74 75 72 6e 3b  EDATA ddeReturn;
1b40: 0d 0a 20 20 20 20 20 20 52 65 67 69 73 74 65 72  ..      Register
1b50: 65 64 49 6e 74 65 72 70 20 2a 72 69 50 74 72 3b  edInterp *riPtr;
1b60: 0d 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65  ..      Tcl_Inte
1b70: 72 70 20 2a 73 65 6e 64 49 6e 74 65 72 70 3b 0d  rp *sendInterp;.
1b80: 0a 21 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .!     Tcl_Obj *
1b90: 6f 62 6a 50 74 72 3b 0d 0a 20 20 20 20 20 20 54  objPtr;..      T
1ba0: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
1bb0: 61 20 2a 74 73 64 50 74 72 20 3d 20 54 43 4c 5f  a *tsdPtr = TCL_
1bc0: 54 53 44 5f 49 4e 49 54 28 26 64 61 74 61 4b 65  TSD_INIT(&dataKe
1bd0: 79 29 3b 0d 0a 20 20 0d 0a 20 20 20 20 20 20 2f  y);..  ..      /
1be0: 2a 0d 0a 2d 2d 2d 20 39 34 36 2c 39 35 32 20 2d  *..--- 946,952 -
1bf0: 2d 2d 2d 0d 0a 20 20 20 20 20 20 48 44 44 45 44  ---..      HDDED
1c00: 41 54 41 20 64 64 65 52 65 74 75 72 6e 3b 0d 0a  ATA ddeReturn;..
1c10: 20 20 20 20 20 20 52 65 67 69 73 74 65 72 65 64        Registered
1c20: 49 6e 74 65 72 70 20 2a 72 69 50 74 72 3b 0d 0a  Interp *riPtr;..
1c30: 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
1c40: 20 2a 73 65 6e 64 49 6e 74 65 72 70 3b 0d 0a 21   *sendInterp;..!
1c50: 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62       Tcl_Obj *ob
1c60: 6a 50 74 72 2c 20 2a 68 61 6e 64 6c 65 72 50 74  jPtr, *handlerPt
1c70: 72 3b 0d 0a 20 20 20 20 20 20 54 68 72 65 61 64  r;..      Thread
1c80: 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 74 73  SpecificData *ts
1c90: 64 50 74 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49  dPtr = TCL_TSD_I
1ca0: 4e 49 54 28 26 64 61 74 61 4b 65 79 29 3b 0d 0a  NIT(&dataKey);..
1cb0: 20 20 0d 0a 20 20 20 20 20 20 2f 2a 0d 0a 2a 2a    ..      /*..**
1cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a  *************..*
1cd0: 2a 2a 20 38 37 36 2c 38 38 36 20 2a 2a 2a 2a 0d  ** 876,886 ****.
1ce0: 0a 20 20 0d 0a 20 20 20 20 20 20 73 77 69 74 63  .  ..      switc
1cf0: 68 20 28 69 6e 64 65 78 29 20 7b 0d 0a 20 20 09  h (index) {..  .
1d00: 63 61 73 65 20 44 44 45 5f 53 45 52 56 45 52 4e  case DDE_SERVERN
1d10: 41 4d 45 3a 0d 0a 21 20 09 20 20 20 20 69 66 20  AME:..! .    if 
1d20: 28 28 6f 62 6a 63 20 21 3d 20 33 29 20 26 26 20  ((objc != 3) && 
1d30: 28 6f 62 6a 63 20 21 3d 20 32 29 29 20 7b 0d 0a  (objc != 2)) {..
1d40: 21 20 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  ! ..Tcl_WrongNum
1d50: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1d60: 6f 62 6a 76 2c 20 22 73 65 72 76 65 72 6e 61 6d  objv, "servernam
1d70: 65 20 3f 73 65 72 76 65 72 4e 61 6d 65 3f 22 29  e ?serverName?")
1d80: 3b 0d 0a 20 20 09 09 72 65 74 75 72 6e 20 54 43  ;..  ..return TC
1d90: 4c 5f 45 52 52 4f 52 3b 0d 0a 20 20 09 20 20 20  L_ERROR;..  .   
1da0: 20 7d 0d 0a 21 20 09 20 20 20 20 66 69 72 73 74   }..! .    first
1db0: 41 72 67 20 3d 20 28 6f 62 6a 63 20 2d 20 31 29  Arg = (objc - 1)
1dc0: 3b 0d 0a 20 20 09 20 20 20 20 62 72 65 61 6b 3b  ;..  .    break;
1dd0: 0d 0a 20 20 09 63 61 73 65 20 44 44 45 5f 45 58  ..  .case DDE_EX
1de0: 45 43 55 54 45 3a 0d 0a 20 20 09 20 20 20 20 69  ECUTE:..  .    i
1df0: 66 20 28 28 6f 62 6a 63 20 3c 20 35 29 20 7c 7c  f ((objc < 5) ||
1e00: 20 28 6f 62 6a 63 20 3e 20 36 29 29 20 7b 0d 0a   (objc > 6)) {..
1e10: 2d 2d 2d 20 39 36 36 2c 39 39 37 20 2d 2d 2d 2d  --- 966,997 ----
1e20: 0d 0a 20 20 0d 0a 20 20 20 20 20 20 73 77 69 74  ..  ..      swit
1e30: 63 68 20 28 69 6e 64 65 78 29 20 7b 0d 0a 20 20  ch (index) {..  
1e40: 09 63 61 73 65 20 44 44 45 5f 53 45 52 56 45 52  .case DDE_SERVER
1e50: 4e 41 4d 45 3a 0d 0a 21 20 09 20 20 20 20 69 66  NAME:..! .    if
1e60: 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 26 26 20   ((objc < 2) && 
1e70: 28 6f 62 6a 63 20 3e 20 35 29 29 20 7b 0d 0a 21  (objc > 5)) {..!
1e80: 20 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41   ..Tcl_WrongNumA
1e90: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1ea0: 62 6a 76 2c 20 22 73 65 72 76 65 72 6e 61 6d 65  bjv, "servername
1eb0: 20 3f 2d 68 61 6e 64 6c 65 72 20 70 72 6f 63 3f   ?-handler proc?
1ec0: 20 3f 73 65 72 76 65 72 4e 61 6d 65 3f 22 29 3b   ?serverName?");
1ed0: 0d 0a 20 20 09 09 72 65 74 75 72 6e 20 54 43 4c  ..  ..return TCL
1ee0: 5f 45 52 52 4f 52 3b 0d 0a 20 20 09 20 20 20 20  _ERROR;..  .    
1ef0: 7d 0d 0a 21 20 09 20 20 20 20 69 66 20 28 6f 62  }..! .    if (ob
1f00: 6a 63 20 3e 20 32 20 26 26 20 54 63 6c 5f 47 65  jc > 2 && Tcl_Ge
1f10: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 4e 55  tIndexFromObj(NU
1f20: 4c 4c 2c 20 6f 62 6a 76 5b 32 5d 2c 20 64 64 65  LL, objv[2], dde
1f30: 53 72 76 4f 70 74 69 6f 6e 73 2c 20 22 6f 70 74  SrvOptions, "opt
1f40: 69 6f 6e 22 2c 20 30 2c 0d 0a 21 20 09 09 20 20  ion", 0,..! ..  
1f50: 20 20 26 61 72 67 49 6e 64 65 78 29 20 3d 3d 20    &argIndex) == 
1f60: 54 43 4c 5f 4f 4b 29 20 7b 0d 0a 21 20 09 09 69  TCL_OK) {..! ..i
1f70: 66 20 28 6f 62 6a 63 20 3c 20 34 29 20 7b 0d 0a  f (objc < 4) {..
1f80: 21 20 09 09 20 20 20 20 52 65 67 69 73 74 65 72  ! ..    Register
1f90: 65 64 49 6e 74 65 72 70 20 2a 72 69 50 74 72 20  edInterp *riPtr 
1fa0: 3d 20 44 64 65 47 65 74 52 65 67 69 73 74 72 61  = DdeGetRegistra
1fb0: 74 69 6f 6e 50 74 72 28 69 6e 74 65 72 70 29 3b  tionPtr(interp);
1fc0: 0d 0a 21 20 09 09 20 20 20 20 69 66 20 28 72 69  ..! ..    if (ri
1fd0: 50 74 72 20 26 26 20 72 69 50 74 72 2d 3e 68 61  Ptr && riPtr->ha
1fe0: 6e 64 6c 65 72 50 74 72 29 20 7b 0d 0a 21 20 09  ndlerPtr) {..! .
1ff0: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
2000: 6c 74 28 69 6e 74 65 72 70 2c 20 72 69 50 74 72  lt(interp, riPtr
2010: 2d 3e 68 61 6e 64 6c 65 72 50 74 72 29 3b 0d 0a  ->handlerPtr);..
2020: 21 20 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  ! ..    } else {
2030: 0d 0a 21 20 09 09 09 54 63 6c 5f 52 65 73 65 74  ..! ...Tcl_Reset
2040: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0d  Result(interp);.
2050: 0a 21 20 09 09 20 20 20 20 7d 0d 0a 21 20 09 09  .! ..    }..! ..
2060: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
2070: 4b 3b 0d 0a 21 20 09 09 7d 0d 0a 21 20 09 09 68  K;..! ..}..! ..h
2080: 61 6e 64 6c 65 72 50 74 72 20 3d 20 6f 62 6a 76  andlerPtr = objv
2090: 5b 33 5d 3b 0d 0a 21 20 09 09 66 69 72 73 74 41  [3];..! ..firstA
20a0: 72 67 20 3d 20 28 6f 62 6a 63 20 3d 3d 20 35 29  rg = (objc == 5)
20b0: 20 3f 20 28 6f 62 6a 63 20 2d 20 31 29 20 3a 20   ? (objc - 1) : 
20c0: 31 3b 0d 0a 21 20 09 20 20 20 20 7d 20 65 6c 73  1;..! .    } els
20d0: 65 20 7b 0d 0a 21 20 09 09 69 66 20 28 6f 62 6a  e {..! ..if (obj
20e0: 63 20 3e 20 33 29 20 7b 0d 0a 21 20 09 09 20 20  c > 3) {..! ..  
20f0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2100: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2110: 6a 76 2c 0d 0a 21 20 09 09 09 20 20 20 20 22 73  jv,..! ...    "s
2120: 65 72 76 65 72 6e 61 6d 65 20 3f 2d 68 61 6e 64  ervername ?-hand
2130: 6c 65 72 20 70 72 6f 63 3f 20 3f 73 65 72 76 65  ler proc? ?serve
2140: 72 4e 61 6d 65 3f 22 29 3b 0d 0a 21 20 09 09 20  rName?");..! .. 
2150: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2160: 52 4f 52 3b 0d 0a 21 20 09 09 7d 0d 0a 21 20 09  ROR;..! ..}..! .
2170: 09 68 61 6e 64 6c 65 72 50 74 72 20 3d 20 4e 55  .handlerPtr = NU
2180: 4c 4c 3b 0d 0a 21 20 09 09 66 69 72 73 74 41 72  LL;..! ..firstAr
2190: 67 20 3d 20 28 6f 62 6a 63 20 2d 20 31 29 3b 0d  g = (objc - 1);.
21a0: 0a 21 20 09 20 20 20 20 7d 0d 0a 20 20 09 20 20  .! .    }..  .  
21b0: 20 20 62 72 65 61 6b 3b 0d 0a 20 20 09 63 61 73    break;..  .cas
21c0: 65 20 44 44 45 5f 45 58 45 43 55 54 45 3a 0d 0a  e DDE_EXECUTE:..
21d0: 20 20 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63    .    if ((objc
21e0: 20 3c 20 35 29 20 7c 7c 20 28 6f 62 6a 63 20 3e   < 5) || (objc >
21f0: 20 36 29 29 20 7b 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a   6)) {..********
2200: 2a 2a 2a 2a 2a 2a 2a 0d 0a 2a 2a 2a 20 31 30 30  *******..*** 100
2210: 32 2c 31 30 30 38 20 2a 2a 2a 2a 0d 0a 20 20 0d  2,1008 ****..  .
2220: 0a 20 20 20 20 20 20 73 77 69 74 63 68 20 28 69  .      switch (i
2230: 6e 64 65 78 29 20 7b 0d 0a 20 20 09 63 61 73 65  ndex) {..  .case
2240: 20 44 44 45 5f 53 45 52 56 45 52 4e 41 4d 45 3a   DDE_SERVERNAME:
2250: 20 7b 0d 0a 21 20 09 20 20 20 20 73 65 72 76 69   {..! .    servi
2260: 63 65 4e 61 6d 65 20 3d 20 44 64 65 53 65 74 53  ceName = DdeSetS
2270: 65 72 76 65 72 4e 61 6d 65 28 69 6e 74 65 72 70  erverName(interp
2280: 2c 20 73 65 72 76 69 63 65 4e 61 6d 65 29 3b 0d  , serviceName);.
2290: 0a 20 20 09 20 20 20 20 69 66 20 28 73 65 72 76  .  .    if (serv
22a0: 69 63 65 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29  iceName != NULL)
22b0: 20 7b 0d 0a 20 20 09 09 54 63 6c 5f 53 65 74 53   {..  ..Tcl_SetS
22c0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
22d0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
22e0: 29 2c 0d 0a 20 20 09 09 09 73 65 72 76 69 63 65  ),..  ...service
22f0: 4e 61 6d 65 2c 20 2d 31 29 3b 0d 0a 2d 2d 2d 20  Name, -1);..--- 
2300: 31 31 31 33 2c 31 31 31 39 20 2d 2d 2d 2d 0d 0a  1113,1119 ----..
2310: 20 20 0d 0a 20 20 20 20 20 20 73 77 69 74 63 68    ..      switch
2320: 20 28 69 6e 64 65 78 29 20 7b 0d 0a 20 20 09 63   (index) {..  .c
2330: 61 73 65 20 44 44 45 5f 53 45 52 56 45 52 4e 41  ase DDE_SERVERNA
2340: 4d 45 3a 20 7b 0d 0a 21 20 09 20 20 20 20 73 65  ME: {..! .    se
2350: 72 76 69 63 65 4e 61 6d 65 20 3d 20 44 64 65 53  rviceName = DdeS
2360: 65 74 53 65 72 76 65 72 4e 61 6d 65 28 69 6e 74  etServerName(int
2370: 65 72 70 2c 20 73 65 72 76 69 63 65 4e 61 6d 65  erp, serviceName
2380: 2c 20 68 61 6e 64 6c 65 72 50 74 72 29 3b 0d 0a  , handlerPtr);..
2390: 20 20 09 20 20 20 20 69 66 20 28 73 65 72 76 69    .    if (servi
23a0: 63 65 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20  ceName != NULL) 
23b0: 7b 0d 0a 20 20 09 09 54 63 6c 5f 53 65 74 53 74  {..  ..Tcl_SetSt
23c0: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  ringObj(Tcl_GetO
23d0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
23e0: 2c 0d 0a 20 20 09 09 09 73 65 72 76 69 63 65 4e  ,..  ...serviceN
23f0: 61 6d 65 2c 20 2d 31 29 3b 0d 0a                 ame, -1);..