Hex Artifact Content

Artifact 14ae6d53f2b52df9c3a83257ddc86002802c2103:


0000: 2f 2a 20 0a 20 2a 20 74 6b 54 65 78 74 2e 63 20  /* . * tkText.c 
0010: 28 43 54 6b 29 20 2d 2d 0a 20 2a 0a 20 2a 09 54  (CTk) --. *. *.T
0020: 68 69 73 20 6d 6f 64 75 6c 65 20 70 72 6f 76 69  his module provi
0030: 64 65 73 20 61 20 62 69 67 20 63 68 75 6e 6b 20  des a big chunk 
0040: 6f 66 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  of the implement
0050: 61 74 69 6f 6e 20 6f 66 0a 20 2a 09 6d 75 6c 74  ation of. *.mult
0060: 69 2d 6c 69 6e 65 20 65 64 69 74 61 62 6c 65 20  i-line editable 
0070: 74 65 78 74 20 77 69 64 67 65 74 73 20 66 6f 72  text widgets for
0080: 20 54 6b 2e 20 20 41 6d 6f 6e 67 20 6f 74 68 65   Tk.  Among othe
0090: 72 20 74 68 69 6e 67 73 2c 0a 20 2a 09 69 74 20  r things,. *.it 
00a0: 70 72 6f 76 69 64 65 73 20 74 68 65 20 54 63 6c  provides the Tcl
00b0: 20 63 6f 6d 6d 61 6e 64 20 69 6e 74 65 72 66 61   command interfa
00c0: 63 65 73 20 74 6f 20 74 65 78 74 20 77 69 64 67  ces to text widg
00d0: 65 74 73 20 61 6e 64 0a 20 2a 09 74 68 65 20 64  ets and. *.the d
00e0: 69 73 70 6c 61 79 20 63 6f 64 65 2e 20 20 54 68  isplay code.  Th
00f0: 65 20 42 2d 74 72 65 65 20 72 65 70 72 65 73 65  e B-tree represe
0100: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 65 78 74 20  ntation of text 
0110: 69 73 0a 20 2a 09 69 6d 70 6c 65 6d 65 6e 74 65  is. *.implemente
0120: 64 20 65 6c 73 65 77 68 65 72 65 2e 0a 20 2a 0a  d elsewhere.. *.
0130: 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29   * Copyright (c)
0140: 20 31 39 39 32 2d 31 39 39 34 20 54 68 65 20 52   1992-1994 The R
0150: 65 67 65 6e 74 73 20 6f 66 20 74 68 65 20 55 6e  egents of the Un
0160: 69 76 65 72 73 69 74 79 20 6f 66 20 43 61 6c 69  iversity of Cali
0170: 66 6f 72 6e 69 61 2e 0a 20 2a 20 43 6f 70 79 72  fornia.. * Copyr
0180: 69 67 68 74 20 28 63 29 20 31 39 39 34 2d 31 39  ight (c) 1994-19
0190: 39 35 20 53 75 6e 20 4d 69 63 72 6f 73 79 73 74  95 Sun Microsyst
01a0: 65 6d 73 2c 20 49 6e 63 2e 0a 20 2a 20 43 6f 70  ems, Inc.. * Cop
01b0: 79 72 69 67 68 74 20 28 63 29 20 31 39 39 35 20  yright (c) 1995 
01c0: 43 6c 65 76 65 6c 61 6e 64 20 43 6c 69 6e 69 63  Cleveland Clinic
01d0: 20 46 6f 75 6e 64 61 74 69 6f 6e 0a 20 2a 0a 20   Foundation. *. 
01e0: 2a 20 53 65 65 20 74 68 65 20 66 69 6c 65 20 22  * See the file "
01f0: 6c 69 63 65 6e 73 65 2e 74 65 72 6d 73 22 20 66  license.terms" f
0200: 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  or information o
0210: 6e 20 75 73 61 67 65 20 61 6e 64 20 72 65 64 69  n usage and redi
0220: 73 74 72 69 62 75 74 69 6f 6e 0a 20 2a 20 6f 66  stribution. * of
0230: 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20   this file, and 
0240: 66 6f 72 20 61 20 44 49 53 43 4c 41 49 4d 45 52  for a DISCLAIMER
0250: 20 4f 46 20 41 4c 4c 20 57 41 52 52 41 4e 54 49   OF ALL WARRANTI
0260: 45 53 2e 0a 20 2a 0a 20 2a 20 40 28 23 29 20 24  ES.. *. * @(#) $
0270: 49 64 3a 20 63 74 6b 2e 73 68 61 72 2c 76 20 31  Id: ctk.shar,v 1
0280: 2e 35 30 20 31 39 39 36 2f 30 31 2f 31 35 20 31  .50 1996/01/15 1
0290: 34 3a 34 37 3a 31 36 20 61 6e 64 72 65 77 6d 20  4:47:16 andrewm 
02a0: 45 78 70 20 61 6e 64 72 65 77 6d 20 24 0a 20 2a  Exp andrewm $. *
02b0: 2f 0a 0a 0a 23 69 6e 63 6c 75 64 65 20 22 64 65  /...#include "de
02c0: 66 61 75 6c 74 2e 68 22 0a 23 69 6e 63 6c 75 64  fault.h".#includ
02d0: 65 20 22 74 6b 50 6f 72 74 2e 68 22 0a 23 69 6e  e "tkPort.h".#in
02e0: 63 6c 75 64 65 20 22 74 6b 49 6e 74 2e 68 22 0a  clude "tkInt.h".
02f0: 23 69 6e 63 6c 75 64 65 20 22 74 6b 54 65 78 74  #include "tkText
0300: 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 49 6e 66 6f 72  .h"../*. * Infor
0310: 6d 61 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 70  mation used to p
0320: 61 72 73 65 20 74 65 78 74 20 63 6f 6e 66 69 67  arse text config
0330: 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 3a  uration options:
0340: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 6b 5f  . */..static Tk_
0350: 43 6f 6e 66 69 67 53 70 65 63 20 63 6f 6e 66 69  ConfigSpec confi
0360: 67 53 70 65 63 73 5b 5d 20 3d 20 7b 0a 20 20 20  gSpecs[] = {.   
0370: 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f 53 59 4e 4f   {TK_CONFIG_SYNO
0380: 4e 59 4d 2c 20 22 2d 62 64 22 2c 20 22 62 6f 72  NYM, "-bd", "bor
0390: 64 65 72 57 69 64 74 68 22 2c 20 28 63 68 61 72  derWidth", (char
03a0: 20 2a 29 20 4e 55 4c 4c 2c 0a 09 28 63 68 61 72   *) NULL,..(char
03b0: 20 2a 29 20 4e 55 4c 4c 2c 20 30 2c 20 30 7d 2c   *) NULL, 0, 0},
03c0: 0a 20 20 20 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f  .    {TK_CONFIG_
03d0: 50 49 58 45 4c 53 2c 20 22 2d 62 6f 72 64 65 72  PIXELS, "-border
03e0: 77 69 64 74 68 22 2c 20 22 62 6f 72 64 65 72 57  width", "borderW
03f0: 69 64 74 68 22 2c 20 22 42 6f 72 64 65 72 57 69  idth", "BorderWi
0400: 64 74 68 22 2c 0a 09 44 45 46 5f 54 45 58 54 5f  dth",..DEF_TEXT_
0410: 42 4f 52 44 45 52 5f 57 49 44 54 48 2c 20 54 6b  BORDER_WIDTH, Tk
0420: 5f 4f 66 66 73 65 74 28 54 6b 54 65 78 74 2c 20  _Offset(TkText, 
0430: 62 6f 72 64 65 72 57 69 64 74 68 29 2c 20 30 7d  borderWidth), 0}
0440: 2c 0a 20 20 20 20 7b 54 4b 5f 43 4f 4e 46 49 47  ,.    {TK_CONFIG
0450: 5f 50 49 58 45 4c 53 2c 20 22 2d 68 65 69 67 68  _PIXELS, "-heigh
0460: 74 22 2c 20 22 68 65 69 67 68 74 22 2c 20 22 48  t", "height", "H
0470: 65 69 67 68 74 22 2c 0a 09 44 45 46 5f 54 45 58  eight",..DEF_TEX
0480: 54 5f 48 45 49 47 48 54 2c 20 54 6b 5f 4f 66 66  T_HEIGHT, Tk_Off
0490: 73 65 74 28 54 6b 54 65 78 74 2c 20 68 65 69 67  set(TkText, heig
04a0: 68 74 29 2c 20 30 7d 2c 0a 20 20 20 20 7b 54 4b  ht), 0},.    {TK
04b0: 5f 43 4f 4e 46 49 47 5f 50 49 58 45 4c 53 2c 20  _CONFIG_PIXELS, 
04c0: 22 2d 70 61 64 78 22 2c 20 22 70 61 64 58 22 2c  "-padx", "padX",
04d0: 20 22 50 61 64 22 2c 0a 09 44 45 46 5f 54 45 58   "Pad",..DEF_TEX
04e0: 54 5f 50 41 44 58 2c 20 54 6b 5f 4f 66 66 73 65  T_PADX, Tk_Offse
04f0: 74 28 54 6b 54 65 78 74 2c 20 70 61 64 58 29 2c  t(TkText, padX),
0500: 20 30 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43 4f 4e   0},.    {TK_CON
0510: 46 49 47 5f 50 49 58 45 4c 53 2c 20 22 2d 70 61  FIG_PIXELS, "-pa
0520: 64 79 22 2c 20 22 70 61 64 59 22 2c 20 22 50 61  dy", "padY", "Pa
0530: 64 22 2c 0a 09 44 45 46 5f 54 45 58 54 5f 50 41  d",..DEF_TEXT_PA
0540: 44 59 2c 20 54 6b 5f 4f 66 66 73 65 74 28 54 6b  DY, Tk_Offset(Tk
0550: 54 65 78 74 2c 20 70 61 64 59 29 2c 20 30 7d 2c  Text, padY), 0},
0560: 0a 20 20 20 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f  .    {TK_CONFIG_
0570: 50 49 58 45 4c 53 2c 20 22 2d 73 70 61 63 69 6e  PIXELS, "-spacin
0580: 67 31 22 2c 20 22 73 70 61 63 69 6e 67 31 22 2c  g1", "spacing1",
0590: 20 22 53 70 61 63 69 6e 67 22 2c 0a 09 44 45 46   "Spacing",..DEF
05a0: 5f 54 45 58 54 5f 53 50 41 43 49 4e 47 31 2c 20  _TEXT_SPACING1, 
05b0: 54 6b 5f 4f 66 66 73 65 74 28 54 6b 54 65 78 74  Tk_Offset(TkText
05c0: 2c 20 73 70 61 63 69 6e 67 31 29 2c 0a 09 54 4b  , spacing1),..TK
05d0: 5f 43 4f 4e 46 49 47 5f 44 4f 4e 54 5f 53 45 54  _CONFIG_DONT_SET
05e0: 5f 44 45 46 41 55 4c 54 7d 2c 0a 20 20 20 20 7b  _DEFAULT},.    {
05f0: 54 4b 5f 43 4f 4e 46 49 47 5f 50 49 58 45 4c 53  TK_CONFIG_PIXELS
0600: 2c 20 22 2d 73 70 61 63 69 6e 67 32 22 2c 20 22  , "-spacing2", "
0610: 73 70 61 63 69 6e 67 32 22 2c 20 22 53 70 61 63  spacing2", "Spac
0620: 69 6e 67 22 2c 0a 09 44 45 46 5f 54 45 58 54 5f  ing",..DEF_TEXT_
0630: 53 50 41 43 49 4e 47 32 2c 20 54 6b 5f 4f 66 66  SPACING2, Tk_Off
0640: 73 65 74 28 54 6b 54 65 78 74 2c 20 73 70 61 63  set(TkText, spac
0650: 69 6e 67 32 29 2c 0a 09 54 4b 5f 43 4f 4e 46 49  ing2),..TK_CONFI
0660: 47 5f 44 4f 4e 54 5f 53 45 54 5f 44 45 46 41 55  G_DONT_SET_DEFAU
0670: 4c 54 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43 4f 4e  LT},.    {TK_CON
0680: 46 49 47 5f 50 49 58 45 4c 53 2c 20 22 2d 73 70  FIG_PIXELS, "-sp
0690: 61 63 69 6e 67 33 22 2c 20 22 73 70 61 63 69 6e  acing3", "spacin
06a0: 67 33 22 2c 20 22 53 70 61 63 69 6e 67 22 2c 0a  g3", "Spacing",.
06b0: 09 44 45 46 5f 54 45 58 54 5f 53 50 41 43 49 4e  .DEF_TEXT_SPACIN
06c0: 47 33 2c 20 54 6b 5f 4f 66 66 73 65 74 28 54 6b  G3, Tk_Offset(Tk
06d0: 54 65 78 74 2c 20 73 70 61 63 69 6e 67 33 29 2c  Text, spacing3),
06e0: 0a 09 54 4b 5f 43 4f 4e 46 49 47 5f 44 4f 4e 54  ..TK_CONFIG_DONT
06f0: 5f 53 45 54 5f 44 45 46 41 55 4c 54 7d 2c 0a 20  _SET_DEFAULT},. 
0700: 20 20 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f 55 49     {TK_CONFIG_UI
0710: 44 2c 20 22 2d 73 74 61 74 65 22 2c 20 22 73 74  D, "-state", "st
0720: 61 74 65 22 2c 20 22 53 74 61 74 65 22 2c 0a 09  ate", "State",..
0730: 44 45 46 5f 54 45 58 54 5f 53 54 41 54 45 2c 20  DEF_TEXT_STATE, 
0740: 54 6b 5f 4f 66 66 73 65 74 28 54 6b 54 65 78 74  Tk_Offset(TkText
0750: 2c 20 73 74 61 74 65 29 2c 20 30 7d 2c 0a 20 20  , state), 0},.  
0760: 20 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f 53 54 52    {TK_CONFIG_STR
0770: 49 4e 47 2c 20 22 2d 74 61 62 73 22 2c 20 22 74  ING, "-tabs", "t
0780: 61 62 73 22 2c 20 22 54 61 62 73 22 2c 0a 09 44  abs", "Tabs",..D
0790: 45 46 5f 54 45 58 54 5f 54 41 42 53 2c 20 54 6b  EF_TEXT_TABS, Tk
07a0: 5f 4f 66 66 73 65 74 28 54 6b 54 65 78 74 2c 20  _Offset(TkText, 
07b0: 74 61 62 4f 70 74 69 6f 6e 53 74 72 69 6e 67 29  tabOptionString)
07c0: 2c 20 54 4b 5f 43 4f 4e 46 49 47 5f 4e 55 4c 4c  , TK_CONFIG_NULL
07d0: 5f 4f 4b 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43 4f  _OK},.    {TK_CO
07e0: 4e 46 49 47 5f 53 54 52 49 4e 47 2c 20 22 2d 74  NFIG_STRING, "-t
07f0: 61 6b 65 66 6f 63 75 73 22 2c 20 22 74 61 6b 65  akefocus", "take
0800: 46 6f 63 75 73 22 2c 20 22 54 61 6b 65 46 6f 63  Focus", "TakeFoc
0810: 75 73 22 2c 0a 09 44 45 46 5f 54 45 58 54 5f 54  us",..DEF_TEXT_T
0820: 41 4b 45 5f 46 4f 43 55 53 2c 20 54 6b 5f 4f 66  AKE_FOCUS, Tk_Of
0830: 66 73 65 74 28 54 6b 54 65 78 74 2c 20 74 61 6b  fset(TkText, tak
0840: 65 46 6f 63 75 73 29 2c 0a 09 54 4b 5f 43 4f 4e  eFocus),..TK_CON
0850: 46 49 47 5f 4e 55 4c 4c 5f 4f 4b 7d 2c 0a 20 20  FIG_NULL_OK},.  
0860: 20 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f 49 4e 54    {TK_CONFIG_INT
0870: 2c 20 22 2d 77 69 64 74 68 22 2c 20 22 77 69 64  , "-width", "wid
0880: 74 68 22 2c 20 22 57 69 64 74 68 22 2c 0a 09 44  th", "Width",..D
0890: 45 46 5f 54 45 58 54 5f 57 49 44 54 48 2c 20 54  EF_TEXT_WIDTH, T
08a0: 6b 5f 4f 66 66 73 65 74 28 54 6b 54 65 78 74 2c  k_Offset(TkText,
08b0: 20 77 69 64 74 68 29 2c 20 30 7d 2c 0a 20 20 20   width), 0},.   
08c0: 20 7b 54 4b 5f 43 4f 4e 46 49 47 5f 55 49 44 2c   {TK_CONFIG_UID,
08d0: 20 22 2d 77 72 61 70 22 2c 20 22 77 72 61 70 22   "-wrap", "wrap"
08e0: 2c 20 22 57 72 61 70 22 2c 0a 09 44 45 46 5f 54  , "Wrap",..DEF_T
08f0: 45 58 54 5f 57 52 41 50 2c 20 54 6b 5f 4f 66 66  EXT_WRAP, Tk_Off
0900: 73 65 74 28 54 6b 54 65 78 74 2c 20 77 72 61 70  set(TkText, wrap
0910: 4d 6f 64 65 29 2c 20 30 7d 2c 0a 20 20 20 20 7b  Mode), 0},.    {
0920: 54 4b 5f 43 4f 4e 46 49 47 5f 53 54 52 49 4e 47  TK_CONFIG_STRING
0930: 2c 20 22 2d 78 73 63 72 6f 6c 6c 63 6f 6d 6d 61  , "-xscrollcomma
0940: 6e 64 22 2c 20 22 78 53 63 72 6f 6c 6c 43 6f 6d  nd", "xScrollCom
0950: 6d 61 6e 64 22 2c 20 22 53 63 72 6f 6c 6c 43 6f  mand", "ScrollCo
0960: 6d 6d 61 6e 64 22 2c 0a 09 44 45 46 5f 54 45 58  mmand",..DEF_TEX
0970: 54 5f 58 53 43 52 4f 4c 4c 5f 43 4f 4d 4d 41 4e  T_XSCROLL_COMMAN
0980: 44 2c 20 54 6b 5f 4f 66 66 73 65 74 28 54 6b 54  D, Tk_Offset(TkT
0990: 65 78 74 2c 20 78 53 63 72 6f 6c 6c 43 6d 64 29  ext, xScrollCmd)
09a0: 2c 0a 09 54 4b 5f 43 4f 4e 46 49 47 5f 4e 55 4c  ,..TK_CONFIG_NUL
09b0: 4c 5f 4f 4b 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43  L_OK},.    {TK_C
09c0: 4f 4e 46 49 47 5f 53 54 52 49 4e 47 2c 20 22 2d  ONFIG_STRING, "-
09d0: 79 73 63 72 6f 6c 6c 63 6f 6d 6d 61 6e 64 22 2c  yscrollcommand",
09e0: 20 22 79 53 63 72 6f 6c 6c 43 6f 6d 6d 61 6e 64   "yScrollCommand
09f0: 22 2c 20 22 53 63 72 6f 6c 6c 43 6f 6d 6d 61 6e  ", "ScrollComman
0a00: 64 22 2c 0a 09 44 45 46 5f 54 45 58 54 5f 59 53  d",..DEF_TEXT_YS
0a10: 43 52 4f 4c 4c 5f 43 4f 4d 4d 41 4e 44 2c 20 54  CROLL_COMMAND, T
0a20: 6b 5f 4f 66 66 73 65 74 28 54 6b 54 65 78 74 2c  k_Offset(TkText,
0a30: 20 79 53 63 72 6f 6c 6c 43 6d 64 29 2c 0a 09 54   yScrollCmd),..T
0a40: 4b 5f 43 4f 4e 46 49 47 5f 4e 55 4c 4c 5f 4f 4b  K_CONFIG_NULL_OK
0a50: 7d 2c 0a 20 20 20 20 7b 54 4b 5f 43 4f 4e 46 49  },.    {TK_CONFI
0a60: 47 5f 45 4e 44 2c 20 28 63 68 61 72 20 2a 29 20  G_END, (char *) 
0a70: 4e 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20 4e  NULL, (char *) N
0a80: 55 4c 4c 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ULL, (char *) NU
0a90: 4c 4c 2c 0a 09 28 63 68 61 72 20 2a 29 20 4e 55  LL,..(char *) NU
0aa0: 4c 4c 2c 20 30 2c 20 30 7d 0a 7d 3b 0a 0a 2f 2a  LL, 0, 0}.};../*
0ab0: 0a 20 2a 20 54 6b 5f 55 69 64 27 73 20 75 73 65  . * Tk_Uid's use
0ac0: 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74  d to represent t
0ad0: 65 78 74 20 73 74 61 74 65 73 3a 0a 20 2a 2f 0a  ext states:. */.
0ae0: 0a 54 6b 5f 55 69 64 20 74 6b 54 65 78 74 43 68  .Tk_Uid tkTextCh
0af0: 61 72 55 69 64 20 3d 20 4e 55 4c 4c 3b 0a 54 6b  arUid = NULL;.Tk
0b00: 5f 55 69 64 20 74 6b 54 65 78 74 44 69 73 61 62  _Uid tkTextDisab
0b10: 6c 65 64 55 69 64 20 3d 20 4e 55 4c 4c 3b 0a 54  ledUid = NULL;.T
0b20: 6b 5f 55 69 64 20 74 6b 54 65 78 74 4e 6f 6e 65  k_Uid tkTextNone
0b30: 55 69 64 20 3d 20 4e 55 4c 4c 3b 0a 54 6b 5f 55  Uid = NULL;.Tk_U
0b40: 69 64 20 74 6b 54 65 78 74 4e 6f 72 6d 61 6c 55  id tkTextNormalU
0b50: 69 64 20 3d 20 4e 55 4c 4c 3b 0a 54 6b 5f 55 69  id = NULL;.Tk_Ui
0b60: 64 20 74 6b 54 65 78 74 57 6f 72 64 55 69 64 20  d tkTextWordUid 
0b70: 3d 20 4e 55 4c 4c 3b 0a 0a 2f 2a 0a 20 2a 20 42  = NULL;../*. * B
0b80: 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 20  oolean variable 
0b90: 69 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68  indicating wheth
0ba0: 65 72 20 6f 72 20 6e 6f 74 20 73 70 65 63 69 61  er or not specia
0bb0: 6c 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65  l debugging code
0bc0: 0a 20 2a 20 73 68 6f 75 6c 64 20 62 65 20 65 78  . * should be ex
0bd0: 65 63 75 74 65 64 2e 0a 20 2a 2f 0a 0a 69 6e 74  ecuted.. */..int
0be0: 20 74 6b 54 65 78 74 44 65 62 75 67 20 3d 20 30   tkTextDebug = 0
0bf0: 3b 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  ;../*. * Forward
0c00: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f   declarations fo
0c10: 72 20 70 72 6f 63 65 64 75 72 65 73 20 64 65 66  r procedures def
0c20: 69 6e 65 64 20 6c 61 74 65 72 20 69 6e 20 74 68  ined later in th
0c30: 69 73 20 66 69 6c 65 3a 0a 20 2a 2f 0a 0a 73 74  is file:. */..st
0c40: 61 74 69 63 20 69 6e 74 09 09 43 6f 6e 66 69 67  atic int..Config
0c50: 75 72 65 54 65 78 74 20 5f 41 4e 53 49 5f 41 52  ureText _ANSI_AR
0c60: 47 53 5f 28 28 54 63 6c 5f 49 6e 74 65 72 70 20  GS_((Tcl_Interp 
0c70: 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20  *interp,....    
0c80: 54 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72 2c  TkText *textPtr,
0c90: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20   int argc, char 
0ca0: 2a 2a 61 72 67 76 2c 20 69 6e 74 20 66 6c 61 67  **argv, int flag
0cb0: 73 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09  s));.static int.
0cc0: 09 44 65 6c 65 74 65 43 68 61 72 73 20 5f 41 4e  .DeleteChars _AN
0cd0: 53 49 5f 41 52 47 53 5f 28 28 54 6b 54 65 78 74  SI_ARGS_((TkText
0ce0: 20 2a 74 65 78 74 50 74 72 2c 0a 09 09 09 20 20   *textPtr,....  
0cf0: 20 20 63 68 61 72 20 2a 69 6e 64 65 78 31 53 74    char *index1St
0d00: 72 69 6e 67 2c 20 63 68 61 72 20 2a 69 6e 64 65  ring, char *inde
0d10: 78 32 53 74 72 69 6e 67 29 29 3b 0a 73 74 61 74  x2String));.stat
0d20: 69 63 20 76 6f 69 64 09 09 44 65 73 74 72 6f 79  ic void..Destroy
0d30: 54 65 78 74 20 5f 41 4e 53 49 5f 41 52 47 53 5f  Text _ANSI_ARGS_
0d40: 28 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  ((ClientData cli
0d50: 65 6e 74 44 61 74 61 29 29 3b 0a 73 74 61 74 69  entData));.stati
0d60: 63 20 76 6f 69 64 09 09 49 6e 73 65 72 74 43 68  c void..InsertCh
0d70: 61 72 73 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28  ars _ANSI_ARGS_(
0d80: 28 54 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72  (TkText *textPtr
0d90: 2c 0a 09 09 09 20 20 20 20 54 6b 54 65 78 74 49  ,....    TkTextI
0da0: 6e 64 65 78 20 2a 69 6e 64 65 78 50 74 72 2c 20  ndex *indexPtr, 
0db0: 63 68 61 72 20 2a 73 74 72 69 6e 67 29 29 3b 0a  char *string));.
0dc0: 73 74 61 74 69 63 20 76 6f 69 64 09 09 54 65 78  static void..Tex
0dd0: 74 43 6d 64 44 65 6c 65 74 65 64 50 72 6f 63 20  tCmdDeletedProc 
0de0: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 0a 09 09  _ANSI_ARGS_((...
0df0: 09 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
0e00: 63 6c 69 65 6e 74 44 61 74 61 29 29 3b 0a 73 74  clientData));.st
0e10: 61 74 69 63 20 76 6f 69 64 09 09 54 65 78 74 45  atic void..TextE
0e20: 76 65 6e 74 50 72 6f 63 20 5f 41 4e 53 49 5f 41  ventProc _ANSI_A
0e30: 52 47 53 5f 28 28 43 6c 69 65 6e 74 44 61 74 61  RGS_((ClientData
0e40: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09   clientData,....
0e50: 20 20 20 20 58 45 76 65 6e 74 20 2a 65 76 65 6e      XEvent *even
0e60: 74 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20 69  tPtr));.static i
0e70: 6e 74 09 09 54 65 78 74 53 65 61 72 63 68 43 6d  nt..TextSearchCm
0e80: 64 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54  d _ANSI_ARGS_((T
0e90: 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72 2c 0a  kText *textPtr,.
0ea0: 09 09 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ...    Tcl_Inter
0eb0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61  p *interp, int a
0ec0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
0ed0: 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09  ));.static int..
0ee0: 54 65 78 74 57 69 64 67 65 74 43 6d 64 20 5f 41  TextWidgetCmd _A
0ef0: 4e 53 49 5f 41 52 47 53 5f 28 28 43 6c 69 65 6e  NSI_ARGS_((Clien
0f00: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
0f10: 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 49 6e 74  ,....    Tcl_Int
0f20: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
0f30: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
0f40: 67 76 29 29 3b 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  gv));.../*. *---
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
0f90: 2a 20 54 6b 5f 54 65 78 74 43 6d 64 20 2d 2d 0a  * Tk_TextCmd --.
0fa0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
0fb0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
0fc0: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
0fd0: 74 65 78 74 22 20 54 63 6c 20 63 6f 6d 6d 61 6e  text" Tcl comman
0fe0: 64 2e 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73  d.. *.See the us
0ff0: 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  er documentation
1000: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20   for details on 
1010: 77 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a  what it does.. *
1020: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
1030: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
1040: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
1050: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
1060: 65 20 74 68 65 20 75 73 65 72 20 64 6f 63 75 6d  e the user docum
1070: 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d  entation.. *. *-
1080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10c0: 2f 0a 0a 69 6e 74 0a 54 6b 5f 54 65 78 74 43 6d  /..int.Tk_TextCm
10d0: 64 28 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  d(clientData, in
10e0: 74 65 72 70 2c 20 61 72 67 63 2c 20 61 72 67 76  terp, argc, argv
10f0: 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61  ).    ClientData
1100: 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20   clientData;./* 
1110: 4d 61 69 6e 20 77 69 6e 64 6f 77 20 61 73 73 6f  Main window asso
1120: 63 69 61 74 65 64 20 77 69 74 68 0a 09 09 09 09  ciated with.....
1130: 20 2a 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20   * interpreter. 
1140: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  */.    Tcl_Inter
1150: 70 20 2a 69 6e 74 65 72 70 3b 09 09 2f 2a 20 43  p *interp;../* C
1160: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  urrent interpret
1170: 65 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  er. */.    int a
1180: 72 67 63 3b 09 09 09 2f 2a 20 4e 75 6d 62 65 72  rgc;.../* Number
1190: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a   of arguments. *
11a0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 72 67  /.    char **arg
11b0: 76 3b 09 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20  v;../* Argument 
11c0: 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 7b 0a 20 20  strings. */.{.  
11d0: 20 20 54 6b 5f 57 69 6e 64 6f 77 20 74 6b 77 69    Tk_Window tkwi
11e0: 6e 20 3d 20 28 54 6b 5f 57 69 6e 64 6f 77 29 20  n = (Tk_Window) 
11f0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
1200: 54 6b 5f 57 69 6e 64 6f 77 20 6e 65 77 3b 0a 20  Tk_Window new;. 
1210: 20 20 20 72 65 67 69 73 74 65 72 20 54 6b 54 65     register TkTe
1220: 78 74 20 2a 74 65 78 74 50 74 72 3b 0a 20 20 20  xt *textPtr;.   
1230: 20 54 6b 54 65 78 74 49 6e 64 65 78 20 73 74 61   TkTextIndex sta
1240: 72 74 49 6e 64 65 78 3b 0a 0a 20 20 20 20 69 66  rtIndex;..    if
1250: 20 28 61 72 67 63 20 3c 20 32 29 20 7b 0a 09 54   (argc < 2) {..T
1260: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1270: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1280: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1290: 20 5c 22 22 2c 0a 09 09 61 72 67 76 5b 30 5d 2c   \"",...argv[0],
12a0: 20 22 20 70 61 74 68 4e 61 6d 65 20 3f 6f 70 74   " pathName ?opt
12b0: 69 6f 6e 73 3f 5c 22 22 2c 20 28 63 68 61 72 20  ions?\"", (char 
12c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
12d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12e0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
12f0: 2a 20 50 65 72 66 6f 72 6d 20 6f 6e 63 65 2d 6f  * Perform once-o
1300: 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  nly initializati
1310: 6f 6e 3a 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  on:.     */..   
1320: 20 69 66 20 28 74 6b 54 65 78 74 4e 6f 72 6d 61   if (tkTextNorma
1330: 6c 55 69 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  lUid == NULL) {.
1340: 09 74 6b 54 65 78 74 43 68 61 72 55 69 64 20 3d  .tkTextCharUid =
1350: 20 54 6b 5f 47 65 74 55 69 64 28 22 63 68 61 72   Tk_GetUid("char
1360: 22 29 3b 0a 09 74 6b 54 65 78 74 44 69 73 61 62  ");..tkTextDisab
1370: 6c 65 64 55 69 64 20 3d 20 54 6b 5f 47 65 74 55  ledUid = Tk_GetU
1380: 69 64 28 22 64 69 73 61 62 6c 65 64 22 29 3b 0a  id("disabled");.
1390: 09 74 6b 54 65 78 74 4e 6f 6e 65 55 69 64 20 3d  .tkTextNoneUid =
13a0: 20 54 6b 5f 47 65 74 55 69 64 28 22 6e 6f 6e 65   Tk_GetUid("none
13b0: 22 29 3b 0a 09 74 6b 54 65 78 74 4e 6f 72 6d 61  ");..tkTextNorma
13c0: 6c 55 69 64 20 3d 20 54 6b 5f 47 65 74 55 69 64  lUid = Tk_GetUid
13d0: 28 22 6e 6f 72 6d 61 6c 22 29 3b 0a 09 74 6b 54  ("normal");..tkT
13e0: 65 78 74 57 6f 72 64 55 69 64 20 3d 20 54 6b 5f  extWordUid = Tk_
13f0: 47 65 74 55 69 64 28 22 77 6f 72 64 22 29 3b 0a  GetUid("word");.
1400: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
1410: 20 20 20 2a 20 43 72 65 61 74 65 20 74 68 65 20     * Create the 
1420: 77 69 6e 64 6f 77 2e 0a 20 20 20 20 20 2a 2f 0a  window..     */.
1430: 0a 20 20 20 20 6e 65 77 20 3d 20 54 6b 5f 43 72  .    new = Tk_Cr
1440: 65 61 74 65 57 69 6e 64 6f 77 46 72 6f 6d 50 61  eateWindowFromPa
1450: 74 68 28 69 6e 74 65 72 70 2c 20 74 6b 77 69 6e  th(interp, tkwin
1460: 2c 20 61 72 67 76 5b 31 5d 2c 20 28 63 68 61 72  , argv[1], (char
1470: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69   *) NULL);.    i
1480: 66 20 28 6e 65 77 20 3d 3d 20 4e 55 4c 4c 29 20  f (new == NULL) 
1490: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
14a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
14b0: 74 65 78 74 50 74 72 20 3d 20 28 54 6b 54 65 78  textPtr = (TkTex
14c0: 74 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a  t *) ckalloc(siz
14d0: 65 6f 66 28 54 6b 54 65 78 74 29 29 3b 0a 20 20  eof(TkText));.  
14e0: 20 20 74 65 78 74 50 74 72 2d 3e 74 6b 77 69 6e    textPtr->tkwin
14f0: 20 3d 20 6e 65 77 3b 0a 20 20 20 20 74 65 78 74   = new;.    text
1500: 50 74 72 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e  Ptr->interp = in
1510: 74 65 72 70 3b 0a 20 20 20 20 74 65 78 74 50 74  terp;.    textPt
1520: 72 2d 3e 77 69 64 67 65 74 43 6d 64 20 3d 20 54  r->widgetCmd = T
1530: 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
1540: 28 69 6e 74 65 72 70 2c 0a 09 20 20 20 20 54 6b  (interp,..    Tk
1550: 5f 50 61 74 68 4e 61 6d 65 28 74 65 78 74 50 74  _PathName(textPt
1560: 72 2d 3e 74 6b 77 69 6e 29 2c 20 54 65 78 74 57  r->tkwin), TextW
1570: 69 64 67 65 74 43 6d 64 2c 0a 09 20 20 20 20 28  idgetCmd,..    (
1580: 43 6c 69 65 6e 74 44 61 74 61 29 20 74 65 78 74  ClientData) text
1590: 50 74 72 2c 20 54 65 78 74 43 6d 64 44 65 6c 65  Ptr, TextCmdDele
15a0: 74 65 64 50 72 6f 63 29 3b 0a 20 20 20 20 74 65  tedProc);.    te
15b0: 78 74 50 74 72 2d 3e 74 72 65 65 20 3d 20 54 6b  xtPtr->tree = Tk
15c0: 42 54 72 65 65 43 72 65 61 74 65 28 29 3b 0a 20  BTreeCreate();. 
15d0: 20 20 20 54 63 6c 5f 49 6e 69 74 48 61 73 68 54     Tcl_InitHashT
15e0: 61 62 6c 65 28 26 74 65 78 74 50 74 72 2d 3e 74  able(&textPtr->t
15f0: 61 67 54 61 62 6c 65 2c 20 54 43 4c 5f 53 54 52  agTable, TCL_STR
1600: 49 4e 47 5f 4b 45 59 53 29 3b 0a 20 20 20 20 74  ING_KEYS);.    t
1610: 65 78 74 50 74 72 2d 3e 6e 75 6d 54 61 67 73 20  extPtr->numTags 
1620: 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 69  = 0;.    Tcl_Ini
1630: 74 48 61 73 68 54 61 62 6c 65 28 26 74 65 78 74  tHashTable(&text
1640: 50 74 72 2d 3e 6d 61 72 6b 54 61 62 6c 65 2c 20  Ptr->markTable, 
1650: 54 43 4c 5f 53 54 52 49 4e 47 5f 4b 45 59 53 29  TCL_STRING_KEYS)
1660: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 69 74 48 61  ;.    Tcl_InitHa
1670: 73 68 54 61 62 6c 65 28 26 74 65 78 74 50 74 72  shTable(&textPtr
1680: 2d 3e 77 69 6e 64 6f 77 54 61 62 6c 65 2c 20 54  ->windowTable, T
1690: 43 4c 5f 53 54 52 49 4e 47 5f 4b 45 59 53 29 3b  CL_STRING_KEYS);
16a0: 0a 20 20 20 20 74 65 78 74 50 74 72 2d 3e 73 74  .    textPtr->st
16b0: 61 74 65 20 3d 20 74 6b 54 65 78 74 4e 6f 72 6d  ate = tkTextNorm
16c0: 61 6c 55 69 64 3b 0a 20 20 20 20 74 65 78 74 50  alUid;.    textP
16d0: 74 72 2d 3e 62 6f 72 64 65 72 57 69 64 74 68 20  tr->borderWidth 
16e0: 3d 20 30 3b 0a 20 20 20 20 74 65 78 74 50 74 72  = 0;.    textPtr
16f0: 2d 3e 70 61 64 58 20 3d 20 30 3b 0a 20 20 20 20  ->padX = 0;.    
1700: 74 65 78 74 50 74 72 2d 3e 70 61 64 59 20 3d 20  textPtr->padY = 
1710: 30 3b 0a 20 20 20 20 74 65 78 74 50 74 72 2d 3e  0;.    textPtr->
1720: 73 70 61 63 69 6e 67 31 20 3d 20 30 3b 0a 20 20  spacing1 = 0;.  
1730: 20 20 74 65 78 74 50 74 72 2d 3e 73 70 61 63 69    textPtr->spaci
1740: 6e 67 32 20 3d 20 30 3b 0a 20 20 20 20 74 65 78  ng2 = 0;.    tex
1750: 74 50 74 72 2d 3e 73 70 61 63 69 6e 67 33 20 3d  tPtr->spacing3 =
1760: 20 30 3b 0a 20 20 20 20 74 65 78 74 50 74 72 2d   0;.    textPtr-
1770: 3e 74 61 62 4f 70 74 69 6f 6e 53 74 72 69 6e 67  >tabOptionString
1780: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 74 65 78   = NULL;.    tex
1790: 74 50 74 72 2d 3e 74 61 62 41 72 72 61 79 50 74  tPtr->tabArrayPt
17a0: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 74 65  r = NULL;.    te
17b0: 78 74 50 74 72 2d 3e 77 72 61 70 4d 6f 64 65 20  xtPtr->wrapMode 
17c0: 3d 20 74 6b 54 65 78 74 43 68 61 72 55 69 64 3b  = tkTextCharUid;
17d0: 0a 20 20 20 20 74 65 78 74 50 74 72 2d 3e 77 69  .    textPtr->wi
17e0: 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 74 65 78  dth = 0;.    tex
17f0: 74 50 74 72 2d 3e 68 65 69 67 68 74 20 3d 20 30  tPtr->height = 0
1800: 3b 0a 20 20 20 20 74 65 78 74 50 74 72 2d 3e 70  ;.    textPtr->p
1810: 72 65 76 57 69 64 74 68 20 3d 20 54 6b 5f 57 69  revWidth = Tk_Wi
1820: 64 74 68 28 6e 65 77 29 3b 0a 20 20 20 20 74 65  dth(new);.    te
1830: 78 74 50 74 72 2d 3e 70 72 65 76 48 65 69 67 68  xtPtr->prevHeigh
1840: 74 20 3d 20 54 6b 5f 48 65 69 67 68 74 28 6e 65  t = Tk_Height(ne
1850: 77 29 3b 0a 20 20 20 20 54 6b 54 65 78 74 43 72  w);.    TkTextCr
1860: 65 61 74 65 44 49 6e 66 6f 28 74 65 78 74 50 74  eateDInfo(textPt
1870: 72 29 3b 0a 20 20 20 20 54 6b 54 65 78 74 4d 61  r);.    TkTextMa
1880: 6b 65 49 6e 64 65 78 28 74 65 78 74 50 74 72 2d  keIndex(textPtr-
1890: 3e 74 72 65 65 2c 20 30 2c 20 30 2c 20 26 73 74  >tree, 0, 0, &st
18a0: 61 72 74 49 6e 64 65 78 29 3b 0a 20 20 20 20 54  artIndex);.    T
18b0: 6b 54 65 78 74 53 65 74 59 56 69 65 77 28 74 65  kTextSetYView(te
18c0: 78 74 50 74 72 2c 20 26 73 74 61 72 74 49 6e 64  xtPtr, &startInd
18d0: 65 78 2c 20 30 29 3b 0a 20 20 20 20 74 65 78 74  ex, 0);.    text
18e0: 50 74 72 2d 3e 73 65 6c 54 61 67 50 74 72 20 3d  Ptr->selTagPtr =
18f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 74 65 78 74 50   NULL;.    textP
1900: 74 72 2d 3e 69 6e 73 65 72 74 4d 61 72 6b 50 74  tr->insertMarkPt
1910: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 74 65  r = NULL;.    te
1920: 78 74 50 74 72 2d 3e 74 61 6b 65 46 6f 63 75 73  xtPtr->takeFocus
1930: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 74 65 78   = NULL;.    tex
1940: 74 50 74 72 2d 3e 78 53 63 72 6f 6c 6c 43 6d 64  tPtr->xScrollCmd
1950: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 74 65 78   = NULL;.    tex
1960: 74 50 74 72 2d 3e 79 53 63 72 6f 6c 6c 43 6d 64  tPtr->yScrollCmd
1970: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 74 65 78   = NULL;.    tex
1980: 74 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  tPtr->flags = 0;
1990: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
19a0: 43 72 65 61 74 65 20 74 68 65 20 22 73 65 6c 22  Create the "sel"
19b0: 20 74 61 67 20 61 6e 64 20 74 68 65 20 22 69 6e   tag and the "in
19c0: 73 65 72 74 22 20 6d 61 72 6b 2e 0a 20 20 20 20  sert" mark..    
19d0: 20 2a 2f 0a 0a 20 20 20 20 74 65 78 74 50 74 72   */..    textPtr
19e0: 2d 3e 73 65 6c 54 61 67 50 74 72 20 3d 20 54 6b  ->selTagPtr = Tk
19f0: 54 65 78 74 43 72 65 61 74 65 54 61 67 28 74 65  TextCreateTag(te
1a00: 78 74 50 74 72 2c 20 22 73 65 6c 22 29 3b 0a 20  xtPtr, "sel");. 
1a10: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 68 6f     /*.     * Sho
1a20: 75 6c 64 20 73 65 74 20 22 73 65 6c 22 20 74 61  uld set "sel" ta
1a30: 67 20 74 6f 20 52 45 56 45 52 53 45 20 73 74 79  g to REVERSE sty
1a40: 6c 65 20 68 65 72 65 20 28 77 68 65 6e 20 49 20  le here (when I 
1a50: 73 75 70 70 6f 72 74 0a 20 20 20 20 20 2a 20 73  support.     * s
1a60: 65 74 74 69 6e 67 20 61 72 62 69 74 72 61 72 79  etting arbitrary
1a70: 20 73 74 79 6c 65 73 20 66 6f 72 20 74 61 67 73   styles for tags
1a80: 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 74  )..     */.    t
1a90: 65 78 74 50 74 72 2d 3e 69 6e 73 65 72 74 4d 61  extPtr->insertMa
1aa0: 72 6b 50 74 72 20 3d 20 54 6b 54 65 78 74 53 65  rkPtr = TkTextSe
1ab0: 74 4d 61 72 6b 28 74 65 78 74 50 74 72 2c 20 22  tMark(textPtr, "
1ac0: 69 6e 73 65 72 74 22 2c 20 26 73 74 61 72 74 49  insert", &startI
1ad0: 6e 64 65 78 29 3b 0a 0a 20 20 20 20 54 6b 5f 53  ndex);..    Tk_S
1ae0: 65 74 43 6c 61 73 73 28 6e 65 77 2c 20 22 54 65  etClass(new, "Te
1af0: 78 74 22 29 3b 0a 20 20 20 20 54 6b 5f 43 72 65  xt");.    Tk_Cre
1b00: 61 74 65 45 76 65 6e 74 48 61 6e 64 6c 65 72 28  ateEventHandler(
1b10: 74 65 78 74 50 74 72 2d 3e 74 6b 77 69 6e 2c 0a  textPtr->tkwin,.
1b20: 20 20 20 20 09 20 20 20 20 43 54 4b 5f 45 58 50      .    CTK_EXP
1b30: 4f 53 45 5f 45 56 45 4e 54 5f 4d 41 53 4b 7c 43  OSE_EVENT_MASK|C
1b40: 54 4b 5f 44 45 53 54 52 4f 59 5f 45 56 45 4e 54  TK_DESTROY_EVENT
1b50: 5f 4d 41 53 4b 7c 43 54 4b 5f 4d 41 50 5f 45 56  _MASK|CTK_MAP_EV
1b60: 45 4e 54 5f 4d 41 53 4b 0a 20 20 20 20 09 20 20  ENT_MASK.    .  
1b70: 20 20 7c 43 54 4b 5f 46 4f 43 55 53 5f 45 56 45    |CTK_FOCUS_EVE
1b80: 4e 54 5f 4d 41 53 4b 2c 0a 09 20 20 20 20 54 65  NT_MASK,..    Te
1b90: 78 74 45 76 65 6e 74 50 72 6f 63 2c 20 28 43 6c  xtEventProc, (Cl
1ba0: 69 65 6e 74 44 61 74 61 29 20 74 65 78 74 50 74  ientData) textPt
1bb0: 72 29 3b 0a 20 20 20 20 69 66 20 28 43 6f 6e 66  r);.    if (Conf
1bc0: 69 67 75 72 65 54 65 78 74 28 69 6e 74 65 72 70  igureText(interp
1bd0: 2c 20 74 65 78 74 50 74 72 2c 20 61 72 67 63 2d  , textPtr, argc-
1be0: 32 2c 20 61 72 67 76 2b 32 2c 20 30 29 20 21 3d  2, argv+2, 0) !=
1bf0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 6b 5f 44   TCL_OK) {..Tk_D
1c00: 65 73 74 72 6f 79 57 69 6e 64 6f 77 28 74 65 78  estroyWindow(tex
1c10: 74 50 74 72 2d 3e 74 6b 77 69 6e 29 3b 0a 09 72  tPtr->tkwin);..r
1c20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c30: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53  .    }.    Tcl_S
1c40: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1c50: 54 6b 5f 50 61 74 68 4e 61 6d 65 28 74 65 78 74  Tk_PathName(text
1c60: 50 74 72 2d 3e 74 6b 77 69 6e 29 2c 54 43 4c 5f  Ptr->tkwin),TCL_
1c70: 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20  VOLATILE);..    
1c80: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1c90: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cd0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 65 78  ------. *. * Tex
1ce0: 74 57 69 64 67 65 74 43 6d 64 20 2d 2d 0a 20 2a  tWidgetCmd --. *
1cf0: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
1d00: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
1d10: 20 70 72 6f 63 65 73 73 20 74 68 65 20 54 63 6c   process the Tcl
1d20: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 68 61 74   command. *.that
1d30: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1d40: 61 20 74 65 78 74 20 77 69 64 67 65 74 2e 20 20  a text widget.  
1d50: 53 65 65 20 74 68 65 20 75 73 65 72 0a 20 2a 09  See the user. *.
1d60: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
1d70: 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61  r details on wha
1d80: 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20 2a  t it does.. *. *
1d90: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
1da0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
1db0: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
1dc0: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 65 20 74  ffects:. *.See t
1dd0: 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74  he user document
1de0: 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ation.. *. *----
1df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
1e30: 73 74 61 74 69 63 20 69 6e 74 0a 54 65 78 74 57  static int.TextW
1e40: 69 64 67 65 74 43 6d 64 28 63 6c 69 65 6e 74 44  idgetCmd(clientD
1e50: 61 74 61 2c 20 69 6e 74 65 72 70 2c 20 61 72 67  ata, interp, arg
1e60: 63 2c 20 61 72 67 76 29 0a 20 20 20 20 43 6c 69  c, argv).    Cli
1e70: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
1e80: 74 61 3b 09 2f 2a 20 49 6e 66 6f 72 6d 61 74 69  ta;./* Informati
1e90: 6f 6e 20 61 62 6f 75 74 20 74 65 78 74 20 77 69  on about text wi
1ea0: 64 67 65 74 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  dget. */.    Tcl
1eb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
1ec0: 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74  ../* Current int
1ed0: 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20  erpreter. */.   
1ee0: 20 69 6e 74 20 61 72 67 63 3b 09 09 09 2f 2a 20   int argc;.../* 
1ef0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
1f00: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72  nts. */.    char
1f10: 20 2a 2a 61 72 67 76 3b 09 09 2f 2a 20 41 72 67   **argv;../* Arg
1f20: 75 6d 65 6e 74 20 73 74 72 69 6e 67 73 2e 20 2a  ument strings. *
1f30: 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72  /.{.    register
1f40: 20 54 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72   TkText *textPtr
1f50: 20 3d 20 28 54 6b 54 65 78 74 20 2a 29 20 63 6c   = (TkText *) cl
1f60: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 69 6e  ientData;.    in
1f70: 74 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f  t result = TCL_O
1f80: 4b 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65  K;.    size_t le
1f90: 6e 67 74 68 3b 0a 20 20 20 20 69 6e 74 20 63 3b  ngth;.    int c;
1fa0: 0a 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78  .    TkTextIndex
1fb0: 20 69 6e 64 65 78 31 2c 20 69 6e 64 65 78 32 3b   index1, index2;
1fc0: 0a 0a 20 20 20 20 69 66 20 28 61 72 67 63 20 3c  ..    if (argc <
1fd0: 20 32 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e   2) {..Tcl_Appen
1fe0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ff0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2000: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 09 09  hould be \"",...
2010: 61 72 67 76 5b 30 5d 2c 20 22 20 6f 70 74 69 6f  argv[0], " optio
2020: 6e 20 3f 61 72 67 20 61 72 67 20 2e 2e 2e 3f 5c  n ?arg arg ...?\
2030: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  "", (char *) NUL
2040: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
2050: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
2060: 20 54 6b 5f 50 72 65 73 65 72 76 65 28 28 43 6c   Tk_Preserve((Cl
2070: 69 65 6e 74 44 61 74 61 29 20 74 65 78 74 50 74  ientData) textPt
2080: 72 29 3b 0a 20 20 20 20 63 20 3d 20 61 72 67 76  r);.    c = argv
2090: 5b 31 5d 5b 30 5d 3b 0a 20 20 20 20 6c 65 6e 67  [1][0];.    leng
20a0: 74 68 20 3d 20 73 74 72 6c 65 6e 28 61 72 67 76  th = strlen(argv
20b0: 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 28 28 63  [1]);.    if ((c
20c0: 20 3d 3d 20 27 62 27 29 20 26 26 20 28 73 74 72   == 'b') && (str
20d0: 6e 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22 62  ncmp(argv[1], "b
20e0: 62 6f 78 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d  box", length) ==
20f0: 20 30 29 29 20 7b 0a 09 69 6e 74 20 78 2c 20 79   0)) {..int x, y
2100: 2c 20 77 69 64 74 68 2c 20 68 65 69 67 68 74 3b  , width, height;
2110: 0a 0a 09 69 66 20 28 61 72 67 63 20 21 3d 20 33  ...if (argc != 3
2120: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
2130: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2140: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2150: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
2160: 09 09 20 20 20 20 61 72 67 76 5b 30 5d 2c 20 22  ..    argv[0], "
2170: 20 62 62 6f 78 20 69 6e 64 65 78 5c 22 22 2c 20   bbox index\"", 
2180: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
2190: 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 43  .    result = TC
21a0: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 67 6f  L_ERROR;..    go
21b0: 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 69 66 20  to done;..}..if 
21c0: 28 54 6b 54 65 78 74 47 65 74 49 6e 64 65 78 28  (TkTextGetIndex(
21d0: 69 6e 74 65 72 70 2c 20 74 65 78 74 50 74 72 2c  interp, textPtr,
21e0: 20 61 72 67 76 5b 32 5d 2c 20 26 69 6e 64 65 78   argv[2], &index
21f0: 31 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  1) != TCL_OK) {.
2200: 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 43  .    result = TC
2210: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 67 6f  L_ERROR;..    go
2220: 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 69 66 20  to done;..}..if 
2230: 28 54 6b 54 65 78 74 43 68 61 72 42 62 6f 78 28  (TkTextCharBbox(
2240: 74 65 78 74 50 74 72 2c 20 26 69 6e 64 65 78 31  textPtr, &index1
2250: 2c 20 26 78 2c 20 26 79 2c 20 26 77 69 64 74 68  , &x, &y, &width
2260: 2c 20 26 68 65 69 67 68 74 29 20 3d 3d 20 30 29  , &height) == 0)
2270: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 62 75 66   {..    char buf
2280: 66 65 72 5b 38 30 5d 3b 0a 09 20 20 20 20 73 70  fer[80];..    sp
2290: 72 69 6e 74 66 28 62 75 66 66 65 72 2c 20 22 25  rintf(buffer, "%
22a0: 64 20 25 64 20 25 64 20 25 64 22 2c 20 78 2c 20  d %d %d %d", x, 
22b0: 79 2c 20 77 69 64 74 68 2c 20 68 65 69 67 68 74  y, width, height
22c0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 52  );..    Tcl_SetR
22d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 62 75 66  esult(interp,buf
22e0: 66 65 72 2c 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  fer,TCL_VOLATILE
22f0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  );..}.    } else
2300: 20 69 66 20 28 28 63 20 3d 3d 20 27 63 27 29 20   if ((c == 'c') 
2310: 26 26 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76  && (strncmp(argv
2320: 5b 31 5d 2c 20 22 63 67 65 74 22 2c 20 6c 65 6e  [1], "cget", len
2330: 67 74 68 29 20 3d 3d 20 30 29 0a 09 20 20 20 20  gth) == 0)..    
2340: 26 26 20 28 6c 65 6e 67 74 68 20 3e 3d 20 32 29  && (length >= 2)
2350: 29 20 7b 0a 09 69 66 20 28 61 72 67 63 20 21 3d  ) {..if (argc !=
2360: 20 33 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41   3) {..    Tcl_A
2370: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2380: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
2390: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
23a0: 2c 0a 09 09 20 20 20 20 61 72 67 76 5b 30 5d 2c  ,...    argv[0],
23b0: 20 22 20 63 67 65 74 20 6f 70 74 69 6f 6e 5c 22   " cget option\"
23c0: 22 2c 0a 09 09 20 20 20 20 28 63 68 61 72 20 2a  ",...    (char *
23d0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  ) NULL);..    re
23e0: 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52  sult = TCL_ERROR
23f0: 3b 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65  ;..    goto done
2400: 3b 0a 09 7d 0a 09 72 65 73 75 6c 74 20 3d 20 54  ;..}..result = T
2410: 6b 5f 43 6f 6e 66 69 67 75 72 65 56 61 6c 75 65  k_ConfigureValue
2420: 28 69 6e 74 65 72 70 2c 20 74 65 78 74 50 74 72  (interp, textPtr
2430: 2d 3e 74 6b 77 69 6e 2c 20 63 6f 6e 66 69 67 53  ->tkwin, configS
2440: 70 65 63 73 2c 0a 09 09 28 63 68 61 72 20 2a 29  pecs,...(char *)
2450: 20 74 65 78 74 50 74 72 2c 20 61 72 67 76 5b 32   textPtr, argv[2
2460: 5d 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  ], 0);.    } els
2470: 65 20 69 66 20 28 28 63 20 3d 3d 20 27 63 27 29  e if ((c == 'c')
2480: 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 72 67   && (strncmp(arg
2490: 76 5b 31 5d 2c 20 22 63 6f 6d 70 61 72 65 22 2c  v[1], "compare",
24a0: 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29 0a 09   length) == 0)..
24b0: 20 20 20 20 26 26 20 28 6c 65 6e 67 74 68 20 3e      && (length >
24c0: 3d 20 33 29 29 20 7b 0a 09 69 6e 74 20 72 65 6c  = 3)) {..int rel
24d0: 61 74 69 6f 6e 2c 20 76 61 6c 75 65 3b 0a 09 63  ation, value;..c
24e0: 68 61 72 20 2a 70 3b 0a 0a 09 69 66 20 28 61 72  har *p;...if (ar
24f0: 67 63 20 21 3d 20 35 29 20 7b 0a 09 20 20 20 20  gc != 5) {..    
2500: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2510: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2520: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2530: 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72 67  e \"",...    arg
2540: 76 5b 30 5d 2c 20 22 20 63 6f 6d 70 61 72 65 20  v[0], " compare 
2550: 69 6e 64 65 78 31 20 6f 70 20 69 6e 64 65 78 32  index1 op index2
2560: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  \"", (char *) NU
2570: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 73 75 6c 74  LL);..    result
2580: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20   = TCL_ERROR;.. 
2590: 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d     goto done;..}
25a0: 0a 09 69 66 20 28 28 54 6b 54 65 78 74 47 65 74  ..if ((TkTextGet
25b0: 49 6e 64 65 78 28 69 6e 74 65 72 70 2c 20 74 65  Index(interp, te
25c0: 78 74 50 74 72 2c 20 61 72 67 76 5b 32 5d 2c 20  xtPtr, argv[2], 
25d0: 26 69 6e 64 65 78 31 29 20 21 3d 20 54 43 4c 5f  &index1) != TCL_
25e0: 4f 4b 29 0a 09 09 7c 7c 20 28 54 6b 54 65 78 74  OK)...|| (TkText
25f0: 47 65 74 49 6e 64 65 78 28 69 6e 74 65 72 70 2c  GetIndex(interp,
2600: 20 74 65 78 74 50 74 72 2c 20 61 72 67 76 5b 34   textPtr, argv[4
2610: 5d 2c 20 26 69 6e 64 65 78 32 29 0a 09 09 21 3d  ], &index2)...!=
2620: 20 54 43 4c 5f 4f 4b 29 29 20 7b 0a 09 20 20 20   TCL_OK)) {..   
2630: 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52   result = TCL_ER
2640: 52 4f 52 3b 0a 09 20 20 20 20 67 6f 74 6f 20 64  ROR;..    goto d
2650: 6f 6e 65 3b 0a 09 7d 0a 09 72 65 6c 61 74 69 6f  one;..}..relatio
2660: 6e 20 3d 20 54 6b 54 65 78 74 49 6e 64 65 78 43  n = TkTextIndexC
2670: 6d 70 28 26 69 6e 64 65 78 31 2c 20 26 69 6e 64  mp(&index1, &ind
2680: 65 78 32 29 3b 0a 09 70 20 3d 20 61 72 67 76 5b  ex2);..p = argv[
2690: 33 5d 3b 0a 09 69 66 20 28 70 5b 30 5d 20 3d 3d  3];..if (p[0] ==
26a0: 20 27 3c 27 29 20 7b 0a 09 09 76 61 6c 75 65 20   '<') {...value 
26b0: 3d 20 28 72 65 6c 61 74 69 6f 6e 20 3c 20 30 29  = (relation < 0)
26c0: 3b 0a 09 20 20 20 20 69 66 20 28 28 70 5b 31 5d  ;..    if ((p[1]
26d0: 20 3d 3d 20 27 3d 27 29 20 26 26 20 28 70 5b 32   == '=') && (p[2
26e0: 5d 20 3d 3d 20 30 29 29 20 7b 0a 09 09 76 61 6c  ] == 0)) {...val
26f0: 75 65 20 3d 20 28 72 65 6c 61 74 69 6f 6e 20 3c  ue = (relation <
2700: 3d 20 30 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73  = 0);..    } els
2710: 65 20 69 66 20 28 70 5b 31 5d 20 21 3d 20 30 29  e if (p[1] != 0)
2720: 20 7b 0a 09 09 63 6f 6d 70 61 72 65 45 72 72 6f   {...compareErro
2730: 72 3a 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  r:...Tcl_AppendR
2740: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
2750: 61 64 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  ad comparison op
2760: 65 72 61 74 6f 72 20 5c 22 22 2c 0a 09 09 09 61  erator \"",....a
2770: 72 67 76 5b 33 5d 2c 20 22 5c 22 3a 20 6d 75 73  rgv[3], "\": mus
2780: 74 20 62 65 20 3c 2c 20 3c 3d 2c 20 3d 3d 2c 20  t be <, <=, ==, 
2790: 3e 3d 2c 20 3e 2c 20 6f 72 20 21 3d 22 2c 0a 09  >=, >, or !=",..
27a0: 09 09 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  ..(char *) NULL)
27b0: 3b 0a 09 09 72 65 73 75 6c 74 20 3d 20 54 43 4c  ;...result = TCL
27c0: 5f 45 52 52 4f 52 3b 0a 09 09 67 6f 74 6f 20 64  _ERROR;...goto d
27d0: 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65  one;..    }..} e
27e0: 6c 73 65 20 69 66 20 28 70 5b 30 5d 20 3d 3d 20  lse if (p[0] == 
27f0: 27 3e 27 29 20 7b 0a 09 09 76 61 6c 75 65 20 3d  '>') {...value =
2800: 20 28 72 65 6c 61 74 69 6f 6e 20 3e 20 30 29 3b   (relation > 0);
2810: 0a 09 20 20 20 20 69 66 20 28 28 70 5b 31 5d 20  ..    if ((p[1] 
2820: 3d 3d 20 27 3d 27 29 20 26 26 20 28 70 5b 32 5d  == '=') && (p[2]
2830: 20 3d 3d 20 30 29 29 20 7b 0a 09 09 76 61 6c 75   == 0)) {...valu
2840: 65 20 3d 20 28 72 65 6c 61 74 69 6f 6e 20 3e 3d  e = (relation >=
2850: 20 30 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65   0);..    } else
2860: 20 69 66 20 28 70 5b 31 5d 20 21 3d 20 30 29 20   if (p[1] != 0) 
2870: 7b 0a 09 09 67 6f 74 6f 20 63 6f 6d 70 61 72 65  {...goto compare
2880: 45 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 7d  Error;..    }..}
2890: 20 65 6c 73 65 20 69 66 20 28 28 70 5b 30 5d 20   else if ((p[0] 
28a0: 3d 3d 20 27 3d 27 29 20 26 26 20 28 70 5b 31 5d  == '=') && (p[1]
28b0: 20 3d 3d 20 27 3d 27 29 20 26 26 20 28 70 5b 32   == '=') && (p[2
28c0: 5d 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20  ] == 0)) {..    
28d0: 76 61 6c 75 65 20 3d 20 28 72 65 6c 61 74 69 6f  value = (relatio
28e0: 6e 20 3d 3d 20 30 29 3b 0a 09 7d 20 65 6c 73 65  n == 0);..} else
28f0: 20 69 66 20 28 28 70 5b 30 5d 20 3d 3d 20 27 21   if ((p[0] == '!
2900: 27 29 20 26 26 20 28 70 5b 31 5d 20 3d 3d 20 27  ') && (p[1] == '
2910: 3d 27 29 20 26 26 20 28 70 5b 32 5d 20 3d 3d 20  =') && (p[2] == 
2920: 30 29 29 20 7b 0a 09 20 20 20 20 76 61 6c 75 65  0)) {..    value
2930: 20 3d 20 28 72 65 6c 61 74 69 6f 6e 20 21 3d 20   = (relation != 
2940: 30 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  0);..} else {.. 
2950: 20 20 20 67 6f 74 6f 20 63 6f 6d 70 61 72 65 45     goto compareE
2960: 72 72 6f 72 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65  rror;..}..Tcl_Se
2970: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 28  tResult(interp,(
2980: 76 61 6c 75 65 29 20 3f 20 22 31 22 20 3a 20 22  value) ? "1" : "
2990: 30 22 2c 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  0",TCL_STATIC);.
29a0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28      } else if ((
29b0: 63 20 3d 3d 20 27 63 27 29 20 26 26 20 28 73 74  c == 'c') && (st
29c0: 72 6e 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22  rncmp(argv[1], "
29d0: 63 6f 6e 66 69 67 75 72 65 22 2c 20 6c 65 6e 67  configure", leng
29e0: 74 68 29 20 3d 3d 20 30 29 0a 09 20 20 20 20 26  th) == 0)..    &
29f0: 26 20 28 6c 65 6e 67 74 68 20 3e 3d 20 33 29 29  & (length >= 3))
2a00: 20 7b 0a 09 69 66 20 28 61 72 67 63 20 3d 3d 20   {..if (argc == 
2a10: 32 29 20 7b 0a 09 20 20 20 20 72 65 73 75 6c 74  2) {..    result
2a20: 20 3d 20 54 6b 5f 43 6f 6e 66 69 67 75 72 65 49   = Tk_ConfigureI
2a30: 6e 66 6f 28 69 6e 74 65 72 70 2c 20 74 65 78 74  nfo(interp, text
2a40: 50 74 72 2d 3e 74 6b 77 69 6e 2c 20 63 6f 6e 66  Ptr->tkwin, conf
2a50: 69 67 53 70 65 63 73 2c 0a 09 09 20 20 20 20 28  igSpecs,...    (
2a60: 63 68 61 72 20 2a 29 20 74 65 78 74 50 74 72 2c  char *) textPtr,
2a70: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 2c 20   (char *) NULL, 
2a80: 30 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  0);..} else if (
2a90: 61 72 67 63 20 3d 3d 20 33 29 20 7b 0a 09 20 20  argc == 3) {..  
2aa0: 20 20 72 65 73 75 6c 74 20 3d 20 54 6b 5f 43 6f    result = Tk_Co
2ab0: 6e 66 69 67 75 72 65 49 6e 66 6f 28 69 6e 74 65  nfigureInfo(inte
2ac0: 72 70 2c 20 74 65 78 74 50 74 72 2d 3e 74 6b 77  rp, textPtr->tkw
2ad0: 69 6e 2c 20 63 6f 6e 66 69 67 53 70 65 63 73 2c  in, configSpecs,
2ae0: 0a 09 09 20 20 20 20 28 63 68 61 72 20 2a 29 20  ...    (char *) 
2af0: 74 65 78 74 50 74 72 2c 20 61 72 67 76 5b 32 5d  textPtr, argv[2]
2b00: 2c 20 30 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  , 0);..} else {.
2b10: 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 43 6f  .    result = Co
2b20: 6e 66 69 67 75 72 65 54 65 78 74 28 69 6e 74 65  nfigureText(inte
2b30: 72 70 2c 20 74 65 78 74 50 74 72 2c 20 61 72 67  rp, textPtr, arg
2b40: 63 2d 32 2c 20 61 72 67 76 2b 32 2c 0a 09 09 20  c-2, argv+2,... 
2b50: 20 20 20 54 4b 5f 43 4f 4e 46 49 47 5f 41 52 47     TK_CONFIG_ARG
2b60: 56 5f 4f 4e 4c 59 29 3b 0a 09 7d 0a 20 20 20 20  V_ONLY);..}.    
2b70: 7d 20 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d  } else if ((c ==
2b80: 20 27 64 27 29 20 26 26 20 28 73 74 72 6e 63 6d   'd') && (strncm
2b90: 70 28 61 72 67 76 5b 31 5d 2c 20 22 64 65 62 75  p(argv[1], "debu
2ba0: 67 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30  g", length) == 0
2bb0: 29 0a 09 20 20 20 20 26 26 20 28 6c 65 6e 67 74  )..    && (lengt
2bc0: 68 20 3e 3d 20 33 29 29 20 7b 0a 09 69 66 20 28  h >= 3)) {..if (
2bd0: 61 72 67 63 20 3e 20 33 29 20 7b 0a 09 20 20 20  argc > 3) {..   
2be0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2bf0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
2c00: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
2c10: 62 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72  be \"",...    ar
2c20: 67 76 5b 30 5d 2c 20 22 20 64 65 62 75 67 20 62  gv[0], " debug b
2c30: 6f 6f 6c 65 61 6e 5c 22 22 2c 20 28 63 68 61 72  oolean\"", (char
2c40: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
2c50: 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52  result = TCL_ERR
2c60: 4f 52 3b 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f  OR;..    goto do
2c70: 6e 65 3b 0a 09 7d 0a 09 69 66 20 28 61 72 67 63  ne;..}..if (argc
2c80: 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 54 63   == 2) {..    Tc
2c90: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
2ca0: 72 70 2c 28 74 6b 42 54 72 65 65 44 65 62 75 67  rp,(tkBTreeDebug
2cb0: 29 20 3f 20 22 31 22 20 3a 20 22 30 22 2c 54 43  ) ? "1" : "0",TC
2cc0: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 7d 20 65 6c  L_STATIC);..} el
2cd0: 73 65 20 7b 0a 09 20 20 20 20 69 66 20 28 54 63  se {..    if (Tc
2ce0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 28 69 6e 74  l_GetBoolean(int
2cf0: 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 74  erp, argv[2], &t
2d00: 6b 42 54 72 65 65 44 65 62 75 67 29 20 21 3d 20  kBTreeDebug) != 
2d10: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 73 75  TCL_OK) {...resu
2d20: 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  lt = TCL_ERROR;.
2d30: 09 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 20 20  ..goto done;..  
2d40: 20 20 7d 0a 09 20 20 20 20 74 6b 54 65 78 74 44    }..    tkTextD
2d50: 65 62 75 67 20 3d 20 74 6b 42 54 72 65 65 44 65  ebug = tkBTreeDe
2d60: 62 75 67 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  bug;..}.    } el
2d70: 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27 64 27  se if ((c == 'd'
2d80: 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 72  ) && (strncmp(ar
2d90: 67 76 5b 31 5d 2c 20 22 64 65 6c 65 74 65 22 2c  gv[1], "delete",
2da0: 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29 0a 09   length) == 0)..
2db0: 20 20 20 20 26 26 20 28 6c 65 6e 67 74 68 20 3e      && (length >
2dc0: 3d 20 33 29 29 20 7b 0a 09 69 66 20 28 28 61 72  = 3)) {..if ((ar
2dd0: 67 63 20 21 3d 20 33 29 20 26 26 20 28 61 72 67  gc != 3) && (arg
2de0: 63 20 21 3d 20 34 29 29 20 7b 0a 09 20 20 20 20  c != 4)) {..    
2df0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2e00: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2e10: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2e20: 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72 67  e \"",...    arg
2e30: 76 5b 30 5d 2c 20 22 20 64 65 6c 65 74 65 20 69  v[0], " delete i
2e40: 6e 64 65 78 31 20 3f 69 6e 64 65 78 32 3f 5c 22  ndex1 ?index2?\"
2e50: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
2e60: 29 3b 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d  );..    result =
2e70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
2e80: 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09   goto done;..}..
2e90: 69 66 20 28 74 65 78 74 50 74 72 2d 3e 73 74 61  if (textPtr->sta
2ea0: 74 65 20 3d 3d 20 74 6b 54 65 78 74 4e 6f 72 6d  te == tkTextNorm
2eb0: 61 6c 55 69 64 29 20 7b 0a 09 20 20 20 20 72 65  alUid) {..    re
2ec0: 73 75 6c 74 20 3d 20 44 65 6c 65 74 65 43 68 61  sult = DeleteCha
2ed0: 72 73 28 74 65 78 74 50 74 72 2c 20 61 72 67 76  rs(textPtr, argv
2ee0: 5b 32 5d 2c 0a 09 09 20 20 20 20 28 61 72 67 63  [2],...    (argc
2ef0: 20 3d 3d 20 34 29 20 3f 20 61 72 67 76 5b 33 5d   == 4) ? argv[3]
2f00: 20 3a 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c   : (char *) NULL
2f10: 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  );..}.    } else
2f20: 20 69 66 20 28 28 63 20 3d 3d 20 27 64 27 29 20   if ((c == 'd') 
2f30: 26 26 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76  && (strncmp(argv
2f40: 5b 31 5d 2c 20 22 64 6c 69 6e 65 69 6e 66 6f 22  [1], "dlineinfo"
2f50: 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29 0a  , length) == 0).
2f60: 09 20 20 20 20 26 26 20 28 6c 65 6e 67 74 68 20  .    && (length 
2f70: 3e 3d 20 32 29 29 20 7b 0a 09 69 6e 74 20 78 2c  >= 2)) {..int x,
2f80: 20 79 2c 20 77 69 64 74 68 2c 20 68 65 69 67 68   y, width, heigh
2f90: 74 2c 20 62 61 73 65 3b 0a 0a 09 69 66 20 28 61  t, base;...if (a
2fa0: 72 67 63 20 21 3d 20 33 29 20 7b 0a 09 20 20 20  rgc != 3) {..   
2fb0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2fc0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
2fd0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
2fe0: 62 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72  be \"",...    ar
2ff0: 67 76 5b 30 5d 2c 20 22 20 64 6c 69 6e 65 69 6e  gv[0], " dlinein
3000: 66 6f 20 69 6e 64 65 78 5c 22 22 2c 20 28 63 68  fo index\"", (ch
3010: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
3020: 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45    result = TCL_E
3030: 52 52 4f 52 3b 0a 09 20 20 20 20 67 6f 74 6f 20  RROR;..    goto 
3040: 64 6f 6e 65 3b 0a 09 7d 0a 09 69 66 20 28 54 6b  done;..}..if (Tk
3050: 54 65 78 74 47 65 74 49 6e 64 65 78 28 69 6e 74  TextGetIndex(int
3060: 65 72 70 2c 20 74 65 78 74 50 74 72 2c 20 61 72  erp, textPtr, ar
3070: 67 76 5b 32 5d 2c 20 26 69 6e 64 65 78 31 29 20  gv[2], &index1) 
3080: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
3090: 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45    result = TCL_E
30a0: 52 52 4f 52 3b 0a 09 20 20 20 20 67 6f 74 6f 20  RROR;..    goto 
30b0: 64 6f 6e 65 3b 0a 09 7d 0a 09 69 66 20 28 54 6b  done;..}..if (Tk
30c0: 54 65 78 74 44 4c 69 6e 65 49 6e 66 6f 28 74 65  TextDLineInfo(te
30d0: 78 74 50 74 72 2c 20 26 69 6e 64 65 78 31 2c 20  xtPtr, &index1, 
30e0: 26 78 2c 20 26 79 2c 20 26 77 69 64 74 68 2c 20  &x, &y, &width, 
30f0: 26 68 65 69 67 68 74 2c 20 26 62 61 73 65 29 0a  &height, &base).
3100: 09 09 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 63  ..== 0) {..    c
3110: 68 61 72 20 62 75 66 66 65 72 5b 31 30 30 5d 3b  har buffer[100];
3120: 0a 09 20 20 20 20 73 70 72 69 6e 74 66 28 62 75  ..    sprintf(bu
3130: 66 66 65 72 2c 20 22 25 64 20 25 64 20 25 64 20  ffer, "%d %d %d 
3140: 25 64 20 25 64 22 2c 0a 09 20 20 20 20 09 20 20  %d %d",..    .  
3150: 20 20 78 2c 20 79 2c 20 77 69 64 74 68 2c 20 68    x, y, width, h
3160: 65 69 67 68 74 2c 20 62 61 73 65 29 3b 0a 09 20  eight, base);.. 
3170: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
3180: 28 69 6e 74 65 72 70 2c 62 75 66 66 65 72 2c 54  (interp,buffer,T
3190: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 09 7d  CL_VOLATILE);..}
31a0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
31b0: 28 63 20 3d 3d 20 27 67 27 29 20 26 26 20 28 73  (c == 'g') && (s
31c0: 74 72 6e 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20  trncmp(argv[1], 
31d0: 22 67 65 74 22 2c 20 6c 65 6e 67 74 68 29 20 3d  "get", length) =
31e0: 3d 20 30 29 29 20 7b 0a 09 69 66 20 28 28 61 72  = 0)) {..if ((ar
31f0: 67 63 20 21 3d 20 33 29 20 26 26 20 28 61 72 67  gc != 3) && (arg
3200: 63 20 21 3d 20 34 29 29 20 7b 0a 09 20 20 20 20  c != 4)) {..    
3210: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3220: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
3230: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
3240: 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72 67  e \"",...    arg
3250: 76 5b 30 5d 2c 20 22 20 67 65 74 20 69 6e 64 65  v[0], " get inde
3260: 78 31 20 3f 69 6e 64 65 78 32 3f 5c 22 22 2c 20  x1 ?index2?\"", 
3270: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
3280: 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 43  .    result = TC
3290: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 67 6f  L_ERROR;..    go
32a0: 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 69 66 20  to done;..}..if 
32b0: 28 54 6b 54 65 78 74 47 65 74 49 6e 64 65 78 28  (TkTextGetIndex(
32c0: 69 6e 74 65 72 70 2c 20 74 65 78 74 50 74 72 2c  interp, textPtr,
32d0: 20 61 72 67 76 5b 32 5d 2c 20 26 69 6e 64 65 78   argv[2], &index
32e0: 31 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  1) != TCL_OK) {.
32f0: 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 43  .    result = TC
3300: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 67 6f  L_ERROR;..    go
3310: 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 69 66 20  to done;..}..if 
3320: 28 61 72 67 63 20 3d 3d 20 33 29 20 7b 0a 09 20  (argc == 3) {.. 
3330: 20 20 20 69 6e 64 65 78 32 20 3d 20 69 6e 64 65     index2 = inde
3340: 78 31 3b 0a 09 20 20 20 20 54 6b 54 65 78 74 49  x1;..    TkTextI
3350: 6e 64 65 78 46 6f 72 77 43 68 61 72 73 28 26 69  ndexForwChars(&i
3360: 6e 64 65 78 32 2c 20 31 2c 20 26 69 6e 64 65 78  ndex2, 1, &index
3370: 32 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  2);..} else if (
3380: 54 6b 54 65 78 74 47 65 74 49 6e 64 65 78 28 69  TkTextGetIndex(i
3390: 6e 74 65 72 70 2c 20 74 65 78 74 50 74 72 2c 20  nterp, textPtr, 
33a0: 61 72 67 76 5b 33 5d 2c 20 26 69 6e 64 65 78 32  argv[3], &index2
33b0: 29 0a 09 09 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  )...!= TCL_OK) {
33c0: 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54  ..    result = T
33d0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 67  CL_ERROR;..    g
33e0: 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 69 66  oto done;..}..if
33f0: 20 28 54 6b 54 65 78 74 49 6e 64 65 78 43 6d 70   (TkTextIndexCmp
3400: 28 26 69 6e 64 65 78 31 2c 20 26 69 6e 64 65 78  (&index1, &index
3410: 32 29 20 3e 3d 20 30 29 20 7b 0a 09 20 20 20 20  2) >= 0) {..    
3420: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 77  goto done;..}..w
3430: 68 69 6c 65 20 28 31 29 20 7b 0a 09 20 20 20 20  hile (1) {..    
3440: 69 6e 74 20 6f 66 66 73 65 74 2c 20 6c 61 73 74  int offset, last
3450: 2c 20 73 61 76 65 64 43 68 61 72 3b 0a 09 20 20  , savedChar;..  
3460: 20 20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20    TkTextSegment 
3470: 2a 73 65 67 50 74 72 3b 0a 0a 09 20 20 20 20 73  *segPtr;...    s
3480: 65 67 50 74 72 20 3d 20 54 6b 54 65 78 74 49 6e  egPtr = TkTextIn
3490: 64 65 78 54 6f 53 65 67 28 26 69 6e 64 65 78 31  dexToSeg(&index1
34a0: 2c 20 26 6f 66 66 73 65 74 29 3b 0a 09 20 20 20  , &offset);..   
34b0: 20 6c 61 73 74 20 3d 20 73 65 67 50 74 72 2d 3e   last = segPtr->
34c0: 73 69 7a 65 3b 0a 09 20 20 20 20 69 66 20 28 69  size;..    if (i
34d0: 6e 64 65 78 31 2e 6c 69 6e 65 50 74 72 20 3d 3d  ndex1.linePtr ==
34e0: 20 69 6e 64 65 78 32 2e 6c 69 6e 65 50 74 72 29   index2.linePtr)
34f0: 20 7b 0a 09 09 69 6e 74 20 6c 61 73 74 32 3b 0a   {...int last2;.
3500: 0a 09 09 69 66 20 28 69 6e 64 65 78 32 2e 63 68  ...if (index2.ch
3510: 61 72 49 6e 64 65 78 20 3d 3d 20 69 6e 64 65 78  arIndex == index
3520: 31 2e 63 68 61 72 49 6e 64 65 78 29 20 7b 0a 09  1.charIndex) {..
3530: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a  .    break;...}.
3540: 09 09 6c 61 73 74 32 20 3d 20 69 6e 64 65 78 32  ..last2 = index2
3550: 2e 63 68 61 72 49 6e 64 65 78 20 2d 20 69 6e 64  .charIndex - ind
3560: 65 78 31 2e 63 68 61 72 49 6e 64 65 78 20 2b 20  ex1.charIndex + 
3570: 6f 66 66 73 65 74 3b 0a 09 09 69 66 20 28 6c 61  offset;...if (la
3580: 73 74 32 20 3c 20 6c 61 73 74 29 20 7b 0a 09 09  st2 < last) {...
3590: 20 20 20 20 6c 61 73 74 20 3d 20 6c 61 73 74 32      last = last2
35a0: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20  ;...}..    }..  
35b0: 20 20 69 66 20 28 73 65 67 50 74 72 2d 3e 74 79    if (segPtr->ty
35c0: 70 65 50 74 72 20 3d 3d 20 26 74 6b 54 65 78 74  pePtr == &tkText
35d0: 43 68 61 72 54 79 70 65 29 20 7b 0a 09 09 73 61  CharType) {...sa
35e0: 76 65 64 43 68 61 72 20 3d 20 73 65 67 50 74 72  vedChar = segPtr
35f0: 2d 3e 62 6f 64 79 2e 63 68 61 72 73 5b 6c 61 73  ->body.chars[las
3600: 74 5d 3b 0a 09 09 73 65 67 50 74 72 2d 3e 62 6f  t];...segPtr->bo
3610: 64 79 2e 63 68 61 72 73 5b 6c 61 73 74 5d 20 3d  dy.chars[last] =
3620: 20 30 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64   0;...Tcl_Append
3630: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
3640: 65 67 50 74 72 2d 3e 62 6f 64 79 2e 63 68 61 72  egPtr->body.char
3650: 73 20 2b 20 6f 66 66 73 65 74 2c 0a 09 09 09 28  s + offset,....(
3660: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
3670: 09 73 65 67 50 74 72 2d 3e 62 6f 64 79 2e 63 68  .segPtr->body.ch
3680: 61 72 73 5b 6c 61 73 74 5d 20 3d 20 73 61 76 65  ars[last] = save
3690: 64 43 68 61 72 3b 0a 09 20 20 20 20 7d 0a 09 20  dChar;..    }.. 
36a0: 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 46 6f     TkTextIndexFo
36b0: 72 77 43 68 61 72 73 28 26 69 6e 64 65 78 31 2c  rwChars(&index1,
36c0: 20 6c 61 73 74 2d 6f 66 66 73 65 74 2c 20 26 69   last-offset, &i
36d0: 6e 64 65 78 31 29 3b 0a 09 7d 0a 20 20 20 20 7d  ndex1);..}.    }
36e0: 20 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20   else if ((c == 
36f0: 27 69 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70  'i') && (strncmp
3700: 28 61 72 67 76 5b 31 5d 2c 20 22 69 6e 64 65 78  (argv[1], "index
3710: 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29  ", length) == 0)
3720: 0a 09 20 20 20 20 26 26 20 28 6c 65 6e 67 74 68  ..    && (length
3730: 20 3e 3d 20 33 29 29 20 7b 0a 09 69 66 20 28 61   >= 3)) {..if (a
3740: 72 67 63 20 21 3d 20 33 29 20 7b 0a 09 20 20 20  rgc != 3) {..   
3750: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
3760: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
3770: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
3780: 62 65 20 5c 22 22 2c 0a 09 09 20 20 20 20 61 72  be \"",...    ar
3790: 67 76 5b 30 5d 2c 20 22 20 69 6e 64 65 78 20 69  gv[0], " index i
37a0: 6e 64 65 78 5c 22 22 2c 0a 09 09 20 20 20 20 28  ndex\"",...    (
37b0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
37c0: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c      result = TCL
37d0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 67 6f 74  _ERROR;..    got
37e0: 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 69 66 20 28  o done;..}..if (
37f0: 54 6b 54 65 78 74 47 65 74 49 6e 64 65 78 28 69  TkTextGetIndex(i
3800: 6e 74 65 72 70 2c 20 74 65 78 74 50 74 72 2c 20  nterp, textPtr, 
3810: 61 72 67 76 5b 32 5d 2c 20 26 69 6e 64 65 78 31  argv[2], &index1
3820: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
3830: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c      result = TCL
3840: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 67 6f 74  _ERROR;..    got
3850: 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 09 54 6b 54 65  o done;..}..TkTe
3860: 78 74 50 72 69 6e 74 49 6e 64 65 78 28 26 69 6e  xtPrintIndex(&in
3870: 64 65 78 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  dex1, Tcl_GetStr
3880: 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
3890: 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ));.    } else i
38a0: 66 20 28 28 63 20 3d 3d 20 27 69 27 29 20 26 26  f ((c == 'i') &&
38b0: 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 31   (strncmp(argv[1
38c0: 5d 2c 20 22 69 6e 73 65 72 74 22 2c 20 6c 65 6e  ], "insert", len
38d0: 67 74 68 29 20 3d 3d 20 30 29 0a 09 20 20 20 20  gth) == 0)..    
38e0: 26 26 20 28 6c 65 6e 67 74 68 20 3e 3d 20 33 29  && (length >= 3)
38f0: 29 20 7b 0a 09 69 6e 74 20 69 2c 20 6a 2c 20 6e  ) {..int i, j, n
3900: 75 6d 54 61 67 73 3b 0a 09 63 68 61 72 20 2a 2a  umTags;..char **
3910: 74 61 67 4e 61 6d 65 73 3b 0a 09 54 6b 54 65 78  tagNames;..TkTex
3920: 74 54 61 67 20 2a 2a 6f 6c 64 54 61 67 41 72 72  tTag **oldTagArr
3930: 61 79 50 74 72 3b 0a 0a 09 69 66 20 28 61 72 67  ayPtr;...if (arg
3940: 63 20 3c 20 34 29 20 7b 0a 09 20 20 20 20 54 63  c < 4) {..    Tc
3950: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3960: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3970: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3980: 5c 22 22 2c 0a 09 09 20 20 20 20 61 72 67 76 5b  \"",...    argv[
3990: 30 5d 2c 0a 09 09 20 20 20 20 22 20 69 6e 73 65  0],...    " inse
39a0: 72 74 20 69 6e 64 65 78 20 63 68 61 72 73 20 3f  rt index chars ?
39b0: 74 61 67 4c 69 73 74 20 63 68 61 72 73 20 74 61  tagList chars ta
39c0: 67 4c 69 73 74 20 2e 2e 2e 3f 5c 22 22 2c 0a 09  gList ...?\"",..
39d0: 09 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55  .    (char *) NU
39e0: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 73 75 6c 74  LL);..    result
39f0: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20   = TCL_ERROR;.. 
3a00: 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d     goto done;..}
3a10: 0a 09 69 66 20 28 54 6b 54 65 78 74 47 65 74 49  ..if (TkTextGetI
3a20: 6e 64 65 78 28 69 6e 74 65 72 70 2c 20 74 65 78  ndex(interp, tex
3a30: 74 50 74 72 2c 20 61 72 67 76 5b 32 5d 2c 20 26  tPtr, argv[2], &
3a40: 69 6e 64 65 78 31 29 20 21 3d 20 54 43 4c 5f 4f  index1) != TCL_O
3a50: 4b 29 20 7b 0a 09 20 20 20 20 72 65 73 75 6c 74  K) {..    result
3a60: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20   = TCL_ERROR;.. 
3a70: 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 7d     goto done;..}
3a80: 0a 09 69 66 20 28 74 65 78 74 50 74 72 2d 3e 73  ..if (textPtr->s
3a90: 74 61 74 65 20 3d 3d 20 74 6b 54 65 78 74 4e 6f  tate == tkTextNo
3aa0: 72 6d 61 6c 55 69 64 29 20 7b 0a 09 20 20 20 20  rmalUid) {..    
3ab0: 66 6f 72 20 28 6a 20 3d 20 33 3b 20 20 6a 20 3c  for (j = 3;  j <
3ac0: 20 61 72 67 63 3b 20 6a 20 2b 3d 20 32 29 20 7b   argc; j += 2) {
3ad0: 0a 09 09 49 6e 73 65 72 74 43 68 61 72 73 28 74  ...InsertChars(t
3ae0: 65 78 74 50 74 72 2c 20 26 69 6e 64 65 78 31 2c  extPtr, &index1,
3af0: 20 61 72 67 76 5b 6a 5d 29 3b 0a 09 09 69 66 20   argv[j]);...if 
3b00: 28 61 72 67 63 20 3e 20 28 6a 2b 31 29 29 20 7b  (argc > (j+1)) {
3b10: 0a 09 09 20 20 20 20 54 6b 54 65 78 74 49 6e 64  ...    TkTextInd
3b20: 65 78 46 6f 72 77 43 68 61 72 73 28 26 69 6e 64  exForwChars(&ind
3b30: 65 78 31 2c 20 28 69 6e 74 29 20 73 74 72 6c 65  ex1, (int) strle
3b40: 6e 28 61 72 67 76 5b 6a 5d 29 2c 0a 09 09 09 20  n(argv[j]),.... 
3b50: 20 20 20 26 69 6e 64 65 78 32 29 3b 0a 09 09 20     &index2);... 
3b60: 20 20 20 6f 6c 64 54 61 67 41 72 72 61 79 50 74     oldTagArrayPt
3b70: 72 20 3d 20 54 6b 42 54 72 65 65 47 65 74 54 61  r = TkBTreeGetTa
3b80: 67 73 28 26 69 6e 64 65 78 31 2c 20 26 6e 75 6d  gs(&index1, &num
3b90: 54 61 67 73 29 3b 0a 09 09 20 20 20 20 69 66 20  Tags);...    if 
3ba0: 28 6f 6c 64 54 61 67 41 72 72 61 79 50 74 72 20  (oldTagArrayPtr 
3bb0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 66 6f  != NULL) {....fo
3bc0: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 6e 75  r (i = 0; i < nu
3bd0: 6d 54 61 67 73 3b 20 69 2b 2b 29 20 7b 0a 09 09  mTags; i++) {...
3be0: 09 20 20 20 20 54 6b 42 54 72 65 65 54 61 67 28  .    TkBTreeTag(
3bf0: 26 69 6e 64 65 78 31 2c 20 26 69 6e 64 65 78 32  &index1, &index2
3c00: 2c 20 6f 6c 64 54 61 67 41 72 72 61 79 50 74 72  , oldTagArrayPtr
3c10: 5b 69 5d 2c 20 30 29 3b 0a 09 09 09 7d 0a 09 09  [i], 0);....}...
3c20: 09 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29  .ckfree((char *)
3c30: 20 6f 6c 64 54 61 67 41 72 72 61 79 50 74 72 29   oldTagArrayPtr)
3c40: 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 20 20  ;...    }...    
3c50: 69 66 20 28 54 63 6c 5f 53 70 6c 69 74 4c 69 73  if (Tcl_SplitLis
3c60: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 6a  t(interp, argv[j
3c70: 2b 31 5d 2c 20 26 6e 75 6d 54 61 67 73 2c 20 26  +1], &numTags, &
3c80: 74 61 67 4e 61 6d 65 73 29 0a 09 09 09 20 20 20  tagNames)....   
3c90: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
3ca0: 09 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52  .result = TCL_ER
3cb0: 52 4f 52 3b 0a 09 09 09 67 6f 74 6f 20 64 6f 6e  ROR;....goto don
3cc0: 65 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 20  e;...    }...   
3cd0: 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c   for (i = 0; i <
3ce0: 20 6e 75 6d 54 61 67 73 3b 20 69 2b 2b 29 20 7b   numTags; i++) {
3cf0: 0a 09 09 09 54 6b 42 54 72 65 65 54 61 67 28 26  ....TkBTreeTag(&
3d00: 69 6e 64 65 78 31 2c 20 26 69 6e 64 65 78 32 2c  index1, &index2,
3d10: 0a 09 09 09 09 54 6b 54 65 78 74 43 72 65 61 74  .....TkTextCreat
3d20: 65 54 61 67 28 74 65 78 74 50 74 72 2c 20 74 61  eTag(textPtr, ta
3d30: 67 4e 61 6d 65 73 5b 69 5d 29 2c 20 31 29 3b 0a  gNames[i]), 1);.
3d40: 09 09 20 20 20 20 7d 0a 09 09 20 20 20 20 63 6b  ..    }...    ck
3d50: 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 74 61  free((char *) ta
3d60: 67 4e 61 6d 65 73 29 3b 0a 09 09 20 20 20 20 69  gNames);...    i
3d70: 6e 64 65 78 31 20 3d 20 69 6e 64 65 78 32 3b 0a  ndex1 = index2;.
3d80: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20  ..}..    }..}.  
3d90: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 63 20    } else if ((c 
3da0: 3d 3d 20 27 6d 27 29 20 26 26 20 28 73 74 72 6e  == 'm') && (strn
3db0: 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22 6d 61  cmp(argv[1], "ma
3dc0: 72 6b 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20  rk", length) == 
3dd0: 30 29 29 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20  0)) {..result = 
3de0: 54 6b 54 65 78 74 4d 61 72 6b 43 6d 64 28 74 65  TkTextMarkCmd(te
3df0: 78 74 50 74 72 2c 20 69 6e 74 65 72 70 2c 20 61  xtPtr, interp, a
3e00: 72 67 63 2c 20 61 72 67 76 29 3b 0a 20 20 20 20  rgc, argv);.    
3e10: 7d 20 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d  } else if ((c ==
3e20: 20 27 73 27 29 20 26 26 20 28 73 74 72 63 6d 70   's') && (strcmp
3e30: 28 61 72 67 76 5b 31 5d 2c 20 22 73 63 61 6e 22  (argv[1], "scan"
3e40: 29 20 3d 3d 20 30 29 20 26 26 20 28 6c 65 6e 67  ) == 0) && (leng
3e50: 74 68 20 3e 3d 20 32 29 29 20 7b 0a 09 72 65 73  th >= 2)) {..res
3e60: 75 6c 74 20 3d 20 43 74 6b 5f 55 6e 73 75 70 70  ult = Ctk_Unsupp
3e70: 6f 72 74 65 64 28 69 6e 74 65 72 70 2c 20 22 73  orted(interp, "s
3e80: 63 61 6e 22 29 3b 0a 20 20 20 20 7d 20 65 6c 73  can");.    } els
3e90: 65 20 69 66 20 28 28 63 20 3d 3d 20 27 73 27 29  e if ((c == 's')
3ea0: 20 26 26 20 28 73 74 72 63 6d 70 28 61 72 67 76   && (strcmp(argv
3eb0: 5b 31 5d 2c 20 22 73 65 61 72 63 68 22 29 20 3d  [1], "search") =
3ec0: 3d 20 30 29 0a 09 20 20 20 20 26 26 20 28 6c 65  = 0)..    && (le
3ed0: 6e 67 74 68 20 3e 3d 20 33 29 29 20 7b 0a 09 72  ngth >= 3)) {..r
3ee0: 65 73 75 6c 74 20 3d 20 54 65 78 74 53 65 61 72  esult = TextSear
3ef0: 63 68 43 6d 64 28 74 65 78 74 50 74 72 2c 20 69  chCmd(textPtr, i
3f00: 6e 74 65 72 70 2c 20 61 72 67 63 2c 20 61 72 67  nterp, argc, arg
3f10: 76 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  v);.    } else i
3f20: 66 20 28 28 63 20 3d 3d 20 27 73 27 29 20 26 26  f ((c == 's') &&
3f30: 20 28 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d   (strcmp(argv[1]
3f40: 2c 20 22 73 65 65 22 29 20 3d 3d 20 30 29 20 26  , "see") == 0) &
3f50: 26 20 28 6c 65 6e 67 74 68 20 3e 3d 20 33 29 29  & (length >= 3))
3f60: 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 6b 54   {..result = TkT
3f70: 65 78 74 53 65 65 43 6d 64 28 74 65 78 74 50 74  extSeeCmd(textPt
3f80: 72 2c 20 69 6e 74 65 72 70 2c 20 61 72 67 63 2c  r, interp, argc,
3f90: 20 61 72 67 76 29 3b 0a 20 20 20 20 7d 20 65 6c   argv);.    } el
3fa0: 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27 74 27  se if ((c == 't'
3fb0: 29 20 26 26 20 28 73 74 72 63 6d 70 28 61 72 67  ) && (strcmp(arg
3fc0: 76 5b 31 5d 2c 20 22 74 61 67 22 29 20 3d 3d 20  v[1], "tag") == 
3fd0: 30 29 29 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20  0)) {..result = 
3fe0: 54 6b 54 65 78 74 54 61 67 43 6d 64 28 74 65 78  TkTextTagCmd(tex
3ff0: 74 50 74 72 2c 20 69 6e 74 65 72 70 2c 20 61 72  tPtr, interp, ar
4000: 67 63 2c 20 61 72 67 76 29 3b 0a 20 20 20 20 7d  gc, argv);.    }
4010: 20 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20   else if ((c == 
4020: 27 77 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70  'w') && (strncmp
4030: 28 61 72 67 76 5b 31 5d 2c 20 22 77 69 6e 64 6f  (argv[1], "windo
4040: 77 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30  w", length) == 0
4050: 29 29 20 7b 0a 09 2f 2a 20 72 65 73 75 6c 74 20  )) {../* result 
4060: 3d 20 54 6b 54 65 78 74 57 69 6e 64 6f 77 43 6d  = TkTextWindowCm
4070: 64 28 74 65 78 74 50 74 72 2c 20 69 6e 74 65 72  d(textPtr, inter
4080: 70 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 20  p, argc, argv); 
4090: 2a 2f 0a 09 72 65 73 75 6c 74 20 3d 20 43 74 6b  */..result = Ctk
40a0: 5f 55 6e 73 75 70 70 6f 72 74 65 64 28 69 6e 74  _Unsupported(int
40b0: 65 72 70 2c 20 22 77 69 6e 64 6f 77 22 29 3b 0a  erp, "window");.
40c0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28      } else if ((
40d0: 63 20 3d 3d 20 27 78 27 29 20 26 26 20 28 73 74  c == 'x') && (st
40e0: 72 6e 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22  rncmp(argv[1], "
40f0: 78 76 69 65 77 22 2c 20 6c 65 6e 67 74 68 29 20  xview", length) 
4100: 3d 3d 20 30 29 29 20 7b 0a 09 72 65 73 75 6c 74  == 0)) {..result
4110: 20 3d 20 54 6b 54 65 78 74 58 76 69 65 77 43 6d   = TkTextXviewCm
4120: 64 28 74 65 78 74 50 74 72 2c 20 69 6e 74 65 72  d(textPtr, inter
4130: 70 2c 20 61 72 67 63 2c 20 61 72 67 76 29 3b 0a  p, argc, argv);.
4140: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28      } else if ((
4150: 63 20 3d 3d 20 27 79 27 29 20 26 26 20 28 73 74  c == 'y') && (st
4160: 72 6e 63 6d 70 28 61 72 67 76 5b 31 5d 2c 20 22  rncmp(argv[1], "
4170: 79 76 69 65 77 22 2c 20 6c 65 6e 67 74 68 29 20  yview", length) 
4180: 3d 3d 20 30 29 0a 09 20 20 20 20 26 26 20 28 6c  == 0)..    && (l
4190: 65 6e 67 74 68 20 3e 3d 20 32 29 29 20 7b 0a 09  ength >= 2)) {..
41a0: 72 65 73 75 6c 74 20 3d 20 54 6b 54 65 78 74 59  result = TkTextY
41b0: 76 69 65 77 43 6d 64 28 74 65 78 74 50 74 72 2c  viewCmd(textPtr,
41c0: 20 69 6e 74 65 72 70 2c 20 61 72 67 63 2c 20 61   interp, argc, a
41d0: 72 67 76 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rgv);.    } else
41e0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
41f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
4200: 64 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 61 72  d option \"", ar
4210: 67 76 5b 31 5d 2c 0a 09 09 22 5c 22 3a 20 20 6d  gv[1],..."\":  m
4220: 75 73 74 20 62 65 20 62 62 6f 78 2c 20 63 67 65  ust be bbox, cge
4230: 74 2c 20 63 6f 6d 70 61 72 65 2c 20 63 6f 6e 66  t, compare, conf
4240: 69 67 75 72 65 2c 20 64 65 62 75 67 2c 20 64 65  igure, debug, de
4250: 6c 65 74 65 2c 20 22 2c 0a 09 09 22 64 6c 69 6e  lete, ",..."dlin
4260: 65 69 6e 66 6f 2c 20 67 65 74 2c 20 69 6e 64 65  einfo, get, inde
4270: 78 2c 20 69 6e 73 65 72 74 2c 20 6d 61 72 6b 2c  x, insert, mark,
4280: 20 73 63 61 6e 2c 20 73 65 61 72 63 68 2c 20 73   scan, search, s
4290: 65 65 2c 20 22 2c 0a 09 09 22 74 61 67 2c 20 77  ee, ",..."tag, w
42a0: 69 6e 64 6f 77 2c 20 78 76 69 65 77 2c 20 6f 72  indow, xview, or
42b0: 20 79 76 69 65 77 22 2c 0a 09 09 28 63 68 61 72   yview",...(char
42c0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 73 75   *) NULL);..resu
42d0: 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  lt = TCL_ERROR;.
42e0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 6e 65 3a      }..    done:
42f0: 0a 20 20 20 20 54 6b 5f 52 65 6c 65 61 73 65 28  .    Tk_Release(
4300: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 74 65 78  (ClientData) tex
4310: 74 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  tPtr);.    retur
4320: 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a 2f 2a  n result;.}.../*
4330: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
4380: 44 65 73 74 72 6f 79 54 65 78 74 20 2d 2d 0a 20  DestroyText --. 
4390: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
43a0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 62  ure is invoked b
43b0: 79 20 54 6b 5f 45 76 65 6e 74 75 61 6c 6c 79 46  y Tk_EventuallyF
43c0: 72 65 65 20 6f 72 20 54 6b 5f 52 65 6c 65 61 73  ree or Tk_Releas
43d0: 65 0a 20 2a 09 74 6f 20 63 6c 65 61 6e 20 75 70  e. *.to clean up
43e0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74   the internal st
43f0: 72 75 63 74 75 72 65 20 6f 66 20 61 20 74 65 78  ructure of a tex
4400: 74 20 61 74 20 61 20 73 61 66 65 20 74 69 6d 65  t at a safe time
4410: 0a 20 2a 09 28 77 68 65 6e 20 6e 6f 2d 6f 6e 65  . *.(when no-one
4420: 20 69 73 20 75 73 69 6e 67 20 69 74 20 61 6e 79   is using it any
4430: 6d 6f 72 65 29 2e 0a 20 2a 0a 20 2a 20 52 65 73  more).. *. * Res
4440: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ults:. *.None.. 
4450: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
4460: 73 3a 0a 20 2a 09 45 76 65 72 79 74 68 69 6e 67  s:. *.Everything
4470: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4480: 20 74 68 65 20 74 65 78 74 20 69 73 20 66 72 65   the text is fre
4490: 65 64 20 75 70 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ed up.. *. *----
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44e0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  --. */..static v
44f0: 6f 69 64 0a 44 65 73 74 72 6f 79 54 65 78 74 28  oid.DestroyText(
4500: 63 6c 69 65 6e 74 44 61 74 61 29 0a 20 20 20 20  clientData).    
4510: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
4520: 74 44 61 74 61 3b 09 2f 2a 20 49 6e 66 6f 20 61  tData;./* Info a
4530: 62 6f 75 74 20 74 65 78 74 20 77 69 64 67 65 74  bout text widget
4540: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73  . */.{.    regis
4550: 74 65 72 20 54 6b 54 65 78 74 20 2a 74 65 78 74  ter TkText *text
4560: 50 74 72 20 3d 20 28 54 6b 54 65 78 74 20 2a 29  Ptr = (TkText *)
4570: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20   clientData;.   
4580: 20 54 63 6c 5f 48 61 73 68 53 65 61 72 63 68 20   Tcl_HashSearch 
4590: 73 65 61 72 63 68 3b 0a 20 20 20 20 54 63 6c 5f  search;.    Tcl_
45a0: 48 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72 3b  HashEntry *hPtr;
45b0: 0a 20 20 20 20 54 6b 54 65 78 74 54 61 67 20 2a  .    TkTextTag *
45c0: 74 61 67 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a  tagPtr;..    /*.
45d0: 20 20 20 20 20 2a 20 46 72 65 65 20 75 70 20 61       * Free up a
45e0: 6c 6c 20 74 68 65 20 73 74 75 66 66 20 74 68 61  ll the stuff tha
45f0: 74 20 72 65 71 75 69 72 65 73 20 73 70 65 63 69  t requires speci
4600: 61 6c 20 68 61 6e 64 6c 69 6e 67 2c 20 74 68 65  al handling, the
4610: 6e 0a 20 20 20 20 20 2a 20 6c 65 74 20 54 6b 5f  n.     * let Tk_
4620: 46 72 65 65 4f 70 74 69 6f 6e 73 20 68 61 6e 64  FreeOptions hand
4630: 6c 65 20 61 6c 6c 20 74 68 65 20 73 74 61 6e 64  le all the stand
4640: 61 72 64 20 6f 70 74 69 6f 6e 2d 72 65 6c 61 74  ard option-relat
4650: 65 64 0a 20 20 20 20 20 2a 20 73 74 75 66 66 2e  ed.     * stuff.
4660: 20 20 53 70 65 63 69 61 6c 20 6e 6f 74 65 3a 20    Special note: 
4670: 20 66 72 65 65 20 75 70 20 64 69 73 70 6c 61 79   free up display
4680: 2d 72 65 6c 61 74 65 64 20 69 6e 66 6f 72 6d 61  -related informa
4690: 74 69 6f 6e 0a 20 20 20 20 20 2a 20 62 65 66 6f  tion.     * befo
46a0: 72 65 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  re deleting the 
46b0: 42 2d 74 72 65 65 2c 20 73 69 6e 63 65 20 64 69  B-tree, since di
46c0: 73 70 6c 61 79 2d 72 65 6c 61 74 65 64 20 73 74  splay-related st
46d0: 75 66 66 0a 20 20 20 20 20 2a 20 6d 61 79 20 72  uff.     * may r
46e0: 65 66 65 72 20 74 6f 20 73 74 75 66 66 20 69 6e  efer to stuff in
46f0: 20 74 68 65 20 42 2d 74 72 65 65 2e 0a 20 20 20   the B-tree..   
4700: 20 20 2a 2f 0a 0a 20 20 20 20 54 6b 54 65 78 74    */..    TkText
4710: 46 72 65 65 44 49 6e 66 6f 28 74 65 78 74 50 74  FreeDInfo(textPt
4720: 72 29 3b 0a 20 20 20 20 54 6b 42 54 72 65 65 44  r);.    TkBTreeD
4730: 65 73 74 72 6f 79 28 74 65 78 74 50 74 72 2d 3e  estroy(textPtr->
4740: 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 20 28  tree);.    for (
4750: 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 72 73 74  hPtr = Tcl_First
4760: 48 61 73 68 45 6e 74 72 79 28 26 74 65 78 74 50  HashEntry(&textP
4770: 74 72 2d 3e 74 61 67 54 61 62 6c 65 2c 20 26 73  tr->tagTable, &s
4780: 65 61 72 63 68 29 3b 0a 09 20 20 20 20 68 50 74  earch);..    hPt
4790: 72 20 21 3d 20 4e 55 4c 4c 3b 20 68 50 74 72 20  r != NULL; hPtr 
47a0: 3d 20 54 63 6c 5f 4e 65 78 74 48 61 73 68 45 6e  = Tcl_NextHashEn
47b0: 74 72 79 28 26 73 65 61 72 63 68 29 29 20 7b 0a  try(&search)) {.
47c0: 09 74 61 67 50 74 72 20 3d 20 28 54 6b 54 65 78  .tagPtr = (TkTex
47d0: 74 54 61 67 20 2a 29 20 54 63 6c 5f 47 65 74 48  tTag *) Tcl_GetH
47e0: 61 73 68 56 61 6c 75 65 28 68 50 74 72 29 3b 0a  ashValue(hPtr);.
47f0: 09 54 6b 54 65 78 74 46 72 65 65 54 61 67 28 74  .TkTextFreeTag(t
4800: 65 78 74 50 74 72 2c 20 74 61 67 50 74 72 29 3b  extPtr, tagPtr);
4810: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
4820: 65 6c 65 74 65 48 61 73 68 54 61 62 6c 65 28 26  eleteHashTable(&
4830: 74 65 78 74 50 74 72 2d 3e 74 61 67 54 61 62 6c  textPtr->tagTabl
4840: 65 29 3b 0a 20 20 20 20 66 6f 72 20 28 68 50 74  e);.    for (hPt
4850: 72 20 3d 20 54 63 6c 5f 46 69 72 73 74 48 61 73  r = Tcl_FirstHas
4860: 68 45 6e 74 72 79 28 26 74 65 78 74 50 74 72 2d  hEntry(&textPtr-
4870: 3e 6d 61 72 6b 54 61 62 6c 65 2c 20 26 73 65 61  >markTable, &sea
4880: 72 63 68 29 3b 0a 09 20 20 20 20 68 50 74 72 20  rch);..    hPtr 
4890: 21 3d 20 4e 55 4c 4c 3b 20 68 50 74 72 20 3d 20  != NULL; hPtr = 
48a0: 54 63 6c 5f 4e 65 78 74 48 61 73 68 45 6e 74 72  Tcl_NextHashEntr
48b0: 79 28 26 73 65 61 72 63 68 29 29 20 7b 0a 09 63  y(&search)) {..c
48c0: 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 54  kfree((char *) T
48d0: 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28  cl_GetHashValue(
48e0: 68 50 74 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20  hPtr));.    }.  
48f0: 20 20 54 63 6c 5f 44 65 6c 65 74 65 48 61 73 68    Tcl_DeleteHash
4900: 54 61 62 6c 65 28 26 74 65 78 74 50 74 72 2d 3e  Table(&textPtr->
4910: 6d 61 72 6b 54 61 62 6c 65 29 3b 0a 20 20 20 20  markTable);.    
4920: 69 66 20 28 74 65 78 74 50 74 72 2d 3e 74 61 62  if (textPtr->tab
4930: 41 72 72 61 79 50 74 72 20 21 3d 20 4e 55 4c 4c  ArrayPtr != NULL
4940: 29 20 7b 0a 09 63 6b 66 72 65 65 28 28 63 68 61  ) {..ckfree((cha
4950: 72 20 2a 29 20 74 65 78 74 50 74 72 2d 3e 74 61  r *) textPtr->ta
4960: 62 41 72 72 61 79 50 74 72 29 3b 0a 20 20 20 20  bArrayPtr);.    
4970: 7d 0a 0a 20 20 20 20 54 6b 5f 46 72 65 65 4f 70  }..    Tk_FreeOp
4980: 74 69 6f 6e 73 28 63 6f 6e 66 69 67 53 70 65 63  tions(configSpec
4990: 73 2c 20 28 63 68 61 72 20 2a 29 20 74 65 78 74  s, (char *) text
49a0: 50 74 72 2c 20 30 29 3b 0a 20 20 20 20 63 6b 66  Ptr, 0);.    ckf
49b0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 74 65 78  ree((char *) tex
49c0: 74 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tPtr);.}.../*. *
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e  ------. *. * Con
4a20: 66 69 67 75 72 65 54 65 78 74 20 2d 2d 0a 20 2a  figureText --. *
4a30: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
4a40: 72 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  re is called to 
4a50: 70 72 6f 63 65 73 73 20 61 6e 20 61 72 67 76 2f  process an argv/
4a60: 61 72 67 63 20 6c 69 73 74 2c 20 70 6c 75 73 0a  argc list, plus.
4a70: 20 2a 09 74 68 65 20 54 6b 20 6f 70 74 69 6f 6e   *.the Tk option
4a80: 20 64 61 74 61 62 61 73 65 2c 20 69 6e 20 6f 72   database, in or
4a90: 64 65 72 20 74 6f 20 63 6f 6e 66 69 67 75 72 65  der to configure
4aa0: 20 28 6f 72 0a 20 2a 09 72 65 63 6f 6e 66 69 67   (or. *.reconfig
4ab0: 75 72 65 29 20 61 20 74 65 78 74 20 77 69 64 67  ure) a text widg
4ac0: 65 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  et.. *. * Result
4ad0: 73 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72 6e  s:. *.The return
4ae0: 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 61 6e   value is a stan
4af0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
4b00: 20 20 49 66 20 54 43 4c 5f 45 52 52 4f 52 20 69    If TCL_ERROR i
4b10: 73 0a 20 2a 09 72 65 74 75 72 6e 65 64 2c 20 74  s. *.returned, t
4b20: 68 65 6e 20 69 6e 74 65 72 70 2d 3e 72 65 73 75  hen interp->resu
4b30: 6c 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 65  lt contains an e
4b40: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a  rror message.. *
4b50: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4b60: 3a 0a 20 2a 09 43 6f 6e 66 69 67 75 72 61 74 69  :. *.Configurati
4b70: 6f 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20  on information, 
4b80: 73 75 63 68 20 61 73 20 74 65 78 74 20 73 74 72  such as text str
4b90: 69 6e 67 2c 20 63 6f 6c 6f 72 73 2c 20 66 6f 6e  ing, colors, fon
4ba0: 74 2c 0a 20 2a 09 65 74 63 2e 20 67 65 74 20 73  t,. *.etc. get s
4bb0: 65 74 20 66 6f 72 20 74 65 78 74 50 74 72 3b 20  et for textPtr; 
4bc0: 20 6f 6c 64 20 72 65 73 6f 75 72 63 65 73 20 67   old resources g
4bd0: 65 74 20 66 72 65 65 64 2c 20 69 66 20 74 68 65  et freed, if the
4be0: 72 65 0a 20 2a 09 77 65 72 65 20 61 6e 79 2e 0a  re. *.were any..
4bf0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4c40: 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 6f 6e 66  .static int.Conf
4c50: 69 67 75 72 65 54 65 78 74 28 69 6e 74 65 72 70  igureText(interp
4c60: 2c 20 74 65 78 74 50 74 72 2c 20 61 72 67 63 2c  , textPtr, argc,
4c70: 20 61 72 67 76 2c 20 66 6c 61 67 73 29 0a 20 20   argv, flags).  
4c80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4c90: 74 65 72 70 3b 09 09 2f 2a 20 55 73 65 64 20 66  terp;../* Used f
4ca0: 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74 69  or error reporti
4cb0: 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65 67 69 73  ng. */.    regis
4cc0: 74 65 72 20 54 6b 54 65 78 74 20 2a 74 65 78 74  ter TkText *text
4cd0: 50 74 72 3b 09 2f 2a 20 49 6e 66 6f 72 6d 61 74  Ptr;./* Informat
4ce0: 69 6f 6e 20 61 62 6f 75 74 20 77 69 64 67 65 74  ion about widget
4cf0: 3b 20 20 6d 61 79 20 6f 72 20 6d 61 79 0a 09 09  ;  may or may...
4d00: 09 09 20 2a 20 6e 6f 74 20 61 6c 72 65 61 64 79  .. * not already
4d10: 20 68 61 76 65 20 76 61 6c 75 65 73 20 66 6f 72   have values for
4d20: 20 73 6f 6d 65 20 66 69 65 6c 64 73 2e 20 2a 2f   some fields. */
4d30: 0a 20 20 20 20 69 6e 74 20 61 72 67 63 3b 09 09  .    int argc;..
4d40: 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61  ./* Number of va
4d50: 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20 61  lid entries in a
4d60: 72 67 76 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72  rgv. */.    char
4d70: 20 2a 2a 61 72 67 76 3b 09 09 2f 2a 20 41 72 67   **argv;../* Arg
4d80: 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 69  uments. */.    i
4d90: 6e 74 20 66 6c 61 67 73 3b 09 09 09 2f 2a 20 46  nt flags;.../* F
4da0: 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
4db0: 54 6b 5f 43 6f 6e 66 69 67 75 72 65 57 69 64 67  Tk_ConfigureWidg
4dc0: 65 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 66 20  et. */.{.    if 
4dd0: 28 54 6b 5f 43 6f 6e 66 69 67 75 72 65 57 69 64  (Tk_ConfigureWid
4de0: 67 65 74 28 69 6e 74 65 72 70 2c 20 74 65 78 74  get(interp, text
4df0: 50 74 72 2d 3e 74 6b 77 69 6e 2c 20 63 6f 6e 66  Ptr->tkwin, conf
4e00: 69 67 53 70 65 63 73 2c 0a 09 20 20 20 20 61 72  igSpecs,..    ar
4e10: 67 63 2c 20 61 72 67 76 2c 20 28 63 68 61 72 20  gc, argv, (char 
4e20: 2a 29 20 74 65 78 74 50 74 72 2c 20 66 6c 61 67  *) textPtr, flag
4e30: 73 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  s) != TCL_OK) {.
4e40: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
4e50: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
4e60: 0a 20 20 20 20 20 2a 20 41 20 66 65 77 20 6f 74  .     * A few ot
4e70: 68 65 72 20 6f 70 74 69 6f 6e 73 20 61 6c 73 6f  her options also
4e80: 20 6e 65 65 64 20 73 70 65 63 69 61 6c 20 70 72   need special pr
4e90: 6f 63 65 73 73 69 6e 67 2c 20 73 75 63 68 20 61  ocessing, such a
4ea0: 73 20 70 61 72 73 69 6e 67 0a 20 20 20 20 20 2a  s parsing.     *
4eb0: 20 74 68 65 20 67 65 6f 6d 65 74 72 79 20 61 6e   the geometry an
4ec0: 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 62 61  d setting the ba
4ed0: 63 6b 67 72 6f 75 6e 64 20 66 72 6f 6d 20 61 20  ckground from a 
4ee0: 33 2d 44 20 62 6f 72 64 65 72 2e 0a 20 20 20 20  3-D border..    
4ef0: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 28 74 65   */..    if ((te
4f00: 78 74 50 74 72 2d 3e 73 74 61 74 65 20 21 3d 20  xtPtr->state != 
4f10: 74 6b 54 65 78 74 4e 6f 72 6d 61 6c 55 69 64 29  tkTextNormalUid)
4f20: 0a 09 20 20 20 20 26 26 20 28 74 65 78 74 50 74  ..    && (textPt
4f30: 72 2d 3e 73 74 61 74 65 20 21 3d 20 74 6b 54 65  r->state != tkTe
4f40: 78 74 44 69 73 61 62 6c 65 64 55 69 64 29 29 20  xtDisabledUid)) 
4f50: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
4f60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
4f70: 20 73 74 61 74 65 20 76 61 6c 75 65 20 5c 22 22   state value \""
4f80: 2c 20 74 65 78 74 50 74 72 2d 3e 73 74 61 74 65  , textPtr->state
4f90: 2c 0a 09 09 22 5c 22 3a 20 20 6d 75 73 74 20 62  ,..."\":  must b
4fa0: 65 20 6e 6f 72 6d 61 6c 20 6f 72 20 64 69 73 61  e normal or disa
4fb0: 62 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  bled", (char *) 
4fc0: 4e 55 4c 4c 29 3b 0a 09 74 65 78 74 50 74 72 2d  NULL);..textPtr-
4fd0: 3e 73 74 61 74 65 20 3d 20 74 6b 54 65 78 74 4e  >state = tkTextN
4fe0: 6f 72 6d 61 6c 55 69 64 3b 0a 09 72 65 74 75 72  ormalUid;..retur
4ff0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5000: 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 74 65 78   }..    if ((tex
5010: 74 50 74 72 2d 3e 77 72 61 70 4d 6f 64 65 20 21  tPtr->wrapMode !
5020: 3d 20 74 6b 54 65 78 74 43 68 61 72 55 69 64 29  = tkTextCharUid)
5030: 0a 09 20 20 20 20 26 26 20 28 74 65 78 74 50 74  ..    && (textPt
5040: 72 2d 3e 77 72 61 70 4d 6f 64 65 20 21 3d 20 74  r->wrapMode != t
5050: 6b 54 65 78 74 4e 6f 6e 65 55 69 64 29 0a 09 20  kTextNoneUid).. 
5060: 20 20 20 26 26 20 28 74 65 78 74 50 74 72 2d 3e     && (textPtr->
5070: 77 72 61 70 4d 6f 64 65 20 21 3d 20 74 6b 54 65  wrapMode != tkTe
5080: 78 74 57 6f 72 64 55 69 64 29 29 20 7b 0a 09 54  xtWordUid)) {..T
5090: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
50a0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 77 72 61  interp, "bad wra
50b0: 70 20 6d 6f 64 65 20 5c 22 22 2c 20 74 65 78 74  p mode \"", text
50c0: 50 74 72 2d 3e 77 72 61 70 4d 6f 64 65 2c 0a 09  Ptr->wrapMode,..
50d0: 09 22 5c 22 3a 20 20 6d 75 73 74 20 62 65 20 63  ."\":  must be c
50e0: 68 61 72 2c 20 6e 6f 6e 65 2c 20 6f 72 20 77 6f  har, none, or wo
50f0: 72 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  rd", (char *) NU
5100: 4c 4c 29 3b 0a 09 74 65 78 74 50 74 72 2d 3e 77  LL);..textPtr->w
5110: 72 61 70 4d 6f 64 65 20 3d 20 74 6b 54 65 78 74  rapMode = tkText
5120: 43 68 61 72 55 69 64 3b 0a 09 72 65 74 75 72 6e  CharUid;..return
5130: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
5140: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
5150: 20 44 6f 6e 27 74 20 61 6c 6c 6f 77 20 6e 65 67   Don't allow neg
5160: 61 74 69 76 65 20 73 70 61 63 69 6e 67 73 2e 0a  ative spacings..
5170: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20       */..    if 
5180: 28 74 65 78 74 50 74 72 2d 3e 73 70 61 63 69 6e  (textPtr->spacin
5190: 67 31 20 3c 20 30 29 20 7b 0a 09 74 65 78 74 50  g1 < 0) {..textP
51a0: 74 72 2d 3e 73 70 61 63 69 6e 67 31 20 3d 20 30  tr->spacing1 = 0
51b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
51c0: 74 65 78 74 50 74 72 2d 3e 73 70 61 63 69 6e 67  textPtr->spacing
51d0: 32 20 3c 20 30 29 20 7b 0a 09 74 65 78 74 50 74  2 < 0) {..textPt
51e0: 72 2d 3e 73 70 61 63 69 6e 67 32 20 3d 20 30 3b  r->spacing2 = 0;
51f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 74  .    }.    if (t
5200: 65 78 74 50 74 72 2d 3e 73 70 61 63 69 6e 67 33  extPtr->spacing3
5210: 20 3c 20 30 29 20 7b 0a 09 74 65 78 74 50 74 72   < 0) {..textPtr
5220: 2d 3e 73 70 61 63 69 6e 67 33 20 3d 20 30 3b 0a  ->spacing3 = 0;.
5230: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
5240: 20 20 20 2a 20 50 61 72 73 65 20 74 61 62 20 73     * Parse tab s
5250: 74 6f 70 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  tops..     */.. 
5260: 20 20 20 69 66 20 28 74 65 78 74 50 74 72 2d 3e     if (textPtr->
5270: 74 61 62 41 72 72 61 79 50 74 72 20 21 3d 20 4e  tabArrayPtr != N
5280: 55 4c 4c 29 20 7b 0a 09 63 6b 66 72 65 65 28 28  ULL) {..ckfree((
5290: 63 68 61 72 20 2a 29 20 74 65 78 74 50 74 72 2d  char *) textPtr-
52a0: 3e 74 61 62 41 72 72 61 79 50 74 72 29 3b 0a 09  >tabArrayPtr);..
52b0: 74 65 78 74 50 74 72 2d 3e 74 61 62 41 72 72 61  textPtr->tabArra
52c0: 79 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  yPtr = NULL;.   
52d0: 20 7d 0a 20 20 20 20 69 66 20 28 74 65 78 74 50   }.    if (textP
52e0: 74 72 2d 3e 74 61 62 4f 70 74 69 6f 6e 53 74 72  tr->tabOptionStr
52f0: 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ing != NULL) {..
5300: 74 65 78 74 50 74 72 2d 3e 74 61 62 41 72 72 61  textPtr->tabArra
5310: 79 50 74 72 20 3d 20 54 6b 54 65 78 74 47 65 74  yPtr = TkTextGet
5320: 54 61 62 73 28 69 6e 74 65 72 70 2c 20 74 65 78  Tabs(interp, tex
5330: 74 50 74 72 2d 3e 74 6b 77 69 6e 2c 0a 09 09 74  tPtr->tkwin,...t
5340: 65 78 74 50 74 72 2d 3e 74 61 62 4f 70 74 69 6f  extPtr->tabOptio
5350: 6e 53 74 72 69 6e 67 29 3b 0a 09 69 66 20 28 74  nString);..if (t
5360: 65 78 74 50 74 72 2d 3e 74 61 62 41 72 72 61 79  extPtr->tabArray
5370: 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Ptr == NULL) {..
5380: 20 20 20 20 54 63 6c 5f 41 64 64 45 72 72 6f 72      Tcl_AddError
5390: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 22 5c 6e 20  Info(interp,"\n 
53a0: 20 20 20 28 77 68 69 6c 65 20 70 72 6f 63 65 73     (while proces
53b0: 73 69 6e 67 20 2d 74 61 62 73 20 6f 70 74 69 6f  sing -tabs optio
53c0: 6e 29 22 29 3b 0a 09 20 20 20 20 72 65 74 75 72  n)");..    retur
53d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
53e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
53f0: 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74     * Make sure t
5400: 68 61 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  hat configuratio
5410: 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 70 72  n options are pr
5420: 6f 70 65 72 6c 79 20 6d 69 72 72 6f 72 65 64 0a  operly mirrored.
5430: 20 20 20 20 20 2a 20 62 65 74 77 65 65 6e 20 74       * between t
5440: 68 65 20 77 69 64 67 65 74 20 72 65 63 6f 72 64  he widget record
5450: 20 61 6e 64 20 74 68 65 20 22 73 65 6c 22 20 74   and the "sel" t
5460: 61 67 73 2e 20 20 4e 4f 54 45 3a 20 77 65 20 64  ags.  NOTE: we d
5470: 6f 6e 27 74 0a 20 20 20 20 20 2a 20 68 61 76 65  on't.     * have
5480: 20 74 6f 20 66 72 65 65 20 75 70 20 69 6e 66 6f   to free up info
5490: 72 6d 61 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  rmation during t
54a0: 68 65 20 6d 69 72 72 6f 72 69 6e 67 3b 20 20 6f  he mirroring;  o
54b0: 6c 64 0a 20 20 20 20 20 2a 20 69 6e 66 6f 72 6d  ld.     * inform
54c0: 61 74 69 6f 6e 20 77 61 73 20 66 72 65 65 64 20  ation was freed 
54d0: 77 68 65 6e 20 69 74 20 77 61 73 20 72 65 70 6c  when it was repl
54e0: 61 63 65 64 20 69 6e 20 74 68 65 20 77 69 64 67  aced in the widg
54f0: 65 74 0a 20 20 20 20 20 2a 20 72 65 63 6f 72 64  et.     * record
5500: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 74  ..     */..    t
5510: 65 78 74 50 74 72 2d 3e 73 65 6c 54 61 67 50 74  extPtr->selTagPt
5520: 72 2d 3e 61 66 66 65 63 74 73 44 69 73 70 6c 61  r->affectsDispla
5530: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 28  y = 0;.    if ((
5540: 74 65 78 74 50 74 72 2d 3e 73 65 6c 54 61 67 50  textPtr->selTagP
5550: 74 72 2d 3e 6a 75 73 74 69 66 79 53 74 72 69 6e  tr->justifyStrin
5560: 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  g != NULL)..    
5570: 7c 7c 20 28 74 65 78 74 50 74 72 2d 3e 73 65 6c  || (textPtr->sel
5580: 54 61 67 50 74 72 2d 3e 6c 4d 61 72 67 69 6e 31  TagPtr->lMargin1
5590: 53 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29 0a  String != NULL).
55a0: 09 20 20 20 20 7c 7c 20 28 74 65 78 74 50 74 72  .    || (textPtr
55b0: 2d 3e 73 65 6c 54 61 67 50 74 72 2d 3e 6c 4d 61  ->selTagPtr->lMa
55c0: 72 67 69 6e 32 53 74 72 69 6e 67 20 21 3d 20 4e  rgin2String != N
55d0: 55 4c 4c 29 0a 09 20 20 20 20 7c 7c 20 28 74 65  ULL)..    || (te
55e0: 78 74 50 74 72 2d 3e 73 65 6c 54 61 67 50 74 72  xtPtr->selTagPtr
55f0: 2d 3e 6f 66 66 73 65 74 53 74 72 69 6e 67 20 21  ->offsetString !
5600: 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 7c 7c 20  = NULL)..    || 
5610: 28 74 65 78 74 50 74 72 2d 3e 73 65 6c 54 61 67  (textPtr->selTag
5620: 50 74 72 2d 3e 72 4d 61 72 67 69 6e 53 74 72 69  Ptr->rMarginStri
5630: 6e 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20  ng != NULL)..   
5640: 20 7c 7c 20 28 74 65 78 74 50 74 72 2d 3e 73 65   || (textPtr->se
5650: 6c 54 61 67 50 74 72 2d 3e 73 70 61 63 69 6e 67  lTagPtr->spacing
5660: 31 53 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29  1String != NULL)
5670: 0a 09 20 20 20 20 7c 7c 20 28 74 65 78 74 50 74  ..    || (textPt
5680: 72 2d 3e 73 65 6c 54 61 67 50 74 72 2d 3e 73 70  r->selTagPtr->sp
5690: 61 63 69 6e 67 32 53 74 72 69 6e 67 20 21 3d 20  acing2String != 
56a0: 4e 55 4c 4c 29 0a 09 20 20 20 20 7c 7c 20 28 74  NULL)..    || (t
56b0: 65 78 74 50 74 72 2d 3e 73 65 6c 54 61 67 50 74  extPtr->selTagPt
56c0: 72 2d 3e 73 70 61 63 69 6e 67 33 53 74 72 69 6e  r->spacing3Strin
56d0: 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  g != NULL)..    
56e0: 7c 7c 20 28 74 65 78 74 50 74 72 2d 3e 73 65 6c  || (textPtr->sel
56f0: 54 61 67 50 74 72 2d 3e 74 61 62 53 74 72 69 6e  TagPtr->tabStrin
5700: 67 20 21 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20  g != NULL)..    
5710: 7c 7c 20 28 74 65 78 74 50 74 72 2d 3e 73 65 6c  || (textPtr->sel
5720: 54 61 67 50 74 72 2d 3e 75 6e 64 65 72 6c 69 6e  TagPtr->underlin
5730: 65 53 74 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 29  eString != NULL)
5740: 0a 09 20 20 20 20 7c 7c 20 28 74 65 78 74 50 74  ..    || (textPt
5750: 72 2d 3e 73 65 6c 54 61 67 50 74 72 2d 3e 77 72  r->selTagPtr->wr
5760: 61 70 4d 6f 64 65 20 21 3d 20 4e 55 4c 4c 29 29  apMode != NULL))
5770: 20 7b 0a 09 74 65 78 74 50 74 72 2d 3e 73 65 6c   {..textPtr->sel
5780: 54 61 67 50 74 72 2d 3e 61 66 66 65 63 74 73 44  TagPtr->affectsD
5790: 69 73 70 6c 61 79 20 3d 20 31 3b 0a 20 20 20 20  isplay = 1;.    
57a0: 7d 0a 20 20 20 20 54 6b 54 65 78 74 52 65 64 72  }.    TkTextRedr
57b0: 61 77 54 61 67 28 74 65 78 74 50 74 72 2c 20 28  awTag(textPtr, (
57c0: 54 6b 54 65 78 74 49 6e 64 65 78 20 2a 29 20 4e  TkTextIndex *) N
57d0: 55 4c 4c 2c 20 28 54 6b 54 65 78 74 49 6e 64 65  ULL, (TkTextInde
57e0: 78 20 2a 29 20 4e 55 4c 4c 2c 0a 09 20 20 20 20  x *) NULL,..    
57f0: 74 65 78 74 50 74 72 2d 3e 73 65 6c 54 61 67 50  textPtr->selTagP
5800: 74 72 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 0a  tr, 1);..    /*.
5810: 20 20 20 20 20 2a 20 52 65 67 69 73 74 65 72 20       * Register 
5820: 74 68 65 20 64 65 73 69 72 65 64 20 67 65 6f 6d  the desired geom
5830: 65 74 72 79 20 66 6f 72 20 74 68 65 20 77 69 6e  etry for the win
5840: 64 6f 77 2c 20 61 6e 64 20 61 72 72 61 6e 67 65  dow, and arrange
5850: 20 66 6f 72 0a 20 20 20 20 20 2a 20 74 68 65 20   for.     * the 
5860: 77 69 6e 64 6f 77 20 74 6f 20 62 65 20 72 65 64  window to be red
5870: 69 73 70 6c 61 79 65 64 2e 0a 20 20 20 20 20 2a  isplayed..     *
5880: 2f 0a 0a 20 20 20 20 69 66 20 28 74 65 78 74 50  /..    if (textP
5890: 74 72 2d 3e 77 69 64 74 68 20 3c 3d 20 30 29 20  tr->width <= 0) 
58a0: 7b 0a 09 74 65 78 74 50 74 72 2d 3e 77 69 64 74  {..textPtr->widt
58b0: 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  h = 1;.    }.   
58c0: 20 69 66 20 28 74 65 78 74 50 74 72 2d 3e 68 65   if (textPtr->he
58d0: 69 67 68 74 20 3c 3d 20 30 29 20 7b 0a 09 74 65  ight <= 0) {..te
58e0: 78 74 50 74 72 2d 3e 68 65 69 67 68 74 20 3d 20  xtPtr->height = 
58f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 6b 5f  1;.    }.    Tk_
5900: 47 65 6f 6d 65 74 72 79 52 65 71 75 65 73 74 28  GeometryRequest(
5910: 74 65 78 74 50 74 72 2d 3e 74 6b 77 69 6e 2c 0a  textPtr->tkwin,.
5920: 09 20 20 20 20 74 65 78 74 50 74 72 2d 3e 77 69  .    textPtr->wi
5930: 64 74 68 20 2b 20 32 2a 74 65 78 74 50 74 72 2d  dth + 2*textPtr-
5940: 3e 62 6f 72 64 65 72 57 69 64 74 68 20 2b 20 32  >borderWidth + 2
5950: 2a 74 65 78 74 50 74 72 2d 3e 70 61 64 58 2c 0a  *textPtr->padX,.
5960: 09 20 20 20 20 74 65 78 74 50 74 72 2d 3e 68 65  .    textPtr->he
5970: 69 67 68 74 20 2b 20 32 2a 74 65 78 74 50 74 72  ight + 2*textPtr
5980: 2d 3e 62 6f 72 64 65 72 57 69 64 74 68 20 2b 20  ->borderWidth + 
5990: 32 2a 74 65 78 74 50 74 72 2d 3e 70 61 64 59 29  2*textPtr->padY)
59a0: 3b 0a 20 20 20 20 54 6b 5f 53 65 74 49 6e 74 65  ;.    Tk_SetInte
59b0: 72 6e 61 6c 42 6f 72 64 65 72 28 74 65 78 74 50  rnalBorder(textP
59c0: 74 72 2d 3e 74 6b 77 69 6e 2c 20 74 65 78 74 50  tr->tkwin, textP
59d0: 74 72 2d 3e 62 6f 72 64 65 72 57 69 64 74 68 29  tr->borderWidth)
59e0: 3b 0a 20 20 20 20 54 6b 54 65 78 74 52 65 6c 61  ;.    TkTextRela
59f0: 79 6f 75 74 57 69 6e 64 6f 77 28 74 65 78 74 50  youtWindow(textP
5a00: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
5a10: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
5a20: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5a60: 20 2a 0a 20 2a 20 54 65 78 74 45 76 65 6e 74 50   *. * TextEventP
5a70: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  roc --. *. *.Thi
5a80: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
5a90: 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 54 6b  nvoked by the Tk
5aa0: 20 64 69 73 70 61 74 63 68 65 72 20 6f 6e 0a 20   dispatcher on. 
5ab0: 2a 09 73 74 72 75 63 74 75 72 65 20 63 68 61 6e  *.structure chan
5ac0: 67 65 73 20 74 6f 20 61 20 74 65 78 74 2e 20 20  ges to a text.  
5ad0: 46 6f 72 20 74 65 78 74 73 20 77 69 74 68 20 33  For texts with 3
5ae0: 44 0a 20 2a 09 62 6f 72 64 65 72 73 2c 20 74 68  D. *.borders, th
5af0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
5b00: 61 6c 73 6f 20 69 6e 76 6f 6b 65 64 20 66 6f 72  also invoked for
5b10: 20 65 78 70 6f 73 75 72 65 73 2e 0a 20 2a 0a 20   exposures.. *. 
5b20: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
5b30: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
5b40: 66 66 65 63 74 73 3a 0a 20 2a 09 57 68 65 6e 20  ffects:. *.When 
5b50: 74 68 65 20 77 69 6e 64 6f 77 20 67 65 74 73 20  the window gets 
5b60: 64 65 6c 65 74 65 64 2c 20 69 6e 74 65 72 6e 61  deleted, interna
5b70: 6c 20 73 74 72 75 63 74 75 72 65 73 20 67 65 74  l structures get
5b80: 0a 20 2a 09 63 6c 65 61 6e 65 64 20 75 70 2e 20  . *.cleaned up. 
5b90: 20 57 68 65 6e 20 69 74 20 67 65 74 73 20 65 78   When it gets ex
5ba0: 70 6f 73 65 64 2c 20 69 74 20 69 73 20 72 65 64  posed, it is red
5bb0: 69 73 70 6c 61 79 65 64 2e 0a 20 2a 0a 20 2a 2d  isplayed.. *. *-
5bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5c00: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 54  /..static void.T
5c10: 65 78 74 45 76 65 6e 74 50 72 6f 63 28 63 6c 69  extEventProc(cli
5c20: 65 6e 74 44 61 74 61 2c 20 65 76 65 6e 74 50 74  entData, eventPt
5c30: 72 29 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74  r).    ClientDat
5c40: 61 20 63 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a  a clientData;./*
5c50: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
5c60: 75 74 20 77 69 6e 64 6f 77 2e 20 2a 2f 0a 20 20  ut window. */.  
5c70: 20 20 72 65 67 69 73 74 65 72 20 58 45 76 65 6e    register XEven
5c80: 74 20 2a 65 76 65 6e 74 50 74 72 3b 09 2f 2a 20  t *eventPtr;./* 
5c90: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
5ca0: 74 20 65 76 65 6e 74 2e 20 2a 2f 0a 7b 0a 20 20  t event. */.{.  
5cb0: 20 20 72 65 67 69 73 74 65 72 20 54 6b 54 65 78    register TkTex
5cc0: 74 20 2a 74 65 78 74 50 74 72 20 3d 20 28 54 6b  t *textPtr = (Tk
5cd0: 54 65 78 74 20 2a 29 20 63 6c 69 65 6e 74 44 61  Text *) clientDa
5ce0: 74 61 3b 0a 20 20 20 20 54 6b 54 65 78 74 49 6e  ta;.    TkTextIn
5cf0: 64 65 78 20 69 6e 64 65 78 2c 20 69 6e 64 65 78  dex index, index
5d00: 32 3b 0a 0a 20 20 20 20 69 66 20 28 65 76 65 6e  2;..    if (even
5d10: 74 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20 43 54  tPtr->type == CT
5d20: 4b 5f 45 58 50 4f 53 45 5f 45 56 45 4e 54 29 20  K_EXPOSE_EVENT) 
5d30: 7b 0a 09 54 6b 54 65 78 74 52 65 64 72 61 77 52  {..TkTextRedrawR
5d40: 65 67 69 6f 6e 28 74 65 78 74 50 74 72 2c 0a 09  egion(textPtr,..
5d50: 09 65 76 65 6e 74 50 74 72 2d 3e 75 2e 65 78 70  .eventPtr->u.exp
5d60: 6f 73 65 2e 6c 65 66 74 2c 20 65 76 65 6e 74 50  ose.left, eventP
5d70: 74 72 2d 3e 75 2e 65 78 70 6f 73 65 2e 74 6f 70  tr->u.expose.top
5d80: 2c 0a 09 09 65 76 65 6e 74 50 74 72 2d 3e 75 2e  ,...eventPtr->u.
5d90: 65 78 70 6f 73 65 2e 72 69 67 68 74 20 2d 20 65  expose.right - e
5da0: 76 65 6e 74 50 74 72 2d 3e 75 2e 65 78 70 6f 73  ventPtr->u.expos
5db0: 65 2e 6c 65 66 74 2c 0a 09 09 65 76 65 6e 74 50  e.left,...eventP
5dc0: 74 72 2d 3e 75 2e 65 78 70 6f 73 65 2e 62 6f 74  tr->u.expose.bot
5dd0: 74 6f 6d 20 2d 20 65 76 65 6e 74 50 74 72 2d 3e  tom - eventPtr->
5de0: 75 2e 65 78 70 6f 73 65 2e 74 6f 70 29 3b 0a 20  u.expose.top);. 
5df0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 65 76     } else if (ev
5e00: 65 6e 74 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20  entPtr->type == 
5e10: 43 54 4b 5f 4d 41 50 5f 45 56 45 4e 54 29 20 7b  CTK_MAP_EVENT) {
5e20: 0a 09 69 66 20 28 28 74 65 78 74 50 74 72 2d 3e  ..if ((textPtr->
5e30: 70 72 65 76 57 69 64 74 68 20 21 3d 20 54 6b 5f  prevWidth != Tk_
5e40: 57 69 64 74 68 28 74 65 78 74 50 74 72 2d 3e 74  Width(textPtr->t
5e50: 6b 77 69 6e 29 29 0a 09 09 7c 7c 20 28 74 65 78  kwin))...|| (tex
5e60: 74 50 74 72 2d 3e 70 72 65 76 48 65 69 67 68 74  tPtr->prevHeight
5e70: 20 21 3d 20 54 6b 5f 48 65 69 67 68 74 28 74 65   != Tk_Height(te
5e80: 78 74 50 74 72 2d 3e 74 6b 77 69 6e 29 29 29 20  xtPtr->tkwin))) 
5e90: 7b 0a 09 20 20 20 20 54 6b 54 65 78 74 52 65 6c  {..    TkTextRel
5ea0: 61 79 6f 75 74 57 69 6e 64 6f 77 28 74 65 78 74  ayoutWindow(text
5eb0: 50 74 72 29 3b 0a 09 20 20 20 20 74 65 78 74 50  Ptr);..    textP
5ec0: 74 72 2d 3e 70 72 65 76 57 69 64 74 68 20 3d 20  tr->prevWidth = 
5ed0: 54 6b 5f 57 69 64 74 68 28 74 65 78 74 50 74 72  Tk_Width(textPtr
5ee0: 2d 3e 74 6b 77 69 6e 29 3b 0a 09 20 20 20 20 74  ->tkwin);..    t
5ef0: 65 78 74 50 74 72 2d 3e 70 72 65 76 48 65 69 67  extPtr->prevHeig
5f00: 68 74 20 3d 20 54 6b 5f 48 65 69 67 68 74 28 74  ht = Tk_Height(t
5f10: 65 78 74 50 74 72 2d 3e 74 6b 77 69 6e 29 3b 0a  extPtr->tkwin);.
5f20: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .}.    } else if
5f30: 20 28 65 76 65 6e 74 50 74 72 2d 3e 74 79 70 65   (eventPtr->type
5f40: 20 3d 3d 20 43 54 4b 5f 44 45 53 54 52 4f 59 5f   == CTK_DESTROY_
5f50: 45 56 45 4e 54 29 20 7b 0a 09 69 66 20 28 74 65  EVENT) {..if (te
5f60: 78 74 50 74 72 2d 3e 74 6b 77 69 6e 20 21 3d 20  xtPtr->tkwin != 
5f70: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 74 65 78  NULL) {..    tex
5f80: 74 50 74 72 2d 3e 74 6b 77 69 6e 20 3d 20 4e 55  tPtr->tkwin = NU
5f90: 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 6c  LL;..    Tcl_Del
5fa0: 65 74 65 43 6f 6d 6d 61 6e 64 28 74 65 78 74 50  eteCommand(textP
5fb0: 74 72 2d 3e 69 6e 74 65 72 70 2c 0a 09 09 20 20  tr->interp,...  
5fc0: 20 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64    Tcl_GetCommand
5fd0: 4e 61 6d 65 28 74 65 78 74 50 74 72 2d 3e 69 6e  Name(textPtr->in
5fe0: 74 65 72 70 2c 0a 09 09 20 20 20 20 74 65 78 74  terp,...    text
5ff0: 50 74 72 2d 3e 77 69 64 67 65 74 43 6d 64 29 29  Ptr->widgetCmd))
6000: 3b 0a 09 7d 0a 09 54 6b 5f 45 76 65 6e 74 75 61  ;..}..Tk_Eventua
6010: 6c 6c 79 46 72 65 65 28 28 43 6c 69 65 6e 74 44  llyFree((ClientD
6020: 61 74 61 29 20 74 65 78 74 50 74 72 2c 20 44 65  ata) textPtr, De
6030: 73 74 72 6f 79 54 65 78 74 29 3b 0a 20 20 20 20  stroyText);.    
6040: 7d 20 65 6c 73 65 20 69 66 20 28 65 76 65 6e 74  } else if (event
6050: 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20 43 54 4b  Ptr->type == CTK
6060: 5f 46 4f 43 55 53 5f 45 56 45 4e 54 29 20 7b 0a  _FOCUS_EVENT) {.
6070: 09 74 65 78 74 50 74 72 2d 3e 66 6c 61 67 73 20  .textPtr->flags 
6080: 7c 3d 20 47 4f 54 5f 46 4f 43 55 53 3b 0a 09 54  |= GOT_FOCUS;..T
6090: 6b 54 65 78 74 4d 61 72 6b 53 65 67 54 6f 49 6e  kTextMarkSegToIn
60a0: 64 65 78 28 74 65 78 74 50 74 72 2c 20 74 65 78  dex(textPtr, tex
60b0: 74 50 74 72 2d 3e 69 6e 73 65 72 74 4d 61 72 6b  tPtr->insertMark
60c0: 50 74 72 2c 20 26 69 6e 64 65 78 29 3b 0a 09 54  Ptr, &index);..T
60d0: 6b 54 65 78 74 49 6e 64 65 78 46 6f 72 77 43 68  kTextIndexForwCh
60e0: 61 72 73 28 26 69 6e 64 65 78 2c 20 31 2c 20 26  ars(&index, 1, &
60f0: 69 6e 64 65 78 32 29 3b 0a 09 54 6b 54 65 78 74  index2);..TkText
6100: 43 68 61 6e 67 65 64 28 74 65 78 74 50 74 72 2c  Changed(textPtr,
6110: 20 26 69 6e 64 65 78 2c 20 26 69 6e 64 65 78 32   &index, &index2
6120: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
6130: 20 28 65 76 65 6e 74 50 74 72 2d 3e 74 79 70 65   (eventPtr->type
6140: 20 3d 3d 20 43 54 4b 5f 55 4e 46 4f 43 55 53 5f   == CTK_UNFOCUS_
6150: 45 56 45 4e 54 29 20 7b 0a 09 74 65 78 74 50 74  EVENT) {..textPt
6160: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 47 4f 54  r->flags &= ~GOT
6170: 5f 46 4f 43 55 53 3b 0a 20 20 20 20 7d 0a 7d 0a  _FOCUS;.    }.}.
6180: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
61d0: 0a 20 2a 20 54 65 78 74 43 6d 64 44 65 6c 65 74  . * TextCmdDelet
61e0: 65 64 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09  edProc --. *. *.
61f0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
6200: 73 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  s invoked when a
6210: 20 77 69 64 67 65 74 20 63 6f 6d 6d 61 6e 64 20   widget command 
6220: 69 73 20 64 65 6c 65 74 65 64 2e 20 20 49 66 0a  is deleted.  If.
6230: 20 2a 09 74 68 65 20 77 69 64 67 65 74 20 69 73   *.the widget is
6240: 6e 27 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74  n't already in t
6250: 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
6260: 69 6e 67 20 64 65 73 74 72 6f 79 65 64 2c 0a 20  ing destroyed,. 
6270: 2a 09 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 64  *.this command d
6280: 65 73 74 72 6f 79 73 20 69 74 2e 0a 20 2a 0a 20  estroys it.. *. 
6290: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
62a0: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
62b0: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 77  ffects:. *.The w
62c0: 69 64 67 65 74 20 69 73 20 64 65 73 74 72 6f 79  idget is destroy
62d0: 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ed.. *. *-------
62e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6320: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
6330: 0a 54 65 78 74 43 6d 64 44 65 6c 65 74 65 64 50  .TextCmdDeletedP
6340: 72 6f 63 28 63 6c 69 65 6e 74 44 61 74 61 29 0a  roc(clientData).
6350: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63      ClientData c
6360: 6c 69 65 6e 74 44 61 74 61 3b 09 2f 2a 20 50 6f  lientData;./* Po
6370: 69 6e 74 65 72 20 74 6f 20 77 69 64 67 65 74 20  inter to widget 
6380: 72 65 63 6f 72 64 20 66 6f 72 20 77 69 64 67 65  record for widge
6390: 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 6b 54 65  t. */.{.    TkTe
63a0: 78 74 20 2a 74 65 78 74 50 74 72 20 3d 20 28 54  xt *textPtr = (T
63b0: 6b 54 65 78 74 20 2a 29 20 63 6c 69 65 6e 74 44  kText *) clientD
63c0: 61 74 61 3b 0a 20 20 20 20 54 6b 5f 57 69 6e 64  ata;.    Tk_Wind
63d0: 6f 77 20 74 6b 77 69 6e 20 3d 20 74 65 78 74 50  ow tkwin = textP
63e0: 74 72 2d 3e 74 6b 77 69 6e 3b 0a 0a 20 20 20 20  tr->tkwin;..    
63f0: 2f 2a 0a 20 20 20 20 20 2a 20 54 68 69 73 20 70  /*.     * This p
6400: 72 6f 63 65 64 75 72 65 20 63 6f 75 6c 64 20 62  rocedure could b
6410: 65 20 69 6e 76 6f 6b 65 64 20 65 69 74 68 65 72  e invoked either
6420: 20 62 65 63 61 75 73 65 20 74 68 65 20 77 69 6e   because the win
6430: 64 6f 77 20 77 61 73 0a 20 20 20 20 20 2a 20 64  dow was.     * d
6440: 65 73 74 72 6f 79 65 64 20 61 6e 64 20 74 68 65  estroyed and the
6450: 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 74 68 65   command was the
6460: 6e 20 64 65 6c 65 74 65 64 20 28 69 6e 20 77 68  n deleted (in wh
6470: 69 63 68 20 63 61 73 65 20 74 6b 77 69 6e 0a 20  ich case tkwin. 
6480: 20 20 20 20 2a 20 69 73 20 4e 55 4c 4c 29 20 6f      * is NULL) o
6490: 72 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f  r because the co
64a0: 6d 6d 61 6e 64 20 77 61 73 20 64 65 6c 65 74 65  mmand was delete
64b0: 64 2c 20 61 6e 64 20 74 68 65 6e 20 74 68 69 73  d, and then this
64c0: 20 70 72 6f 63 65 64 75 72 65 0a 20 20 20 20 20   procedure.     
64d0: 2a 20 64 65 73 74 72 6f 79 73 20 74 68 65 20 77  * destroys the w
64e0: 69 64 67 65 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a  idget..     */..
64f0: 20 20 20 20 69 66 20 28 74 6b 77 69 6e 20 21 3d      if (tkwin !=
6500: 20 4e 55 4c 4c 29 20 7b 0a 09 74 65 78 74 50 74   NULL) {..textPt
6510: 72 2d 3e 74 6b 77 69 6e 20 3d 20 4e 55 4c 4c 3b  r->tkwin = NULL;
6520: 0a 09 54 6b 5f 44 65 73 74 72 6f 79 57 69 6e 64  ..Tk_DestroyWind
6530: 6f 77 28 74 6b 77 69 6e 29 3b 0a 20 20 20 20 7d  ow(tkwin);.    }
6540: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
6550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 0a 20 2a 0a 20 2a 20 49 6e 73 65 72 74 43 68 61  . *. * InsertCha
65a0: 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  rs --. *. *.This
65b0: 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65   procedure imple
65c0: 6d 65 6e 74 73 20 6d 6f 73 74 20 6f 66 20 74 68  ments most of th
65d0: 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20  e functionality 
65e0: 6f 66 20 74 68 65 0a 20 2a 09 22 69 6e 73 65 72  of the. *."inser
65f0: 74 22 20 77 69 64 67 65 74 20 63 6f 6d 6d 61 6e  t" widget comman
6600: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  d.. *. * Results
6610: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
6620: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
6630: 2a 09 54 68 65 20 63 68 61 72 61 63 74 65 72 73  *.The characters
6640: 20 69 6e 20 22 73 74 72 69 6e 67 22 20 67 65 74   in "string" get
6650: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 65   added to the te
6660: 78 74 20 6a 75 73 74 20 62 65 66 6f 72 65 0a 20  xt just before. 
6670: 2a 09 74 68 65 20 63 68 61 72 61 63 74 65 72 20  *.the character 
6680: 69 6e 64 69 63 61 74 65 64 20 62 79 20 22 69 6e  indicated by "in
6690: 64 65 78 50 74 72 22 2e 0a 20 2a 0a 20 2a 2d 2d  dexPtr".. *. *--
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66e0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
66f0: 20 76 6f 69 64 0a 49 6e 73 65 72 74 43 68 61 72   void.InsertChar
6700: 73 28 74 65 78 74 50 74 72 2c 20 69 6e 64 65 78  s(textPtr, index
6710: 50 74 72 2c 20 73 74 72 69 6e 67 29 0a 20 20 20  Ptr, string).   
6720: 20 54 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72   TkText *textPtr
6730: 3b 09 09 2f 2a 20 4f 76 65 72 61 6c 6c 20 69 6e  ;../* Overall in
6740: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
6750: 74 65 78 74 20 77 69 64 67 65 74 2e 20 2a 2f 0a  text widget. */.
6760: 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20      TkTextIndex 
6770: 2a 69 6e 64 65 78 50 74 72 3b 09 2f 2a 20 57 68  *indexPtr;./* Wh
6780: 65 72 65 20 74 6f 20 69 6e 73 65 72 74 20 6e 65  ere to insert ne
6790: 77 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 4d  w characters.  M
67a0: 61 79 20 62 65 0a 09 09 09 09 20 2a 20 6d 6f 64  ay be..... * mod
67b0: 69 66 69 65 64 20 61 6e 64 2f 6f 72 20 69 6e 76  ified and/or inv
67c0: 61 6c 69 64 61 74 65 64 2e 20 2a 2f 0a 20 20 20  alidated. */.   
67d0: 20 63 68 61 72 20 2a 73 74 72 69 6e 67 3b 09 09   char *string;..
67e0: 2f 2a 20 4e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74  /* Null-terminat
67f0: 65 64 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  ed string contai
6800: 6e 69 6e 67 20 6e 65 77 0a 09 09 09 09 20 2a 20  ning new..... * 
6810: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 61  information to a
6820: 64 64 20 74 6f 20 74 65 78 74 2e 20 2a 2f 0a 7b  dd to text. */.{
6830: 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 49 6e 64  .    int lineInd
6840: 65 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ex;..    /*.    
6850: 20 2a 20 44 6f 6e 27 74 20 61 6c 6c 6f 77 20 69   * Don't allow i
6860: 6e 73 65 72 74 69 6f 6e 73 20 6f 6e 20 74 68 65  nsertions on the
6870: 20 6c 61 73 74 20 28 64 75 6d 6d 79 29 20 6c 69   last (dummy) li
6880: 6e 65 20 6f 66 20 74 68 65 20 74 65 78 74 2e 0a  ne of the text..
6890: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 69 6e       */..    lin
68a0: 65 49 6e 64 65 78 20 3d 20 54 6b 42 54 72 65 65  eIndex = TkBTree
68b0: 4c 69 6e 65 49 6e 64 65 78 28 69 6e 64 65 78 50  LineIndex(indexP
68c0: 74 72 2d 3e 6c 69 6e 65 50 74 72 29 3b 0a 20 20  tr->linePtr);.  
68d0: 20 20 69 66 20 28 6c 69 6e 65 49 6e 64 65 78 20    if (lineIndex 
68e0: 3d 3d 20 54 6b 42 54 72 65 65 4e 75 6d 4c 69 6e  == TkBTreeNumLin
68f0: 65 73 28 74 65 78 74 50 74 72 2d 3e 74 72 65 65  es(textPtr->tree
6900: 29 29 20 7b 0a 09 6c 69 6e 65 49 6e 64 65 78 2d  )) {..lineIndex-
6910: 2d 3b 0a 09 54 6b 54 65 78 74 4d 61 6b 65 49 6e  -;..TkTextMakeIn
6920: 64 65 78 28 74 65 78 74 50 74 72 2d 3e 74 72 65  dex(textPtr->tre
6930: 65 2c 20 6c 69 6e 65 49 6e 64 65 78 2c 20 31 30  e, lineIndex, 10
6940: 30 30 30 30 30 2c 20 69 6e 64 65 78 50 74 72 29  00000, indexPtr)
6950: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
6960: 20 20 20 20 20 2a 20 4e 6f 74 69 66 79 20 74 68       * Notify th
6970: 65 20 64 69 73 70 6c 61 79 20 6d 6f 64 75 6c 65  e display module
6980: 20 74 68 61 74 20 6c 69 6e 65 73 20 61 72 65 20   that lines are 
6990: 61 62 6f 75 74 20 74 6f 20 63 68 61 6e 67 65 2c  about to change,
69a0: 20 74 68 65 6e 20 64 6f 0a 20 20 20 20 20 2a 20   then do.     * 
69b0: 74 68 65 20 69 6e 73 65 72 74 69 6f 6e 2e 0a 20  the insertion.. 
69c0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 6b 54 65      */..    TkTe
69d0: 78 74 43 68 61 6e 67 65 64 28 74 65 78 74 50 74  xtChanged(textPt
69e0: 72 2c 20 69 6e 64 65 78 50 74 72 2c 20 69 6e 64  r, indexPtr, ind
69f0: 65 78 50 74 72 29 3b 0a 20 20 20 20 54 6b 42 54  exPtr);.    TkBT
6a00: 72 65 65 49 6e 73 65 72 74 43 68 61 72 73 28 69  reeInsertChars(i
6a10: 6e 64 65 78 50 74 72 2c 20 73 74 72 69 6e 67 29  ndexPtr, string)
6a20: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
6a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6a70: 2d 0a 20 2a 0a 20 2a 20 44 65 6c 65 74 65 43 68  -. *. * DeleteCh
6a80: 61 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ars --. *. *.Thi
6a90: 73 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c  s procedure impl
6aa0: 65 6d 65 6e 74 73 20 6d 6f 73 74 20 6f 66 20 74  ements most of t
6ab0: 68 65 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  he functionality
6ac0: 20 6f 66 20 74 68 65 0a 20 2a 09 22 64 65 6c 65   of the. *."dele
6ad0: 74 65 22 20 77 69 64 67 65 74 20 63 6f 6d 6d 61  te" widget comma
6ae0: 6e 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nd.. *. * Result
6af0: 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 61 20  s:. *.Returns a 
6b00: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
6b10: 75 6c 74 2c 20 61 6e 64 20 6c 65 61 76 65 73 20  ult, and leaves 
6b20: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
6b30: 0a 20 2a 09 69 6e 20 74 65 78 74 50 74 72 2d 3e  . *.in textPtr->
6b40: 69 6e 74 65 72 70 20 69 66 20 74 68 65 72 65 20  interp if there 
6b50: 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a  is an error.. *.
6b60: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
6b70: 0a 20 2a 09 43 68 61 72 61 63 74 65 72 73 20 67  . *.Characters g
6b80: 65 74 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  et deleted from 
6b90: 74 68 65 20 74 65 78 74 2e 0a 20 2a 0a 20 2a 2d  the text.. *. *-
6ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
6bf0: 63 20 69 6e 74 0a 44 65 6c 65 74 65 43 68 61 72  c int.DeleteChar
6c00: 73 28 74 65 78 74 50 74 72 2c 20 69 6e 64 65 78  s(textPtr, index
6c10: 31 53 74 72 69 6e 67 2c 20 69 6e 64 65 78 32 53  1String, index2S
6c20: 74 72 69 6e 67 29 0a 20 20 20 20 54 6b 54 65 78  tring).    TkTex
6c30: 74 20 2a 74 65 78 74 50 74 72 3b 09 09 2f 2a 20  t *textPtr;../* 
6c40: 4f 76 65 72 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  Overall informat
6c50: 69 6f 6e 20 61 62 6f 75 74 20 74 65 78 74 20 77  ion about text w
6c60: 69 64 67 65 74 2e 20 2a 2f 0a 20 20 20 20 63 68  idget. */.    ch
6c70: 61 72 20 2a 69 6e 64 65 78 31 53 74 72 69 6e 67  ar *index1String
6c80: 3b 09 09 2f 2a 20 53 74 72 69 6e 67 20 64 65 73  ;../* String des
6c90: 63 72 69 62 69 6e 67 20 6c 6f 63 61 74 69 6f 6e  cribing location
6ca0: 20 6f 66 20 66 69 72 73 74 0a 09 09 09 09 20 2a   of first..... *
6cb0: 20 63 68 61 72 61 63 74 65 72 20 74 6f 20 64 65   character to de
6cc0: 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20 63 68 61  lete. */.    cha
6cd0: 72 20 2a 69 6e 64 65 78 32 53 74 72 69 6e 67 3b  r *index2String;
6ce0: 09 09 2f 2a 20 53 74 72 69 6e 67 20 64 65 73 63  ../* String desc
6cf0: 72 69 62 69 6e 67 20 6c 6f 63 61 74 69 6f 6e 20  ribing location 
6d00: 6f 66 20 6c 61 73 74 0a 09 09 09 09 20 2a 20 63  of last..... * c
6d10: 68 61 72 61 63 74 65 72 20 74 6f 20 64 65 6c 65  haracter to dele
6d20: 74 65 2e 20 20 4e 55 4c 4c 20 6d 65 61 6e 73 20  te.  NULL means 
6d30: 6a 75 73 74 0a 09 09 09 09 20 2a 20 64 65 6c 65  just..... * dele
6d40: 74 65 20 74 68 65 20 6f 6e 65 20 63 68 61 72 61  te the one chara
6d50: 63 74 65 72 20 67 69 76 65 6e 20 62 79 0a 09 09  cter given by...
6d60: 09 09 20 2a 20 69 6e 64 65 78 31 53 74 72 69 6e  .. * index1Strin
6d70: 67 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20  g. */.{.    int 
6d80: 6c 69 6e 65 31 2c 20 6c 69 6e 65 32 2c 20 6c 69  line1, line2, li
6d90: 6e 65 2c 20 63 68 61 72 49 6e 64 65 78 2c 20 72  ne, charIndex, r
6da0: 65 73 65 74 56 69 65 77 3b 0a 20 20 20 20 54 6b  esetView;.    Tk
6db0: 54 65 78 74 49 6e 64 65 78 20 69 6e 64 65 78 31  TextIndex index1
6dc0: 2c 20 69 6e 64 65 78 32 3b 0a 0a 20 20 20 20 2f  , index2;..    /
6dd0: 2a 0a 20 20 20 20 20 2a 20 50 61 72 73 65 20 74  *.     * Parse t
6de0: 68 65 20 73 74 61 72 74 69 6e 67 20 61 6e 64 20  he starting and 
6df0: 73 74 6f 70 70 69 6e 67 20 69 6e 64 69 63 65 73  stopping indices
6e00: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69  ..     */..    i
6e10: 66 20 28 54 6b 54 65 78 74 47 65 74 49 6e 64 65  f (TkTextGetInde
6e20: 78 28 74 65 78 74 50 74 72 2d 3e 69 6e 74 65 72  x(textPtr->inter
6e30: 70 2c 20 74 65 78 74 50 74 72 2c 20 69 6e 64 65  p, textPtr, inde
6e40: 78 31 53 74 72 69 6e 67 2c 20 26 69 6e 64 65 78  x1String, &index
6e50: 31 29 0a 09 20 20 20 20 21 3d 20 54 43 4c 5f 4f  1)..    != TCL_O
6e60: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
6e70: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6e80: 20 20 69 66 20 28 69 6e 64 65 78 32 53 74 72 69    if (index2Stri
6e90: 6e 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  ng != NULL) {..i
6ea0: 66 20 28 54 6b 54 65 78 74 47 65 74 49 6e 64 65  f (TkTextGetInde
6eb0: 78 28 74 65 78 74 50 74 72 2d 3e 69 6e 74 65 72  x(textPtr->inter
6ec0: 70 2c 20 74 65 78 74 50 74 72 2c 20 69 6e 64 65  p, textPtr, inde
6ed0: 78 32 53 74 72 69 6e 67 2c 20 26 69 6e 64 65 78  x2String, &index
6ee0: 32 29 0a 09 09 21 3d 20 54 43 4c 5f 4f 4b 29 20  2)...!= TCL_OK) 
6ef0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
6f00: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
6f10: 7d 20 65 6c 73 65 20 7b 0a 09 69 6e 64 65 78 32  } else {..index2
6f20: 20 3d 20 69 6e 64 65 78 31 3b 0a 09 54 6b 54 65   = index1;..TkTe
6f30: 78 74 49 6e 64 65 78 46 6f 72 77 43 68 61 72 73  xtIndexForwChars
6f40: 28 26 69 6e 64 65 78 32 2c 20 31 2c 20 26 69 6e  (&index2, 1, &in
6f50: 64 65 78 32 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  dex2);.    }..  
6f60: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65    /*.     * Make
6f70: 20 73 75 72 65 20 74 68 65 72 65 27 73 20 72 65   sure there's re
6f80: 61 6c 6c 79 20 73 6f 6d 65 74 68 69 6e 67 20 74  ally something t
6f90: 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20 20 20 2a  o delete..     *
6fa0: 2f 0a 0a 20 20 20 20 69 66 20 28 54 6b 54 65 78  /..    if (TkTex
6fb0: 74 49 6e 64 65 78 43 6d 70 28 26 69 6e 64 65 78  tIndexCmp(&index
6fc0: 31 2c 20 26 69 6e 64 65 78 32 29 20 3e 3d 20 30  1, &index2) >= 0
6fd0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
6fe0: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
6ff0: 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 6f 64  *.     * The cod
7000: 65 20 62 65 6c 6f 77 20 69 73 20 75 67 6c 79 2c  e below is ugly,
7010: 20 62 75 74 20 69 74 27 73 20 6e 65 65 64 65 64   but it's needed
7020: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
7030: 65 72 65 0a 20 20 20 20 20 2a 20 69 73 20 61 6c  ere.     * is al
7040: 77 61 79 73 20 61 20 64 75 6d 6d 79 20 65 6d 70  ways a dummy emp
7050: 74 79 20 6c 69 6e 65 20 61 74 20 74 68 65 20 65  ty line at the e
7060: 6e 64 20 6f 66 20 74 68 65 20 74 65 78 74 2e 20  nd of the text. 
7070: 20 49 66 20 74 68 65 0a 20 20 20 20 20 2a 20 66   If the.     * f
7080: 69 6e 61 6c 20 6e 65 77 6c 69 6e 65 20 6f 66 20  inal newline of 
7090: 74 68 65 20 66 69 6c 65 20 28 6a 75 73 74 20 62  the file (just b
70a0: 65 66 6f 72 65 20 74 68 65 20 64 75 6d 6d 79 20  efore the dummy 
70b0: 6c 69 6e 65 29 20 69 73 20 62 65 69 6e 67 0a 20  line) is being. 
70c0: 20 20 20 20 2a 20 64 65 6c 65 74 65 64 2c 20 74      * deleted, t
70d0: 68 65 6e 20 62 61 63 6b 20 75 70 20 69 6e 64 65  hen back up inde
70e0: 78 20 74 6f 20 6a 75 73 74 20 62 65 66 6f 72 65  x to just before
70f0: 20 74 68 65 20 6e 65 77 6c 69 6e 65 2e 20 20 49   the newline.  I
7100: 66 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20 69  f.     * there i
7110: 73 20 61 20 6e 65 77 6c 69 6e 65 20 6a 75 73 74  s a newline just
7120: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
7130: 74 20 63 68 61 72 61 63 74 65 72 20 62 65 69 6e  t character bein
7140: 67 20 64 65 6c 65 74 65 64 2c 0a 20 20 20 20 20  g deleted,.     
7150: 2a 20 74 68 65 6e 20 62 61 63 6b 20 75 70 20 74  * then back up t
7160: 68 65 20 66 69 72 73 74 20 69 6e 64 65 78 20 74  he first index t
7170: 6f 6f 2c 20 73 6f 20 74 68 61 74 20 61 6e 20 65  oo, so that an e
7180: 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69  ven number of li
7190: 6e 65 73 0a 20 20 20 20 20 2a 20 67 65 74 73 20  nes.     * gets 
71a0: 64 65 6c 65 74 65 64 2e 20 20 46 75 72 74 68 65  deleted.  Furthe
71b0: 72 6d 6f 72 65 2c 20 72 65 6d 6f 76 65 20 61 6e  rmore, remove an
71c0: 79 20 74 61 67 73 20 74 68 61 74 20 61 72 65 20  y tags that are 
71d0: 70 72 65 73 65 6e 74 20 6f 6e 0a 20 20 20 20 20  present on.     
71e0: 2a 20 74 68 65 20 6e 65 77 6c 69 6e 65 20 74 68  * the newline th
71f0: 61 74 20 69 73 6e 27 74 20 67 6f 69 6e 67 20 74  at isn't going t
7200: 6f 20 62 65 20 64 65 6c 65 74 65 64 20 61 66 74  o be deleted aft
7210: 65 72 20 61 6c 6c 20 28 74 68 69 73 20 73 69 6d  er all (this sim
7220: 75 6c 61 74 65 73 0a 20 20 20 20 20 2a 20 64 65  ulates.     * de
7230: 6c 65 74 69 6e 67 20 74 68 65 20 6e 65 77 6c 69  leting the newli
7240: 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64 64 69  ne and then addi
7250: 6e 67 20 61 20 22 63 6c 65 61 6e 22 20 6f 6e 65  ng a "clean" one
7260: 20 62 61 63 6b 20 61 67 61 69 6e 29 2e 0a 20 20   back again)..  
7270: 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 69 6e 65 31     */..    line1
7280: 20 3d 20 54 6b 42 54 72 65 65 4c 69 6e 65 49 6e   = TkBTreeLineIn
7290: 64 65 78 28 69 6e 64 65 78 31 2e 6c 69 6e 65 50  dex(index1.lineP
72a0: 74 72 29 3b 0a 20 20 20 20 6c 69 6e 65 32 20 3d  tr);.    line2 =
72b0: 20 54 6b 42 54 72 65 65 4c 69 6e 65 49 6e 64 65   TkBTreeLineInde
72c0: 78 28 69 6e 64 65 78 32 2e 6c 69 6e 65 50 74 72  x(index2.linePtr
72d0: 29 3b 0a 20 20 20 20 69 66 20 28 6c 69 6e 65 32  );.    if (line2
72e0: 20 3d 3d 20 54 6b 42 54 72 65 65 4e 75 6d 4c 69   == TkBTreeNumLi
72f0: 6e 65 73 28 74 65 78 74 50 74 72 2d 3e 74 72 65  nes(textPtr->tre
7300: 65 29 29 20 7b 0a 09 54 6b 54 65 78 74 54 61 67  e)) {..TkTextTag
7310: 20 2a 2a 61 72 72 61 79 50 74 72 3b 0a 09 69 6e   **arrayPtr;..in
7320: 74 20 61 72 72 61 79 53 69 7a 65 2c 20 69 3b 0a  t arraySize, i;.
7330: 09 54 6b 54 65 78 74 49 6e 64 65 78 20 6f 6c 64  .TkTextIndex old
7340: 49 6e 64 65 78 32 3b 0a 0a 09 6f 6c 64 49 6e 64  Index2;...oldInd
7350: 65 78 32 20 3d 20 69 6e 64 65 78 32 3b 0a 09 54  ex2 = index2;..T
7360: 6b 54 65 78 74 49 6e 64 65 78 42 61 63 6b 43 68  kTextIndexBackCh
7370: 61 72 73 28 26 6f 6c 64 49 6e 64 65 78 32 2c 20  ars(&oldIndex2, 
7380: 31 2c 20 26 69 6e 64 65 78 32 29 3b 0a 09 6c 69  1, &index2);..li
7390: 6e 65 32 2d 2d 3b 0a 09 69 66 20 28 28 69 6e 64  ne2--;..if ((ind
73a0: 65 78 31 2e 63 68 61 72 49 6e 64 65 78 20 3d 3d  ex1.charIndex ==
73b0: 20 30 29 20 26 26 20 28 6c 69 6e 65 31 20 21 3d   0) && (line1 !=
73c0: 20 30 29 29 20 7b 0a 09 20 20 20 20 54 6b 54 65   0)) {..    TkTe
73d0: 78 74 49 6e 64 65 78 42 61 63 6b 43 68 61 72 73  xtIndexBackChars
73e0: 28 26 69 6e 64 65 78 31 2c 20 31 2c 20 26 69 6e  (&index1, 1, &in
73f0: 64 65 78 31 29 3b 0a 09 20 20 20 20 6c 69 6e 65  dex1);..    line
7400: 31 2d 2d 3b 0a 09 7d 0a 09 61 72 72 61 79 50 74  1--;..}..arrayPt
7410: 72 20 3d 20 54 6b 42 54 72 65 65 47 65 74 54 61  r = TkBTreeGetTa
7420: 67 73 28 26 69 6e 64 65 78 32 2c 20 26 61 72 72  gs(&index2, &arr
7430: 61 79 53 69 7a 65 29 3b 0a 09 69 66 20 28 61 72  aySize);..if (ar
7440: 72 61 79 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20  rayPtr != NULL) 
7450: 7b 0a 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20  {..    for (i = 
7460: 30 3b 20 69 20 3c 20 61 72 72 61 79 53 69 7a 65  0; i < arraySize
7470: 3b 20 69 2b 2b 29 20 7b 0a 09 09 54 6b 42 54 72  ; i++) {...TkBTr
7480: 65 65 54 61 67 28 26 69 6e 64 65 78 32 2c 20 26  eeTag(&index2, &
7490: 6f 6c 64 49 6e 64 65 78 32 2c 20 61 72 72 61 79  oldIndex2, array
74a0: 50 74 72 5b 69 5d 2c 20 30 29 3b 0a 09 20 20 20  Ptr[i], 0);..   
74b0: 20 7d 0a 09 20 20 20 20 63 6b 66 72 65 65 28 28   }..    ckfree((
74c0: 63 68 61 72 20 2a 29 20 61 72 72 61 79 50 74 72  char *) arrayPtr
74d0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
74e0: 20 2f 2a 0a 20 20 20 20 20 2a 20 54 65 6c 6c 20   /*.     * Tell 
74f0: 74 68 65 20 64 69 73 70 6c 61 79 20 77 68 61 74  the display what
7500: 27 73 20 61 62 6f 75 74 20 74 6f 20 68 61 70 70  's about to happ
7510: 65 6e 20 73 6f 20 69 74 20 63 61 6e 20 64 69 73  en so it can dis
7520: 63 61 72 64 0a 20 20 20 20 20 2a 20 6f 62 73 6f  card.     * obso
7530: 6c 65 74 65 20 64 69 73 70 6c 61 79 20 69 6e 66  lete display inf
7540: 6f 72 6d 61 74 69 6f 6e 2c 20 74 68 65 6e 20 64  ormation, then d
7550: 6f 20 74 68 65 20 64 65 6c 65 74 69 6f 6e 2e 20  o the deletion. 
7560: 20 41 6c 73 6f 2c 0a 20 20 20 20 20 2a 20 69 66   Also,.     * if
7570: 20 74 68 65 20 64 65 6c 65 74 69 6f 6e 20 69 6e   the deletion in
7580: 76 6f 6c 76 65 73 20 74 68 65 20 74 6f 70 20 6c  volves the top l
7590: 69 6e 65 20 6f 6e 20 74 68 65 20 73 63 72 65 65  ine on the scree
75a0: 6e 2c 20 74 68 65 6e 0a 20 20 20 20 20 2a 20 77  n, then.     * w
75b0: 65 20 68 61 76 65 20 74 6f 20 72 65 73 65 74 20  e have to reset 
75c0: 74 68 65 20 76 69 65 77 20 28 74 68 65 20 64 65  the view (the de
75d0: 6c 65 74 69 6f 6e 20 77 69 6c 6c 20 69 6e 76 61  letion will inva
75e0: 6c 69 64 61 74 65 0a 20 20 20 20 20 2a 20 74 65  lidate.     * te
75f0: 78 74 50 74 72 2d 3e 74 6f 70 49 6e 64 65 78 29  xtPtr->topIndex)
7600: 2e 20 20 43 6f 6d 70 75 74 65 20 77 68 61 74 20  .  Compute what 
7610: 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 63 68  the new first ch
7620: 61 72 61 63 74 65 72 0a 20 20 20 20 20 2a 20 77  aracter.     * w
7630: 69 6c 6c 20 62 65 2c 20 74 68 65 6e 20 64 6f 20  ill be, then do 
7640: 74 68 65 20 64 65 6c 65 74 69 6f 6e 2c 20 74 68  the deletion, th
7650: 65 6e 20 72 65 73 65 74 20 74 68 65 20 76 69 65  en reset the vie
7660: 77 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  w..     */..    
7670: 54 6b 54 65 78 74 43 68 61 6e 67 65 64 28 74 65  TkTextChanged(te
7680: 78 74 50 74 72 2c 20 26 69 6e 64 65 78 31 2c 20  xtPtr, &index1, 
7690: 26 69 6e 64 65 78 32 29 3b 0a 20 20 20 20 72 65  &index2);.    re
76a0: 73 65 74 56 69 65 77 20 3d 20 6c 69 6e 65 20 3d  setView = line =
76b0: 20 63 68 61 72 49 6e 64 65 78 20 3d 20 30 3b 0a   charIndex = 0;.
76c0: 20 20 20 20 69 66 20 28 54 6b 54 65 78 74 49 6e      if (TkTextIn
76d0: 64 65 78 43 6d 70 28 26 69 6e 64 65 78 32 2c 20  dexCmp(&index2, 
76e0: 26 74 65 78 74 50 74 72 2d 3e 74 6f 70 49 6e 64  &textPtr->topInd
76f0: 65 78 29 20 3e 3d 20 30 29 20 7b 0a 09 69 66 20  ex) >= 0) {..if 
7700: 28 54 6b 54 65 78 74 49 6e 64 65 78 43 6d 70 28  (TkTextIndexCmp(
7710: 26 69 6e 64 65 78 31 2c 20 26 74 65 78 74 50 74  &index1, &textPt
7720: 72 2d 3e 74 6f 70 49 6e 64 65 78 29 20 3c 3d 20  r->topIndex) <= 
7730: 30 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20  0) {..    /*..  
7740: 20 20 20 2a 20 44 65 6c 65 74 69 6f 6e 20 72 61     * Deletion ra
7750: 6e 67 65 20 73 74 72 61 64 64 6c 65 73 20 74 6f  nge straddles to
7760: 70 49 6e 64 65 78 3a 20 75 73 65 20 74 68 65 20  pIndex: use the 
7770: 62 65 67 69 6e 6e 69 6e 67 0a 09 20 20 20 20 20  beginning..     
7780: 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 61  * of the range a
7790: 73 20 74 68 65 20 6e 65 77 20 74 6f 70 49 6e 64  s the new topInd
77a0: 65 78 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  ex...     */... 
77b0: 20 20 20 72 65 73 65 74 56 69 65 77 20 3d 20 31     resetView = 1
77c0: 3b 0a 09 20 20 20 20 6c 69 6e 65 20 3d 20 6c 69  ;..    line = li
77d0: 6e 65 31 3b 0a 09 20 20 20 20 63 68 61 72 49 6e  ne1;..    charIn
77e0: 64 65 78 20 3d 20 69 6e 64 65 78 31 2e 63 68 61  dex = index1.cha
77f0: 72 49 6e 64 65 78 3b 0a 09 7d 20 65 6c 73 65 20  rIndex;..} else 
7800: 69 66 20 28 69 6e 64 65 78 31 2e 6c 69 6e 65 50  if (index1.lineP
7810: 74 72 20 3d 3d 20 74 65 78 74 50 74 72 2d 3e 74  tr == textPtr->t
7820: 6f 70 49 6e 64 65 78 2e 6c 69 6e 65 50 74 72 29  opIndex.linePtr)
7830: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20   {..    /*..    
7840: 20 2a 20 44 65 6c 65 74 69 6f 6e 20 72 61 6e 67   * Deletion rang
7850: 65 20 73 74 61 72 74 73 20 6f 6e 20 74 6f 70 20  e starts on top 
7860: 6c 69 6e 65 20 62 75 74 20 61 66 74 65 72 20 74  line but after t
7870: 6f 70 49 6e 64 65 78 2e 0a 09 20 20 20 20 20 2a  opIndex...     *
7880: 20 55 73 65 20 74 68 65 20 63 75 72 72 65 6e 74   Use the current
7890: 20 74 6f 70 49 6e 64 65 78 20 61 73 20 74 68 65   topIndex as the
78a0: 20 6e 65 77 20 6f 6e 65 2e 0a 09 20 20 20 20 20   new one...     
78b0: 2a 2f 0a 0a 09 20 20 20 20 72 65 73 65 74 56 69  */...    resetVi
78c0: 65 77 20 3d 20 31 3b 0a 09 20 20 20 20 6c 69 6e  ew = 1;..    lin
78d0: 65 20 3d 20 6c 69 6e 65 31 3b 0a 09 20 20 20 20  e = line1;..    
78e0: 63 68 61 72 49 6e 64 65 78 20 3d 20 74 65 78 74  charIndex = text
78f0: 50 74 72 2d 3e 74 6f 70 49 6e 64 65 78 2e 63 68  Ptr->topIndex.ch
7900: 61 72 49 6e 64 65 78 3b 0a 09 7d 0a 20 20 20 20  arIndex;..}.    
7910: 7d 20 65 6c 73 65 20 69 66 20 28 69 6e 64 65 78  } else if (index
7920: 32 2e 6c 69 6e 65 50 74 72 20 3d 3d 20 74 65 78  2.linePtr == tex
7930: 74 50 74 72 2d 3e 74 6f 70 49 6e 64 65 78 2e 6c  tPtr->topIndex.l
7940: 69 6e 65 50 74 72 29 20 7b 0a 09 2f 2a 0a 09 20  inePtr) {../*.. 
7950: 2a 20 44 65 6c 65 74 69 6f 6e 20 72 61 6e 67 65  * Deletion range
7960: 20 65 6e 64 73 20 6f 6e 20 74 6f 70 20 6c 69 6e   ends on top lin
7970: 65 20 62 75 74 20 62 65 66 6f 72 65 20 74 6f 70  e but before top
7980: 49 6e 64 65 78 2e 0a 09 20 2a 20 46 69 67 75 72  Index... * Figur
7990: 65 20 6f 75 74 20 77 68 61 74 20 77 69 6c 6c 20  e out what will 
79a0: 62 65 20 74 68 65 20 6e 65 77 20 63 68 61 72 61  be the new chara
79b0: 63 74 65 72 20 69 6e 64 65 78 20 66 6f 72 0a 09  cter index for..
79c0: 20 2a 20 74 68 65 20 63 68 61 72 61 63 74 65 72   * the character
79d0: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
79e0: 65 64 20 74 6f 20 62 79 20 74 6f 70 49 6e 64 65  ed to by topInde
79f0: 78 2e 0a 09 20 2a 2f 0a 0a 09 72 65 73 65 74 56  x... */...resetV
7a00: 69 65 77 20 3d 20 31 3b 0a 09 6c 69 6e 65 20 3d  iew = 1;..line =
7a10: 20 6c 69 6e 65 32 3b 0a 09 63 68 61 72 49 6e 64   line2;..charInd
7a20: 65 78 20 3d 20 74 65 78 74 50 74 72 2d 3e 74 6f  ex = textPtr->to
7a30: 70 49 6e 64 65 78 2e 63 68 61 72 49 6e 64 65 78  pIndex.charIndex
7a40: 3b 0a 09 69 66 20 28 69 6e 64 65 78 31 2e 6c 69  ;..if (index1.li
7a50: 6e 65 50 74 72 20 21 3d 20 69 6e 64 65 78 32 2e  nePtr != index2.
7a60: 6c 69 6e 65 50 74 72 29 20 7b 0a 09 20 20 20 20  linePtr) {..    
7a70: 63 68 61 72 49 6e 64 65 78 20 2d 3d 20 69 6e 64  charIndex -= ind
7a80: 65 78 32 2e 63 68 61 72 49 6e 64 65 78 3b 0a 09  ex2.charIndex;..
7a90: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 63 68  } else {..    ch
7aa0: 61 72 49 6e 64 65 78 20 2d 3d 20 28 69 6e 64 65  arIndex -= (inde
7ab0: 78 32 2e 63 68 61 72 49 6e 64 65 78 20 2d 20 69  x2.charIndex - i
7ac0: 6e 64 65 78 31 2e 63 68 61 72 49 6e 64 65 78 29  ndex1.charIndex)
7ad0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 54  ;..}.    }.    T
7ae0: 6b 42 54 72 65 65 44 65 6c 65 74 65 43 68 61 72  kBTreeDeleteChar
7af0: 73 28 26 69 6e 64 65 78 31 2c 20 26 69 6e 64 65  s(&index1, &inde
7b00: 78 32 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73  x2);.    if (res
7b10: 65 74 56 69 65 77 29 20 7b 0a 09 54 6b 54 65 78  etView) {..TkTex
7b20: 74 4d 61 6b 65 49 6e 64 65 78 28 74 65 78 74 50  tMakeIndex(textP
7b30: 74 72 2d 3e 74 72 65 65 2c 20 6c 69 6e 65 2c 20  tr->tree, line, 
7b40: 63 68 61 72 49 6e 64 65 78 2c 20 26 69 6e 64 65  charIndex, &inde
7b50: 78 31 29 3b 0a 09 54 6b 54 65 78 74 53 65 74 59  x1);..TkTextSetY
7b60: 56 69 65 77 28 74 65 78 74 50 74 72 2c 20 26 69  View(textPtr, &i
7b70: 6e 64 65 78 31 2c 20 30 29 3b 0a 20 20 20 20 7d  ndex1, 0);.    }
7b80: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
7b90: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
7ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7be0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 65 78 74 53  ----. *. * TextS
7bf0: 65 61 72 63 68 43 6d 64 20 2d 2d 0a 20 2a 0a 20  earchCmd --. *. 
7c00: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
7c10: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70   is invoked to p
7c20: 72 6f 63 65 73 73 20 74 68 65 20 22 73 65 61 72  rocess the "sear
7c30: 63 68 22 20 77 69 64 67 65 74 20 63 6f 6d 6d 61  ch" widget comma
7c40: 6e 64 0a 20 2a 09 66 6f 72 20 74 65 78 74 20 77  nd. *.for text w
7c50: 69 64 67 65 74 73 2e 20 20 53 65 65 20 74 68 65  idgets.  See the
7c60: 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74   user documentat
7c70: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20  ion for details 
7c80: 6f 6e 20 77 68 61 74 0a 20 2a 09 69 74 20 64 6f  on what. *.it do
7c90: 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  es.. *. * Result
7ca0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
7cb0: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
7cc0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
7cd0: 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 72  . *.See the user
7ce0: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a   documentation..
7cf0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
7d40: 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 65 78 74  .static int.Text
7d50: 53 65 61 72 63 68 43 6d 64 28 74 65 78 74 50 74  SearchCmd(textPt
7d60: 72 2c 20 69 6e 74 65 72 70 2c 20 61 72 67 63 2c  r, interp, argc,
7d70: 20 61 72 67 76 29 0a 20 20 20 20 54 6b 54 65 78   argv).    TkTex
7d80: 74 20 2a 74 65 78 74 50 74 72 3b 09 09 2f 2a 20  t *textPtr;../* 
7d90: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
7da0: 74 20 74 65 78 74 20 77 69 64 67 65 74 2e 20 2a  t text widget. *
7db0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  /.    Tcl_Interp
7dc0: 20 2a 69 6e 74 65 72 70 3b 09 09 2f 2a 20 43 75   *interp;../* Cu
7dd0: 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65  rrent interprete
7de0: 72 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 72  r. */.    int ar
7df0: 67 63 3b 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20  gc;.../* Number 
7e00: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f  of arguments. */
7e10: 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 72 67 76  .    char **argv
7e20: 3b 09 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 73  ;../* Argument s
7e30: 74 72 69 6e 67 73 2e 20 2a 2f 0a 7b 0a 20 20 20  trings. */.{.   
7e40: 20 69 6e 74 20 62 61 63 6b 77 61 72 64 73 2c 20   int backwards, 
7e50: 65 78 61 63 74 2c 20 63 2c 20 69 2c 20 61 72 67  exact, c, i, arg
7e60: 73 4c 65 66 74 2c 20 6e 6f 43 61 73 65 2c 20 6c  sLeft, noCase, l
7e70: 65 66 74 54 6f 53 63 61 6e 3b 0a 20 20 20 20 73  eftToScan;.    s
7e80: 69 7a 65 5f 74 20 6c 65 6e 67 74 68 3b 0a 20 20  ize_t length;.  
7e90: 20 20 69 6e 74 20 6e 75 6d 4c 69 6e 65 73 2c 20    int numLines, 
7ea0: 73 74 61 72 74 69 6e 67 4c 69 6e 65 2c 20 73 74  startingLine, st
7eb0: 61 72 74 69 6e 67 43 68 61 72 2c 20 6c 69 6e 65  artingChar, line
7ec0: 4e 75 6d 2c 20 66 69 72 73 74 43 68 61 72 2c 20  Num, firstChar, 
7ed0: 6c 61 73 74 43 68 61 72 3b 0a 20 20 20 20 69 6e  lastChar;.    in
7ee0: 74 20 63 6f 64 65 2c 20 6d 61 74 63 68 4c 65 6e  t code, matchLen
7ef0: 67 74 68 2c 20 6d 61 74 63 68 43 68 61 72 2c 20  gth, matchChar, 
7f00: 70 61 73 73 65 73 2c 20 73 74 6f 70 4c 69 6e 65  passes, stopLine
7f10: 2c 20 73 65 61 72 63 68 57 68 6f 6c 65 54 65 78  , searchWholeTex
7f20: 74 3b 0a 20 20 20 20 69 6e 74 20 70 61 74 4c 65  t;.    int patLe
7f30: 6e 67 74 68 3b 0a 20 20 20 20 63 68 61 72 20 2a  ngth;.    char *
7f40: 61 72 67 2c 20 2a 70 61 74 74 65 72 6e 2c 20 2a  arg, *pattern, *
7f50: 76 61 72 4e 61 6d 65 2c 20 2a 70 2c 20 2a 73 74  varName, *p, *st
7f60: 61 72 74 4f 66 4c 69 6e 65 3b 0a 20 20 20 20 63  artOfLine;.    c
7f70: 68 61 72 20 62 75 66 66 65 72 5b 32 30 5d 3b 0a  har buffer[20];.
7f80: 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20      TkTextIndex 
7f90: 69 6e 64 65 78 2c 20 73 74 6f 70 49 6e 64 65 78  index, stopIndex
7fa0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
7fb0: 67 20 6c 69 6e 65 2c 20 70 61 74 44 53 74 72 69  g line, patDStri
7fc0: 6e 67 3b 0a 20 20 20 20 54 6b 54 65 78 74 53 65  ng;.    TkTextSe
7fd0: 67 6d 65 6e 74 20 2a 73 65 67 50 74 72 3b 0a 20  gment *segPtr;. 
7fe0: 20 20 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c     TkTextLine *l
7ff0: 69 6e 65 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f  inePtr;.    Tcl_
8000: 52 65 67 45 78 70 20 72 65 67 65 78 70 20 3d 20  RegExp regexp = 
8010: 4e 55 4c 4c 3b 09 09 2f 2a 20 49 6e 69 74 69 61  NULL;../* Initia
8020: 6c 69 7a 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  lization needed 
8030: 6f 6e 6c 79 20 74 6f 0a 09 09 09 09 09 20 2a 20  only to...... * 
8040: 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72  prevent compiler
8050: 20 77 61 72 6e 69 6e 67 2e 20 2a 2f 0a 0a 20 20   warning. */..  
8060: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 50 61 72 73    /*.     * Pars
8070: 65 20 73 77 69 74 63 68 65 73 20 61 6e 64 20 6f  e switches and o
8080: 74 68 65 72 20 61 72 67 75 6d 65 6e 74 73 2e 0a  ther arguments..
8090: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 65 78 61       */..    exa
80a0: 63 74 20 3d 20 31 3b 0a 20 20 20 20 62 61 63 6b  ct = 1;.    back
80b0: 77 61 72 64 73 20 3d 20 30 3b 0a 20 20 20 20 6e  wards = 0;.    n
80c0: 6f 43 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 76  oCase = 0;.    v
80d0: 61 72 4e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20  arName = NULL;. 
80e0: 20 20 20 66 6f 72 20 28 69 20 3d 20 32 3b 20 69     for (i = 2; i
80f0: 20 3c 20 61 72 67 63 3b 20 69 2b 2b 29 20 7b 0a   < argc; i++) {.
8100: 09 61 72 67 20 3d 20 61 72 67 76 5b 69 5d 3b 0a  .arg = argv[i];.
8110: 09 69 66 20 28 61 72 67 5b 30 5d 20 21 3d 20 27  .if (arg[0] != '
8120: 2d 27 29 20 7b 0a 09 20 20 20 20 62 72 65 61 6b  -') {..    break
8130: 3b 0a 09 7d 0a 09 6c 65 6e 67 74 68 20 3d 20 73  ;..}..length = s
8140: 74 72 6c 65 6e 28 61 72 67 29 3b 0a 09 69 66 20  trlen(arg);..if 
8150: 28 6c 65 6e 67 74 68 20 3c 20 32 29 20 7b 0a 09  (length < 2) {..
8160: 20 20 20 20 62 61 64 53 77 69 74 63 68 3a 0a 09      badSwitch:..
8170: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
8180: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
8190: 64 20 73 77 69 74 63 68 20 5c 22 22 2c 20 61 72  d switch \"", ar
81a0: 67 2c 0a 09 09 20 20 20 20 22 5c 22 3a 20 6d 75  g,...    "\": mu
81b0: 73 74 20 62 65 20 2d 66 6f 72 77 61 72 64 2c 20  st be -forward, 
81c0: 2d 62 61 63 6b 77 61 72 64 2c 20 2d 65 78 61 63  -backward, -exac
81d0: 74 2c 20 2d 72 65 67 65 78 70 2c 20 22 2c 0a 09  t, -regexp, ",..
81e0: 09 20 20 20 20 22 2d 6e 6f 63 61 73 65 2c 20 2d  .    "-nocase, -
81f0: 63 6f 75 6e 74 2c 20 6f 72 20 2d 2d 22 2c 20 28  count, or --", (
8200: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
8210: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8220: 52 52 4f 52 3b 0a 09 7d 0a 09 63 20 3d 20 61 72  RROR;..}..c = ar
8230: 67 5b 31 5d 3b 0a 09 69 66 20 28 28 63 20 3d 3d  g[1];..if ((c ==
8240: 20 27 62 27 29 20 26 26 20 28 73 74 72 6e 63 6d   'b') && (strncm
8250: 70 28 61 72 67 76 5b 69 5d 2c 20 22 2d 62 61 63  p(argv[i], "-bac
8260: 6b 77 61 72 64 73 22 2c 20 6c 65 6e 67 74 68 29  kwards", length)
8270: 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 62   == 0)) {..    b
8280: 61 63 6b 77 61 72 64 73 20 3d 20 31 3b 0a 09 7d  ackwards = 1;..}
8290: 20 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20   else if ((c == 
82a0: 27 63 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70  'c') && (strncmp
82b0: 28 61 72 67 76 5b 69 5d 2c 20 22 2d 63 6f 75 6e  (argv[i], "-coun
82c0: 74 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30  t", length) == 0
82d0: 29 29 20 7b 0a 09 20 20 20 20 69 66 20 28 69 20  )) {..    if (i 
82e0: 3e 3d 20 28 61 72 67 63 2d 31 29 29 20 7b 0a 09  >= (argc-1)) {..
82f0: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
8300: 6e 74 65 72 70 2c 22 6e 6f 20 76 61 6c 75 65 20  nterp,"no value 
8310: 67 69 76 65 6e 20 66 6f 72 20 5c 22 2d 63 6f 75  given for \"-cou
8320: 6e 74 5c 22 20 6f 70 74 69 6f 6e 22 2c 54 43 4c  nt\" option",TCL
8330: 5f 53 54 41 54 49 43 29 3b 0a 09 09 72 65 74 75  _STATIC);...retu
8340: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
8350: 20 20 20 7d 0a 09 20 20 20 20 69 2b 2b 3b 0a 09     }..    i++;..
8360: 20 20 20 20 76 61 72 4e 61 6d 65 20 3d 20 61 72      varName = ar
8370: 67 76 5b 69 5d 3b 0a 09 7d 20 65 6c 73 65 20 69  gv[i];..} else i
8380: 66 20 28 28 63 20 3d 3d 20 27 65 27 29 20 26 26  f ((c == 'e') &&
8390: 20 28 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 69   (strncmp(argv[i
83a0: 5d 2c 20 22 2d 65 78 61 63 74 22 2c 20 6c 65 6e  ], "-exact", len
83b0: 67 74 68 29 20 3d 3d 20 30 29 29 20 7b 0a 09 20  gth) == 0)) {.. 
83c0: 20 20 20 65 78 61 63 74 20 3d 20 31 3b 0a 09 7d     exact = 1;..}
83d0: 20 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20   else if ((c == 
83e0: 27 66 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70  'f') && (strncmp
83f0: 28 61 72 67 76 5b 69 5d 2c 20 22 2d 66 6f 72 77  (argv[i], "-forw
8400: 61 72 64 73 22 2c 20 6c 65 6e 67 74 68 29 20 3d  ards", length) =
8410: 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 62 61 63  = 0)) {..    bac
8420: 6b 77 61 72 64 73 20 3d 20 30 3b 0a 09 7d 20 65  kwards = 0;..} e
8430: 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27 6e  lse if ((c == 'n
8440: 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61  ') && (strncmp(a
8450: 72 67 76 5b 69 5d 2c 20 22 2d 6e 6f 63 61 73 65  rgv[i], "-nocase
8460: 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29  ", length) == 0)
8470: 29 20 7b 0a 09 20 20 20 20 6e 6f 43 61 73 65 20  ) {..    noCase 
8480: 3d 20 31 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  = 1;..} else if 
8490: 28 28 63 20 3d 3d 20 27 72 27 29 20 26 26 20 28  ((c == 'r') && (
84a0: 73 74 72 6e 63 6d 70 28 61 72 67 76 5b 69 5d 2c  strncmp(argv[i],
84b0: 20 22 2d 72 65 67 65 78 70 22 2c 20 6c 65 6e 67   "-regexp", leng
84c0: 74 68 29 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20  th) == 0)) {..  
84d0: 20 20 65 78 61 63 74 20 3d 20 30 3b 0a 09 7d 20    exact = 0;..} 
84e0: 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27  else if ((c == '
84f0: 2d 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28  -') && (strncmp(
8500: 61 72 67 76 5b 69 5d 2c 20 22 2d 2d 22 2c 20 6c  argv[i], "--", l
8510: 65 6e 67 74 68 29 20 3d 3d 20 30 29 29 20 7b 0a  ength) == 0)) {.
8520: 09 20 20 20 20 69 2b 2b 3b 0a 09 20 20 20 20 62  .    i++;..    b
8530: 72 65 61 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  reak;..} else {.
8540: 09 20 20 20 20 67 6f 74 6f 20 62 61 64 53 77 69  .    goto badSwi
8550: 74 63 68 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  tch;..}.    }.  
8560: 20 20 61 72 67 73 4c 65 66 74 20 3d 20 61 72 67    argsLeft = arg
8570: 63 20 2d 20 28 69 2b 32 29 3b 0a 20 20 20 20 69  c - (i+2);.    i
8580: 66 20 28 28 61 72 67 73 4c 65 66 74 20 21 3d 20  f ((argsLeft != 
8590: 30 29 20 26 26 20 28 61 72 67 73 4c 65 66 74 20  0) && (argsLeft 
85a0: 21 3d 20 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  != 1)) {..Tcl_Ap
85b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
85c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
85d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
85e0: 0a 09 09 61 72 67 76 5b 30 5d 2c 20 22 20 73 65  ...argv[0], " se
85f0: 61 72 63 68 20 3f 73 77 69 74 63 68 65 73 3f 20  arch ?switches? 
8600: 70 61 74 74 65 72 6e 20 69 6e 64 65 78 20 3f 73  pattern index ?s
8610: 74 6f 70 49 6e 64 65 78 3f 22 2c 0a 09 09 28 63  topIndex?",...(c
8620: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
8630: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8640: 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 74 74 65  .    }.    patte
8650: 72 6e 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 0a 20  rn = argv[i];.. 
8660: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 6e     /*.     * Con
8670: 76 65 72 74 20 74 68 65 20 70 61 74 74 65 72 6e  vert the pattern
8680: 20 74 6f 20 6c 6f 77 65 72 2d 63 61 73 65 20 69   to lower-case i
8690: 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64  f we're supposed
86a0: 20 74 6f 20 69 67 6e 6f 72 65 20 63 61 73 65 2e   to ignore case.
86b0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
86c0: 20 28 6e 6f 43 61 73 65 29 20 7b 0a 09 54 63 6c   (noCase) {..Tcl
86d0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 70 61  _DStringInit(&pa
86e0: 74 44 53 74 72 69 6e 67 29 3b 0a 09 54 63 6c 5f  tDString);..Tcl_
86f0: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 70  DStringAppend(&p
8700: 61 74 44 53 74 72 69 6e 67 2c 20 70 61 74 74 65  atDString, patte
8710: 72 6e 2c 20 2d 31 29 3b 0a 09 70 61 74 74 65 72  rn, -1);..patter
8720: 6e 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  n = Tcl_DStringV
8730: 61 6c 75 65 28 26 70 61 74 44 53 74 72 69 6e 67  alue(&patDString
8740: 29 3b 0a 09 66 6f 72 20 28 70 20 3d 20 70 61 74  );..for (p = pat
8750: 74 65 72 6e 3b 20 2a 70 20 21 3d 20 30 3b 20 70  tern; *p != 0; p
8760: 2b 2b 29 20 7b 0a 09 20 20 20 20 69 66 20 28 69  ++) {..    if (i
8770: 73 75 70 70 65 72 28 55 43 48 41 52 28 2a 70 29  supper(UCHAR(*p)
8780: 29 29 20 7b 0a 09 09 2a 70 20 3d 20 74 6f 6c 6f  )) {...*p = tolo
8790: 77 65 72 28 55 43 48 41 52 28 2a 70 29 29 3b 0a  wer(UCHAR(*p));.
87a0: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
87b0: 0a 20 20 20 20 69 66 20 28 54 6b 54 65 78 74 47  .    if (TkTextG
87c0: 65 74 49 6e 64 65 78 28 69 6e 74 65 72 70 2c 20  etIndex(interp, 
87d0: 74 65 78 74 50 74 72 2c 20 61 72 67 76 5b 69 2b  textPtr, argv[i+
87e0: 31 5d 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54  1], &index) != T
87f0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
8800: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8810: 7d 0a 20 20 20 20 6e 75 6d 4c 69 6e 65 73 20 3d  }.    numLines =
8820: 20 54 6b 42 54 72 65 65 4e 75 6d 4c 69 6e 65 73   TkBTreeNumLines
8830: 28 74 65 78 74 50 74 72 2d 3e 74 72 65 65 29 3b  (textPtr->tree);
8840: 0a 20 20 20 20 73 74 61 72 74 69 6e 67 4c 69 6e  .    startingLin
8850: 65 20 3d 20 54 6b 42 54 72 65 65 4c 69 6e 65 49  e = TkBTreeLineI
8860: 6e 64 65 78 28 69 6e 64 65 78 2e 6c 69 6e 65 50  ndex(index.lineP
8870: 74 72 29 3b 0a 20 20 20 20 73 74 61 72 74 69 6e  tr);.    startin
8880: 67 43 68 61 72 20 3d 20 69 6e 64 65 78 2e 63 68  gChar = index.ch
8890: 61 72 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 20  arIndex;.    if 
88a0: 28 73 74 61 72 74 69 6e 67 4c 69 6e 65 20 3e 3d  (startingLine >=
88b0: 20 6e 75 6d 4c 69 6e 65 73 29 20 7b 0a 09 69 66   numLines) {..if
88c0: 20 28 62 61 63 6b 77 61 72 64 73 29 20 7b 0a 09   (backwards) {..
88d0: 20 20 20 20 73 74 61 72 74 69 6e 67 4c 69 6e 65      startingLine
88e0: 20 3d 20 54 6b 42 54 72 65 65 4e 75 6d 4c 69 6e   = TkBTreeNumLin
88f0: 65 73 28 74 65 78 74 50 74 72 2d 3e 74 72 65 65  es(textPtr->tree
8900: 29 20 2d 20 31 3b 0a 09 20 20 20 20 73 74 61 72  ) - 1;..    star
8910: 74 69 6e 67 43 68 61 72 20 3d 20 54 6b 42 54 72  tingChar = TkBTr
8920: 65 65 43 68 61 72 73 49 6e 4c 69 6e 65 28 54 6b  eeCharsInLine(Tk
8930: 42 54 72 65 65 46 69 6e 64 4c 69 6e 65 28 74 65  BTreeFindLine(te
8940: 78 74 50 74 72 2d 3e 74 72 65 65 2c 0a 09 09 20  xtPtr->tree,... 
8950: 20 20 20 73 74 61 72 74 69 6e 67 4c 69 6e 65 29     startingLine)
8960: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  );..} else {..  
8970: 20 20 73 74 61 72 74 69 6e 67 4c 69 6e 65 20 3d    startingLine =
8980: 20 30 3b 0a 09 20 20 20 20 73 74 61 72 74 69 6e   0;..    startin
8990: 67 43 68 61 72 20 3d 20 30 3b 0a 09 7d 0a 20 20  gChar = 0;..}.  
89a0: 20 20 7d 0a 20 20 20 20 69 66 20 28 61 72 67 73    }.    if (args
89b0: 4c 65 66 74 20 3d 3d 20 31 29 20 7b 0a 09 69 66  Left == 1) {..if
89c0: 20 28 54 6b 54 65 78 74 47 65 74 49 6e 64 65 78   (TkTextGetIndex
89d0: 28 69 6e 74 65 72 70 2c 20 74 65 78 74 50 74 72  (interp, textPtr
89e0: 2c 20 61 72 67 76 5b 69 2b 32 5d 2c 20 26 73 74  , argv[i+2], &st
89f0: 6f 70 49 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f  opIndex) != TCL_
8a00: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  OK) {..    retur
8a10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
8a20: 09 73 74 6f 70 4c 69 6e 65 20 3d 20 54 6b 42 54  .stopLine = TkBT
8a30: 72 65 65 4c 69 6e 65 49 6e 64 65 78 28 73 74 6f  reeLineIndex(sto
8a40: 70 49 6e 64 65 78 2e 6c 69 6e 65 50 74 72 29 3b  pIndex.linePtr);
8a50: 0a 09 69 66 20 28 21 62 61 63 6b 77 61 72 64 73  ..if (!backwards
8a60: 20 26 26 20 28 73 74 6f 70 4c 69 6e 65 20 3d 3d   && (stopLine ==
8a70: 20 6e 75 6d 4c 69 6e 65 73 29 29 20 7b 0a 09 20   numLines)) {.. 
8a80: 20 20 20 73 74 6f 70 4c 69 6e 65 20 3d 20 6e 75     stopLine = nu
8a90: 6d 4c 69 6e 65 73 2d 31 3b 0a 09 7d 0a 09 73 65  mLines-1;..}..se
8aa0: 61 72 63 68 57 68 6f 6c 65 54 65 78 74 20 3d 20  archWholeText = 
8ab0: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  0;.    } else {.
8ac0: 09 73 74 6f 70 4c 69 6e 65 20 3d 20 30 3b 0a 09  .stopLine = 0;..
8ad0: 73 65 61 72 63 68 57 68 6f 6c 65 54 65 78 74 20  searchWholeText 
8ae0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
8af0: 2f 2a 0a 20 20 20 20 20 2a 20 53 63 61 6e 20 74  /*.     * Scan t
8b00: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 66 20 74 68  hrough all of th
8b10: 65 20 6c 69 6e 65 73 20 6f 66 20 74 68 65 20 74  e lines of the t
8b20: 65 78 74 20 63 69 72 63 75 6c 61 72 6c 79 2c 20  ext circularly, 
8b30: 73 74 61 72 74 69 6e 67 0a 20 20 20 20 20 2a 20  starting.     * 
8b40: 61 74 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64  at the given ind
8b50: 65 78 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ex..     */..   
8b60: 20 6d 61 74 63 68 4c 65 6e 67 74 68 20 3d 20 70   matchLength = p
8b70: 61 74 4c 65 6e 67 74 68 20 3d 20 30 3b 09 2f 2a  atLength = 0;./*
8b80: 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 74 6f 20   Only needed to 
8b90: 70 72 65 76 65 6e 74 20 63 6f 6d 70 69 6c 65 72  prevent compiler
8ba0: 0a 09 09 09 09 09 20 2a 20 77 61 72 6e 69 6e 67  ...... * warning
8bb0: 73 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 65 78  s. */.    if (ex
8bc0: 61 63 74 29 20 7b 0a 09 70 61 74 4c 65 6e 67 74  act) {..patLengt
8bd0: 68 20 3d 20 73 74 72 6c 65 6e 28 70 61 74 74 65  h = strlen(patte
8be0: 72 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rn);.    } else 
8bf0: 7b 0a 09 72 65 67 65 78 70 20 3d 20 54 63 6c 5f  {..regexp = Tcl_
8c00: 52 65 67 45 78 70 43 6f 6d 70 69 6c 65 28 69 6e  RegExpCompile(in
8c10: 74 65 72 70 2c 20 70 61 74 74 65 72 6e 29 3b 0a  terp, pattern);.
8c20: 09 69 66 20 28 72 65 67 65 78 70 20 3d 3d 20 4e  .if (regexp == N
8c30: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75  ULL) {..    retu
8c40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
8c50: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 69 6e 65 4e  .    }.    lineN
8c60: 75 6d 20 3d 20 73 74 61 72 74 69 6e 67 4c 69 6e  um = startingLin
8c70: 65 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 43  e;.    code = TC
8c80: 4c 5f 4f 4b 3b 0a 20 20 20 20 54 63 6c 5f 44 53  L_OK;.    Tcl_DS
8c90: 74 72 69 6e 67 49 6e 69 74 28 26 6c 69 6e 65 29  tringInit(&line)
8ca0: 3b 0a 20 20 20 20 66 6f 72 20 28 70 61 73 73 65  ;.    for (passe
8cb0: 73 20 3d 20 30 3b 20 70 61 73 73 65 73 20 3c 20  s = 0; passes < 
8cc0: 32 3b 20 29 20 7b 0a 09 69 66 20 28 6c 69 6e 65  2; ) {..if (line
8cd0: 4e 75 6d 20 3e 3d 20 6e 75 6d 4c 69 6e 65 73 29  Num >= numLines)
8ce0: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20   {..    /*..    
8cf0: 20 2a 20 44 6f 6e 27 74 20 73 65 61 72 63 68 20   * Don't search 
8d00: 74 68 65 20 64 75 6d 6d 79 20 6c 61 73 74 20 6c  the dummy last l
8d10: 69 6e 65 20 6f 66 20 74 68 65 20 74 65 78 74 2e  ine of the text.
8d20: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
8d30: 67 6f 74 6f 20 6e 65 78 74 4c 69 6e 65 3b 0a 09  goto nextLine;..
8d40: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 45 78 74 72 61  }.../*.. * Extra
8d50: 63 74 20 74 68 65 20 74 65 78 74 20 66 72 6f 6d  ct the text from
8d60: 20 74 68 65 20 6c 69 6e 65 2e 20 20 49 66 20 77   the line.  If w
8d70: 65 27 72 65 20 64 6f 69 6e 67 20 72 65 67 75 6c  e're doing regul
8d80: 61 72 0a 09 20 2a 20 65 78 70 72 65 73 73 69 6f  ar.. * expressio
8d90: 6e 20 6d 61 74 63 68 69 6e 67 2c 20 64 72 6f 70  n matching, drop
8da0: 20 74 68 65 20 6e 65 77 6c 69 6e 65 20 66 72 6f   the newline fro
8db0: 6d 20 74 68 65 20 6c 69 6e 65 2c 20 73 6f 0a 09  m the line, so..
8dc0: 20 2a 20 74 68 61 74 20 22 24 22 20 63 61 6e 20   * that "$" can 
8dd0: 62 65 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68  be used to match
8de0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
8df0: 6c 69 6e 65 2e 0a 09 20 2a 2f 0a 0a 09 6c 69 6e  line... */...lin
8e00: 65 50 74 72 20 3d 20 54 6b 42 54 72 65 65 46 69  ePtr = TkBTreeFi
8e10: 6e 64 4c 69 6e 65 28 74 65 78 74 50 74 72 2d 3e  ndLine(textPtr->
8e20: 74 72 65 65 2c 20 6c 69 6e 65 4e 75 6d 29 3b 0a  tree, lineNum);.
8e30: 09 66 6f 72 20 28 73 65 67 50 74 72 20 3d 20 6c  .for (segPtr = l
8e40: 69 6e 65 50 74 72 2d 3e 73 65 67 50 74 72 3b 20  inePtr->segPtr; 
8e50: 73 65 67 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a  segPtr != NULL;.
8e60: 09 09 73 65 67 50 74 72 20 3d 20 73 65 67 50 74  ..segPtr = segPt
8e70: 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 20  r->nextPtr) {.. 
8e80: 20 20 20 69 66 20 28 73 65 67 50 74 72 2d 3e 74     if (segPtr->t
8e90: 79 70 65 50 74 72 20 21 3d 20 26 74 6b 54 65 78  ypePtr != &tkTex
8ea0: 74 43 68 61 72 54 79 70 65 29 20 7b 0a 09 09 63  tCharType) {...c
8eb0: 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a  ontinue;..    }.
8ec0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
8ed0: 41 70 70 65 6e 64 28 26 6c 69 6e 65 2c 20 73 65  Append(&line, se
8ee0: 67 50 74 72 2d 3e 62 6f 64 79 2e 63 68 61 72 73  gPtr->body.chars
8ef0: 2c 20 73 65 67 50 74 72 2d 3e 73 69 7a 65 29 3b  , segPtr->size);
8f00: 0a 09 7d 0a 09 69 66 20 28 21 65 78 61 63 74 29  ..}..if (!exact)
8f10: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   {..    Tcl_DStr
8f20: 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 26 6c 69  ingSetLength(&li
8f30: 6e 65 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c  ne, Tcl_DStringL
8f40: 65 6e 67 74 68 28 26 6c 69 6e 65 29 2d 31 29 3b  ength(&line)-1);
8f50: 0a 09 7d 0a 09 73 74 61 72 74 4f 66 4c 69 6e 65  ..}..startOfLine
8f60: 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61   = Tcl_DStringVa
8f70: 6c 75 65 28 26 6c 69 6e 65 29 3b 0a 0a 09 2f 2a  lue(&line);.../*
8f80: 0a 09 20 2a 20 49 66 20 77 65 27 72 65 20 69 67  .. * If we're ig
8f90: 6e 6f 72 69 6e 67 20 63 61 73 65 2c 20 63 6f 6e  noring case, con
8fa0: 76 65 72 74 20 74 68 65 20 6c 69 6e 65 20 74 6f  vert the line to
8fb0: 20 6c 6f 77 65 72 20 63 61 73 65 2e 0a 09 20 2a   lower case... *
8fc0: 2f 0a 0a 09 69 66 20 28 6e 6f 43 61 73 65 29 20  /...if (noCase) 
8fd0: 7b 0a 09 20 20 20 20 66 6f 72 20 28 70 20 3d 20  {..    for (p = 
8fe0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
8ff0: 28 26 6c 69 6e 65 29 3b 20 2a 70 20 21 3d 20 30  (&line); *p != 0
9000: 3b 20 70 2b 2b 29 20 7b 0a 09 09 69 66 20 28 69  ; p++) {...if (i
9010: 73 75 70 70 65 72 28 55 43 48 41 52 28 2a 70 29  supper(UCHAR(*p)
9020: 29 29 20 7b 0a 09 09 20 20 20 20 2a 70 20 3d 20  )) {...    *p = 
9030: 74 6f 6c 6f 77 65 72 28 55 43 48 41 52 28 2a 70  tolower(UCHAR(*p
9040: 29 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09  ));...}..    }..
9050: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 43 68 65 63 6b  }.../*.. * Check
9060: 20 66 6f 72 20 6d 61 74 63 68 65 73 20 77 69 74   for matches wit
9070: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
9080: 6c 69 6e 65 2e 20 20 49 66 20 73 6f 2c 20 61 6e  line.  If so, an
9090: 64 20 69 66 20 77 65 27 72 65 0a 09 20 2a 20 73  d if we're.. * s
90a0: 65 61 72 63 68 69 6e 67 20 62 61 63 6b 77 61 72  earching backwar
90b0: 64 73 2c 20 72 65 70 65 61 74 20 74 68 65 20 73  ds, repeat the s
90c0: 65 61 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68  earch to find th
90d0: 65 20 6c 61 73 74 20 6d 61 74 63 68 0a 09 20 2a  e last match.. *
90e0: 20 69 6e 20 74 68 65 20 6c 69 6e 65 2e 0a 09 20   in the line... 
90f0: 2a 2f 0a 0a 09 6d 61 74 63 68 43 68 61 72 20 3d  */...matchChar =
9100: 20 2d 31 3b 0a 09 66 69 72 73 74 43 68 61 72 20   -1;..firstChar 
9110: 3d 20 30 3b 0a 09 6c 61 73 74 43 68 61 72 20 3d  = 0;..lastChar =
9120: 20 49 4e 54 5f 4d 41 58 3b 0a 09 69 66 20 28 6c   INT_MAX;..if (l
9130: 69 6e 65 4e 75 6d 20 3d 3d 20 73 74 61 72 74 69  ineNum == starti
9140: 6e 67 4c 69 6e 65 29 20 7b 0a 09 20 20 20 20 69  ngLine) {..    i
9150: 6e 74 20 69 6e 64 65 78 49 6e 44 53 74 72 69 6e  nt indexInDStrin
9160: 67 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20  g;...    /*..   
9170: 20 20 2a 20 54 68 65 20 73 74 61 72 74 69 6e 67    * The starting
9180: 20 6c 69 6e 65 20 69 73 20 74 72 69 63 6b 79 3a   line is tricky:
9190: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
91a0: 77 65 20 73 65 65 20 69 74 0a 09 20 20 20 20 20  we see it..     
91b0: 2a 20 77 65 20 63 68 65 63 6b 20 6f 6e 65 20 70  * we check one p
91c0: 61 72 74 20 6f 66 20 74 68 65 20 6c 69 6e 65 2c  art of the line,
91d0: 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
91e0: 70 61 73 73 20 74 68 72 6f 75 67 68 0a 09 20 20  pass through..  
91f0: 20 20 20 2a 20 77 65 20 63 68 65 63 6b 20 74 68     * we check th
9200: 65 20 6f 74 68 65 72 20 70 61 72 74 20 6f 66 20  e other part of 
9210: 74 68 65 20 6c 69 6e 65 2e 20 20 57 65 20 68 61  the line.  We ha
9220: 76 65 20 74 6f 20 62 65 20 76 65 72 79 0a 09 20  ve to be very.. 
9230: 20 20 20 20 2a 20 63 61 72 65 66 75 6c 20 68 65      * careful he
9240: 72 65 20 62 65 63 61 75 73 65 20 74 68 65 72 65  re because there
9250: 20 63 6f 75 6c 64 20 62 65 20 65 6d 62 65 64 64   could be embedd
9260: 65 64 20 77 69 6e 64 6f 77 73 20 6f 72 0a 09 20  ed windows or.. 
9270: 20 20 20 20 2a 20 6f 74 68 65 72 20 74 68 69 6e      * other thin
9280: 67 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  gs that are not 
9290: 69 6e 20 74 68 65 20 65 78 74 72 61 63 74 65 64  in the extracted
92a0: 20 6c 69 6e 65 2e 20 20 52 65 73 63 61 6e 0a 09   line.  Rescan..
92b0: 20 20 20 20 20 2a 20 74 68 65 20 6f 72 69 67 69       * the origi
92c0: 6e 61 6c 20 6c 69 6e 65 20 74 6f 20 63 6f 6d 70  nal line to comp
92d0: 75 74 65 20 74 68 65 20 69 6e 64 65 78 20 69 6e  ute the index in
92e0: 20 69 74 20 6f 66 20 74 68 65 20 66 69 72 73 74   it of the first
92f0: 0a 09 20 20 20 20 20 2a 20 63 68 61 72 61 63 74  ..     * charact
9300: 65 72 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  er...     */... 
9310: 20 20 20 69 6e 64 65 78 49 6e 44 53 74 72 69 6e     indexInDStrin
9320: 67 20 3d 20 73 74 61 72 74 69 6e 67 43 68 61 72  g = startingChar
9330: 3b 0a 09 20 20 20 20 66 6f 72 20 28 73 65 67 50  ;..    for (segP
9340: 74 72 20 3d 20 6c 69 6e 65 50 74 72 2d 3e 73 65  tr = linePtr->se
9350: 67 50 74 72 2c 20 6c 65 66 74 54 6f 53 63 61 6e  gPtr, leftToScan
9360: 20 3d 20 73 74 61 72 74 69 6e 67 43 68 61 72 3b   = startingChar;
9370: 0a 09 09 20 20 20 20 6c 65 66 74 54 6f 53 63 61  ...    leftToSca
9380: 6e 20 3e 20 30 3b 20 73 65 67 50 74 72 20 3d 20  n > 0; segPtr = 
9390: 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74 72 29  segPtr->nextPtr)
93a0: 20 7b 0a 09 09 69 66 20 28 73 65 67 50 74 72 2d   {...if (segPtr-
93b0: 3e 74 79 70 65 50 74 72 20 21 3d 20 26 74 6b 54  >typePtr != &tkT
93c0: 65 78 74 43 68 61 72 54 79 70 65 29 20 7b 0a 09  extCharType) {..
93d0: 09 20 20 20 20 69 6e 64 65 78 49 6e 44 53 74 72  .    indexInDStr
93e0: 69 6e 67 20 2d 3d 20 73 65 67 50 74 72 2d 3e 73  ing -= segPtr->s
93f0: 69 7a 65 3b 0a 09 09 7d 0a 09 09 6c 65 66 74 54  ize;...}...leftT
9400: 6f 53 63 61 6e 20 2d 3d 20 73 65 67 50 74 72 2d  oScan -= segPtr-
9410: 3e 73 69 7a 65 3b 0a 09 20 20 20 20 7d 0a 0a 09  >size;..    }...
9420: 20 20 20 20 70 61 73 73 65 73 2b 2b 3b 0a 09 20      passes++;.. 
9430: 20 20 20 69 66 20 28 28 70 61 73 73 65 73 20 3d     if ((passes =
9440: 3d 20 31 29 20 5e 20 62 61 63 6b 77 61 72 64 73  = 1) ^ backwards
9450: 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 4f 6e  ) {.../*... * On
9460: 6c 79 20 75 73 65 20 74 68 65 20 6c 61 73 74 20  ly use the last 
9470: 70 61 72 74 20 6f 66 20 74 68 65 20 6c 69 6e 65  part of the line
9480: 2e 0a 09 09 20 2a 2f 0a 0a 09 09 66 69 72 73 74  .... */....first
9490: 43 68 61 72 20 3d 20 69 6e 64 65 78 49 6e 44 53  Char = indexInDS
94a0: 74 72 69 6e 67 3b 0a 09 09 69 66 20 28 66 69 72  tring;...if (fir
94b0: 73 74 43 68 61 72 20 3e 3d 20 54 63 6c 5f 44 53  stChar >= Tcl_DS
94c0: 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 6c 69 6e  tringLength(&lin
94d0: 65 29 29 20 7b 0a 09 09 20 20 20 20 67 6f 74 6f  e)) {...    goto
94e0: 20 6e 65 78 74 4c 69 6e 65 3b 0a 09 09 7d 0a 09   nextLine;...}..
94f0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 2f      } else {.../
9500: 2a 0a 09 09 20 2a 20 55 73 65 20 6f 6e 6c 79 20  *... * Use only 
9510: 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 6f  the first part o
9520: 66 20 74 68 65 20 6c 69 6e 65 2e 0a 09 09 20 2a  f the line.... *
9530: 2f 0a 0a 09 09 6c 61 73 74 43 68 61 72 20 3d 20  /....lastChar = 
9540: 69 6e 64 65 78 49 6e 44 53 74 72 69 6e 67 3b 0a  indexInDString;.
9550: 09 20 20 20 20 7d 0a 09 7d 0a 09 64 6f 20 7b 0a  .    }..}..do {.
9560: 09 20 20 20 20 69 6e 74 20 74 68 69 73 4c 65 6e  .    int thisLen
9570: 67 74 68 3b 0a 09 20 20 20 20 69 66 20 28 65 78  gth;..    if (ex
9580: 61 63 74 29 20 7b 0a 09 09 70 20 3d 20 73 74 72  act) {...p = str
9590: 73 74 72 28 73 74 61 72 74 4f 66 4c 69 6e 65 20  str(startOfLine 
95a0: 2b 20 66 69 72 73 74 43 68 61 72 2c 20 70 61 74  + firstChar, pat
95b0: 74 65 72 6e 29 3b 0a 09 09 69 66 20 28 70 20 3d  tern);...if (p =
95c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20  = NULL) {...    
95d0: 62 72 65 61 6b 3b 0a 09 09 7d 0a 09 09 69 20 3d  break;...}...i =
95e0: 20 70 20 2d 20 73 74 61 72 74 4f 66 4c 69 6e 65   p - startOfLine
95f0: 3b 0a 09 09 74 68 69 73 4c 65 6e 67 74 68 20 3d  ;...thisLength =
9600: 20 70 61 74 4c 65 6e 67 74 68 3b 0a 09 20 20 20   patLength;..   
9610: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 63 68 61 72   } else {...char
9620: 20 2a 73 74 61 72 74 2c 20 2a 65 6e 64 3b 0a 09   *start, *end;..
9630: 09 69 6e 74 20 6d 61 74 63 68 3b 0a 0a 09 09 6d  .int match;....m
9640: 61 74 63 68 20 3d 20 54 63 6c 5f 52 65 67 45 78  atch = Tcl_RegEx
9650: 70 45 78 65 63 28 69 6e 74 65 72 70 2c 20 72 65  pExec(interp, re
9660: 67 65 78 70 2c 0a 09 09 09 73 74 61 72 74 4f 66  gexp,....startOf
9670: 4c 69 6e 65 20 2b 20 66 69 72 73 74 43 68 61 72  Line + firstChar
9680: 2c 20 73 74 61 72 74 4f 66 4c 69 6e 65 29 3b 0a  , startOfLine);.
9690: 09 09 69 66 20 28 6d 61 74 63 68 20 3c 20 30 29  ..if (match < 0)
96a0: 20 7b 0a 09 09 20 20 20 20 63 6f 64 65 20 3d 20   {...    code = 
96b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
96c0: 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 09 7d 0a   goto done;...}.
96d0: 09 09 69 66 20 28 21 6d 61 74 63 68 29 20 7b 0a  ..if (!match) {.
96e0: 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d  ..    break;...}
96f0: 0a 09 09 54 63 6c 5f 52 65 67 45 78 70 52 61 6e  ...Tcl_RegExpRan
9700: 67 65 28 72 65 67 65 78 70 2c 20 30 2c 20 26 73  ge(regexp, 0, &s
9710: 74 61 72 74 2c 20 26 65 6e 64 29 3b 0a 09 09 69  tart, &end);...i
9720: 20 3d 20 73 74 61 72 74 20 2d 20 73 74 61 72 74   = start - start
9730: 4f 66 4c 69 6e 65 3b 0a 09 09 74 68 69 73 4c 65  OfLine;...thisLe
9740: 6e 67 74 68 20 3d 20 65 6e 64 20 2d 20 73 74 61  ngth = end - sta
9750: 72 74 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  rt;..    }..    
9760: 69 66 20 28 69 20 3e 3d 20 6c 61 73 74 43 68 61  if (i >= lastCha
9770: 72 29 20 7b 0a 09 09 62 72 65 61 6b 3b 0a 09 20  r) {...break;.. 
9780: 20 20 20 7d 0a 09 20 20 20 20 6d 61 74 63 68 43     }..    matchC
9790: 68 61 72 20 3d 20 69 3b 0a 09 20 20 20 20 6d 61  har = i;..    ma
97a0: 74 63 68 4c 65 6e 67 74 68 20 3d 20 74 68 69 73  tchLength = this
97b0: 4c 65 6e 67 74 68 3b 0a 09 20 20 20 20 66 69 72  Length;..    fir
97c0: 73 74 43 68 61 72 20 3d 20 6d 61 74 63 68 43 68  stChar = matchCh
97d0: 61 72 2b 31 3b 0a 09 7d 20 77 68 69 6c 65 20 28  ar+1;..} while (
97e0: 62 61 63 6b 77 61 72 64 73 29 3b 0a 0a 09 2f 2a  backwards);.../*
97f0: 0a 09 20 2a 20 49 66 20 77 65 20 66 6f 75 6e 64  .. * If we found
9800: 20 61 20 6d 61 74 63 68 20 74 68 65 6e 20 77 65   a match then we
9810: 27 72 65 20 64 6f 6e 65 2e 20 20 4d 61 6b 65 20  're done.  Make 
9820: 73 75 72 65 20 74 68 61 74 0a 09 20 2a 20 74 68  sure that.. * th
9830: 65 20 6d 61 74 63 68 20 6f 63 63 75 72 72 65 64  e match occurred
9840: 20 62 65 66 6f 72 65 20 74 68 65 20 73 74 6f 70   before the stop
9850: 70 69 6e 67 20 69 6e 64 65 78 2c 20 69 66 20 6f  ping index, if o
9860: 6e 65 20 77 61 73 0a 09 20 2a 20 73 70 65 63 69  ne was.. * speci
9870: 66 69 65 64 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20  fied... */...if 
9880: 28 6d 61 74 63 68 43 68 61 72 20 3e 3d 20 30 29  (matchChar >= 0)
9890: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20   {..    /*..    
98a0: 20 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 66   * The index inf
98b0: 6f 72 6d 61 74 69 6f 6e 20 72 65 74 75 72 6e 65  ormation returne
98c0: 64 20 62 79 20 74 68 65 20 72 65 67 75 6c 61 72  d by the regular
98d0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 09 20 20 20   expression..   
98e0: 20 20 2a 20 70 61 72 73 65 72 20 6f 6e 6c 79 20    * parser only 
98f0: 63 6f 6e 73 69 64 65 72 73 20 74 65 78 74 75 61  considers textua
9900: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 3a 20 20  l information:  
9910: 69 74 20 64 6f 65 73 6e 27 74 0a 09 20 20 20 20  it doesn't..    
9920: 20 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 65   * account for e
9930: 6d 62 65 64 64 65 64 20 77 69 6e 64 6f 77 73 20  mbedded windows 
9940: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 6e 6f 6e  or any other non
9950: 2d 74 65 78 74 75 61 6c 20 69 6e 66 6f 2e 0a 09  -textual info...
9960: 20 20 20 20 20 2a 20 53 63 61 6e 20 74 68 72 6f       * Scan thro
9970: 75 67 68 20 74 68 65 20 6c 69 6e 65 27 73 20 73  ugh the line's s
9980: 65 67 6d 65 6e 74 73 20 61 67 61 69 6e 20 74 6f  egments again to
9990: 20 61 64 6a 75 73 74 20 62 6f 74 68 0a 09 20 20   adjust both..  
99a0: 20 20 20 2a 20 6d 61 74 63 68 43 68 61 72 20 61     * matchChar a
99b0: 6e 64 20 6d 61 74 63 68 43 6f 75 6e 74 2e 0a 09  nd matchCount...
99c0: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 66 6f       */...    fo
99d0: 72 20 28 73 65 67 50 74 72 20 3d 20 6c 69 6e 65  r (segPtr = line
99e0: 50 74 72 2d 3e 73 65 67 50 74 72 2c 20 6c 65 66  Ptr->segPtr, lef
99f0: 74 54 6f 53 63 61 6e 20 3d 20 6d 61 74 63 68 43  tToScan = matchC
9a00: 68 61 72 3b 0a 09 09 20 20 20 20 6c 65 66 74 54  har;...    leftT
9a10: 6f 53 63 61 6e 20 3e 3d 20 30 3b 20 73 65 67 50  oScan >= 0; segP
9a20: 74 72 20 3d 20 73 65 67 50 74 72 2d 3e 6e 65 78  tr = segPtr->nex
9a30: 74 50 74 72 29 20 7b 0a 09 09 69 66 20 28 73 65  tPtr) {...if (se
9a40: 67 50 74 72 2d 3e 74 79 70 65 50 74 72 20 21 3d  gPtr->typePtr !=
9a50: 20 26 74 6b 54 65 78 74 43 68 61 72 54 79 70 65   &tkTextCharType
9a60: 29 20 7b 0a 09 09 20 20 20 20 6d 61 74 63 68 43  ) {...    matchC
9a70: 68 61 72 20 2b 3d 20 73 65 67 50 74 72 2d 3e 73  har += segPtr->s
9a80: 69 7a 65 3b 0a 09 09 20 20 20 20 63 6f 6e 74 69  ize;...    conti
9a90: 6e 75 65 3b 0a 09 09 7d 0a 09 09 6c 65 66 74 54  nue;...}...leftT
9aa0: 6f 53 63 61 6e 20 2d 3d 20 73 65 67 50 74 72 2d  oScan -= segPtr-
9ab0: 3e 73 69 7a 65 3b 0a 09 20 20 20 20 7d 0a 09 20  >size;..    }.. 
9ac0: 20 20 20 66 6f 72 20 28 6c 65 66 74 54 6f 53 63     for (leftToSc
9ad0: 61 6e 20 2b 3d 20 6d 61 74 63 68 4c 65 6e 67 74  an += matchLengt
9ae0: 68 3b 20 6c 65 66 74 54 6f 53 63 61 6e 20 3e 20  h; leftToScan > 
9af0: 30 3b 0a 09 09 20 20 20 20 73 65 67 50 74 72 20  0;...    segPtr 
9b00: 3d 20 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74  = segPtr->nextPt
9b10: 72 29 20 7b 0a 09 09 69 66 20 28 73 65 67 50 74  r) {...if (segPt
9b20: 72 2d 3e 74 79 70 65 50 74 72 20 21 3d 20 26 74  r->typePtr != &t
9b30: 6b 54 65 78 74 43 68 61 72 54 79 70 65 29 20 7b  kTextCharType) {
9b40: 0a 09 09 20 20 20 20 6d 61 74 63 68 4c 65 6e 67  ...    matchLeng
9b50: 74 68 20 2b 3d 20 73 65 67 50 74 72 2d 3e 73 69  th += segPtr->si
9b60: 7a 65 3b 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e  ze;...    contin
9b70: 75 65 3b 0a 09 09 7d 0a 09 09 6c 65 66 74 54 6f  ue;...}...leftTo
9b80: 53 63 61 6e 20 2d 3d 20 73 65 67 50 74 72 2d 3e  Scan -= segPtr->
9b90: 73 69 7a 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20  size;..    }..  
9ba0: 20 20 54 6b 54 65 78 74 4d 61 6b 65 49 6e 64 65    TkTextMakeInde
9bb0: 78 28 74 65 78 74 50 74 72 2d 3e 74 72 65 65 2c  x(textPtr->tree,
9bc0: 20 6c 69 6e 65 4e 75 6d 2c 20 6d 61 74 63 68 43   lineNum, matchC
9bd0: 68 61 72 2c 20 26 69 6e 64 65 78 29 3b 0a 09 20  har, &index);.. 
9be0: 20 20 20 69 66 20 28 21 73 65 61 72 63 68 57 68     if (!searchWh
9bf0: 6f 6c 65 54 65 78 74 29 20 7b 0a 09 09 69 66 20  oleText) {...if 
9c00: 28 21 62 61 63 6b 77 61 72 64 73 20 26 26 20 28  (!backwards && (
9c10: 54 6b 54 65 78 74 49 6e 64 65 78 43 6d 70 28 26  TkTextIndexCmp(&
9c20: 69 6e 64 65 78 2c 20 26 73 74 6f 70 49 6e 64 65  index, &stopInde
9c30: 78 29 20 3e 3d 20 30 29 29 20 7b 0a 09 09 20 20  x) >= 0)) {...  
9c40: 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 09 7d    goto done;...}
9c50: 0a 09 09 69 66 20 28 62 61 63 6b 77 61 72 64 73  ...if (backwards
9c60: 20 26 26 20 28 54 6b 54 65 78 74 49 6e 64 65 78   && (TkTextIndex
9c70: 43 6d 70 28 26 69 6e 64 65 78 2c 20 26 73 74 6f  Cmp(&index, &sto
9c80: 70 49 6e 64 65 78 29 20 3c 20 30 29 29 20 7b 0a  pIndex) < 0)) {.
9c90: 09 09 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b  ..    goto done;
9ca0: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20  ...}..    }..   
9cb0: 20 69 66 20 28 76 61 72 4e 61 6d 65 20 21 3d 20   if (varName != 
9cc0: 4e 55 4c 4c 29 20 7b 0a 09 09 73 70 72 69 6e 74  NULL) {...sprint
9cd0: 66 28 62 75 66 66 65 72 2c 20 22 25 64 22 2c 20  f(buffer, "%d", 
9ce0: 6d 61 74 63 68 4c 65 6e 67 74 68 29 3b 0a 09 09  matchLength);...
9cf0: 69 66 20 28 54 63 6c 5f 53 65 74 56 61 72 28 69  if (Tcl_SetVar(i
9d00: 6e 74 65 72 70 2c 20 76 61 72 4e 61 6d 65 2c 20  nterp, varName, 
9d10: 62 75 66 66 65 72 2c 20 54 43 4c 5f 4c 45 41 56  buffer, TCL_LEAV
9d20: 45 5f 45 52 52 5f 4d 53 47 29 0a 09 09 09 3d 3d  E_ERR_MSG)....==
9d30: 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 63   NULL) {...    c
9d40: 6f 64 65 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b  ode = TCL_ERROR;
9d50: 0a 09 09 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65  ...    goto done
9d60: 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20  ;...}..    }..  
9d70: 20 20 54 6b 54 65 78 74 50 72 69 6e 74 49 6e 64    TkTextPrintInd
9d80: 65 78 28 26 69 6e 64 65 78 2c 20 54 63 6c 5f 47  ex(&index, Tcl_G
9d90: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
9da0: 6e 74 65 72 70 29 29 3b 0a 09 20 20 20 20 67 6f  nterp));..    go
9db0: 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 0a 09 2f 2a  to done;..}.../*
9dc0: 0a 09 20 2a 20 47 6f 20 74 6f 20 74 68 65 20 6e  .. * Go to the n
9dd0: 65 78 74 20 28 6f 72 20 70 72 65 76 69 6f 75 73  ext (or previous
9de0: 29 20 6c 69 6e 65 3b 0a 09 20 2a 2f 0a 0a 09 6e  ) line;.. */...n
9df0: 65 78 74 4c 69 6e 65 3a 0a 09 69 66 20 28 62 61  extLine:..if (ba
9e00: 63 6b 77 61 72 64 73 29 20 7b 0a 09 20 20 20 20  ckwards) {..    
9e10: 6c 69 6e 65 4e 75 6d 2d 2d 3b 0a 09 20 20 20 20  lineNum--;..    
9e20: 69 66 20 28 21 73 65 61 72 63 68 57 68 6f 6c 65  if (!searchWhole
9e30: 54 65 78 74 29 20 7b 0a 09 09 69 66 20 28 6c 69  Text) {...if (li
9e40: 6e 65 4e 75 6d 20 3c 20 73 74 6f 70 4c 69 6e 65  neNum < stopLine
9e50: 29 20 7b 0a 09 09 20 20 20 20 62 72 65 61 6b 3b  ) {...    break;
9e60: 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65  ...}..    } else
9e70: 20 69 66 20 28 6c 69 6e 65 4e 75 6d 20 3c 20 30   if (lineNum < 0
9e80: 29 20 7b 0a 09 09 6c 69 6e 65 4e 75 6d 20 3d 20  ) {...lineNum = 
9e90: 6e 75 6d 4c 69 6e 65 73 2d 31 3b 0a 09 20 20 20  numLines-1;..   
9ea0: 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20   }..} else {..  
9eb0: 20 20 6c 69 6e 65 4e 75 6d 2b 2b 3b 0a 09 20 20    lineNum++;..  
9ec0: 20 20 69 66 20 28 21 73 65 61 72 63 68 57 68 6f    if (!searchWho
9ed0: 6c 65 54 65 78 74 29 20 7b 0a 09 09 69 66 20 28  leText) {...if (
9ee0: 6c 69 6e 65 4e 75 6d 20 3e 20 73 74 6f 70 4c 69  lineNum > stopLi
9ef0: 6e 65 29 20 7b 0a 09 09 20 20 20 20 62 72 65 61  ne) {...    brea
9f00: 6b 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c  k;...}..    } el
9f10: 73 65 20 69 66 20 28 6c 69 6e 65 4e 75 6d 20 3e  se if (lineNum >
9f20: 3d 20 6e 75 6d 4c 69 6e 65 73 29 20 7b 0a 09 09  = numLines) {...
9f30: 6c 69 6e 65 4e 75 6d 20 3d 20 30 3b 0a 09 20 20  lineNum = 0;..  
9f40: 20 20 7d 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72    }..}..Tcl_DStr
9f50: 69 6e 67 53 65 74 4c 65 6e 67 74 68 28 26 6c 69  ingSetLength(&li
9f60: 6e 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ne, 0);.    }.  
9f70: 20 20 64 6f 6e 65 3a 0a 20 20 20 20 54 63 6c 5f    done:.    Tcl_
9f80: 44 53 74 72 69 6e 67 46 72 65 65 28 26 6c 69 6e  DStringFree(&lin
9f90: 65 29 3b 0a 20 20 20 20 69 66 20 28 6e 6f 43 61  e);.    if (noCa
9fa0: 73 65 29 20 7b 0a 09 54 63 6c 5f 44 53 74 72 69  se) {..Tcl_DStri
9fb0: 6e 67 46 72 65 65 28 26 70 61 74 44 53 74 72 69  ngFree(&patDStri
9fc0: 6e 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ng);.    }.    r
9fd0: 65 74 75 72 6e 20 63 6f 64 65 3b 0a 7d 0a 0c 0a  eturn code;.}...
9fe0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
9ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
a030: 2a 20 54 6b 54 65 78 74 47 65 74 54 61 62 73 20  * TkTextGetTabs 
a040: 2d 2d 0a 20 2a 0a 20 2a 09 50 61 72 73 65 73 20  --. *. *.Parses 
a050: 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 70  a string descrip
a060: 74 69 6f 6e 20 6f 66 20 61 20 73 65 74 20 6f 66  tion of a set of
a070: 20 74 61 62 20 73 74 6f 70 73 2e 0a 20 2a 0a 20   tab stops.. *. 
a080: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
a090: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
a0a0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
a0b0: 20 6d 61 6c 6c 6f 63 27 65 64 20 73 74 72 75 63   malloc'ed struc
a0c0: 74 75 72 65 20 68 6f 6c 64 69 6e 67 0a 20 2a 09  ture holding. *.
a0d0: 70 61 72 73 65 64 20 69 6e 66 6f 72 6d 61 74 69  parsed informati
a0e0: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 74 61 62  on about the tab
a0f0: 20 73 74 6f 70 73 2e 20 20 49 66 20 61 6e 20 65   stops.  If an e
a100: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 20 2a  rror occurred. *
a110: 09 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e  .then the return
a120: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 20 61   value is NULL a
a130: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
a140: 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 0a 20  age is left in. 
a150: 2a 09 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74  *.interp->result
a160: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
a170: 65 63 74 73 3a 0a 20 2a 09 4d 65 6d 6f 72 79 20  ects:. *.Memory 
a180: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  is allocated for
a190: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74   the structure t
a1a0: 68 61 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e  hat is returned.
a1b0: 20 20 49 74 20 69 73 0a 20 2a 09 75 70 20 74 6f    It is. *.up to
a1c0: 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66   the caller to f
a1d0: 72 65 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ree this structu
a1e0: 72 65 20 77 68 65 6e 20 69 74 20 69 73 20 6e 6f  re when it is no
a1f0: 20 6c 6f 6e 67 65 72 0a 20 2a 09 6e 65 65 64 65   longer. *.neede
a200: 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d.. *. *--------
a210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
a250: 2a 2f 0a 0a 54 6b 54 65 78 74 54 61 62 41 72 72  */..TkTextTabArr
a260: 61 79 20 2a 0a 54 6b 54 65 78 74 47 65 74 54 61  ay *.TkTextGetTa
a270: 62 73 28 69 6e 74 65 72 70 2c 20 74 6b 77 69 6e  bs(interp, tkwin
a280: 2c 20 73 74 72 69 6e 67 29 0a 20 20 20 20 54 63  , string).    Tc
a290: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a2a0: 3b 09 09 09 2f 2a 20 55 73 65 64 20 66 6f 72 20  ;.../* Used for 
a2b0: 65 72 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 2e  error reporting.
a2c0: 20 2a 2f 0a 20 20 20 20 54 6b 5f 57 69 6e 64 6f   */.    Tk_Windo
a2d0: 77 20 74 6b 77 69 6e 3b 09 09 09 2f 2a 20 57 69  w tkwin;.../* Wi
a2e0: 6e 64 6f 77 20 69 6e 20 77 68 69 63 68 20 74 68  ndow in which th
a2f0: 65 20 74 61 62 73 20 77 69 6c 6c 20 62 65 0a 09  e tabs will be..
a300: 09 09 09 09 20 2a 20 75 73 65 64 2e 20 2a 2f 0a  .... * used. */.
a310: 20 20 20 20 63 68 61 72 20 2a 73 74 72 69 6e 67      char *string
a320: 3b 09 09 09 2f 2a 20 44 65 73 63 72 69 70 74 69  ;.../* Descripti
a330: 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 20 73 74  on of the tab st
a340: 6f 70 73 2e 20 20 53 65 65 0a 09 09 09 09 09 20  ops.  See...... 
a350: 2a 20 74 68 65 20 74 65 78 74 20 6d 61 6e 75 61  * the text manua
a360: 6c 20 65 6e 74 72 79 20 66 6f 72 20 64 65 74 61  l entry for deta
a370: 69 6c 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e  ils. */.{.    in
a380: 74 20 61 72 67 63 2c 20 69 2c 20 63 6f 75 6e 74  t argc, i, count
a390: 2c 20 63 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a  , c;.    char **
a3a0: 61 72 67 76 3b 0a 20 20 20 20 54 6b 54 65 78 74  argv;.    TkText
a3b0: 54 61 62 41 72 72 61 79 20 2a 74 61 62 41 72 72  TabArray *tabArr
a3c0: 61 79 50 74 72 3b 0a 20 20 20 20 54 6b 54 65 78  ayPtr;.    TkTex
a3d0: 74 54 61 62 20 2a 74 61 62 50 74 72 3b 0a 0a 20  tTab *tabPtr;.. 
a3e0: 20 20 20 69 66 20 28 54 63 6c 5f 53 70 6c 69 74     if (Tcl_Split
a3f0: 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 73 74 72  List(interp, str
a400: 69 6e 67 2c 20 26 61 72 67 63 2c 20 26 61 72 67  ing, &argc, &arg
a410: 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  v) != TCL_OK) {.
a420: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
a430: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
a440: 20 2a 20 46 69 72 73 74 20 66 69 6e 64 20 6f 75   * First find ou
a450: 74 20 68 6f 77 20 6d 61 6e 79 20 65 6e 74 72 69  t how many entri
a460: 65 73 20 77 65 20 6e 65 65 64 20 74 6f 20 61 6c  es we need to al
a470: 6c 6f 63 61 74 65 20 69 6e 20 74 68 65 0a 20 20  locate in the.  
a480: 20 20 20 2a 20 74 61 62 20 61 72 72 61 79 2e 0a     * tab array..
a490: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 63 6f 75       */..    cou
a4a0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 20  nt = 0;.    for 
a4b0: 28 69 20 3d 20 30 3b 20 69 20 3c 20 61 72 67 63  (i = 0; i < argc
a4c0: 3b 20 69 2b 2b 29 20 7b 0a 09 63 20 3d 20 61 72  ; i++) {..c = ar
a4d0: 67 76 5b 69 5d 5b 30 5d 3b 0a 09 69 66 20 28 28  gv[i][0];..if ((
a4e0: 63 20 21 3d 20 27 6c 27 29 20 26 26 20 28 63 20  c != 'l') && (c 
a4f0: 21 3d 20 27 72 27 29 20 26 26 20 28 63 20 21 3d  != 'r') && (c !=
a500: 20 27 63 27 29 20 26 26 20 28 63 20 21 3d 20 27   'c') && (c != '
a510: 6e 27 29 29 20 7b 0a 09 20 20 20 20 63 6f 75 6e  n')) {..    coun
a520: 74 2b 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  t++;..}.    }.. 
a530: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 50 61 72     /*.     * Par
a540: 73 65 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  se the elements 
a550: 6f 66 20 74 68 65 20 6c 69 73 74 20 6f 6e 65 20  of the list one 
a560: 61 74 20 61 20 74 69 6d 65 20 74 6f 20 66 69 6c  at a time to fil
a570: 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20  l in the.     * 
a580: 61 72 72 61 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a  array..     */..
a590: 20 20 20 20 74 61 62 41 72 72 61 79 50 74 72 20      tabArrayPtr 
a5a0: 3d 20 28 54 6b 54 65 78 74 54 61 62 41 72 72 61  = (TkTextTabArra
a5b0: 79 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e  y *) ckalloc((un
a5c0: 73 69 67 6e 65 64 29 0a 09 20 20 20 20 28 73 69  signed)..    (si
a5d0: 7a 65 6f 66 28 54 6b 54 65 78 74 54 61 62 41 72  zeof(TkTextTabAr
a5e0: 72 61 79 29 20 2b 20 28 63 6f 75 6e 74 2d 31 29  ray) + (count-1)
a5f0: 2a 73 69 7a 65 6f 66 28 54 6b 54 65 78 74 54 61  *sizeof(TkTextTa
a600: 62 29 29 29 3b 0a 20 20 20 20 74 61 62 41 72 72  b)));.    tabArr
a610: 61 79 50 74 72 2d 3e 6e 75 6d 54 61 62 73 20 3d  ayPtr->numTabs =
a620: 20 30 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d   0;.    for (i =
a630: 20 30 2c 20 74 61 62 50 74 72 20 3d 20 26 74 61   0, tabPtr = &ta
a640: 62 41 72 72 61 79 50 74 72 2d 3e 74 61 62 73 5b  bArrayPtr->tabs[
a650: 30 5d 3b 20 69 20 20 3c 20 61 72 67 63 3b 20 69  0]; i  < argc; i
a660: 2b 2b 2c 20 74 61 62 50 74 72 2b 2b 29 20 7b 0a  ++, tabPtr++) {.
a670: 09 69 66 20 28 54 6b 5f 47 65 74 50 69 78 65 6c  .if (Tk_GetPixel
a680: 73 28 69 6e 74 65 72 70 2c 20 74 6b 77 69 6e 2c  s(interp, tkwin,
a690: 20 61 72 67 76 5b 69 5d 2c 20 26 74 61 62 50 74   argv[i], &tabPt
a6a0: 72 2d 3e 6c 6f 63 61 74 69 6f 6e 29 0a 09 09 21  r->location)...!
a6b0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
a6c0: 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a   goto error;..}.
a6d0: 09 74 61 62 41 72 72 61 79 50 74 72 2d 3e 6e 75  .tabArrayPtr->nu
a6e0: 6d 54 61 62 73 2b 2b 3b 0a 0a 09 2f 2a 0a 09 20  mTabs++;.../*.. 
a6f0: 2a 20 53 65 65 20 69 66 20 74 68 65 72 65 20 69  * See if there i
a700: 73 20 61 6e 20 65 78 70 6c 69 63 69 74 20 61 6c  s an explicit al
a710: 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 6e  ignment in the n
a720: 65 78 74 20 6c 69 73 74 0a 09 20 2a 20 65 6c 65  ext list.. * ele
a730: 6d 65 6e 74 2e 20 20 4f 74 68 65 72 77 69 73 65  ment.  Otherwise
a740: 20 6a 75 73 74 20 75 73 65 20 22 6c 65 66 74 22   just use "left"
a750: 2e 0a 09 20 2a 2f 0a 0a 09 74 61 62 50 74 72 2d  ... */...tabPtr-
a760: 3e 61 6c 69 67 6e 6d 65 6e 74 20 3d 20 4c 45 46  >alignment = LEF
a770: 54 3b 0a 09 69 66 20 28 28 69 2b 31 29 20 3d 3d  T;..if ((i+1) ==
a780: 20 61 72 67 63 29 20 7b 0a 09 20 20 20 20 63 6f   argc) {..    co
a790: 6e 74 69 6e 75 65 3b 0a 09 7d 0a 09 63 20 3d 20  ntinue;..}..c = 
a7a0: 55 43 48 41 52 28 61 72 67 76 5b 69 2b 31 5d 5b  UCHAR(argv[i+1][
a7b0: 30 5d 29 3b 0a 09 69 66 20 28 21 69 73 61 6c 70  0]);..if (!isalp
a7c0: 68 61 28 63 29 29 20 7b 0a 09 20 20 20 20 63 6f  ha(c)) {..    co
a7d0: 6e 74 69 6e 75 65 3b 0a 09 7d 0a 09 69 20 2b 3d  ntinue;..}..i +=
a7e0: 20 31 3b 0a 09 69 66 20 28 28 63 20 3d 3d 20 27   1;..if ((c == '
a7f0: 6c 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28  l') && (strncmp(
a800: 61 72 67 76 5b 69 5d 2c 20 22 6c 65 66 74 22 2c  argv[i], "left",
a810: 0a 09 09 73 74 72 6c 65 6e 28 61 72 67 76 5b 69  ...strlen(argv[i
a820: 5d 29 29 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20  ])) == 0)) {..  
a830: 20 20 74 61 62 50 74 72 2d 3e 61 6c 69 67 6e 6d    tabPtr->alignm
a840: 65 6e 74 20 3d 20 4c 45 46 54 3b 0a 09 7d 20 65  ent = LEFT;..} e
a850: 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27 72  lse if ((c == 'r
a860: 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61  ') && (strncmp(a
a870: 72 67 76 5b 69 5d 2c 20 22 72 69 67 68 74 22 2c  rgv[i], "right",
a880: 0a 09 09 73 74 72 6c 65 6e 28 61 72 67 76 5b 69  ...strlen(argv[i
a890: 5d 29 29 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20  ])) == 0)) {..  
a8a0: 20 20 74 61 62 50 74 72 2d 3e 61 6c 69 67 6e 6d    tabPtr->alignm
a8b0: 65 6e 74 20 3d 20 52 49 47 48 54 3b 0a 09 7d 20  ent = RIGHT;..} 
a8c0: 65 6c 73 65 20 69 66 20 28 28 63 20 3d 3d 20 27  else if ((c == '
a8d0: 63 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28  c') && (strncmp(
a8e0: 61 72 67 76 5b 69 5d 2c 20 22 63 65 6e 74 65 72  argv[i], "center
a8f0: 22 2c 0a 09 09 73 74 72 6c 65 6e 28 61 72 67 76  ",...strlen(argv
a900: 5b 69 5d 29 29 20 3d 3d 20 30 29 29 20 7b 0a 09  [i])) == 0)) {..
a910: 20 20 20 20 74 61 62 50 74 72 2d 3e 61 6c 69 67      tabPtr->alig
a920: 6e 6d 65 6e 74 20 3d 20 43 45 4e 54 45 52 3b 0a  nment = CENTER;.
a930: 09 7d 20 65 6c 73 65 20 69 66 20 28 28 63 20 3d  .} else if ((c =
a940: 3d 20 27 6e 27 29 20 26 26 20 28 73 74 72 6e 63  = 'n') && (strnc
a950: 6d 70 28 61 72 67 76 5b 69 5d 2c 0a 09 09 22 6e  mp(argv[i],..."n
a960: 75 6d 65 72 69 63 22 2c 20 73 74 72 6c 65 6e 28  umeric", strlen(
a970: 61 72 67 76 5b 69 5d 29 29 20 3d 3d 20 30 29 29  argv[i])) == 0))
a980: 20 7b 0a 09 20 20 20 20 74 61 62 50 74 72 2d 3e   {..    tabPtr->
a990: 61 6c 69 67 6e 6d 65 6e 74 20 3d 20 4e 55 4d 45  alignment = NUME
a9a0: 52 49 43 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  RIC;..} else {..
a9b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a9c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
a9d0: 64 20 74 61 62 20 61 6c 69 67 6e 6d 65 6e 74 20  d tab alignment 
a9e0: 5c 22 22 2c 0a 09 09 20 20 20 20 61 72 67 76 5b  \"",...    argv[
a9f0: 69 5d 2c 20 22 5c 22 3a 20 6d 75 73 74 20 62 65  i], "\": must be
aa00: 20 6c 65 66 74 2c 20 72 69 67 68 74 2c 20 63 65   left, right, ce
aa10: 6e 74 65 72 2c 20 6f 72 20 6e 75 6d 65 72 69 63  nter, or numeric
aa20: 22 2c 0a 09 09 20 20 20 20 28 63 68 61 72 20 2a  ",...    (char *
aa30: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 67 6f  ) NULL);..    go
aa40: 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a 20 20 20  to error;..}.   
aa50: 20 7d 0a 20 20 20 20 63 6b 66 72 65 65 28 28 63   }.    ckfree((c
aa60: 68 61 72 20 2a 29 20 61 72 67 76 29 3b 0a 20 20  har *) argv);.  
aa70: 20 20 72 65 74 75 72 6e 20 74 61 62 41 72 72 61    return tabArra
aa80: 79 50 74 72 3b 0a 0a 20 20 20 20 65 72 72 6f 72  yPtr;..    error
aa90: 3a 0a 20 20 20 20 63 6b 66 72 65 65 28 28 63 68  :.    ckfree((ch
aaa0: 61 72 20 2a 29 20 74 61 62 41 72 72 61 79 50 74  ar *) tabArrayPt
aab0: 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 28  r);.    ckfree((
aac0: 63 68 61 72 20 2a 29 20 61 72 67 76 29 3b 0a 20  char *) argv);. 
aad0: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
aae0: 7d 0a                                            }.