Hex Artifact Content

Artifact a0446bbd6efd4f17502e8a7be43ed2a2db3f36ed:


0000: 2f 2a 20 0a 20 2a 20 74 6b 54 65 78 74 42 54 72  /* . * tkTextBTr
0010: 65 65 2e 63 20 28 43 54 6b 29 20 2d 2d 0a 20 2a  ee.c (CTk) --. *
0020: 0a 20 2a 09 54 68 69 73 20 66 69 6c 65 20 63 6f  . *.This file co
0030: 6e 74 61 69 6e 73 20 63 6f 64 65 20 74 68 61 74  ntains code that
0040: 20 6d 61 6e 61 67 65 73 20 74 68 65 20 42 2d 74   manages the B-t
0050: 72 65 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ree representati
0060: 6f 6e 0a 20 2a 09 6f 66 20 74 65 78 74 20 66 6f  on. *.of text fo
0070: 72 20 54 6b 27 73 20 74 65 78 74 20 77 69 64 67  r Tk's text widg
0080: 65 74 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74  et and implement
0090: 73 20 63 68 61 72 61 63 74 65 72 20 61 6e 64 0a  s character and.
00a0: 20 2a 09 74 6f 67 67 6c 65 20 73 65 67 6d 65 6e   *.toggle segmen
00b0: 74 20 74 79 70 65 73 2e 0a 20 2a 0a 20 2a 20 43  t types.. *. * C
00c0: 6f 70 79 72 69 67 68 74 20 28 63 29 20 31 39 39  opyright (c) 199
00d0: 32 2d 31 39 39 34 20 54 68 65 20 52 65 67 65 6e  2-1994 The Regen
00e0: 74 73 20 6f 66 20 74 68 65 20 55 6e 69 76 65 72  ts of the Univer
00f0: 73 69 74 79 20 6f 66 20 43 61 6c 69 66 6f 72 6e  sity of Californ
0100: 69 61 2e 0a 20 2a 20 43 6f 70 79 72 69 67 68 74  ia.. * Copyright
0110: 20 28 63 29 20 31 39 39 34 2d 31 39 39 35 20 53   (c) 1994-1995 S
0120: 75 6e 20 4d 69 63 72 6f 73 79 73 74 65 6d 73 2c  un Microsystems,
0130: 20 49 6e 63 2e 0a 20 2a 0a 20 2a 20 53 65 65 20   Inc.. *. * See 
0140: 74 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73  the file "licens
0150: 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66  e.terms" for inf
0160: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67  ormation on usag
0170: 65 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75  e and redistribu
0180: 74 69 6f 6e 0a 20 2a 20 6f 66 20 74 68 69 73 20  tion. * of this 
0190: 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20  file, and for a 
01a0: 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c  DISCLAIMER OF AL
01b0: 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a  L WARRANTIES.. *
01c0: 0a 20 2a 20 40 28 23 29 20 24 49 64 3a 20 63 74  . * @(#) $Id: ct
01d0: 6b 2e 73 68 61 72 2c 76 20 31 2e 35 30 20 31 39  k.shar,v 1.50 19
01e0: 39 36 2f 30 31 2f 31 35 20 31 34 3a 34 37 3a 31  96/01/15 14:47:1
01f0: 36 20 61 6e 64 72 65 77 6d 20 45 78 70 20 61 6e  6 andrewm Exp an
0200: 64 72 65 77 6d 20 24 0a 20 2a 2f 0a 0a 0a 23 69  drewm $. */...#i
0210: 6e 63 6c 75 64 65 20 22 74 6b 49 6e 74 2e 68 22  nclude "tkInt.h"
0220: 0a 23 69 6e 63 6c 75 64 65 20 22 74 6b 50 6f 72  .#include "tkPor
0230: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 74  t.h".#include "t
0240: 6b 54 65 78 74 2e 68 22 0a 0a 2f 2a 0a 20 2a 20  kText.h"../*. * 
0250: 54 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  The data structu
0260: 72 65 20 62 65 6c 6f 77 20 6b 65 65 70 73 20 73  re below keeps s
0270: 75 6d 6d 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  ummary informati
0280: 6f 6e 20 61 62 6f 75 74 20 6f 6e 65 20 74 61 67  on about one tag
0290: 20 61 73 20 70 61 72 74 0a 20 2a 20 6f 66 20 74   as part. * of t
02a0: 68 65 20 74 61 67 20 69 6e 66 6f 72 6d 61 74 69  he tag informati
02b0: 6f 6e 20 69 6e 20 61 20 6e 6f 64 65 2e 0a 20 2a  on in a node.. *
02c0: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  /..typedef struc
02d0: 74 20 53 75 6d 6d 61 72 79 20 7b 0a 20 20 20 20  t Summary {.    
02e0: 54 6b 54 65 78 74 54 61 67 20 2a 74 61 67 50 74  TkTextTag *tagPt
02f0: 72 3b 09 09 09 2f 2a 20 48 61 6e 64 6c 65 20 66  r;.../* Handle f
0300: 6f 72 20 74 61 67 2e 20 2a 2f 0a 20 20 20 20 69  or tag. */.    i
0310: 6e 74 20 74 6f 67 67 6c 65 43 6f 75 6e 74 3b 09  nt toggleCount;.
0320: 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74  ../* Number of t
0330: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 74 6f 20  ransitions into 
0340: 6f 72 0a 09 09 09 09 09 20 2a 20 6f 75 74 20 6f  or...... * out o
0350: 66 20 74 68 69 73 20 74 61 67 20 74 68 61 74 20  f this tag that 
0360: 6f 63 63 75 72 20 69 6e 0a 09 09 09 09 09 20 2a  occur in...... *
0370: 20 74 68 65 20 73 75 62 74 72 65 65 20 72 6f 6f   the subtree roo
0380: 74 65 64 20 61 74 20 74 68 69 73 20 6e 6f 64 65  ted at this node
0390: 2e 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  . */.    struct 
03a0: 53 75 6d 6d 61 72 79 20 2a 6e 65 78 74 50 74 72  Summary *nextPtr
03b0: 3b 09 09 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69  ;../* Next in li
03c0: 73 74 20 6f 66 20 61 6c 6c 20 74 61 67 73 20 66  st of all tags f
03d0: 6f 72 20 73 61 6d 65 0a 09 09 09 09 09 20 2a 20  or same...... * 
03e0: 6e 6f 64 65 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  node, or NULL if
03f0: 20 61 74 20 65 6e 64 20 6f 66 20 6c 69 73 74 2e   at end of list.
0400: 20 2a 2f 0a 7d 20 53 75 6d 6d 61 72 79 3b 0a 0a   */.} Summary;..
0410: 2f 2a 0a 20 2a 20 54 68 65 20 64 61 74 61 20 73  /*. * The data s
0420: 74 72 75 63 74 75 72 65 20 62 65 6c 6f 77 20 64  tructure below d
0430: 65 66 69 6e 65 73 20 61 20 6e 6f 64 65 20 69 6e  efines a node in
0440: 20 74 68 65 20 42 2d 74 72 65 65 2e 0a 20 2a 2f   the B-tree.. */
0450: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
0460: 20 4e 6f 64 65 20 7b 0a 20 20 20 20 73 74 72 75   Node {.    stru
0470: 63 74 20 4e 6f 64 65 20 2a 70 61 72 65 6e 74 50  ct Node *parentP
0480: 74 72 3b 09 09 2f 2a 20 50 6f 69 6e 74 65 72 20  tr;../* Pointer 
0490: 74 6f 20 70 61 72 65 6e 74 20 6e 6f 64 65 2c 20  to parent node, 
04a0: 6f 72 20 4e 55 4c 4c 20 69 66 0a 09 09 09 09 09  or NULL if......
04b0: 20 2a 20 74 68 69 73 20 69 73 20 74 68 65 20 72   * this is the r
04c0: 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 73 74 72 75  oot. */.    stru
04d0: 63 74 20 4e 6f 64 65 20 2a 6e 65 78 74 50 74 72  ct Node *nextPtr
04e0: 3b 09 09 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69  ;../* Next in li
04f0: 73 74 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 77  st of siblings w
0500: 69 74 68 20 74 68 65 0a 09 09 09 09 09 20 2a 20  ith the...... * 
0510: 73 61 6d 65 20 70 61 72 65 6e 74 20 6e 6f 64 65  same parent node
0520: 2c 20 6f 72 20 4e 55 4c 4c 20 66 6f 72 20 65 6e  , or NULL for en
0530: 64 0a 09 09 09 09 09 20 2a 20 6f 66 20 6c 69 73  d...... * of lis
0540: 74 2e 20 2a 2f 0a 20 20 20 20 53 75 6d 6d 61 72  t. */.    Summar
0550: 79 20 2a 73 75 6d 6d 61 72 79 50 74 72 3b 09 09  y *summaryPtr;..
0560: 2f 2a 20 46 69 72 73 74 20 69 6e 20 6d 61 6c 6c  /* First in mall
0570: 6f 63 2d 65 64 20 6c 69 73 74 20 6f 66 20 69 6e  oc-ed list of in
0580: 66 6f 0a 09 09 09 09 09 20 2a 20 61 62 6f 75 74  fo...... * about
0590: 20 74 61 67 73 20 69 6e 20 74 68 69 73 20 73 75   tags in this su
05a0: 62 74 72 65 65 20 28 4e 55 4c 4c 20 69 66 0a 09  btree (NULL if..
05b0: 09 09 09 09 20 2a 20 6e 6f 20 74 61 67 20 69 6e  .... * no tag in
05c0: 66 6f 20 69 6e 20 74 68 65 20 73 75 62 74 72 65  fo in the subtre
05d0: 65 29 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  e). */.    int l
05e0: 65 76 65 6c 3b 09 09 09 09 2f 2a 20 4c 65 76 65  evel;..../* Leve
05f0: 6c 20 6f 66 20 74 68 69 73 20 6e 6f 64 65 20 69  l of this node i
0600: 6e 20 74 68 65 20 42 2d 74 72 65 65 2e 0a 09 09  n the B-tree....
0610: 09 09 09 20 2a 20 30 20 72 65 66 65 72 73 20 74  ... * 0 refers t
0620: 6f 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  o the bottom of 
0630: 74 68 65 20 74 72 65 65 0a 09 09 09 09 09 20 2a  the tree...... *
0640: 20 28 63 68 69 6c 64 72 65 6e 20 61 72 65 20 6c   (children are l
0650: 69 6e 65 73 2c 20 6e 6f 74 20 6e 6f 64 65 73 29  ines, not nodes)
0660: 2e 20 2a 2f 0a 20 20 20 20 75 6e 69 6f 6e 20 7b  . */.    union {
0670: 09 09 09 09 2f 2a 20 46 69 72 73 74 20 69 6e 20  ..../* First in 
0680: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 63  linked list of c
0690: 68 69 6c 64 72 65 6e 2e 20 2a 2f 0a 09 73 74 72  hildren. */..str
06a0: 75 63 74 20 4e 6f 64 65 20 2a 6e 6f 64 65 50 74  uct Node *nodePt
06b0: 72 3b 09 09 2f 2a 20 55 73 65 64 20 69 66 20 6c  r;../* Used if l
06c0: 65 76 65 6c 20 3e 20 30 2e 20 2a 2f 0a 09 54 6b  evel > 0. */..Tk
06d0: 54 65 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50 74  TextLine *linePt
06e0: 72 3b 09 09 2f 2a 20 55 73 65 64 20 69 66 20 6c  r;../* Used if l
06f0: 65 76 65 6c 20 3d 3d 20 30 2e 20 2a 2f 0a 20 20  evel == 0. */.  
0700: 20 20 7d 20 63 68 69 6c 64 72 65 6e 3b 0a 20 20    } children;.  
0710: 20 20 69 6e 74 20 6e 75 6d 43 68 69 6c 64 72 65    int numChildre
0720: 6e 3b 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f  n;.../* Number o
0730: 66 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 74 68  f children of th
0740: 69 73 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 20 20  is node. */.    
0750: 69 6e 74 20 6e 75 6d 4c 69 6e 65 73 3b 09 09 09  int numLines;...
0760: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
0770: 6f 66 20 6c 69 6e 65 73 20 28 6c 65 61 76 65 73  of lines (leaves
0780: 29 20 69 6e 0a 09 09 09 09 09 20 2a 20 74 68 65  ) in...... * the
0790: 20 73 75 62 74 72 65 65 20 72 6f 6f 74 65 64 20   subtree rooted 
07a0: 68 65 72 65 2e 20 2a 2f 0a 7d 20 4e 6f 64 65 3b  here. */.} Node;
07b0: 0a 0a 2f 2a 0a 20 2a 20 55 70 70 65 72 20 61 6e  ../*. * Upper an
07c0: 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20 6f  d lower bounds o
07d0: 6e 20 68 6f 77 20 6d 61 6e 79 20 63 68 69 6c 64  n how many child
07e0: 72 65 6e 20 61 20 6e 6f 64 65 20 6d 61 79 20 68  ren a node may h
07f0: 61 76 65 3a 0a 20 2a 20 72 65 62 61 6c 61 6e 63  ave:. * rebalanc
0800: 65 20 77 68 65 6e 20 65 69 74 68 65 72 20 6f 66  e when either of
0810: 20 74 68 65 73 65 20 6c 69 6d 69 74 73 20 69 73   these limits is
0820: 20 65 78 63 65 65 64 65 64 2e 20 20 4d 41 58 5f   exceeded.  MAX_
0830: 43 48 49 4c 44 52 45 4e 0a 20 2a 20 73 68 6f 75  CHILDREN. * shou
0840: 6c 64 20 62 65 20 74 77 69 63 65 20 4d 49 4e 5f  ld be twice MIN_
0850: 43 48 49 4c 44 52 45 4e 20 61 6e 64 20 4d 49 4e  CHILDREN and MIN
0860: 5f 43 48 49 4c 44 52 45 4e 20 6d 75 73 74 20 62  _CHILDREN must b
0870: 65 20 3e 3d 20 32 2e 0a 20 2a 2f 0a 0a 23 64 65  e >= 2.. */..#de
0880: 66 69 6e 65 20 4d 41 58 5f 43 48 49 4c 44 52 45  fine MAX_CHILDRE
0890: 4e 20 31 32 0a 23 64 65 66 69 6e 65 20 4d 49 4e  N 12.#define MIN
08a0: 5f 43 48 49 4c 44 52 45 4e 20 36 0a 0a 2f 2a 0a  _CHILDREN 6../*.
08b0: 20 2a 20 54 68 65 20 64 61 74 61 20 73 74 72 75   * The data stru
08c0: 63 74 75 72 65 20 62 65 6c 6f 77 20 64 65 66 69  cture below defi
08d0: 6e 65 73 20 61 6e 20 65 6e 74 69 72 65 20 42 2d  nes an entire B-
08e0: 74 72 65 65 2e 0a 20 2a 2f 0a 0a 74 79 70 65 64  tree.. */..typed
08f0: 65 66 20 73 74 72 75 63 74 20 42 54 72 65 65 20  ef struct BTree 
0900: 7b 0a 20 20 20 20 4e 6f 64 65 20 2a 72 6f 6f 74  {.    Node *root
0910: 50 74 72 3b 09 09 09 2f 2a 20 50 6f 69 6e 74 65  Ptr;.../* Pointe
0920: 72 20 74 6f 20 72 6f 6f 74 20 6f 66 20 42 2d 74  r to root of B-t
0930: 72 65 65 2e 20 2a 2f 0a 7d 20 42 54 72 65 65 3b  ree. */.} BTree;
0940: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 74 72 75  ../*. * The stru
0950: 63 74 75 72 65 20 62 65 6c 6f 77 20 69 73 20 75  cture below is u
0960: 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e 66 6f  sed to pass info
0970: 72 6d 61 74 69 6f 6e 20 62 65 74 77 65 65 6e 0a  rmation between.
0980: 20 2a 20 54 6b 42 54 72 65 65 47 65 74 54 61 67   * TkBTreeGetTag
0990: 73 20 61 6e 64 20 49 6e 63 43 6f 75 6e 74 3a 0a  s and IncCount:.
09a0: 20 2a 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72   */..typedef str
09b0: 75 63 74 20 54 61 67 49 6e 66 6f 20 7b 0a 20 20  uct TagInfo {.  
09c0: 20 20 69 6e 74 20 6e 75 6d 54 61 67 73 3b 09 09    int numTags;..
09d0: 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 61  ./* Number of ta
09e0: 67 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  gs for which the
09f0: 72 65 0a 09 09 09 09 09 20 2a 20 69 73 20 63 75  re...... * is cu
0a00: 72 72 65 6e 74 6c 79 20 69 6e 66 6f 72 6d 61 74  rrently informat
0a10: 69 6f 6e 20 69 6e 0a 09 09 09 09 09 20 2a 20 74  ion in...... * t
0a20: 61 67 73 20 61 6e 64 20 63 6f 75 6e 74 73 2e 20  ags and counts. 
0a30: 2a 2f 0a 20 20 20 20 69 6e 74 20 61 72 72 61 79  */.    int array
0a40: 53 69 7a 65 3b 09 09 09 2f 2a 20 4e 75 6d 62 65  Size;.../* Numbe
0a50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61 6c 6c  r of entries all
0a60: 6f 63 61 74 65 64 20 66 6f 72 0a 09 09 09 09 09  ocated for......
0a70: 20 2a 20 74 61 67 73 20 61 6e 64 20 63 6f 75 6e   * tags and coun
0a80: 74 73 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78  ts. */.    TkTex
0a90: 74 54 61 67 20 2a 2a 74 61 67 50 74 72 73 3b 09  tTag **tagPtrs;.
0aa0: 09 2f 2a 20 41 72 72 61 79 20 6f 66 20 74 61 67  ./* Array of tag
0ab0: 73 20 73 65 65 6e 20 73 6f 20 66 61 72 2e 0a 09  s seen so far...
0ac0: 09 09 09 09 20 2a 20 4d 61 6c 6c 6f 63 2d 65 64  .... * Malloc-ed
0ad0: 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 2a 63 6f  . */.    int *co
0ae0: 75 6e 74 73 3b 09 09 09 2f 2a 20 54 6f 67 67 6c  unts;.../* Toggl
0af0: 65 20 63 6f 75 6e 74 20 28 73 6f 20 66 61 72 29  e count (so far)
0b00: 20 66 6f 72 20 65 61 63 68 0a 09 09 09 09 09 20   for each...... 
0b10: 2a 20 65 6e 74 72 79 20 69 6e 20 74 61 67 73 2e  * entry in tags.
0b20: 20 20 4d 61 6c 6c 6f 63 2d 65 64 2e 20 2a 2f 0a    Malloc-ed. */.
0b30: 7d 20 54 61 67 49 6e 66 6f 3b 0a 0a 2f 2a 0a 20  } TagInfo;../*. 
0b40: 2a 20 56 61 72 69 61 62 6c 65 20 74 68 61 74 20  * Variable that 
0b50: 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68 65  indicates whethe
0b60: 72 20 74 6f 20 65 6e 61 62 6c 65 20 63 6f 6e 73  r to enable cons
0b70: 69 73 74 65 6e 63 79 20 63 68 65 63 6b 73 20 66  istency checks f
0b80: 6f 72 0a 20 2a 20 64 65 62 75 67 67 69 6e 67 2e  or. * debugging.
0b90: 0a 20 2a 2f 0a 0a 69 6e 74 20 74 6b 42 54 72 65  . */..int tkBTre
0ba0: 65 44 65 62 75 67 20 3d 20 30 3b 0a 0a 2f 2a 0a  eDebug = 0;../*.
0bb0: 20 2a 20 4d 61 63 72 6f 73 20 74 68 61 74 20 64   * Macros that d
0bc0: 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 75 63  etermine how muc
0bd0: 68 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  h space to alloc
0be0: 61 74 65 20 66 6f 72 20 6e 65 77 20 73 65 67 6d  ate for new segm
0bf0: 65 6e 74 73 3a 0a 20 2a 2f 0a 0a 23 64 65 66 69  ents:. */..#defi
0c00: 6e 65 20 43 53 45 47 5f 53 49 5a 45 28 63 68 61  ne CSEG_SIZE(cha
0c10: 72 73 29 20 28 28 75 6e 73 69 67 6e 65 64 29 20  rs) ((unsigned) 
0c20: 28 54 6b 5f 4f 66 66 73 65 74 28 54 6b 54 65 78  (Tk_Offset(TkTex
0c30: 74 53 65 67 6d 65 6e 74 2c 20 62 6f 64 79 29 20  tSegment, body) 
0c40: 5c 0a 09 2b 20 31 20 2b 20 28 63 68 61 72 73 29  \..+ 1 + (chars)
0c50: 29 29 0a 23 64 65 66 69 6e 65 20 54 53 45 47 5f  )).#define TSEG_
0c60: 53 49 5a 45 20 28 28 75 6e 73 69 67 6e 65 64 29  SIZE ((unsigned)
0c70: 20 28 54 6b 5f 4f 66 66 73 65 74 28 54 6b 54 65   (Tk_Offset(TkTe
0c80: 78 74 53 65 67 6d 65 6e 74 2c 20 62 6f 64 79 29  xtSegment, body)
0c90: 20 5c 0a 09 2b 20 73 69 7a 65 6f 66 28 54 6b 54   \..+ sizeof(TkT
0ca0: 65 78 74 54 6f 67 67 6c 65 29 29 29 0a 0a 2f 2a  extToggle)))../*
0cb0: 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  . * Forward decl
0cc0: 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 70 72 6f  arations for pro
0cd0: 63 65 64 75 72 65 73 20 64 65 66 69 6e 65 64 20  cedures defined 
0ce0: 69 6e 20 74 68 69 73 20 66 69 6c 65 3a 0a 20 2a  in this file:. *
0cf0: 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09  /..static void..
0d00: 43 68 61 6e 67 65 4e 6f 64 65 54 6f 67 67 6c 65  ChangeNodeToggle
0d10: 43 6f 75 6e 74 20 5f 41 4e 53 49 5f 41 52 47 53  Count _ANSI_ARGS
0d20: 5f 28 28 4e 6f 64 65 20 2a 6e 6f 64 65 50 74 72  _((Node *nodePtr
0d30: 2c 0a 09 09 09 20 20 20 20 54 6b 54 65 78 74 54  ,....    TkTextT
0d40: 61 67 20 2a 74 61 67 50 74 72 2c 20 69 6e 74 20  ag *tagPtr, int 
0d50: 64 65 6c 74 61 29 29 3b 0a 73 74 61 74 69 63 20  delta));.static 
0d60: 76 6f 69 64 09 09 43 68 61 72 43 68 65 63 6b 50  void..CharCheckP
0d70: 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28  roc _ANSI_ARGS_(
0d80: 28 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a  (TkTextSegment *
0d90: 73 65 67 50 74 72 2c 0a 09 09 09 20 20 20 20 54  segPtr,....    T
0da0: 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50  kTextLine *lineP
0db0: 74 72 29 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  tr));.static int
0dc0: 09 09 43 68 61 72 44 65 6c 65 74 65 50 72 6f 63  ..CharDeleteProc
0dd0: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 6b   _ANSI_ARGS_((Tk
0de0: 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 73 65 67  TextSegment *seg
0df0: 50 74 72 2c 0a 09 09 09 20 20 20 20 54 6b 54 65  Ptr,....    TkTe
0e00: 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50 74 72 2c  xtLine *linePtr,
0e10: 20 69 6e 74 20 74 72 65 65 47 6f 6e 65 29 29 3b   int treeGone));
0e20: 0a 73 74 61 74 69 63 20 54 6b 54 65 78 74 53 65  .static TkTextSe
0e30: 67 6d 65 6e 74 20 2a 09 43 68 61 72 43 6c 65 61  gment *.CharClea
0e40: 6e 75 70 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52  nupProc _ANSI_AR
0e50: 47 53 5f 28 28 54 6b 54 65 78 74 53 65 67 6d 65  GS_((TkTextSegme
0e60: 6e 74 20 2a 73 65 67 50 74 72 2c 0a 09 09 09 20  nt *segPtr,.... 
0e70: 20 20 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c     TkTextLine *l
0e80: 69 6e 65 50 74 72 29 29 3b 0a 73 74 61 74 69 63  inePtr));.static
0e90: 20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a   TkTextSegment *
0ea0: 09 43 68 61 72 53 70 6c 69 74 50 72 6f 63 20 5f  .CharSplitProc _
0eb0: 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 6b 54 65  ANSI_ARGS_((TkTe
0ec0: 78 74 53 65 67 6d 65 6e 74 20 2a 73 65 67 50 74  xtSegment *segPt
0ed0: 72 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 69 6e  r,....    int in
0ee0: 64 65 78 29 29 3b 0a 73 74 61 74 69 63 20 76 6f  dex));.static vo
0ef0: 69 64 09 09 43 68 65 63 6b 4e 6f 64 65 43 6f 6e  id..CheckNodeCon
0f00: 73 69 73 74 65 6e 63 79 20 5f 41 4e 53 49 5f 41  sistency _ANSI_A
0f10: 52 47 53 5f 28 28 4e 6f 64 65 20 2a 6e 6f 64 65  RGS_((Node *node
0f20: 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20 76 6f  Ptr));.static vo
0f30: 69 64 09 09 43 6c 65 61 6e 75 70 4c 69 6e 65 20  id..CleanupLine 
0f40: 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 54 6b 54  _ANSI_ARGS_((TkT
0f50: 65 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50 74 72  extLine *linePtr
0f60: 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09  ));.static void.
0f70: 09 44 65 6c 65 74 65 53 75 6d 6d 61 72 69 65 73  .DeleteSummaries
0f80: 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28 28 53 75   _ANSI_ARGS_((Su
0f90: 6d 6d 61 72 79 20 2a 74 61 67 50 74 72 29 29 3b  mmary *tagPtr));
0fa0: 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 44 65  .static void..De
0fb0: 73 74 72 6f 79 4e 6f 64 65 20 5f 41 4e 53 49 5f  stroyNode _ANSI_
0fc0: 41 52 47 53 5f 28 28 4e 6f 64 65 20 2a 6e 6f 64  ARGS_((Node *nod
0fd0: 65 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20 76  ePtr));.static v
0fe0: 6f 69 64 09 09 49 6e 63 43 6f 75 6e 74 20 5f 41  oid..IncCount _A
0ff0: 4e 53 49 5f 41 52 47 53 5f 28 28 54 6b 54 65 78  NSI_ARGS_((TkTex
1000: 74 54 61 67 20 2a 74 61 67 50 74 72 2c 20 69 6e  tTag *tagPtr, in
1010: 74 20 69 6e 63 2c 0a 09 09 09 20 20 20 20 54 61  t inc,....    Ta
1020: 67 49 6e 66 6f 20 2a 74 61 67 49 6e 66 6f 50 74  gInfo *tagInfoPt
1030: 72 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  r));.static void
1040: 09 09 52 65 62 61 6c 61 6e 63 65 20 5f 41 4e 53  ..Rebalance _ANS
1050: 49 5f 41 52 47 53 5f 28 28 42 54 72 65 65 20 2a  I_ARGS_((BTree *
1060: 74 72 65 65 50 74 72 2c 20 4e 6f 64 65 20 2a 6e  treePtr, Node *n
1070: 6f 64 65 50 74 72 29 29 3b 0a 73 74 61 74 69 63  odePtr));.static
1080: 20 76 6f 69 64 09 09 52 65 63 6f 6d 70 75 74 65   void..Recompute
1090: 4e 6f 64 65 43 6f 75 6e 74 73 20 5f 41 4e 53 49  NodeCounts _ANSI
10a0: 5f 41 52 47 53 5f 28 28 4e 6f 64 65 20 2a 6e 6f  _ARGS_((Node *no
10b0: 64 65 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20  dePtr));.static 
10c0: 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 09  TkTextSegment *.
10d0: 53 70 6c 69 74 53 65 67 20 5f 41 4e 53 49 5f 41  SplitSeg _ANSI_A
10e0: 52 47 53 5f 28 28 54 6b 54 65 78 74 49 6e 64 65  RGS_((TkTextInde
10f0: 78 20 2a 69 6e 64 65 78 50 74 72 29 29 3b 0a 73  x *indexPtr));.s
1100: 74 61 74 69 63 20 76 6f 69 64 09 09 54 6f 67 67  tatic void..Togg
1110: 6c 65 43 68 65 63 6b 50 72 6f 63 20 5f 41 4e 53  leCheckProc _ANS
1120: 49 5f 41 52 47 53 5f 28 28 54 6b 54 65 78 74 53  I_ARGS_((TkTextS
1130: 65 67 6d 65 6e 74 20 2a 73 65 67 50 74 72 2c 0a  egment *segPtr,.
1140: 09 09 09 20 20 20 20 54 6b 54 65 78 74 4c 69 6e  ...    TkTextLin
1150: 65 20 2a 6c 69 6e 65 50 74 72 29 29 3b 0a 73 74  e *linePtr));.st
1160: 61 74 69 63 20 54 6b 54 65 78 74 53 65 67 6d 65  atic TkTextSegme
1170: 6e 74 20 2a 09 54 6f 67 67 6c 65 43 6c 65 61 6e  nt *.ToggleClean
1180: 75 70 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47  upProc _ANSI_ARG
1190: 53 5f 28 28 54 6b 54 65 78 74 53 65 67 6d 65 6e  S_((TkTextSegmen
11a0: 74 20 2a 73 65 67 50 74 72 2c 0a 09 09 09 20 20  t *segPtr,....  
11b0: 20 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 69    TkTextLine *li
11c0: 6e 65 50 74 72 29 29 3b 0a 73 74 61 74 69 63 20  nePtr));.static 
11d0: 69 6e 74 09 09 54 6f 67 67 6c 65 44 65 6c 65 74  int..ToggleDelet
11e0: 65 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52 47 53  eProc _ANSI_ARGS
11f0: 5f 28 28 54 6b 54 65 78 74 53 65 67 6d 65 6e 74  _((TkTextSegment
1200: 20 2a 73 65 67 50 74 72 2c 0a 09 09 09 20 20 20   *segPtr,....   
1210: 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 69 6e   TkTextLine *lin
1220: 65 50 74 72 2c 20 69 6e 74 20 74 72 65 65 47 6f  ePtr, int treeGo
1230: 6e 65 29 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ne));.static voi
1240: 64 09 09 54 6f 67 67 6c 65 4c 69 6e 65 43 68 61  d..ToggleLineCha
1250: 6e 67 65 50 72 6f 63 20 5f 41 4e 53 49 5f 41 52  ngeProc _ANSI_AR
1260: 47 53 5f 28 28 54 6b 54 65 78 74 53 65 67 6d 65  GS_((TkTextSegme
1270: 6e 74 20 2a 73 65 67 50 74 72 2c 0a 09 09 09 20  nt *segPtr,.... 
1280: 20 20 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c     TkTextLine *l
1290: 69 6e 65 50 74 72 29 29 3b 0a 0a 2f 2a 0a 20 2a  inePtr));../*. *
12a0: 20 54 79 70 65 20 72 65 63 6f 72 64 20 66 6f 72   Type record for
12b0: 20 63 68 61 72 61 63 74 65 72 20 73 65 67 6d 65   character segme
12c0: 6e 74 73 3a 0a 20 2a 2f 0a 0a 54 6b 5f 53 65 67  nts:. */..Tk_Seg
12d0: 54 79 70 65 20 74 6b 54 65 78 74 43 68 61 72 54  Type tkTextCharT
12e0: 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 63 68 61  ype = {.    "cha
12f0: 72 61 63 74 65 72 22 2c 09 09 09 09 2f 2a 20 6e  racter",..../* n
1300: 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 09 09 09  ame */.    0,...
1310: 09 09 09 2f 2a 20 6c 65 66 74 47 72 61 76 69 74  .../* leftGravit
1320: 79 20 2a 2f 0a 20 20 20 20 43 68 61 72 53 70 6c  y */.    CharSpl
1330: 69 74 50 72 6f 63 2c 09 09 09 09 2f 2a 20 73 70  itProc,..../* sp
1340: 6c 69 74 50 72 6f 63 20 2a 2f 0a 20 20 20 20 43  litProc */.    C
1350: 68 61 72 44 65 6c 65 74 65 50 72 6f 63 2c 09 09  harDeleteProc,..
1360: 09 09 2f 2a 20 64 65 6c 65 74 65 50 72 6f 63 20  ../* deleteProc 
1370: 2a 2f 0a 20 20 20 20 43 68 61 72 43 6c 65 61 6e  */.    CharClean
1380: 75 70 50 72 6f 63 2c 09 09 09 09 2f 2a 20 63 6c  upProc,..../* cl
1390: 65 61 6e 75 70 50 72 6f 63 20 2a 2f 0a 20 20 20  eanupProc */.   
13a0: 20 28 54 6b 5f 53 65 67 4c 69 6e 65 43 68 61 6e   (Tk_SegLineChan
13b0: 67 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 2c 09  geProc *) NULL,.
13c0: 09 2f 2a 20 6c 69 6e 65 43 68 61 6e 67 65 50 72  ./* lineChangePr
13d0: 6f 63 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74  oc */.    TkText
13e0: 43 68 61 72 4c 61 79 6f 75 74 50 72 6f 63 2c 09  CharLayoutProc,.
13f0: 09 09 2f 2a 20 6c 61 79 6f 75 74 50 72 6f 63 20  ../* layoutProc 
1400: 2a 2f 0a 20 20 20 20 43 68 61 72 43 68 65 63 6b  */.    CharCheck
1410: 50 72 6f 63 09 09 09 09 2f 2a 20 63 68 65 63 6b  Proc..../* check
1420: 50 72 6f 63 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20  Proc */.};../*. 
1430: 2a 20 54 79 70 65 20 72 65 63 6f 72 64 20 66 6f  * Type record fo
1440: 72 20 73 65 67 6d 65 6e 74 73 20 6d 61 72 6b 69  r segments marki
1450: 6e 67 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ng the beginning
1460: 20 6f 66 20 61 20 74 61 67 67 65 64 0a 20 2a 20   of a tagged. * 
1470: 72 61 6e 67 65 3a 0a 20 2a 2f 0a 0a 54 6b 5f 53  range:. */..Tk_S
1480: 65 67 54 79 70 65 20 74 6b 54 65 78 74 54 6f 67  egType tkTextTog
1490: 67 6c 65 4f 6e 54 79 70 65 20 3d 20 7b 0a 20 20  gleOnType = {.  
14a0: 20 20 22 74 6f 67 67 6c 65 4f 6e 22 2c 09 09 09    "toggleOn",...
14b0: 09 09 2f 2a 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  ../* name */.   
14c0: 20 30 2c 09 09 09 09 09 09 2f 2a 20 6c 65 66 74   0,....../* left
14d0: 47 72 61 76 69 74 79 20 2a 2f 0a 20 20 20 20 28  Gravity */.    (
14e0: 54 6b 5f 53 65 67 53 70 6c 69 74 50 72 6f 63 20  Tk_SegSplitProc 
14f0: 2a 29 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 73 70  *) NULL,.../* sp
1500: 6c 69 74 50 72 6f 63 20 2a 2f 0a 20 20 20 20 54  litProc */.    T
1510: 6f 67 67 6c 65 44 65 6c 65 74 65 50 72 6f 63 2c  oggleDeleteProc,
1520: 09 09 09 09 2f 2a 20 64 65 6c 65 74 65 50 72 6f  ..../* deletePro
1530: 63 20 2a 2f 0a 20 20 20 20 54 6f 67 67 6c 65 43  c */.    ToggleC
1540: 6c 65 61 6e 75 70 50 72 6f 63 2c 09 09 09 09 2f  leanupProc,..../
1550: 2a 20 63 6c 65 61 6e 75 70 50 72 6f 63 20 2a 2f  * cleanupProc */
1560: 0a 20 20 20 20 54 6f 67 67 6c 65 4c 69 6e 65 43  .    ToggleLineC
1570: 68 61 6e 67 65 50 72 6f 63 2c 09 09 09 2f 2a 20  hangeProc,.../* 
1580: 6c 69 6e 65 43 68 61 6e 67 65 50 72 6f 63 20 2a  lineChangeProc *
1590: 2f 0a 20 20 20 20 28 54 6b 5f 53 65 67 4c 61 79  /.    (Tk_SegLay
15a0: 6f 75 74 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 2c  outProc *) NULL,
15b0: 09 09 09 2f 2a 20 6c 61 79 6f 75 74 50 72 6f 63  .../* layoutProc
15c0: 20 2a 2f 0a 20 20 20 20 54 6f 67 67 6c 65 43 68   */.    ToggleCh
15d0: 65 63 6b 50 72 6f 63 09 09 09 09 2f 2a 20 63 68  eckProc..../* ch
15e0: 65 63 6b 50 72 6f 63 20 2a 2f 0a 7d 3b 0a 0a 2f  eckProc */.};../
15f0: 2a 0a 20 2a 20 54 79 70 65 20 72 65 63 6f 72 64  *. * Type record
1600: 20 66 6f 72 20 73 65 67 6d 65 6e 74 73 20 6d 61   for segments ma
1610: 72 6b 69 6e 67 20 74 68 65 20 65 6e 64 20 6f 66  rking the end of
1620: 20 61 20 74 61 67 67 65 64 0a 20 2a 20 72 61 6e   a tagged. * ran
1630: 67 65 3a 0a 20 2a 2f 0a 0a 54 6b 5f 53 65 67 54  ge:. */..Tk_SegT
1640: 79 70 65 20 74 6b 54 65 78 74 54 6f 67 67 6c 65  ype tkTextToggle
1650: 4f 66 66 54 79 70 65 20 3d 20 7b 0a 20 20 20 20  OffType = {.    
1660: 22 74 6f 67 67 6c 65 4f 66 66 22 2c 09 09 09 09  "toggleOff",....
1670: 2f 2a 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 31  /* name */.    1
1680: 2c 09 09 09 09 09 09 2f 2a 20 6c 65 66 74 47 72  ,....../* leftGr
1690: 61 76 69 74 79 20 2a 2f 0a 20 20 20 20 28 54 6b  avity */.    (Tk
16a0: 5f 53 65 67 53 70 6c 69 74 50 72 6f 63 20 2a 29  _SegSplitProc *)
16b0: 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 73 70 6c 69   NULL,.../* spli
16c0: 74 50 72 6f 63 20 2a 2f 0a 20 20 20 20 54 6f 67  tProc */.    Tog
16d0: 67 6c 65 44 65 6c 65 74 65 50 72 6f 63 2c 09 09  gleDeleteProc,..
16e0: 09 09 2f 2a 20 64 65 6c 65 74 65 50 72 6f 63 20  ../* deleteProc 
16f0: 2a 2f 0a 20 20 20 20 54 6f 67 67 6c 65 43 6c 65  */.    ToggleCle
1700: 61 6e 75 70 50 72 6f 63 2c 09 09 09 09 2f 2a 20  anupProc,..../* 
1710: 63 6c 65 61 6e 75 70 50 72 6f 63 20 2a 2f 0a 20  cleanupProc */. 
1720: 20 20 20 54 6f 67 67 6c 65 4c 69 6e 65 43 68 61     ToggleLineCha
1730: 6e 67 65 50 72 6f 63 2c 09 09 09 2f 2a 20 6c 69  ngeProc,.../* li
1740: 6e 65 43 68 61 6e 67 65 50 72 6f 63 20 2a 2f 0a  neChangeProc */.
1750: 20 20 20 20 28 54 6b 5f 53 65 67 4c 61 79 6f 75      (Tk_SegLayou
1760: 74 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 2c 09 09  tProc *) NULL,..
1770: 09 2f 2a 20 6c 61 79 6f 75 74 50 72 6f 63 20 2a  ./* layoutProc *
1780: 2f 0a 20 20 20 20 54 6f 67 67 6c 65 43 68 65 63  /.    ToggleChec
1790: 6b 50 72 6f 63 09 09 09 09 2f 2a 20 63 68 65 63  kProc..../* chec
17a0: 6b 50 72 6f 63 20 2a 2f 0a 7d 3b 0a 0c 0a 2f 2a  kProc */.};.../*
17b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
1800: 54 6b 42 54 72 65 65 43 72 65 61 74 65 20 2d 2d  TkBTreeCreate --
1810: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
1820: 65 64 75 72 65 20 69 73 20 63 61 6c 6c 65 64 20  edure is called 
1830: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
1840: 74 65 78 74 20 42 2d 74 72 65 65 2e 0a 20 2a 0a  text B-tree.. *.
1850: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54   * Results:. *.T
1860: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1870: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1880: 61 20 6e 65 77 20 42 2d 74 72 65 65 20 63 6f 6e  a new B-tree con
1890: 74 61 69 6e 69 6e 67 0a 20 2a 09 6f 6e 65 20 6c  taining. *.one l
18a0: 69 6e 65 20 77 69 74 68 20 6e 6f 74 68 69 6e 67  ine with nothing
18b0: 20 62 75 74 20 61 20 6e 65 77 6c 69 6e 65 20 63   but a newline c
18c0: 68 61 72 61 63 74 65 72 2e 0a 20 2a 0a 20 2a 20  haracter.. *. * 
18d0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
18e0: 09 4d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63  .Memory is alloc
18f0: 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c  ated and initial
1900: 69 7a 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ized.. *. *-----
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1950: 2d 0a 20 2a 2f 0a 0a 54 6b 54 65 78 74 42 54 72  -. */..TkTextBTr
1960: 65 65 0a 54 6b 42 54 72 65 65 43 72 65 61 74 65  ee.TkBTreeCreate
1970: 28 29 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65  ().{.    registe
1980: 72 20 42 54 72 65 65 20 2a 74 72 65 65 50 74 72  r BTree *treePtr
1990: 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 4e  ;.    register N
19a0: 6f 64 65 20 2a 72 6f 6f 74 50 74 72 3b 0a 20 20  ode *rootPtr;.  
19b0: 20 20 72 65 67 69 73 74 65 72 20 54 6b 54 65 78    register TkTex
19c0: 74 4c 69 6e 65 20 2a 6c 69 6e 65 50 74 72 2c 20  tLine *linePtr, 
19d0: 2a 6c 69 6e 65 50 74 72 32 3b 0a 20 20 20 20 72  *linePtr2;.    r
19e0: 65 67 69 73 74 65 72 20 54 6b 54 65 78 74 53 65  egister TkTextSe
19f0: 67 6d 65 6e 74 20 2a 73 65 67 50 74 72 3b 0a 0a  gment *segPtr;..
1a00: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68      /*.     * Th
1a10: 65 20 74 72 65 65 20 77 69 6c 6c 20 69 6e 69 74  e tree will init
1a20: 69 61 6c 6c 79 20 68 61 76 65 20 74 77 6f 20 65  ially have two e
1a30: 6d 70 74 79 20 6c 69 6e 65 73 2e 20 20 54 68 65  mpty lines.  The
1a40: 20 73 65 63 6f 6e 64 20 6c 69 6e 65 0a 20 20 20   second line.   
1a50: 20 20 2a 20 69 73 6e 27 74 20 61 63 74 75 61 6c    * isn't actual
1a60: 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ly part of the t
1a70: 72 65 65 27 73 20 63 6f 6e 74 65 6e 74 73 2c 20  ree's contents, 
1a80: 62 75 74 20 69 74 73 20 70 72 65 73 65 6e 63 65  but its presence
1a90: 0a 20 20 20 20 20 2a 20 6d 61 6b 65 73 20 73 65  .     * makes se
1aa0: 76 65 72 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73  veral operations
1ab0: 20 65 61 73 69 65 72 2e 20 20 54 68 65 20 74 72   easier.  The tr
1ac0: 65 65 20 77 69 6c 6c 20 68 61 76 65 20 6f 6e 65  ee will have one
1ad0: 20 6e 6f 64 65 2c 0a 20 20 20 20 20 2a 20 77 68   node,.     * wh
1ae0: 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
1af0: 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65  root of the tree
1b00: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72  ..     */..    r
1b10: 6f 6f 74 50 74 72 20 3d 20 28 4e 6f 64 65 20 2a  ootPtr = (Node *
1b20: 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  ) ckalloc(sizeof
1b30: 28 4e 6f 64 65 29 29 3b 0a 20 20 20 20 6c 69 6e  (Node));.    lin
1b40: 65 50 74 72 20 3d 20 28 54 6b 54 65 78 74 4c 69  ePtr = (TkTextLi
1b50: 6e 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69  ne *) ckalloc(si
1b60: 7a 65 6f 66 28 54 6b 54 65 78 74 4c 69 6e 65 29  zeof(TkTextLine)
1b70: 29 3b 0a 20 20 20 20 6c 69 6e 65 50 74 72 32 20  );.    linePtr2 
1b80: 3d 20 28 54 6b 54 65 78 74 4c 69 6e 65 20 2a 29  = (TkTextLine *)
1b90: 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28   ckalloc(sizeof(
1ba0: 54 6b 54 65 78 74 4c 69 6e 65 29 29 3b 0a 20 20  TkTextLine));.  
1bb0: 20 20 72 6f 6f 74 50 74 72 2d 3e 70 61 72 65 6e    rootPtr->paren
1bc0: 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  tPtr = NULL;.   
1bd0: 20 72 6f 6f 74 50 74 72 2d 3e 6e 65 78 74 50 74   rootPtr->nextPt
1be0: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 6f  r = NULL;.    ro
1bf0: 6f 74 50 74 72 2d 3e 73 75 6d 6d 61 72 79 50 74  otPtr->summaryPt
1c00: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 6f  r = NULL;.    ro
1c10: 6f 74 50 74 72 2d 3e 6c 65 76 65 6c 20 3d 20 30  otPtr->level = 0
1c20: 3b 0a 20 20 20 20 72 6f 6f 74 50 74 72 2d 3e 63  ;.    rootPtr->c
1c30: 68 69 6c 64 72 65 6e 2e 6c 69 6e 65 50 74 72 20  hildren.linePtr 
1c40: 3d 20 6c 69 6e 65 50 74 72 3b 0a 20 20 20 20 72  = linePtr;.    r
1c50: 6f 6f 74 50 74 72 2d 3e 6e 75 6d 43 68 69 6c 64  ootPtr->numChild
1c60: 72 65 6e 20 3d 20 32 3b 0a 20 20 20 20 72 6f 6f  ren = 2;.    roo
1c70: 74 50 74 72 2d 3e 6e 75 6d 4c 69 6e 65 73 20 3d  tPtr->numLines =
1c80: 20 32 3b 0a 0a 20 20 20 20 6c 69 6e 65 50 74 72   2;..    linePtr
1c90: 2d 3e 70 61 72 65 6e 74 50 74 72 20 3d 20 72 6f  ->parentPtr = ro
1ca0: 6f 74 50 74 72 3b 0a 20 20 20 20 6c 69 6e 65 50  otPtr;.    lineP
1cb0: 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 6c 69  tr->nextPtr = li
1cc0: 6e 65 50 74 72 32 3b 0a 20 20 20 20 73 65 67 50  nePtr2;.    segP
1cd0: 74 72 20 3d 20 28 54 6b 54 65 78 74 53 65 67 6d  tr = (TkTextSegm
1ce0: 65 6e 74 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 43  ent *) ckalloc(C
1cf0: 53 45 47 5f 53 49 5a 45 28 31 29 29 3b 0a 20 20  SEG_SIZE(1));.  
1d00: 20 20 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50 74    linePtr->segPt
1d10: 72 20 3d 20 73 65 67 50 74 72 3b 0a 20 20 20 20  r = segPtr;.    
1d20: 73 65 67 50 74 72 2d 3e 74 79 70 65 50 74 72 20  segPtr->typePtr 
1d30: 3d 20 26 74 6b 54 65 78 74 43 68 61 72 54 79 70  = &tkTextCharTyp
1d40: 65 3b 0a 20 20 20 20 73 65 67 50 74 72 2d 3e 6e  e;.    segPtr->n
1d50: 65 78 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  extPtr = NULL;. 
1d60: 20 20 20 73 65 67 50 74 72 2d 3e 73 69 7a 65 20     segPtr->size 
1d70: 3d 20 31 3b 0a 20 20 20 20 73 65 67 50 74 72 2d  = 1;.    segPtr-
1d80: 3e 62 6f 64 79 2e 63 68 61 72 73 5b 30 5d 20 3d  >body.chars[0] =
1d90: 20 27 5c 6e 27 3b 0a 20 20 20 20 73 65 67 50 74   '\n';.    segPt
1da0: 72 2d 3e 62 6f 64 79 2e 63 68 61 72 73 5b 31 5d  r->body.chars[1]
1db0: 20 3d 20 30 3b 0a 0a 20 20 20 20 6c 69 6e 65 50   = 0;..    lineP
1dc0: 74 72 32 2d 3e 70 61 72 65 6e 74 50 74 72 20 3d  tr2->parentPtr =
1dd0: 20 72 6f 6f 74 50 74 72 3b 0a 20 20 20 20 6c 69   rootPtr;.    li
1de0: 6e 65 50 74 72 32 2d 3e 6e 65 78 74 50 74 72 20  nePtr2->nextPtr 
1df0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 65 67 50  = NULL;.    segP
1e00: 74 72 20 3d 20 28 54 6b 54 65 78 74 53 65 67 6d  tr = (TkTextSegm
1e10: 65 6e 74 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 43  ent *) ckalloc(C
1e20: 53 45 47 5f 53 49 5a 45 28 31 29 29 3b 0a 20 20  SEG_SIZE(1));.  
1e30: 20 20 6c 69 6e 65 50 74 72 32 2d 3e 73 65 67 50    linePtr2->segP
1e40: 74 72 20 3d 20 73 65 67 50 74 72 3b 0a 20 20 20  tr = segPtr;.   
1e50: 20 73 65 67 50 74 72 2d 3e 74 79 70 65 50 74 72   segPtr->typePtr
1e60: 20 3d 20 26 74 6b 54 65 78 74 43 68 61 72 54 79   = &tkTextCharTy
1e70: 70 65 3b 0a 20 20 20 20 73 65 67 50 74 72 2d 3e  pe;.    segPtr->
1e80: 6e 65 78 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  nextPtr = NULL;.
1e90: 20 20 20 20 73 65 67 50 74 72 2d 3e 73 69 7a 65      segPtr->size
1ea0: 20 3d 20 31 3b 0a 20 20 20 20 73 65 67 50 74 72   = 1;.    segPtr
1eb0: 2d 3e 62 6f 64 79 2e 63 68 61 72 73 5b 30 5d 20  ->body.chars[0] 
1ec0: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 73 65 67 50  = '\n';.    segP
1ed0: 74 72 2d 3e 62 6f 64 79 2e 63 68 61 72 73 5b 31  tr->body.chars[1
1ee0: 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 74 72 65 65  ] = 0;..    tree
1ef0: 50 74 72 20 3d 20 28 42 54 72 65 65 20 2a 29 20  Ptr = (BTree *) 
1f00: 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 42  ckalloc(sizeof(B
1f10: 54 72 65 65 29 29 3b 0a 20 20 20 20 74 72 65 65  Tree));.    tree
1f20: 50 74 72 2d 3e 72 6f 6f 74 50 74 72 20 3d 20 72  Ptr->rootPtr = r
1f30: 6f 6f 74 50 74 72 3b 0a 0a 20 20 20 20 72 65 74  ootPtr;..    ret
1f40: 75 72 6e 20 28 54 6b 54 65 78 74 42 54 72 65 65  urn (TkTextBTree
1f50: 29 20 74 72 65 65 50 74 72 3b 0a 7d 0a 0c 0a 2f  ) treePtr;.}.../
1f60: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
1fb0: 20 54 6b 42 54 72 65 65 44 65 73 74 72 6f 79 20   TkBTreeDestroy 
1fc0: 2d 2d 0a 20 2a 0a 20 2a 09 44 65 6c 65 74 65 20  --. *. *.Delete 
1fd0: 61 20 42 2d 74 72 65 65 2c 20 72 65 63 79 63 6c  a B-tree, recycl
1fe0: 69 6e 67 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  ing all of the s
1ff0: 74 6f 72 61 67 65 20 69 74 20 63 6f 6e 74 61 69  torage it contai
2000: 6e 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ns.. *. * Result
2010: 73 3a 0a 20 2a 09 54 68 65 20 74 72 65 65 20 67  s:. *.The tree g
2020: 69 76 65 6e 20 62 79 20 74 72 65 65 50 74 72 20  iven by treePtr 
2030: 69 73 20 64 65 6c 65 74 65 64 2e 20 20 54 72 65  is deleted.  Tre
2040: 65 50 74 72 20 73 68 6f 75 6c 64 20 6e 65 76 65  ePtr should neve
2050: 72 0a 20 2a 09 61 67 61 69 6e 20 62 65 20 75 73  r. *.again be us
2060: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ed.. *. * Side e
2070: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 65 6d 6f 72  ffects:. *.Memor
2080: 79 20 69 73 20 66 72 65 65 64 2e 0a 20 2a 0a 20  y is freed.. *. 
2090: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69  -------. */..voi
20e0: 64 0a 54 6b 42 54 72 65 65 44 65 73 74 72 6f 79  d.TkBTreeDestroy
20f0: 28 74 72 65 65 29 0a 20 20 20 20 54 6b 54 65 78  (tree).    TkTex
2100: 74 42 54 72 65 65 20 74 72 65 65 3b 09 09 09 2f  tBTree tree;.../
2110: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 72 65  * Pointer to tre
2120: 65 20 74 6f 20 64 65 6c 65 74 65 2e 20 2a 2f 20  e to delete. */ 
2130: 0a 7b 0a 20 20 20 20 42 54 72 65 65 20 2a 74 72  .{.    BTree *tr
2140: 65 65 50 74 72 20 3d 20 28 42 54 72 65 65 20 2a  eePtr = (BTree *
2150: 29 20 74 72 65 65 3b 0a 0a 20 20 20 20 44 65 73  ) tree;..    Des
2160: 74 72 6f 79 4e 6f 64 65 28 74 72 65 65 50 74 72  troyNode(treePtr
2170: 2d 3e 72 6f 6f 74 50 74 72 29 3b 0a 20 20 20 20  ->rootPtr);.    
2180: 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 20  ckfree((char *) 
2190: 74 72 65 65 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  treePtr);.}.../*
21a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
21b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
21f0: 44 65 73 74 72 6f 79 4e 6f 64 65 20 2d 2d 0a 20  DestroyNode --. 
2200: 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 72  *. *.This is a r
2210: 65 63 75 72 73 69 76 65 20 75 74 69 6c 69 74 79  ecursive utility
2220: 20 70 72 6f 63 65 64 75 72 65 20 75 73 65 64 20   procedure used 
2230: 64 75 72 69 6e 67 20 74 68 65 20 64 65 6c 65 74  during the delet
2240: 69 6f 6e 0a 20 2a 09 6f 66 20 61 20 42 2d 74 72  ion. *.of a B-tr
2250: 65 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ee.. *. * Result
2260: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
2270: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2280: 20 2a 09 41 6c 6c 20 74 68 65 20 73 74 6f 72 61   *.All the stora
2290: 67 65 20 66 6f 72 20 6e 6f 64 65 50 74 72 20 61  ge for nodePtr a
22a0: 6e 64 20 69 74 73 20 64 65 73 63 65 6e 64 61 6e  nd its descendan
22b0: 74 73 20 69 73 20 66 72 65 65 64 2e 0a 20 2a 0a  ts is freed.. *.
22c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2300: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
2310: 61 74 69 63 20 76 6f 69 64 0a 44 65 73 74 72 6f  atic void.Destro
2320: 79 4e 6f 64 65 28 6e 6f 64 65 50 74 72 29 0a 20  yNode(nodePtr). 
2330: 20 20 20 72 65 67 69 73 74 65 72 20 4e 6f 64 65     register Node
2340: 20 2a 6e 6f 64 65 50 74 72 3b 0a 7b 0a 20 20 20   *nodePtr;.{.   
2350: 20 69 66 20 28 6e 6f 64 65 50 74 72 2d 3e 6c 65   if (nodePtr->le
2360: 76 65 6c 20 3d 3d 20 30 29 20 7b 0a 09 54 6b 54  vel == 0) {..TkT
2370: 65 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50 74 72  extLine *linePtr
2380: 3b 0a 09 54 6b 54 65 78 74 53 65 67 6d 65 6e 74  ;..TkTextSegment
2390: 20 2a 73 65 67 50 74 72 3b 0a 0a 09 77 68 69 6c   *segPtr;...whil
23a0: 65 20 28 6e 6f 64 65 50 74 72 2d 3e 63 68 69 6c  e (nodePtr->chil
23b0: 64 72 65 6e 2e 6c 69 6e 65 50 74 72 20 21 3d 20  dren.linePtr != 
23c0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6c 69 6e  NULL) {..    lin
23d0: 65 50 74 72 20 3d 20 6e 6f 64 65 50 74 72 2d 3e  ePtr = nodePtr->
23e0: 63 68 69 6c 64 72 65 6e 2e 6c 69 6e 65 50 74 72  children.linePtr
23f0: 3b 0a 09 20 20 20 20 6e 6f 64 65 50 74 72 2d 3e  ;..    nodePtr->
2400: 63 68 69 6c 64 72 65 6e 2e 6c 69 6e 65 50 74 72  children.linePtr
2410: 20 3d 20 6c 69 6e 65 50 74 72 2d 3e 6e 65 78 74   = linePtr->next
2420: 50 74 72 3b 0a 09 20 20 20 20 77 68 69 6c 65 20  Ptr;..    while 
2430: 28 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50 74 72  (linePtr->segPtr
2440: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 73 65   != NULL) {...se
2450: 67 50 74 72 20 3d 20 6c 69 6e 65 50 74 72 2d 3e  gPtr = linePtr->
2460: 73 65 67 50 74 72 3b 0a 09 09 6c 69 6e 65 50 74  segPtr;...linePt
2470: 72 2d 3e 73 65 67 50 74 72 20 3d 20 73 65 67 50  r->segPtr = segP
2480: 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 09 28  tr->nextPtr;...(
2490: 2a 73 65 67 50 74 72 2d 3e 74 79 70 65 50 74 72  *segPtr->typePtr
24a0: 2d 3e 64 65 6c 65 74 65 50 72 6f 63 29 28 73 65  ->deleteProc)(se
24b0: 67 50 74 72 2c 20 6c 69 6e 65 50 74 72 2c 20 31  gPtr, linePtr, 1
24c0: 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 63  );..    }..    c
24d0: 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 6c  kfree((char *) l
24e0: 69 6e 65 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20  inePtr);..}.    
24f0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 67 69 73 74  } else {..regist
2500: 65 72 20 4e 6f 64 65 20 2a 63 68 69 6c 64 50 74  er Node *childPt
2510: 72 3b 0a 0a 09 77 68 69 6c 65 20 28 6e 6f 64 65  r;...while (node
2520: 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e 2e 6e 6f  Ptr->children.no
2530: 64 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  dePtr != NULL) {
2540: 0a 09 20 20 20 20 63 68 69 6c 64 50 74 72 20 3d  ..    childPtr =
2550: 20 6e 6f 64 65 50 74 72 2d 3e 63 68 69 6c 64 72   nodePtr->childr
2560: 65 6e 2e 6e 6f 64 65 50 74 72 3b 0a 09 20 20 20  en.nodePtr;..   
2570: 20 6e 6f 64 65 50 74 72 2d 3e 63 68 69 6c 64 72   nodePtr->childr
2580: 65 6e 2e 6e 6f 64 65 50 74 72 20 3d 20 63 68 69  en.nodePtr = chi
2590: 6c 64 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a  ldPtr->nextPtr;.
25a0: 09 20 20 20 20 44 65 73 74 72 6f 79 4e 6f 64 65  .    DestroyNode
25b0: 28 63 68 69 6c 64 50 74 72 29 3b 0a 09 7d 0a 20  (childPtr);..}. 
25c0: 20 20 20 7d 0a 20 20 20 20 44 65 6c 65 74 65 53     }.    DeleteS
25d0: 75 6d 6d 61 72 69 65 73 28 6e 6f 64 65 50 74 72  ummaries(nodePtr
25e0: 2d 3e 73 75 6d 6d 61 72 79 50 74 72 29 3b 0a 20  ->summaryPtr);. 
25f0: 20 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 20     ckfree((char 
2600: 2a 29 20 6e 6f 64 65 50 74 72 29 3b 0a 7d 0a 0c  *) nodePtr);.}..
2610: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2660: 20 2a 20 44 65 6c 65 74 65 53 75 6d 6d 61 72 69   * DeleteSummari
2670: 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09 46 72 65 65  es --. *. *.Free
2680: 20 75 70 20 61 6c 6c 20 6f 66 20 74 68 65 20 6d   up all of the m
2690: 65 6d 6f 72 79 20 69 6e 20 61 20 6c 69 73 74 20  emory in a list 
26a0: 6f 66 20 74 61 67 20 73 75 6d 6d 61 72 69 65 73  of tag summaries
26b0: 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 77   associated. *.w
26c0: 69 74 68 20 61 20 6e 6f 64 65 2e 0a 20 2a 0a 20  ith a node.. *. 
26d0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
26e0: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
26f0: 66 66 65 63 74 73 3a 0a 20 2a 09 53 74 6f 72 61  ffects:. *.Stora
2700: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
2710: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
2720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
2760: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 44 65 6c  .static void.Del
2770: 65 74 65 53 75 6d 6d 61 72 69 65 73 28 73 75 6d  eteSummaries(sum
2780: 6d 61 72 79 50 74 72 29 0a 20 20 20 20 72 65 67  maryPtr).    reg
2790: 69 73 74 65 72 20 53 75 6d 6d 61 72 79 20 2a 73  ister Summary *s
27a0: 75 6d 6d 61 72 79 50 74 72 3b 09 2f 2a 20 46 69  ummaryPtr;./* Fi
27b0: 72 73 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 6e  rst in list of n
27c0: 6f 64 65 27 73 20 74 61 67 0a 09 09 09 09 09 20  ode's tag...... 
27d0: 2a 20 73 75 6d 6d 61 72 69 65 73 2e 20 2a 2f 0a  * summaries. */.
27e0: 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 53  {.    register S
27f0: 75 6d 6d 61 72 79 20 2a 6e 65 78 74 50 74 72 3b  ummary *nextPtr;
2800: 0a 20 20 20 20 77 68 69 6c 65 20 28 73 75 6d 6d  .    while (summ
2810: 61 72 79 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20  aryPtr != NULL) 
2820: 7b 0a 09 6e 65 78 74 50 74 72 20 3d 20 73 75 6d  {..nextPtr = sum
2830: 6d 61 72 79 50 74 72 2d 3e 6e 65 78 74 50 74 72  maryPtr->nextPtr
2840: 3b 0a 09 63 6b 66 72 65 65 28 28 63 68 61 72 20  ;..ckfree((char 
2850: 2a 29 20 73 75 6d 6d 61 72 79 50 74 72 29 3b 0a  *) summaryPtr);.
2860: 09 73 75 6d 6d 61 72 79 50 74 72 20 3d 20 6e 65  .summaryPtr = ne
2870: 78 74 50 74 72 3b 0a 20 20 20 20 7d 0a 7d 0a 0c  xtPtr;.    }.}..
2880: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
28d0: 20 2a 20 54 6b 42 54 72 65 65 49 6e 73 65 72 74   * TkBTreeInsert
28e0: 43 68 61 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 49  Chars --. *. *.I
28f0: 6e 73 65 72 74 20 63 68 61 72 61 63 74 65 72 73  nsert characters
2900: 20 61 74 20 61 20 67 69 76 65 6e 20 70 6f 73 69   at a given posi
2910: 74 69 6f 6e 20 69 6e 20 61 20 42 2d 74 72 65 65  tion in a B-tree
2920: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
2930: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20  . *.None.. *. * 
2940: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
2950: 09 43 68 61 72 61 63 74 65 72 73 20 61 72 65 20  .Characters are 
2960: 61 64 64 65 64 20 74 6f 20 74 68 65 20 42 2d 74  added to the B-t
2970: 72 65 65 20 61 74 20 74 68 65 20 67 69 76 65 6e  ree at the given
2980: 20 70 6f 73 69 74 69 6f 6e 2e 0a 20 2a 09 49 66   position.. *.If
2990: 20 74 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74   the string cont
29a0: 61 69 6e 73 20 6e 65 77 6c 69 6e 65 73 2c 20 6e  ains newlines, n
29b0: 65 77 20 6c 69 6e 65 73 20 77 69 6c 6c 20 62 65  ew lines will be
29c0: 20 61 64 64 65 64 2c 0a 20 2a 09 77 68 69 63 68   added,. *.which
29d0: 20 63 6f 75 6c 64 20 63 61 75 73 65 20 74 68 65   could cause the
29e0: 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 74 68   structure of th
29f0: 65 20 42 2d 74 72 65 65 20 74 6f 20 63 68 61 6e  e B-tree to chan
2a00: 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ge.. *. *-------
2a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2a50: 20 2a 2f 0a 0a 76 6f 69 64 0a 54 6b 42 54 72 65   */..void.TkBTre
2a60: 65 49 6e 73 65 72 74 43 68 61 72 73 28 69 6e 64  eInsertChars(ind
2a70: 65 78 50 74 72 2c 20 73 74 72 69 6e 67 29 0a 20  exPtr, string). 
2a80: 20 20 20 72 65 67 69 73 74 65 72 20 54 6b 54 65     register TkTe
2a90: 78 74 49 6e 64 65 78 20 2a 69 6e 64 65 78 50 74  xtIndex *indexPt
2aa0: 72 3b 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20  r;./* Indicates 
2ab0: 77 68 65 72 65 20 74 6f 20 69 6e 73 65 72 74 20  where to insert 
2ac0: 74 65 78 74 2e 0a 09 09 09 09 09 20 2a 20 57 68  text....... * Wh
2ad0: 65 6e 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  en the procedure
2ae0: 20 72 65 74 75 72 6e 73 2c 20 74 68 69 73 0a 09   returns, this..
2af0: 09 09 09 09 20 2a 20 69 6e 64 65 78 20 69 73 20  .... * index is 
2b00: 6e 6f 20 6c 6f 6e 67 65 72 20 76 61 6c 69 64 20  no longer valid 
2b10: 62 65 63 61 75 73 65 0a 09 09 09 09 09 20 2a 20  because...... * 
2b20: 6f 66 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  of changes to th
2b30: 65 20 73 65 67 6d 65 6e 74 0a 09 09 09 09 09 20  e segment...... 
2b40: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  * structure. */.
2b50: 20 20 20 20 63 68 61 72 20 2a 73 74 72 69 6e 67      char *string
2b60: 3b 09 09 09 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ;.../* Pointer t
2b70: 6f 20 62 79 74 65 73 20 74 6f 20 69 6e 73 65 72  o bytes to inser
2b80: 74 20 28 6d 61 79 0a 09 09 09 09 09 20 2a 20 63  t (may...... * c
2b90: 6f 6e 74 61 69 6e 20 6e 65 77 6c 69 6e 65 73 2c  ontain newlines,
2ba0: 20 6d 75 73 74 20 62 65 20 6e 75 6c 6c 2d 0a 09   must be null-..
2bb0: 09 09 09 09 20 2a 20 74 65 72 6d 69 6e 61 74 65  .... * terminate
2bc0: 64 29 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 67  d). */.{.    reg
2bd0: 69 73 74 65 72 20 4e 6f 64 65 20 2a 6e 6f 64 65  ister Node *node
2be0: 50 74 72 3b 0a 20 20 20 20 72 65 67 69 73 74 65  Ptr;.    registe
2bf0: 72 20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20  r TkTextSegment 
2c00: 2a 70 72 65 76 50 74 72 3b 09 2f 2a 20 54 68 65  *prevPtr;./* The
2c10: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 62 65   segment just be
2c20: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 09  fore the first..
2c30: 09 09 09 09 20 2a 20 6e 65 77 20 73 65 67 6d 65  .... * new segme
2c40: 6e 74 20 28 4e 55 4c 4c 20 6d 65 61 6e 73 20 6e  nt (NULL means n
2c50: 65 77 20 73 65 67 6d 65 6e 74 0a 09 09 09 09 09  ew segment......
2c60: 20 2a 20 69 73 20 61 74 20 62 65 67 69 6e 6e 69   * is at beginni
2c70: 6e 67 20 6f 66 20 6c 69 6e 65 29 2e 20 2a 2f 0a  ng of line). */.
2c80: 20 20 20 20 54 6b 54 65 78 74 53 65 67 6d 65 6e      TkTextSegmen
2c90: 74 20 2a 63 75 72 50 74 72 3b 09 09 2f 2a 20 43  t *curPtr;../* C
2ca0: 75 72 72 65 6e 74 20 73 65 67 6d 65 6e 74 3b 20  urrent segment; 
2cb0: 20 6e 65 77 20 63 68 61 72 61 63 74 65 72 73 0a   new characters.
2cc0: 09 09 09 09 09 20 2a 20 61 72 65 20 69 6e 73 65  ..... * are inse
2cd0: 72 74 65 64 20 6a 75 73 74 20 61 66 74 65 72 20  rted just after 
2ce0: 74 68 69 73 20 6f 6e 65 2e 20 0a 09 09 09 09 09  this one. ......
2cf0: 20 2a 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 69 6e   * NULL means in
2d00: 73 65 72 74 20 61 74 20 62 65 67 69 6e 6e 69 6e  sert at beginnin
2d10: 67 20 6f 66 0a 09 09 09 09 09 20 2a 20 6c 69 6e  g of...... * lin
2d20: 65 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74  e. */.    TkText
2d30: 4c 69 6e 65 20 2a 6c 69 6e 65 50 74 72 3b 09 09  Line *linePtr;..
2d40: 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69 6e 65 20  /* Current line 
2d50: 28 6e 65 77 20 73 65 67 6d 65 6e 74 73 20 61 72  (new segments ar
2d60: 65 0a 09 09 09 09 09 20 2a 20 61 64 64 65 64 20  e...... * added 
2d70: 74 6f 20 74 68 69 73 20 6c 69 6e 65 29 2e 20 2a  to this line). *
2d80: 2f 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54  /.    register T
2d90: 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 73 65  kTextSegment *se
2da0: 67 50 74 72 3b 0a 20 20 20 20 54 6b 54 65 78 74  gPtr;.    TkText
2db0: 4c 69 6e 65 20 2a 6e 65 77 4c 69 6e 65 50 74 72  Line *newLinePtr
2dc0: 3b 0a 20 20 20 20 69 6e 74 20 63 68 75 6e 6b 53  ;.    int chunkS
2dd0: 69 7a 65 3b 09 09 09 2f 2a 20 23 20 63 68 61 72  ize;.../* # char
2de0: 61 63 74 65 72 73 20 69 6e 20 63 75 72 72 65 6e  acters in curren
2df0: 74 20 63 68 75 6e 6b 2e 20 2a 2f 0a 20 20 20 20  t chunk. */.    
2e00: 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a 65  register char *e
2e10: 6f 6c 3b 09 09 09 2f 2a 20 50 6f 69 6e 74 65 72  ol;.../* Pointer
2e20: 20 74 6f 20 63 68 61 72 61 63 74 65 72 20 6a 75   to character ju
2e30: 73 74 20 61 66 74 65 72 20 6c 61 73 74 0a 09 09  st after last...
2e40: 09 09 09 20 2a 20 6f 6e 65 20 69 6e 20 63 75 72  ... * one in cur
2e50: 72 65 6e 74 20 63 68 75 6e 6b 2e 20 2a 2f 0a 20  rent chunk. */. 
2e60: 20 20 20 69 6e 74 20 63 68 61 6e 67 65 54 6f 4c     int changeToL
2e70: 69 6e 65 43 6f 75 6e 74 3b 09 09 2f 2a 20 43 6f  ineCount;../* Co
2e80: 75 6e 74 73 20 63 68 61 6e 67 65 20 74 6f 20 74  unts change to t
2e90: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 09  otal number of..
2ea0: 09 09 09 09 20 2a 20 6c 69 6e 65 73 20 69 6e 20  .... * lines in 
2eb0: 66 69 6c 65 2e 20 2a 2f 0a 0a 20 20 20 20 70 72  file. */..    pr
2ec0: 65 76 50 74 72 20 3d 20 53 70 6c 69 74 53 65 67  evPtr = SplitSeg
2ed0: 28 69 6e 64 65 78 50 74 72 29 3b 0a 20 20 20 20  (indexPtr);.    
2ee0: 6c 69 6e 65 50 74 72 20 3d 20 69 6e 64 65 78 50  linePtr = indexP
2ef0: 74 72 2d 3e 6c 69 6e 65 50 74 72 3b 0a 20 20 20  tr->linePtr;.   
2f00: 20 63 75 72 50 74 72 20 3d 20 70 72 65 76 50 74   curPtr = prevPt
2f10: 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  r;..    /*.     
2f20: 2a 20 43 68 6f 70 20 74 68 65 20 73 74 72 69 6e  * Chop the strin
2f30: 67 20 75 70 20 69 6e 74 6f 20 6c 69 6e 65 73 20  g up into lines 
2f40: 61 6e 64 20 63 72 65 61 74 65 20 61 20 6e 65 77  and create a new
2f50: 20 73 65 67 6d 65 6e 74 20 66 6f 72 0a 20 20 20   segment for.   
2f60: 20 20 2a 20 65 61 63 68 20 6c 69 6e 65 2c 20 70    * each line, p
2f70: 6c 75 73 20 61 20 6e 65 77 20 6c 69 6e 65 20 66  lus a new line f
2f80: 6f 72 20 74 68 65 20 6c 65 66 74 6f 76 65 72 73  or the leftovers
2f90: 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 20 2a   from the.     *
2fa0: 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 2e 0a   previous line..
2fb0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 63 68 61       */..    cha
2fc0: 6e 67 65 54 6f 4c 69 6e 65 43 6f 75 6e 74 20 3d  ngeToLineCount =
2fd0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 2a   0;.    while (*
2fe0: 73 74 72 69 6e 67 20 21 3d 20 30 29 20 7b 0a 09  string != 0) {..
2ff0: 66 6f 72 20 28 65 6f 6c 20 3d 20 73 74 72 69 6e  for (eol = strin
3000: 67 3b 20 2a 65 6f 6c 20 21 3d 20 30 3b 20 65 6f  g; *eol != 0; eo
3010: 6c 2b 2b 29 20 7b 0a 09 20 20 20 20 69 66 20 28  l++) {..    if (
3020: 2a 65 6f 6c 20 3d 3d 20 27 5c 6e 27 29 20 7b 0a  *eol == '\n') {.
3030: 09 09 65 6f 6c 2b 2b 3b 0a 09 09 62 72 65 61 6b  ..eol++;...break
3040: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 63 68 75  ;..    }..}..chu
3050: 6e 6b 53 69 7a 65 20 3d 20 65 6f 6c 2d 73 74 72  nkSize = eol-str
3060: 69 6e 67 3b 0a 09 73 65 67 50 74 72 20 3d 20 28  ing;..segPtr = (
3070: 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 29  TkTextSegment *)
3080: 20 63 6b 61 6c 6c 6f 63 28 43 53 45 47 5f 53 49   ckalloc(CSEG_SI
3090: 5a 45 28 63 68 75 6e 6b 53 69 7a 65 29 29 3b 0a  ZE(chunkSize));.
30a0: 09 73 65 67 50 74 72 2d 3e 74 79 70 65 50 74 72  .segPtr->typePtr
30b0: 20 3d 20 26 74 6b 54 65 78 74 43 68 61 72 54 79   = &tkTextCharTy
30c0: 70 65 3b 0a 09 69 66 20 28 63 75 72 50 74 72 20  pe;..if (curPtr 
30d0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
30e0: 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74 72 20  segPtr->nextPtr 
30f0: 3d 20 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50 74  = linePtr->segPt
3100: 72 3b 0a 09 20 20 20 20 6c 69 6e 65 50 74 72 2d  r;..    linePtr-
3110: 3e 73 65 67 50 74 72 20 3d 20 73 65 67 50 74 72  >segPtr = segPtr
3120: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
3130: 20 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74 72   segPtr->nextPtr
3140: 20 3d 20 63 75 72 50 74 72 2d 3e 6e 65 78 74 50   = curPtr->nextP
3150: 74 72 3b 0a 09 20 20 20 20 63 75 72 50 74 72 2d  tr;..    curPtr-
3160: 3e 6e 65 78 74 50 74 72 20 3d 20 73 65 67 50 74  >nextPtr = segPt
3170: 72 3b 0a 09 7d 0a 09 73 65 67 50 74 72 2d 3e 73  r;..}..segPtr->s
3180: 69 7a 65 20 3d 20 63 68 75 6e 6b 53 69 7a 65 3b  ize = chunkSize;
3190: 0a 09 73 74 72 6e 63 70 79 28 73 65 67 50 74 72  ..strncpy(segPtr
31a0: 2d 3e 62 6f 64 79 2e 63 68 61 72 73 2c 20 73 74  ->body.chars, st
31b0: 72 69 6e 67 2c 20 28 73 69 7a 65 5f 74 29 20 63  ring, (size_t) c
31c0: 68 75 6e 6b 53 69 7a 65 29 3b 0a 09 73 65 67 50  hunkSize);..segP
31d0: 74 72 2d 3e 62 6f 64 79 2e 63 68 61 72 73 5b 63  tr->body.chars[c
31e0: 68 75 6e 6b 53 69 7a 65 5d 20 3d 20 30 3b 0a 09  hunkSize] = 0;..
31f0: 63 75 72 50 74 72 20 3d 20 73 65 67 50 74 72 3b  curPtr = segPtr;
3200: 0a 0a 09 69 66 20 28 65 6f 6c 5b 2d 31 5d 20 21  ...if (eol[-1] !
3210: 3d 20 27 5c 6e 27 29 20 7b 0a 09 20 20 20 20 62  = '\n') {..    b
3220: 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  reak;..}.../*.. 
3230: 2a 20 54 68 65 20 63 68 75 6e 6b 20 65 6e 64 65  * The chunk ende
3240: 64 20 77 69 74 68 20 61 20 6e 65 77 6c 69 6e 65  d with a newline
3250: 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65  , so create a ne
3260: 77 20 54 6b 54 65 78 74 4c 69 6e 65 0a 09 20 2a  w TkTextLine.. *
3270: 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 72 65   and move the re
3280: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6f  mainder of the o
3290: 6c 64 20 6c 69 6e 65 20 74 6f 20 69 74 2e 0a 09  ld line to it...
32a0: 20 2a 2f 0a 0a 09 6e 65 77 4c 69 6e 65 50 74 72   */...newLinePtr
32b0: 20 3d 20 28 54 6b 54 65 78 74 4c 69 6e 65 20 2a   = (TkTextLine *
32c0: 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  ) ckalloc(sizeof
32d0: 28 54 6b 54 65 78 74 4c 69 6e 65 29 29 3b 0a 09  (TkTextLine));..
32e0: 6e 65 77 4c 69 6e 65 50 74 72 2d 3e 70 61 72 65  newLinePtr->pare
32f0: 6e 74 50 74 72 20 3d 20 6c 69 6e 65 50 74 72 2d  ntPtr = linePtr-
3300: 3e 70 61 72 65 6e 74 50 74 72 3b 0a 09 6e 65 77  >parentPtr;..new
3310: 4c 69 6e 65 50 74 72 2d 3e 6e 65 78 74 50 74 72  LinePtr->nextPtr
3320: 20 3d 20 6c 69 6e 65 50 74 72 2d 3e 6e 65 78 74   = linePtr->next
3330: 50 74 72 3b 0a 09 6c 69 6e 65 50 74 72 2d 3e 6e  Ptr;..linePtr->n
3340: 65 78 74 50 74 72 20 3d 20 6e 65 77 4c 69 6e 65  extPtr = newLine
3350: 50 74 72 3b 0a 09 6e 65 77 4c 69 6e 65 50 74 72  Ptr;..newLinePtr
3360: 2d 3e 73 65 67 50 74 72 20 3d 20 73 65 67 50 74  ->segPtr = segPt
3370: 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 73 65 67  r->nextPtr;..seg
3380: 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 4e  Ptr->nextPtr = N
3390: 55 4c 4c 3b 0a 09 6c 69 6e 65 50 74 72 20 3d 20  ULL;..linePtr = 
33a0: 6e 65 77 4c 69 6e 65 50 74 72 3b 0a 09 63 75 72  newLinePtr;..cur
33b0: 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 63 68 61  Ptr = NULL;..cha
33c0: 6e 67 65 54 6f 4c 69 6e 65 43 6f 75 6e 74 2b 2b  ngeToLineCount++
33d0: 3b 0a 0a 09 73 74 72 69 6e 67 20 3d 20 65 6f 6c  ;...string = eol
33e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
33f0: 20 20 20 20 20 2a 20 43 6c 65 61 6e 75 70 20 74       * Cleanup t
3400: 68 65 20 73 74 61 72 74 69 6e 67 20 6c 69 6e 65  he starting line
3410: 20 66 6f 72 20 74 68 65 20 69 6e 73 65 72 74 69   for the inserti
3420: 6f 6e 2c 20 70 6c 75 73 20 74 68 65 20 65 6e 64  on, plus the end
3430: 69 6e 67 0a 20 20 20 20 20 2a 20 6c 69 6e 65 20  ing.     * line 
3440: 69 66 20 69 74 27 73 20 64 69 66 66 65 72 65 6e  if it's differen
3450: 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  t..     */..    
3460: 43 6c 65 61 6e 75 70 4c 69 6e 65 28 69 6e 64 65  CleanupLine(inde
3470: 78 50 74 72 2d 3e 6c 69 6e 65 50 74 72 29 3b 0a  xPtr->linePtr);.
3480: 20 20 20 20 69 66 20 28 6c 69 6e 65 50 74 72 20      if (linePtr 
3490: 21 3d 20 69 6e 64 65 78 50 74 72 2d 3e 6c 69 6e  != indexPtr->lin
34a0: 65 50 74 72 29 20 7b 0a 09 43 6c 65 61 6e 75 70  ePtr) {..Cleanup
34b0: 4c 69 6e 65 28 6c 69 6e 65 50 74 72 29 3b 0a 20  Line(linePtr);. 
34c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
34d0: 20 20 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68    * Increment th
34e0: 65 20 6c 69 6e 65 20 63 6f 75 6e 74 73 20 69 6e  e line counts in
34f0: 20 61 6c 6c 20 74 68 65 20 70 61 72 65 6e 74 20   all the parent 
3500: 6e 6f 64 65 73 20 6f 66 20 74 68 65 20 69 6e 73  nodes of the ins
3510: 65 72 74 69 6f 6e 0a 20 20 20 20 20 2a 20 70 6f  ertion.     * po
3520: 69 6e 74 2c 20 74 68 65 6e 20 72 65 62 61 6c 61  int, then rebala
3530: 6e 63 65 20 74 68 65 20 74 72 65 65 20 69 66 20  nce the tree if 
3540: 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 20  necessary..     
3550: 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 28 6e 6f 64  */..    for (nod
3560: 65 50 74 72 20 3d 20 6c 69 6e 65 50 74 72 2d 3e  ePtr = linePtr->
3570: 70 61 72 65 6e 74 50 74 72 20 3b 20 6e 6f 64 65  parentPtr ; node
3580: 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 20 20  Ptr != NULL;..  
3590: 20 20 6e 6f 64 65 50 74 72 20 3d 20 6e 6f 64 65    nodePtr = node
35a0: 50 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 29 20  Ptr->parentPtr) 
35b0: 7b 0a 09 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d 4c  {..nodePtr->numL
35c0: 69 6e 65 73 20 2b 3d 20 63 68 61 6e 67 65 54 6f  ines += changeTo
35d0: 4c 69 6e 65 43 6f 75 6e 74 3b 0a 20 20 20 20 7d  LineCount;.    }
35e0: 0a 20 20 20 20 6e 6f 64 65 50 74 72 20 3d 20 6c  .    nodePtr = l
35f0: 69 6e 65 50 74 72 2d 3e 70 61 72 65 6e 74 50 74  inePtr->parentPt
3600: 72 3b 0a 20 20 20 20 6e 6f 64 65 50 74 72 2d 3e  r;.    nodePtr->
3610: 6e 75 6d 43 68 69 6c 64 72 65 6e 20 2b 3d 20 63  numChildren += c
3620: 68 61 6e 67 65 54 6f 4c 69 6e 65 43 6f 75 6e 74  hangeToLineCount
3630: 3b 0a 20 20 20 20 69 66 20 28 6e 6f 64 65 50 74  ;.    if (nodePt
3640: 72 2d 3e 6e 75 6d 43 68 69 6c 64 72 65 6e 20 3e  r->numChildren >
3650: 20 4d 41 58 5f 43 48 49 4c 44 52 45 4e 29 20 7b   MAX_CHILDREN) {
3660: 0a 09 52 65 62 61 6c 61 6e 63 65 28 28 42 54 72  ..Rebalance((BTr
3670: 65 65 20 2a 29 20 69 6e 64 65 78 50 74 72 2d 3e  ee *) indexPtr->
3680: 74 72 65 65 2c 20 6e 6f 64 65 50 74 72 29 3b 0a  tree, nodePtr);.
3690: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 74      }..    if (t
36a0: 6b 42 54 72 65 65 44 65 62 75 67 29 20 7b 0a 09  kBTreeDebug) {..
36b0: 54 6b 42 54 72 65 65 43 68 65 63 6b 28 69 6e 64  TkBTreeCheck(ind
36c0: 65 78 50 74 72 2d 3e 74 72 65 65 29 3b 0a 20 20  exPtr->tree);.  
36d0: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
3720: 2a 20 53 70 6c 69 74 53 65 67 20 2d 2d 0a 20 2a  * SplitSeg --. *
3730: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
3740: 72 65 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66  re is called bef
3750: 6f 72 65 20 61 64 64 69 6e 67 20 6f 72 20 64 65  ore adding or de
3760: 6c 65 74 69 6e 67 0a 20 2a 09 73 65 67 6d 65 6e  leting. *.segmen
3770: 74 73 2e 20 20 49 74 20 64 6f 65 73 20 74 68 72  ts.  It does thr
3780: 65 65 20 74 68 69 6e 67 73 3a 20 28 61 29 20 69  ee things: (a) i
3790: 74 20 66 69 6e 64 73 20 74 68 65 20 73 65 67 6d  t finds the segm
37a0: 65 6e 74 0a 20 2a 09 63 6f 6e 74 61 69 6e 69 6e  ent. *.containin
37b0: 67 20 69 6e 64 65 78 50 74 72 3b 20 20 28 62 29  g indexPtr;  (b)
37c0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 73 65   if there are se
37d0: 76 65 72 61 6c 20 73 75 63 68 0a 20 2a 09 73 65  veral such. *.se
37e0: 67 6d 65 6e 74 73 20 28 62 65 63 61 75 73 65 20  gments (because 
37f0: 73 6f 6d 65 20 73 65 67 6d 65 6e 74 73 20 68 61  some segments ha
3800: 76 65 20 7a 65 72 6f 20 6c 65 6e 67 74 68 29 20  ve zero length) 
3810: 74 68 65 6e 0a 20 2a 09 69 74 20 70 69 63 6b 73  then. *.it picks
3820: 20 74 68 65 20 66 69 72 73 74 20 73 65 67 6d 65   the first segme
3830: 6e 74 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  nt that does not
3840: 20 68 61 76 65 20 6c 65 66 74 0a 20 2a 09 67 72   have left. *.gr
3850: 61 76 69 74 79 3b 20 20 28 63 29 20 69 66 20 74  avity;  (c) if t
3860: 68 65 20 69 6e 64 65 78 20 72 65 66 65 72 73 20  he index refers 
3870: 74 6f 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  to the middle of
3880: 0a 20 2a 09 61 20 73 65 67 6d 65 6e 74 20 74 68  . *.a segment th
3890: 65 6e 20 69 74 20 73 70 6c 69 74 73 20 74 68 65  en it splits the
38a0: 20 73 65 67 6d 65 6e 74 20 73 6f 20 74 68 61 74   segment so that
38b0: 20 74 68 65 0a 20 2a 09 69 6e 64 65 78 20 6e 6f   the. *.index no
38c0: 77 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20  w refers to the 
38d0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 73  beginning of a s
38e0: 65 67 6d 65 6e 74 2e 0a 20 2a 0a 20 2a 20 52 65  egment.. *. * Re
38f0: 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65  sults:. *.The re
3900: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
3910: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73  pointer to the s
3920: 65 67 6d 65 6e 74 20 6a 75 73 74 0a 20 2a 09 62  egment just. *.b
3930: 65 66 6f 72 65 20 74 68 65 20 73 65 67 6d 65 6e  efore the segmen
3940: 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  t corresponding 
3950: 74 6f 20 69 6e 64 65 78 50 74 72 20 28 61 73 0a  to indexPtr (as.
3960: 20 2a 09 64 65 73 63 72 69 62 65 64 20 61 62 6f   *.described abo
3970: 76 65 29 2e 20 20 49 66 20 74 68 65 20 73 65 67  ve).  If the seg
3980: 6d 65 6e 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ment correspondi
3990: 6e 67 20 74 6f 0a 20 2a 09 69 6e 64 65 78 50 74  ng to. *.indexPt
39a0: 72 20 69 73 20 74 68 65 20 66 69 72 73 74 20 69  r is the first i
39b0: 6e 20 69 74 73 20 6c 69 6e 65 20 74 68 65 6e 20  n its line then 
39c0: 74 68 65 20 72 65 74 75 72 6e 0a 20 2a 09 76 61  the return. *.va
39d0: 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 0a 20 2a 0a  lue is NULL.. *.
39e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
39f0: 0a 20 2a 09 54 68 65 20 73 65 67 6d 65 6e 74 20  . *.The segment 
3a00: 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20 69  referred to by i
3a10: 6e 64 65 78 50 74 72 20 69 73 20 73 70 6c 69 74  ndexPtr is split
3a20: 20 75 6e 6c 65 73 73 0a 20 2a 09 69 6e 64 65 78   unless. *.index
3a30: 50 74 72 20 72 65 66 65 72 73 20 74 6f 20 69 74  Ptr refers to it
3a40: 73 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65  s first characte
3a50: 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  r.. *. *--------
3a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a90: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
3aa0: 69 63 20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74  ic TkTextSegment
3ab0: 20 2a 0a 53 70 6c 69 74 53 65 67 28 69 6e 64 65   *.SplitSeg(inde
3ac0: 78 50 74 72 29 0a 20 20 20 20 54 6b 54 65 78 74  xPtr).    TkText
3ad0: 49 6e 64 65 78 20 2a 69 6e 64 65 78 50 74 72 3b  Index *indexPtr;
3ae0: 09 09 2f 2a 20 49 6e 64 65 78 20 69 64 65 6e 74  ../* Index ident
3af0: 69 66 79 69 6e 67 20 70 6f 73 69 74 69 6f 6e 0a  ifying position.
3b00: 09 09 09 09 09 20 2a 20 61 74 20 77 68 69 63 68  ..... * at which
3b10: 20 74 6f 20 73 70 6c 69 74 20 61 20 73 65 67 6d   to split a segm
3b20: 65 6e 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 6b  ent. */.{.    Tk
3b30: 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 70 72 65  TextSegment *pre
3b40: 76 50 74 72 2c 20 2a 73 65 67 50 74 72 3b 0a 20  vPtr, *segPtr;. 
3b50: 20 20 20 69 6e 74 20 63 6f 75 6e 74 3b 0a 0a 20     int count;.. 
3b60: 20 20 20 66 6f 72 20 28 63 6f 75 6e 74 20 3d 20     for (count = 
3b70: 69 6e 64 65 78 50 74 72 2d 3e 63 68 61 72 49 6e  indexPtr->charIn
3b80: 64 65 78 2c 20 70 72 65 76 50 74 72 20 3d 20 4e  dex, prevPtr = N
3b90: 55 4c 4c 2c 0a 09 20 20 20 20 73 65 67 50 74 72  ULL,..    segPtr
3ba0: 20 3d 20 69 6e 64 65 78 50 74 72 2d 3e 6c 69 6e   = indexPtr->lin
3bb0: 65 50 74 72 2d 3e 73 65 67 50 74 72 3b 20 73 65  ePtr->segPtr; se
3bc0: 67 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 20  gPtr != NULL;.. 
3bd0: 20 20 20 63 6f 75 6e 74 20 2d 3d 20 73 65 67 50     count -= segP
3be0: 74 72 2d 3e 73 69 7a 65 2c 20 70 72 65 76 50 74  tr->size, prevPt
3bf0: 72 20 3d 20 73 65 67 50 74 72 2c 20 73 65 67 50  r = segPtr, segP
3c00: 74 72 20 3d 20 73 65 67 50 74 72 2d 3e 6e 65 78  tr = segPtr->nex
3c10: 74 50 74 72 29 20 7b 0a 09 69 66 20 28 73 65 67  tPtr) {..if (seg
3c20: 50 74 72 2d 3e 73 69 7a 65 20 3e 20 63 6f 75 6e  Ptr->size > coun
3c30: 74 29 20 7b 0a 09 20 20 20 20 69 66 20 28 63 6f  t) {..    if (co
3c40: 75 6e 74 20 3d 3d 20 30 29 20 7b 0a 09 09 72 65  unt == 0) {...re
3c50: 74 75 72 6e 20 70 72 65 76 50 74 72 3b 0a 09 20  turn prevPtr;.. 
3c60: 20 20 20 7d 0a 09 20 20 20 20 73 65 67 50 74 72     }..    segPtr
3c70: 20 3d 20 28 2a 73 65 67 50 74 72 2d 3e 74 79 70   = (*segPtr->typ
3c80: 65 50 74 72 2d 3e 73 70 6c 69 74 50 72 6f 63 29  ePtr->splitProc)
3c90: 28 73 65 67 50 74 72 2c 20 63 6f 75 6e 74 29 3b  (segPtr, count);
3ca0: 0a 09 20 20 20 20 69 66 20 28 70 72 65 76 50 74  ..    if (prevPt
3cb0: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  r == NULL) {...i
3cc0: 6e 64 65 78 50 74 72 2d 3e 6c 69 6e 65 50 74 72  ndexPtr->linePtr
3cd0: 2d 3e 73 65 67 50 74 72 20 3d 20 73 65 67 50 74  ->segPtr = segPt
3ce0: 72 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  r;..    } else {
3cf0: 0a 09 09 70 72 65 76 50 74 72 2d 3e 6e 65 78 74  ...prevPtr->next
3d00: 50 74 72 20 3d 20 73 65 67 50 74 72 3b 0a 09 20  Ptr = segPtr;.. 
3d10: 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e     }..    return
3d20: 20 73 65 67 50 74 72 3b 0a 09 7d 20 65 6c 73 65   segPtr;..} else
3d30: 20 69 66 20 28 28 73 65 67 50 74 72 2d 3e 73 69   if ((segPtr->si
3d40: 7a 65 20 3d 3d 20 30 29 20 26 26 20 28 63 6f 75  ze == 0) && (cou
3d50: 6e 74 20 3d 3d 20 30 29 0a 09 09 26 26 20 21 73  nt == 0)...&& !s
3d60: 65 67 50 74 72 2d 3e 74 79 70 65 50 74 72 2d 3e  egPtr->typePtr->
3d70: 6c 65 66 74 47 72 61 76 69 74 79 29 20 7b 0a 09  leftGravity) {..
3d80: 20 20 20 20 72 65 74 75 72 6e 20 70 72 65 76 50      return prevP
3d90: 74 72 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20  tr;..}.    }.   
3da0: 20 70 61 6e 69 63 28 22 53 70 6c 69 74 53 65 67   panic("SplitSeg
3db0: 20 72 65 61 63 68 65 64 20 65 6e 64 20 6f 66 20   reached end of 
3dc0: 6c 69 6e 65 21 22 29 3b 0a 20 20 20 20 72 65 74  line!");.    ret
3dd0: 75 72 6e 20 4e 55 4c 4c 3b 0a 7d 0a 0c 0a 2f 2a  urn NULL;.}.../*
3de0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e20: 2d 0a 20 2a 0a 20 2a 20 43 6c 65 61 6e 75 70 4c  -. *. * CleanupL
3e30: 69 6e 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ine --. *. *.Thi
3e40: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 63  s procedure is c
3e50: 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 6f 64 69  alled after modi
3e60: 66 69 63 61 74 69 6f 6e 73 20 68 61 76 65 20 62  fications have b
3e70: 65 65 6e 0a 20 2a 09 6d 61 64 65 20 74 6f 20 61  een. *.made to a
3e80: 20 6c 69 6e 65 2e 20 20 49 74 20 73 63 61 6e 73   line.  It scans
3e90: 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
3ea0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 0a 20 2a 09   segments in. *.
3eb0: 74 68 65 20 6c 69 6e 65 2c 20 67 69 76 69 6e 67  the line, giving
3ec0: 20 65 61 63 68 20 61 20 63 68 61 6e 63 65 20 74   each a chance t
3ed0: 6f 20 63 6c 65 61 6e 20 69 74 73 65 6c 66 20 75  o clean itself u
3ee0: 70 2c 20 65 2e 67 2e 0a 20 2a 09 62 79 20 6d 65  p, e.g.. *.by me
3ef0: 72 67 69 6e 67 20 77 69 74 68 20 74 68 65 20 66  rging with the f
3f00: 6f 6c 6c 6f 77 69 6e 67 20 73 65 67 6d 65 6e 74  ollowing segment
3f10: 73 2c 20 75 70 64 61 74 69 6e 67 20 69 6e 74 65  s, updating inte
3f20: 72 6e 61 6c 0a 20 2a 09 69 6e 66 6f 72 6d 61 74  rnal. *.informat
3f30: 69 6f 6e 2c 20 65 74 63 2e 0a 20 2a 0a 20 2a 20  ion, etc.. *. * 
3f40: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
3f50: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
3f60: 65 63 74 73 3a 0a 20 2a 09 44 65 70 65 6e 64 73  ects:. *.Depends
3f70: 20 6f 6e 20 77 68 61 74 20 74 68 65 20 73 65 67   on what the seg
3f80: 6d 65 6e 74 2d 73 70 65 63 69 66 69 63 20 63 6c  ment-specific cl
3f90: 65 61 6e 75 70 20 70 72 6f 63 65 64 75 72 65 73  eanup procedures
3fa0: 20 64 6f 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d   do.. *. *------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
3ff0: 61 74 69 63 20 76 6f 69 64 0a 43 6c 65 61 6e 75  atic void.Cleanu
4000: 70 4c 69 6e 65 28 6c 69 6e 65 50 74 72 29 0a 20  pLine(linePtr). 
4010: 20 20 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c     TkTextLine *l
4020: 69 6e 65 50 74 72 3b 09 09 2f 2a 20 4c 69 6e 65  inePtr;../* Line
4030: 20 74 6f 20 62 65 20 63 6c 65 61 6e 65 64 20 75   to be cleaned u
4040: 70 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 6b 54 65  p. */.{.    TkTe
4050: 78 74 53 65 67 6d 65 6e 74 20 2a 73 65 67 50 74  xtSegment *segPt
4060: 72 2c 20 2a 2a 70 72 65 76 50 74 72 50 74 72 3b  r, **prevPtrPtr;
4070: 0a 20 20 20 20 69 6e 74 20 61 6e 79 43 68 61 6e  .    int anyChan
4080: 67 65 73 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ges;..    /*.   
4090: 20 20 2a 20 4d 61 6b 65 20 61 20 70 61 73 73 20    * Make a pass 
40a0: 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  over all of the 
40b0: 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  segments in the 
40c0: 6c 69 6e 65 2c 20 67 69 76 69 6e 67 20 65 61 63  line, giving eac
40d0: 68 0a 20 20 20 20 20 2a 20 61 20 63 68 61 6e 63  h.     * a chanc
40e0: 65 20 74 6f 20 63 6c 65 61 6e 20 69 74 73 65 6c  e to clean itsel
40f0: 66 20 75 70 2e 20 20 54 68 69 73 20 63 6f 75 6c  f up.  This coul
4100: 64 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 63 68  d potentially ch
4110: 61 6e 67 65 0a 20 20 20 20 20 2a 20 74 68 65 20  ange.     * the 
4120: 73 74 72 75 63 74 75 72 65 20 6f 66 20 74 68 65  structure of the
4130: 20 6c 69 6e 65 2c 20 65 2e 67 2e 20 62 79 20 6d   line, e.g. by m
4140: 65 72 67 69 6e 67 20 74 77 6f 20 73 65 67 6d 65  erging two segme
4150: 6e 74 73 0a 20 20 20 20 20 2a 20 74 6f 67 65 74  nts.     * toget
4160: 68 65 72 20 6f 72 20 68 61 76 69 6e 67 20 74 77  her or having tw
4170: 6f 20 73 65 67 6d 65 6e 74 73 20 63 61 6e 63 65  o segments cance
4180: 6c 20 74 68 65 6d 73 65 6c 76 65 73 3b 20 20 69  l themselves;  i
4190: 66 20 73 6f 2c 0a 20 20 20 20 20 2a 20 74 68 65  f so,.     * the
41a0: 6e 20 72 65 70 65 61 74 20 74 68 65 20 77 68 6f  n repeat the who
41b0: 6c 65 20 70 72 6f 63 65 73 73 20 61 67 61 69 6e  le process again
41c0: 2c 20 73 69 6e 63 65 20 74 68 65 20 66 69 72 73  , since the firs
41d0: 74 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20  t structure.    
41e0: 20 2a 20 63 68 61 6e 67 65 20 6d 69 67 68 74 20   * change might 
41f0: 6d 61 6b 65 20 6f 74 68 65 72 20 73 74 72 75 63  make other struc
4200: 74 75 72 65 20 63 68 61 6e 67 65 73 20 70 6f 73  ture changes pos
4210: 73 69 62 6c 65 2e 20 20 52 65 70 65 61 74 0a 20  sible.  Repeat. 
4220: 20 20 20 20 2a 20 75 6e 74 69 6c 20 65 76 65 6e      * until even
4230: 74 75 61 6c 6c 79 20 74 68 65 72 65 20 61 72 65  tually there are
4240: 20 6e 6f 20 63 68 61 6e 67 65 73 2e 0a 20 20 20   no changes..   
4250: 20 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 20    */..    while 
4260: 28 31 29 20 7b 0a 09 61 6e 79 43 68 61 6e 67 65  (1) {..anyChange
4270: 73 20 3d 20 30 3b 0a 09 66 6f 72 20 28 70 72 65  s = 0;..for (pre
4280: 76 50 74 72 50 74 72 20 3d 20 26 6c 69 6e 65 50  vPtrPtr = &lineP
4290: 74 72 2d 3e 73 65 67 50 74 72 2c 20 73 65 67 50  tr->segPtr, segP
42a0: 74 72 20 3d 20 2a 70 72 65 76 50 74 72 50 74 72  tr = *prevPtrPtr
42b0: 3b 0a 09 09 73 65 67 50 74 72 20 21 3d 20 4e 55  ;...segPtr != NU
42c0: 4c 4c 3b 0a 09 09 70 72 65 76 50 74 72 50 74 72  LL;...prevPtrPtr
42d0: 20 3d 20 26 28 2a 70 72 65 76 50 74 72 50 74 72   = &(*prevPtrPtr
42e0: 29 2d 3e 6e 65 78 74 50 74 72 2c 20 73 65 67 50  )->nextPtr, segP
42f0: 74 72 20 3d 20 2a 70 72 65 76 50 74 72 50 74 72  tr = *prevPtrPtr
4300: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 73 65 67  ) {..    if (seg
4310: 50 74 72 2d 3e 74 79 70 65 50 74 72 2d 3e 63 6c  Ptr->typePtr->cl
4320: 65 61 6e 75 70 50 72 6f 63 20 21 3d 20 4e 55 4c  eanupProc != NUL
4330: 4c 29 20 7b 0a 09 09 2a 70 72 65 76 50 74 72 50  L) {...*prevPtrP
4340: 74 72 20 3d 20 28 2a 73 65 67 50 74 72 2d 3e 74  tr = (*segPtr->t
4350: 79 70 65 50 74 72 2d 3e 63 6c 65 61 6e 75 70 50  ypePtr->cleanupP
4360: 72 6f 63 29 28 73 65 67 50 74 72 2c 20 6c 69 6e  roc)(segPtr, lin
4370: 65 50 74 72 29 3b 0a 09 09 69 66 20 28 73 65 67  ePtr);...if (seg
4380: 50 74 72 20 21 3d 20 2a 70 72 65 76 50 74 72 50  Ptr != *prevPtrP
4390: 74 72 29 20 7b 0a 09 09 20 20 20 20 61 6e 79 43  tr) {...    anyC
43a0: 68 61 6e 67 65 73 20 3d 20 31 3b 0a 09 09 7d 0a  hanges = 1;...}.
43b0: 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 21  .    }..}..if (!
43c0: 61 6e 79 43 68 61 6e 67 65 73 29 20 7b 0a 09 20  anyChanges) {.. 
43d0: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20     break;..}.   
43e0: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   }.}.../*. *----
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4430: 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 42 54 72 65 65  --. *. * TkBTree
4440: 44 65 6c 65 74 65 43 68 61 72 73 20 2d 2d 0a 20  DeleteChars --. 
4450: 2a 0a 20 2a 09 44 65 6c 65 74 65 20 61 20 72 61  *. *.Delete a ra
4460: 6e 67 65 20 6f 66 20 63 68 61 72 61 63 74 65 72  nge of character
4470: 73 20 66 72 6f 6d 20 61 20 42 2d 74 72 65 65 2e  s from a B-tree.
4480: 20 20 54 68 65 20 63 61 6c 6c 65 72 0a 20 2a 09    The caller. *.
4490: 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74  must make sure t
44a0: 68 61 74 20 74 68 65 20 66 69 6e 61 6c 20 6e 65  hat the final ne
44b0: 77 6c 69 6e 65 20 6f 66 20 74 68 65 20 42 2d 74  wline of the B-t
44c0: 72 65 65 20 69 73 0a 20 2a 09 6e 65 76 65 72 20  ree is. *.never 
44d0: 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52  deleted.. *. * R
44e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
44f0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4500: 63 74 73 3a 0a 20 2a 09 49 6e 66 6f 72 6d 61 74  cts:. *.Informat
4510: 69 6f 6e 20 69 73 20 64 65 6c 65 74 65 64 20 66  ion is deleted f
4520: 72 6f 6d 20 74 68 65 20 42 2d 74 72 65 65 2e 20  rom the B-tree. 
4530: 20 54 68 69 73 20 63 61 6e 20 63 61 75 73 65 20   This can cause 
4540: 74 68 65 0a 20 2a 09 69 6e 74 65 72 6e 61 6c 20  the. *.internal 
4550: 73 74 72 75 63 74 75 72 65 20 6f 66 20 74 68 65  structure of the
4560: 20 42 2d 74 72 65 65 20 74 6f 20 63 68 61 6e 67   B-tree to chang
4570: 65 2e 20 20 4e 6f 74 65 3a 20 62 65 63 61 75 73  e.  Note: becaus
4580: 65 0a 20 2a 09 6f 66 20 63 68 61 6e 67 65 73 20  e. *.of changes 
4590: 74 6f 20 74 68 65 20 42 2d 74 72 65 65 20 73 74  to the B-tree st
45a0: 72 75 63 74 75 72 65 2c 20 74 68 65 20 69 6e 64  ructure, the ind
45b0: 69 63 65 73 20 70 6f 69 6e 74 65 64 0a 20 2a 09  ices pointed. *.
45c0: 74 6f 20 62 79 20 69 6e 64 65 78 31 50 74 72 20  to by index1Ptr 
45d0: 61 6e 64 20 69 6e 64 65 78 32 50 74 72 20 73 68  and index2Ptr sh
45e0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64  ould not be used
45f0: 20 61 66 74 65 72 20 74 68 69 73 0a 20 2a 09 70   after this. *.p
4600: 72 6f 63 65 64 75 72 65 20 72 65 74 75 72 6e 73  rocedure returns
4610: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4660: 2f 0a 0a 76 6f 69 64 0a 54 6b 42 54 72 65 65 44  /..void.TkBTreeD
4670: 65 6c 65 74 65 43 68 61 72 73 28 69 6e 64 65 78  eleteChars(index
4680: 31 50 74 72 2c 20 69 6e 64 65 78 32 50 74 72 29  1Ptr, index2Ptr)
4690: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54 6b  .    register Tk
46a0: 54 65 78 74 49 6e 64 65 78 20 2a 69 6e 64 65 78  TextIndex *index
46b0: 31 50 74 72 3b 09 2f 2a 20 49 6e 64 69 63 61 74  1Ptr;./* Indicat
46c0: 65 73 20 66 69 72 73 74 20 63 68 61 72 61 63 74  es first charact
46d0: 65 72 20 74 68 61 74 20 69 73 0a 09 09 09 09 09  er that is......
46e0: 20 2a 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64   * to be deleted
46f0: 2e 20 2a 2f 0a 20 20 20 20 72 65 67 69 73 74 65  . */.    registe
4700: 72 20 54 6b 54 65 78 74 49 6e 64 65 78 20 2a 69  r TkTextIndex *i
4710: 6e 64 65 78 32 50 74 72 3b 09 2f 2a 20 49 6e 64  ndex2Ptr;./* Ind
4720: 69 63 61 74 65 73 20 63 68 61 72 61 63 74 65 72  icates character
4730: 20 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 0a   just after the.
4740: 09 09 09 09 09 20 2a 20 6c 61 73 74 20 6f 6e 65  ..... * last one
4750: 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 64   that is to be d
4760: 65 6c 65 74 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20  eleted. */.{.   
4770: 20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a   TkTextSegment *
4780: 70 72 65 76 50 74 72 3b 09 09 2f 2a 20 54 68 65  prevPtr;../* The
4790: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 62 65   segment just be
47a0: 66 6f 72 65 20 74 68 65 20 73 74 61 72 74 0a 09  fore the start..
47b0: 09 09 09 09 20 2a 20 6f 66 20 74 68 65 20 64 65  .... * of the de
47c0: 6c 65 74 69 6f 6e 20 72 61 6e 67 65 2e 20 2a 2f  letion range. */
47d0: 0a 20 20 20 20 54 6b 54 65 78 74 53 65 67 6d 65  .    TkTextSegme
47e0: 6e 74 20 2a 6c 61 73 74 50 74 72 3b 09 09 2f 2a  nt *lastPtr;../*
47f0: 20 54 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73   The segment jus
4800: 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 0a  t after the end.
4810: 09 09 09 09 09 20 2a 20 6f 66 20 74 68 65 20 64  ..... * of the d
4820: 65 6c 65 74 69 6f 6e 20 72 61 6e 67 65 2e 20 2a  eletion range. *
4830: 2f 0a 20 20 20 20 54 6b 54 65 78 74 53 65 67 6d  /.    TkTextSegm
4840: 65 6e 74 20 2a 73 65 67 50 74 72 2c 20 2a 6e 65  ent *segPtr, *ne
4850: 78 74 50 74 72 3b 0a 20 20 20 20 54 6b 54 65 78  xtPtr;.    TkTex
4860: 74 4c 69 6e 65 20 2a 63 75 72 4c 69 6e 65 50 74  tLine *curLinePt
4870: 72 3b 0a 20 20 20 20 4e 6f 64 65 20 2a 63 75 72  r;.    Node *cur
4880: 4e 6f 64 65 50 74 72 2c 20 2a 6e 6f 64 65 50 74  NodePtr, *nodePt
4890: 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  r;..    /*.     
48a0: 2a 20 54 72 69 63 6b 79 20 70 6f 69 6e 74 3a 20  * Tricky point: 
48b0: 20 73 70 6c 69 74 20 61 74 20 69 6e 64 65 78 32   split at index2
48c0: 50 74 72 20 66 69 72 73 74 3b 20 20 6f 74 68 65  Ptr first;  othe
48d0: 72 77 69 73 65 20 74 68 65 20 73 70 6c 69 74 0a  rwise the split.
48e0: 20 20 20 20 20 2a 20 61 74 20 69 6e 64 65 78 32       * at index2
48f0: 50 74 72 20 6d 61 79 20 69 6e 76 61 6c 69 64 61  Ptr may invalida
4900: 74 65 20 73 65 67 50 74 72 20 61 6e 64 2f 6f 72  te segPtr and/or
4910: 20 70 72 65 76 50 74 72 2e 0a 20 20 20 20 20 2a   prevPtr..     *
4920: 2f 0a 0a 20 20 20 20 6c 61 73 74 50 74 72 20 3d  /..    lastPtr =
4930: 20 53 70 6c 69 74 53 65 67 28 69 6e 64 65 78 32   SplitSeg(index2
4940: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 6c 61  Ptr);.    if (la
4950: 73 74 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  stPtr != NULL) {
4960: 0a 09 6c 61 73 74 50 74 72 20 3d 20 6c 61 73 74  ..lastPtr = last
4970: 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 20 20  Ptr->nextPtr;.  
4980: 20 20 7d 20 20 65 6c 73 65 20 7b 0a 09 6c 61 73    }  else {..las
4990: 74 50 74 72 20 3d 20 69 6e 64 65 78 32 50 74 72  tPtr = index2Ptr
49a0: 2d 3e 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50 74  ->linePtr->segPt
49b0: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 65  r;.    }.    pre
49c0: 76 50 74 72 20 3d 20 53 70 6c 69 74 53 65 67 28  vPtr = SplitSeg(
49d0: 69 6e 64 65 78 31 50 74 72 29 3b 0a 20 20 20 20  index1Ptr);.    
49e0: 69 66 20 28 70 72 65 76 50 74 72 20 21 3d 20 4e  if (prevPtr != N
49f0: 55 4c 4c 29 20 7b 0a 09 73 65 67 50 74 72 20 3d  ULL) {..segPtr =
4a00: 20 70 72 65 76 50 74 72 2d 3e 6e 65 78 74 50 74   prevPtr->nextPt
4a10: 72 3b 0a 09 70 72 65 76 50 74 72 2d 3e 6e 65 78  r;..prevPtr->nex
4a20: 74 50 74 72 20 3d 20 6c 61 73 74 50 74 72 3b 0a  tPtr = lastPtr;.
4a30: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 65      } else {..se
4a40: 67 50 74 72 20 3d 20 69 6e 64 65 78 31 50 74 72  gPtr = index1Ptr
4a50: 2d 3e 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50 74  ->linePtr->segPt
4a60: 72 3b 0a 09 69 6e 64 65 78 31 50 74 72 2d 3e 6c  r;..index1Ptr->l
4a70: 69 6e 65 50 74 72 2d 3e 73 65 67 50 74 72 20 3d  inePtr->segPtr =
4a80: 20 6c 61 73 74 50 74 72 3b 0a 20 20 20 20 7d 0a   lastPtr;.    }.
4a90: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44  .    /*.     * D
4aa0: 65 6c 65 74 65 20 61 6c 6c 20 6f 66 20 74 68 65  elete all of the
4ab0: 20 73 65 67 6d 65 6e 74 73 20 62 65 74 77 65 65   segments betwee
4ac0: 6e 20 70 72 65 76 50 74 72 20 61 6e 64 20 6c 61  n prevPtr and la
4ad0: 73 74 50 74 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a  stPtr..     */..
4ae0: 20 20 20 20 63 75 72 4c 69 6e 65 50 74 72 20 3d      curLinePtr =
4af0: 20 69 6e 64 65 78 31 50 74 72 2d 3e 6c 69 6e 65   index1Ptr->line
4b00: 50 74 72 3b 0a 20 20 20 20 63 75 72 4e 6f 64 65  Ptr;.    curNode
4b10: 50 74 72 20 3d 20 63 75 72 4c 69 6e 65 50 74 72  Ptr = curLinePtr
4b20: 2d 3e 70 61 72 65 6e 74 50 74 72 3b 0a 20 20 20  ->parentPtr;.   
4b30: 20 77 68 69 6c 65 20 28 73 65 67 50 74 72 20 21   while (segPtr !
4b40: 3d 20 6c 61 73 74 50 74 72 29 20 7b 0a 09 69 66  = lastPtr) {..if
4b50: 20 28 73 65 67 50 74 72 20 3d 3d 20 4e 55 4c 4c   (segPtr == NULL
4b60: 29 20 7b 0a 09 20 20 20 20 54 6b 54 65 78 74 4c  ) {..    TkTextL
4b70: 69 6e 65 20 2a 6e 65 78 74 4c 69 6e 65 50 74 72  ine *nextLinePtr
4b80: 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20  ;...    /*..    
4b90: 20 2a 20 57 65 20 6a 75 73 74 20 72 61 6e 20 6f   * We just ran o
4ba0: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  ff the end of a 
4bb0: 6c 69 6e 65 2e 20 20 46 69 72 73 74 20 66 69 6e  line.  First fin
4bc0: 64 20 74 68 65 0a 09 20 20 20 20 20 2a 20 6e 65  d the..     * ne
4bd0: 78 74 20 6c 69 6e 65 2c 20 74 68 65 6e 20 67 6f  xt line, then go
4be0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 6c 64   back to the old
4bf0: 20 6c 69 6e 65 20 61 6e 64 20 64 65 6c 65 74 65   line and delete
4c00: 20 69 74 0a 09 20 20 20 20 20 2a 20 28 75 6e 6c   it..     * (unl
4c10: 65 73 73 20 69 74 27 73 20 74 68 65 20 73 74 61  ess it's the sta
4c20: 72 74 69 6e 67 20 6c 69 6e 65 20 66 6f 72 20 74  rting line for t
4c30: 68 65 20 72 61 6e 67 65 29 2e 0a 09 20 20 20 20  he range)...    
4c40: 20 2a 2f 0a 0a 09 20 20 20 20 6e 65 78 74 4c 69   */...    nextLi
4c50: 6e 65 50 74 72 20 3d 20 54 6b 42 54 72 65 65 4e  nePtr = TkBTreeN
4c60: 65 78 74 4c 69 6e 65 28 63 75 72 4c 69 6e 65 50  extLine(curLineP
4c70: 74 72 29 3b 0a 09 20 20 20 20 69 66 20 28 63 75  tr);..    if (cu
4c80: 72 4c 69 6e 65 50 74 72 20 21 3d 20 69 6e 64 65  rLinePtr != inde
4c90: 78 31 50 74 72 2d 3e 6c 69 6e 65 50 74 72 29 20  x1Ptr->linePtr) 
4ca0: 7b 0a 09 09 69 66 20 28 63 75 72 4e 6f 64 65 50  {...if (curNodeP
4cb0: 74 72 20 3d 3d 20 69 6e 64 65 78 31 50 74 72 2d  tr == index1Ptr-
4cc0: 3e 6c 69 6e 65 50 74 72 2d 3e 70 61 72 65 6e 74  >linePtr->parent
4cd0: 50 74 72 29 20 7b 0a 09 09 20 20 20 20 69 6e 64  Ptr) {...    ind
4ce0: 65 78 31 50 74 72 2d 3e 6c 69 6e 65 50 74 72 2d  ex1Ptr->linePtr-
4cf0: 3e 6e 65 78 74 50 74 72 20 3d 20 63 75 72 4c 69  >nextPtr = curLi
4d00: 6e 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a  nePtr->nextPtr;.
4d10: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
4d20: 20 63 75 72 4e 6f 64 65 50 74 72 2d 3e 63 68 69   curNodePtr->chi
4d30: 6c 64 72 65 6e 2e 6c 69 6e 65 50 74 72 20 3d 20  ldren.linePtr = 
4d40: 63 75 72 4c 69 6e 65 50 74 72 2d 3e 6e 65 78 74  curLinePtr->next
4d50: 50 74 72 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28  Ptr;...}...for (
4d60: 6e 6f 64 65 50 74 72 20 3d 20 63 75 72 4e 6f 64  nodePtr = curNod
4d70: 65 50 74 72 3b 20 6e 6f 64 65 50 74 72 20 21 3d  ePtr; nodePtr !=
4d80: 20 4e 55 4c 4c 3b 0a 09 09 09 6e 6f 64 65 50 74   NULL;....nodePt
4d90: 72 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 70 61 72  r = nodePtr->par
4da0: 65 6e 74 50 74 72 29 20 7b 0a 09 09 20 20 20 20  entPtr) {...    
4db0: 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d 4c 69 6e 65  nodePtr->numLine
4dc0: 73 2d 2d 3b 0a 09 09 7d 0a 09 09 63 75 72 4e 6f  s--;...}...curNo
4dd0: 64 65 50 74 72 2d 3e 6e 75 6d 43 68 69 6c 64 72  dePtr->numChildr
4de0: 65 6e 2d 2d 3b 0a 09 09 63 6b 66 72 65 65 28 28  en--;...ckfree((
4df0: 63 68 61 72 20 2a 29 20 63 75 72 4c 69 6e 65 50  char *) curLineP
4e00: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  tr);..    }..   
4e10: 20 63 75 72 4c 69 6e 65 50 74 72 20 3d 20 6e 65   curLinePtr = ne
4e20: 78 74 4c 69 6e 65 50 74 72 3b 0a 09 20 20 20 20  xtLinePtr;..    
4e30: 73 65 67 50 74 72 20 3d 20 63 75 72 4c 69 6e 65  segPtr = curLine
4e40: 50 74 72 2d 3e 73 65 67 50 74 72 3b 0a 0a 09 20  Ptr->segPtr;... 
4e50: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 49 66     /*..     * If
4e60: 20 74 68 65 20 6e 6f 64 65 20 69 73 20 65 6d 70   the node is emp
4e70: 74 79 20 74 68 65 6e 20 64 65 6c 65 74 65 20 69  ty then delete i
4e80: 74 20 61 6e 64 20 69 74 73 20 70 61 72 65 6e 74  t and its parent
4e90: 73 2c 0a 09 20 20 20 20 20 2a 20 72 65 63 75 72  s,..     * recur
4ea0: 73 69 76 65 6c 79 20 75 70 77 61 72 64 73 20 75  sively upwards u
4eb0: 6e 74 69 6c 20 61 20 6e 6f 6e 2d 65 6d 70 74 79  ntil a non-empty
4ec0: 20 6e 6f 64 65 20 69 73 20 66 6f 75 6e 64 2e 0a   node is found..
4ed0: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 77  .     */...    w
4ee0: 68 69 6c 65 20 28 63 75 72 4e 6f 64 65 50 74 72  hile (curNodePtr
4ef0: 2d 3e 6e 75 6d 43 68 69 6c 64 72 65 6e 20 3d 3d  ->numChildren ==
4f00: 20 30 29 20 7b 0a 09 09 4e 6f 64 65 20 2a 70 61   0) {...Node *pa
4f10: 72 65 6e 74 50 74 72 3b 0a 0a 09 09 70 61 72 65  rentPtr;....pare
4f20: 6e 74 50 74 72 20 3d 20 63 75 72 4e 6f 64 65 50  ntPtr = curNodeP
4f30: 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 3b 0a 09  tr->parentPtr;..
4f40: 09 69 66 20 28 70 61 72 65 6e 74 50 74 72 2d 3e  .if (parentPtr->
4f50: 63 68 69 6c 64 72 65 6e 2e 6e 6f 64 65 50 74 72  children.nodePtr
4f60: 20 3d 3d 20 63 75 72 4e 6f 64 65 50 74 72 29 20   == curNodePtr) 
4f70: 7b 0a 09 09 20 20 20 20 70 61 72 65 6e 74 50 74  {...    parentPt
4f80: 72 2d 3e 63 68 69 6c 64 72 65 6e 2e 6e 6f 64 65  r->children.node
4f90: 50 74 72 20 3d 20 63 75 72 4e 6f 64 65 50 74 72  Ptr = curNodePtr
4fa0: 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 09 7d 20 65  ->nextPtr;...} e
4fb0: 6c 73 65 20 7b 0a 09 09 20 20 20 20 4e 6f 64 65  lse {...    Node
4fc0: 20 2a 70 72 65 76 4e 6f 64 65 50 74 72 20 3d 20   *prevNodePtr = 
4fd0: 70 61 72 65 6e 74 50 74 72 2d 3e 63 68 69 6c 64  parentPtr->child
4fe0: 72 65 6e 2e 6e 6f 64 65 50 74 72 3b 0a 09 09 20  ren.nodePtr;... 
4ff0: 20 20 20 77 68 69 6c 65 20 28 70 72 65 76 4e 6f     while (prevNo
5000: 64 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 21  dePtr->nextPtr !
5010: 3d 20 63 75 72 4e 6f 64 65 50 74 72 29 20 7b 0a  = curNodePtr) {.
5020: 09 09 09 70 72 65 76 4e 6f 64 65 50 74 72 20 3d  ...prevNodePtr =
5030: 20 70 72 65 76 4e 6f 64 65 50 74 72 2d 3e 6e 65   prevNodePtr->ne
5040: 78 74 50 74 72 3b 0a 09 09 20 20 20 20 7d 0a 09  xtPtr;...    }..
5050: 09 20 20 20 20 70 72 65 76 4e 6f 64 65 50 74 72  .    prevNodePtr
5060: 2d 3e 6e 65 78 74 50 74 72 20 3d 20 63 75 72 4e  ->nextPtr = curN
5070: 6f 64 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b  odePtr->nextPtr;
5080: 0a 09 09 7d 0a 09 09 70 61 72 65 6e 74 50 74 72  ...}...parentPtr
5090: 2d 3e 6e 75 6d 43 68 69 6c 64 72 65 6e 2d 2d 3b  ->numChildren--;
50a0: 0a 09 09 63 6b 66 72 65 65 28 28 63 68 61 72 20  ...ckfree((char 
50b0: 2a 29 20 63 75 72 4e 6f 64 65 50 74 72 29 3b 0a  *) curNodePtr);.
50c0: 09 09 63 75 72 4e 6f 64 65 50 74 72 20 3d 20 70  ..curNodePtr = p
50d0: 61 72 65 6e 74 50 74 72 3b 0a 09 20 20 20 20 7d  arentPtr;..    }
50e0: 0a 09 20 20 20 20 63 75 72 4e 6f 64 65 50 74 72  ..    curNodePtr
50f0: 20 3d 20 63 75 72 4c 69 6e 65 50 74 72 2d 3e 70   = curLinePtr->p
5100: 61 72 65 6e 74 50 74 72 3b 0a 09 20 20 20 20 63  arentPtr;..    c
5110: 6f 6e 74 69 6e 75 65 3b 0a 09 7d 0a 0a 09 6e 65  ontinue;..}...ne
5120: 78 74 50 74 72 20 3d 20 73 65 67 50 74 72 2d 3e  xtPtr = segPtr->
5130: 6e 65 78 74 50 74 72 3b 0a 09 69 66 20 28 28 2a  nextPtr;..if ((*
5140: 73 65 67 50 74 72 2d 3e 74 79 70 65 50 74 72 2d  segPtr->typePtr-
5150: 3e 64 65 6c 65 74 65 50 72 6f 63 29 28 73 65 67  >deleteProc)(seg
5160: 50 74 72 2c 20 63 75 72 4c 69 6e 65 50 74 72 2c  Ptr, curLinePtr,
5170: 20 30 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20   0) != 0) {..   
5180: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 69 73   /*..     * This
5190: 20 73 65 67 6d 65 6e 74 20 72 65 66 75 73 65 73   segment refuses
51a0: 20 74 6f 20 64 69 65 2e 20 20 4d 6f 76 65 20 69   to die.  Move i
51b0: 74 20 74 6f 20 70 72 65 76 50 74 72 20 61 6e 64  t to prevPtr and
51c0: 0a 09 20 20 20 20 20 2a 20 61 64 76 61 6e 63 65  ..     * advance
51d0: 20 70 72 65 76 50 74 72 20 69 66 20 74 68 65 20   prevPtr if the 
51e0: 73 65 67 6d 65 6e 74 20 68 61 73 20 6c 65 66 74  segment has left
51f0: 20 67 72 61 76 69 74 79 2e 0a 09 20 20 20 20 20   gravity...     
5200: 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 70 72 65  */...    if (pre
5210: 76 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  vPtr == NULL) {.
5220: 09 09 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74  ..segPtr->nextPt
5230: 72 20 3d 20 69 6e 64 65 78 31 50 74 72 2d 3e 6c  r = index1Ptr->l
5240: 69 6e 65 50 74 72 2d 3e 73 65 67 50 74 72 3b 0a  inePtr->segPtr;.
5250: 09 09 69 6e 64 65 78 31 50 74 72 2d 3e 6c 69 6e  ..index1Ptr->lin
5260: 65 50 74 72 2d 3e 73 65 67 50 74 72 20 3d 20 73  ePtr->segPtr = s
5270: 65 67 50 74 72 3b 0a 09 20 20 20 20 7d 20 65 6c  egPtr;..    } el
5280: 73 65 20 7b 0a 09 09 73 65 67 50 74 72 2d 3e 6e  se {...segPtr->n
5290: 65 78 74 50 74 72 20 3d 20 70 72 65 76 50 74 72  extPtr = prevPtr
52a0: 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 09 70 72 65  ->nextPtr;...pre
52b0: 76 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20  vPtr->nextPtr = 
52c0: 73 65 67 50 74 72 3b 0a 09 20 20 20 20 7d 0a 09  segPtr;..    }..
52d0: 20 20 20 20 69 66 20 28 73 65 67 50 74 72 2d 3e      if (segPtr->
52e0: 74 79 70 65 50 74 72 2d 3e 6c 65 66 74 47 72 61  typePtr->leftGra
52f0: 76 69 74 79 29 20 7b 0a 09 09 70 72 65 76 50 74  vity) {...prevPt
5300: 72 20 3d 20 73 65 67 50 74 72 3b 0a 09 20 20 20  r = segPtr;..   
5310: 20 7d 0a 09 7d 0a 09 73 65 67 50 74 72 20 3d 20   }..}..segPtr = 
5320: 6e 65 78 74 50 74 72 3b 0a 20 20 20 20 7d 0a 0a  nextPtr;.    }..
5330: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66      /*.     * If
5340: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
5350: 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 64 65  nd end of the de
5360: 6c 65 74 69 6f 6e 20 72 61 6e 67 65 20 61 72 65  letion range are
5370: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 0a 20 20   in different.  
5380: 20 20 20 2a 20 6c 69 6e 65 73 2c 20 6a 6f 69 6e     * lines, join
5390: 20 74 68 65 20 74 77 6f 20 6c 69 6e 65 73 20 74   the two lines t
53a0: 6f 67 65 74 68 65 72 20 61 6e 64 20 64 69 73 63  ogether and disc
53b0: 61 72 64 20 74 68 65 20 65 6e 64 69 6e 67 20 6c  ard the ending l
53c0: 69 6e 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ine..     */..  
53d0: 20 20 69 66 20 28 69 6e 64 65 78 31 50 74 72 2d    if (index1Ptr-
53e0: 3e 6c 69 6e 65 50 74 72 20 21 3d 20 69 6e 64 65  >linePtr != inde
53f0: 78 32 50 74 72 2d 3e 6c 69 6e 65 50 74 72 29 20  x2Ptr->linePtr) 
5400: 7b 0a 09 54 6b 54 65 78 74 4c 69 6e 65 20 2a 70  {..TkTextLine *p
5410: 72 65 76 4c 69 6e 65 50 74 72 3b 0a 0a 09 66 6f  revLinePtr;...fo
5420: 72 20 28 73 65 67 50 74 72 20 3d 20 6c 61 73 74  r (segPtr = last
5430: 50 74 72 3b 20 73 65 67 50 74 72 20 21 3d 20 4e  Ptr; segPtr != N
5440: 55 4c 4c 3b 0a 09 09 73 65 67 50 74 72 20 3d 20  ULL;...segPtr = 
5450: 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74 72 29  segPtr->nextPtr)
5460: 20 7b 0a 09 20 20 20 20 69 66 20 28 73 65 67 50   {..    if (segP
5470: 74 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6c 69 6e  tr->typePtr->lin
5480: 65 43 68 61 6e 67 65 50 72 6f 63 20 21 3d 20 4e  eChangeProc != N
5490: 55 4c 4c 29 20 7b 0a 09 09 28 2a 73 65 67 50 74  ULL) {...(*segPt
54a0: 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6c 69 6e 65  r->typePtr->line
54b0: 43 68 61 6e 67 65 50 72 6f 63 29 28 73 65 67 50  ChangeProc)(segP
54c0: 74 72 2c 20 69 6e 64 65 78 32 50 74 72 2d 3e 6c  tr, index2Ptr->l
54d0: 69 6e 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a  inePtr);..    }.
54e0: 09 7d 0a 09 63 75 72 4e 6f 64 65 50 74 72 20 3d  .}..curNodePtr =
54f0: 20 69 6e 64 65 78 32 50 74 72 2d 3e 6c 69 6e 65   index2Ptr->line
5500: 50 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 3b 0a  Ptr->parentPtr;.
5510: 09 66 6f 72 20 28 6e 6f 64 65 50 74 72 20 3d 20  .for (nodePtr = 
5520: 63 75 72 4e 6f 64 65 50 74 72 3b 20 6e 6f 64 65  curNodePtr; node
5530: 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 6e  Ptr != NULL;...n
5540: 6f 64 65 50 74 72 20 3d 20 6e 6f 64 65 50 74 72  odePtr = nodePtr
5550: 2d 3e 70 61 72 65 6e 74 50 74 72 29 20 7b 0a 09  ->parentPtr) {..
5560: 20 20 20 20 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d      nodePtr->num
5570: 4c 69 6e 65 73 2d 2d 3b 0a 09 7d 0a 09 63 75 72  Lines--;..}..cur
5580: 4e 6f 64 65 50 74 72 2d 3e 6e 75 6d 43 68 69 6c  NodePtr->numChil
5590: 64 72 65 6e 2d 2d 3b 0a 09 70 72 65 76 4c 69 6e  dren--;..prevLin
55a0: 65 50 74 72 20 3d 20 63 75 72 4e 6f 64 65 50 74  ePtr = curNodePt
55b0: 72 2d 3e 63 68 69 6c 64 72 65 6e 2e 6c 69 6e 65  r->children.line
55c0: 50 74 72 3b 0a 09 69 66 20 28 70 72 65 76 4c 69  Ptr;..if (prevLi
55d0: 6e 65 50 74 72 20 3d 3d 20 69 6e 64 65 78 32 50  nePtr == index2P
55e0: 74 72 2d 3e 6c 69 6e 65 50 74 72 29 20 7b 0a 09  tr->linePtr) {..
55f0: 20 20 20 20 63 75 72 4e 6f 64 65 50 74 72 2d 3e      curNodePtr->
5600: 63 68 69 6c 64 72 65 6e 2e 6c 69 6e 65 50 74 72  children.linePtr
5610: 20 3d 20 69 6e 64 65 78 32 50 74 72 2d 3e 6c 69   = index2Ptr->li
5620: 6e 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a  nePtr->nextPtr;.
5630: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 77  .} else {..    w
5640: 68 69 6c 65 20 28 70 72 65 76 4c 69 6e 65 50 74  hile (prevLinePt
5650: 72 2d 3e 6e 65 78 74 50 74 72 20 21 3d 20 69 6e  r->nextPtr != in
5660: 64 65 78 32 50 74 72 2d 3e 6c 69 6e 65 50 74 72  dex2Ptr->linePtr
5670: 29 20 7b 0a 09 09 70 72 65 76 4c 69 6e 65 50 74  ) {...prevLinePt
5680: 72 20 3d 20 70 72 65 76 4c 69 6e 65 50 74 72 2d  r = prevLinePtr-
5690: 3e 6e 65 78 74 50 74 72 3b 0a 09 20 20 20 20 7d  >nextPtr;..    }
56a0: 0a 09 20 20 20 20 70 72 65 76 4c 69 6e 65 50 74  ..    prevLinePt
56b0: 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 69 6e 64  r->nextPtr = ind
56c0: 65 78 32 50 74 72 2d 3e 6c 69 6e 65 50 74 72 2d  ex2Ptr->linePtr-
56d0: 3e 6e 65 78 74 50 74 72 3b 0a 09 7d 0a 09 63 6b  >nextPtr;..}..ck
56e0: 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 69 6e  free((char *) in
56f0: 64 65 78 32 50 74 72 2d 3e 6c 69 6e 65 50 74 72  dex2Ptr->linePtr
5700: 29 3b 0a 09 52 65 62 61 6c 61 6e 63 65 28 28 42  );..Rebalance((B
5710: 54 72 65 65 20 2a 29 20 69 6e 64 65 78 32 50 74  Tree *) index2Pt
5720: 72 2d 3e 74 72 65 65 2c 20 63 75 72 4e 6f 64 65  r->tree, curNode
5730: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Ptr);.    }..   
5740: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6c 65 61 6e   /*.     * Clean
5750: 75 70 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20  up the segments 
5760: 69 6e 20 74 68 65 20 6e 65 77 20 6c 69 6e 65 2e  in the new line.
5770: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 43 6c  .     */..    Cl
5780: 65 61 6e 75 70 4c 69 6e 65 28 69 6e 64 65 78 31  eanupLine(index1
5790: 50 74 72 2d 3e 6c 69 6e 65 50 74 72 29 3b 0a 0a  Ptr->linePtr);..
57a0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4c 61      /*.     * La
57b0: 73 74 6c 79 2c 20 72 65 62 61 6c 61 6e 63 65 20  stly, rebalance 
57c0: 74 68 65 20 66 69 72 73 74 20 6e 6f 64 65 20 6f  the first node o
57d0: 66 20 74 68 65 20 72 61 6e 67 65 2e 0a 20 20 20  f the range..   
57e0: 20 20 2a 2f 0a 0a 20 20 20 20 52 65 62 61 6c 61    */..    Rebala
57f0: 6e 63 65 28 28 42 54 72 65 65 20 2a 29 20 69 6e  nce((BTree *) in
5800: 64 65 78 31 50 74 72 2d 3e 74 72 65 65 2c 20 69  dex1Ptr->tree, i
5810: 6e 64 65 78 31 50 74 72 2d 3e 6c 69 6e 65 50 74  ndex1Ptr->linePt
5820: 72 2d 3e 70 61 72 65 6e 74 50 74 72 29 3b 0a 20  r->parentPtr);. 
5830: 20 20 20 69 66 20 28 74 6b 42 54 72 65 65 44 65     if (tkBTreeDe
5840: 62 75 67 29 20 7b 0a 09 54 6b 42 54 72 65 65 43  bug) {..TkBTreeC
5850: 68 65 63 6b 28 69 6e 64 65 78 31 50 74 72 2d 3e  heck(index1Ptr->
5860: 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c  tree);.    }.}..
5870: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
58c0: 20 2a 20 54 6b 42 54 72 65 65 46 69 6e 64 4c 69   * TkBTreeFindLi
58d0: 6e 65 20 2d 2d 0a 20 2a 0a 20 2a 09 46 69 6e 64  ne --. *. *.Find
58e0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6c 69   a particular li
58f0: 6e 65 20 69 6e 20 61 20 42 2d 74 72 65 65 20 62  ne in a B-tree b
5900: 61 73 65 64 20 6f 6e 20 69 74 73 20 6c 69 6e 65  ased on its line
5910: 20 6e 75 6d 62 65 72 2e 0a 20 2a 0a 20 2a 20 52   number.. *. * R
5920: 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72  esults:. *.The r
5930: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
5940: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
5950: 6c 69 6e 65 20 73 74 72 75 63 74 75 72 65 20 66  line structure f
5960: 6f 72 20 74 68 65 0a 20 2a 09 6c 69 6e 65 20 77  or the. *.line w
5970: 68 6f 73 65 20 69 6e 64 65 78 20 69 73 20 22 6c  hose index is "l
5980: 69 6e 65 22 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  ine", or NULL if
5990: 20 6e 6f 20 73 75 63 68 20 6c 69 6e 65 20 65 78   no such line ex
59a0: 69 73 74 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  ists.. *. * Side
59b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
59c0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5a10: 2a 2f 0a 0a 54 6b 54 65 78 74 4c 69 6e 65 20 2a  */..TkTextLine *
5a20: 0a 54 6b 42 54 72 65 65 46 69 6e 64 4c 69 6e 65  .TkBTreeFindLine
5a30: 28 74 72 65 65 2c 20 6c 69 6e 65 29 0a 20 20 20  (tree, line).   
5a40: 20 54 6b 54 65 78 74 42 54 72 65 65 20 74 72 65   TkTextBTree tre
5a50: 65 3b 09 09 09 2f 2a 20 42 2d 74 72 65 65 20 69  e;.../* B-tree i
5a60: 6e 20 77 68 69 63 68 20 74 6f 20 66 69 6e 64 20  n which to find 
5a70: 6c 69 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  line. */.    int
5a80: 20 6c 69 6e 65 3b 09 09 09 09 2f 2a 20 49 6e 64   line;..../* Ind
5a90: 65 78 20 6f 66 20 64 65 73 69 72 65 64 20 6c 69  ex of desired li
5aa0: 6e 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 42 54 72  ne. */.{.    BTr
5ab0: 65 65 20 2a 74 72 65 65 50 74 72 20 3d 20 28 42  ee *treePtr = (B
5ac0: 54 72 65 65 20 2a 29 20 74 72 65 65 3b 0a 20 20  Tree *) tree;.  
5ad0: 20 20 72 65 67 69 73 74 65 72 20 4e 6f 64 65 20    register Node 
5ae0: 2a 6e 6f 64 65 50 74 72 3b 0a 20 20 20 20 72 65  *nodePtr;.    re
5af0: 67 69 73 74 65 72 20 54 6b 54 65 78 74 4c 69 6e  gister TkTextLin
5b00: 65 20 2a 6c 69 6e 65 50 74 72 3b 0a 20 20 20 20  e *linePtr;.    
5b10: 69 6e 74 20 6c 69 6e 65 73 4c 65 66 74 3b 0a 0a  int linesLeft;..
5b20: 20 20 20 20 6e 6f 64 65 50 74 72 20 3d 20 74 72      nodePtr = tr
5b30: 65 65 50 74 72 2d 3e 72 6f 6f 74 50 74 72 3b 0a  eePtr->rootPtr;.
5b40: 20 20 20 20 6c 69 6e 65 73 4c 65 66 74 20 3d 20      linesLeft = 
5b50: 6c 69 6e 65 3b 0a 20 20 20 20 69 66 20 28 28 6c  line;.    if ((l
5b60: 69 6e 65 20 3c 20 30 29 20 7c 7c 20 28 6c 69 6e  ine < 0) || (lin
5b70: 65 20 3e 3d 20 6e 6f 64 65 50 74 72 2d 3e 6e 75  e >= nodePtr->nu
5b80: 6d 4c 69 6e 65 73 29 29 20 7b 0a 09 72 65 74 75  mLines)) {..retu
5b90: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
5ba0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 6f      /*.     * Wo
5bb0: 72 6b 20 64 6f 77 6e 20 74 68 72 6f 75 67 68 20  rk down through 
5bc0: 6c 65 76 65 6c 73 20 6f 66 20 74 68 65 20 74 72  levels of the tr
5bd0: 65 65 20 75 6e 74 69 6c 20 61 20 6e 6f 64 65 20  ee until a node 
5be0: 69 73 20 66 6f 75 6e 64 20 61 74 0a 20 20 20 20  is found at.    
5bf0: 20 2a 20 6c 65 76 65 6c 20 30 2e 0a 20 20 20 20   * level 0..    
5c00: 20 2a 2f 0a 0a 20 20 20 20 77 68 69 6c 65 20 28   */..    while (
5c10: 6e 6f 64 65 50 74 72 2d 3e 6c 65 76 65 6c 20 21  nodePtr->level !
5c20: 3d 20 30 29 20 7b 0a 09 66 6f 72 20 28 6e 6f 64  = 0) {..for (nod
5c30: 65 50 74 72 20 3d 20 6e 6f 64 65 50 74 72 2d 3e  ePtr = nodePtr->
5c40: 63 68 69 6c 64 72 65 6e 2e 6e 6f 64 65 50 74 72  children.nodePtr
5c50: 3b 0a 09 09 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d  ;...nodePtr->num
5c60: 4c 69 6e 65 73 20 3c 3d 20 6c 69 6e 65 73 4c 65  Lines <= linesLe
5c70: 66 74 3b 0a 09 09 6e 6f 64 65 50 74 72 20 3d 20  ft;...nodePtr = 
5c80: 6e 6f 64 65 50 74 72 2d 3e 6e 65 78 74 50 74 72  nodePtr->nextPtr
5c90: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 6e 6f 64  ) {..    if (nod
5ca0: 65 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ePtr == NULL) {.
5cb0: 09 09 70 61 6e 69 63 28 22 54 6b 42 54 72 65 65  ..panic("TkBTree
5cc0: 46 69 6e 64 4c 69 6e 65 20 72 61 6e 20 6f 75 74  FindLine ran out
5cd0: 20 6f 66 20 6e 6f 64 65 73 22 29 3b 0a 09 20 20   of nodes");..  
5ce0: 20 20 7d 0a 09 20 20 20 20 6c 69 6e 65 73 4c 65    }..    linesLe
5cf0: 66 74 20 2d 3d 20 6e 6f 64 65 50 74 72 2d 3e 6e  ft -= nodePtr->n
5d00: 75 6d 4c 69 6e 65 73 3b 0a 09 7d 0a 20 20 20 20  umLines;..}.    
5d10: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
5d20: 20 57 6f 72 6b 20 74 68 72 6f 75 67 68 20 74 68   Work through th
5d30: 65 20 6c 69 6e 65 73 20 61 74 74 61 63 68 65 64  e lines attached
5d40: 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 2d 30 20   to the level-0 
5d50: 6e 6f 64 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  node..     */.. 
5d60: 20 20 20 66 6f 72 20 28 6c 69 6e 65 50 74 72 20     for (linePtr 
5d70: 3d 20 6e 6f 64 65 50 74 72 2d 3e 63 68 69 6c 64  = nodePtr->child
5d80: 72 65 6e 2e 6c 69 6e 65 50 74 72 3b 20 6c 69 6e  ren.linePtr; lin
5d90: 65 73 4c 65 66 74 20 3e 20 30 3b 0a 09 20 20 20  esLeft > 0;..   
5da0: 20 6c 69 6e 65 50 74 72 20 3d 20 6c 69 6e 65 50   linePtr = lineP
5db0: 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09  tr->nextPtr) {..
5dc0: 69 66 20 28 6c 69 6e 65 50 74 72 20 3d 3d 20 4e  if (linePtr == N
5dd0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 70 61 6e 69  ULL) {..    pani
5de0: 63 28 22 54 6b 42 54 72 65 65 46 69 6e 64 4c 69  c("TkBTreeFindLi
5df0: 6e 65 20 72 61 6e 20 6f 75 74 20 6f 66 20 6c 69  ne ran out of li
5e00: 6e 65 73 22 29 3b 0a 09 7d 0a 09 6c 69 6e 65 73  nes");..}..lines
5e10: 4c 65 66 74 20 2d 3d 20 31 3b 0a 20 20 20 20 7d  Left -= 1;.    }
5e20: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 69 6e 65  .    return line
5e30: 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  Ptr;.}.../*. *--
5e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e80: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 42 54 72  ----. *. * TkBTr
5e90: 65 65 4e 65 78 74 4c 69 6e 65 20 2d 2d 0a 20 2a  eeNextLine --. *
5ea0: 0a 20 2a 09 47 69 76 65 6e 20 61 6e 20 65 78 69  . *.Given an exi
5eb0: 73 74 69 6e 67 20 6c 69 6e 65 20 69 6e 20 61 20  sting line in a 
5ec0: 42 2d 74 72 65 65 2c 20 74 68 69 73 20 70 72 6f  B-tree, this pro
5ed0: 63 65 64 75 72 65 20 6c 6f 63 61 74 65 73 20 74  cedure locates t
5ee0: 68 65 0a 20 2a 09 6e 65 78 74 20 6c 69 6e 65 20  he. *.next line 
5ef0: 69 6e 20 74 68 65 20 42 2d 74 72 65 65 2e 20 20  in the B-tree.  
5f00: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
5f10: 73 20 75 73 65 64 20 66 6f 72 20 73 63 61 6e 6e  s used for scann
5f20: 69 6e 67 0a 20 2a 09 74 68 72 6f 75 67 68 20 74  ing. *.through t
5f30: 68 65 20 42 2d 74 72 65 65 2e 0a 20 2a 0a 20 2a  he B-tree.. *. *
5f40: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65   Results:. *.The
5f50: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
5f60: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5f70: 65 20 6c 69 6e 65 20 74 68 61 74 20 69 6d 6d 65  e line that imme
5f80: 64 69 61 74 65 6c 79 0a 20 2a 09 66 6f 6c 6c 6f  diately. *.follo
5f90: 77 73 20 6c 69 6e 65 50 74 72 2c 20 6f 72 20 4e  ws linePtr, or N
5fa0: 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20  ULL if there is 
5fb0: 6e 6f 20 73 75 63 68 20 6c 69 6e 65 2e 0a 20 2a  no such line.. *
5fc0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
5fd0: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6020: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 6b 54 65  ------. */..TkTe
6030: 78 74 4c 69 6e 65 20 2a 0a 54 6b 42 54 72 65 65  xtLine *.TkBTree
6040: 4e 65 78 74 4c 69 6e 65 28 6c 69 6e 65 50 74 72  NextLine(linePtr
6050: 29 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54  ).    register T
6060: 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50  kTextLine *lineP
6070: 74 72 3b 09 2f 2a 20 50 6f 69 6e 74 65 72 20 74  tr;./* Pointer t
6080: 6f 20 65 78 69 73 74 69 6e 67 20 6c 69 6e 65 20  o existing line 
6090: 69 6e 0a 09 09 09 09 09 20 2a 20 42 2d 74 72 65  in...... * B-tre
60a0: 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 67 69  e. */.{.    regi
60b0: 73 74 65 72 20 4e 6f 64 65 20 2a 6e 6f 64 65 50  ster Node *nodeP
60c0: 74 72 3b 0a 0a 20 20 20 20 69 66 20 28 6c 69 6e  tr;..    if (lin
60d0: 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 21 3d  ePtr->nextPtr !=
60e0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
60f0: 20 6c 69 6e 65 50 74 72 2d 3e 6e 65 78 74 50 74   linePtr->nextPt
6100: 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r;.    }..    /*
6110: 0a 20 20 20 20 20 2a 20 54 68 69 73 20 77 61 73  .     * This was
6120: 20 74 68 65 20 6c 61 73 74 20 6c 69 6e 65 20 61   the last line a
6130: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
6140: 68 65 20 70 61 72 74 69 63 75 6c 61 72 20 70 61  he particular pa
6150: 72 65 6e 74 20 6e 6f 64 65 2e 0a 20 20 20 20 20  rent node..     
6160: 2a 20 53 65 61 72 63 68 20 75 70 20 74 68 65 20  * Search up the 
6170: 74 72 65 65 20 66 6f 72 20 74 68 65 20 6e 65 78  tree for the nex
6180: 74 20 6e 6f 64 65 2c 20 74 68 65 6e 20 73 65 61  t node, then sea
6190: 72 63 68 20 64 6f 77 6e 20 66 72 6f 6d 20 74 68  rch down from th
61a0: 61 74 0a 20 20 20 20 20 2a 20 6e 6f 64 65 20 74  at.     * node t
61b0: 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74  o find the first
61c0: 20 6c 69 6e 65 2c 0a 20 20 20 20 20 2a 2f 0a 0a   line,.     */..
61d0: 20 20 20 20 66 6f 72 20 28 6e 6f 64 65 50 74 72      for (nodePtr
61e0: 20 3d 20 6c 69 6e 65 50 74 72 2d 3e 70 61 72 65   = linePtr->pare
61f0: 6e 74 50 74 72 3b 20 3b 20 6e 6f 64 65 50 74 72  ntPtr; ; nodePtr
6200: 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 70 61 72 65   = nodePtr->pare
6210: 6e 74 50 74 72 29 20 7b 0a 09 69 66 20 28 6e 6f  ntPtr) {..if (no
6220: 64 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 21  dePtr->nextPtr !
6230: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6e  = NULL) {..    n
6240: 6f 64 65 50 74 72 20 3d 20 6e 6f 64 65 50 74 72  odePtr = nodePtr
6250: 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 20 20 20 20  ->nextPtr;..    
6260: 62 72 65 61 6b 3b 0a 09 7d 0a 09 69 66 20 28 6e  break;..}..if (n
6270: 6f 64 65 50 74 72 2d 3e 70 61 72 65 6e 74 50 74  odePtr->parentPt
6280: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  r == NULL) {..  
6290: 20 20 72 65 74 75 72 6e 20 28 54 6b 54 65 78 74    return (TkText
62a0: 4c 69 6e 65 20 2a 29 20 4e 55 4c 4c 3b 0a 09 7d  Line *) NULL;..}
62b0: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
62c0: 20 28 6e 6f 64 65 50 74 72 2d 3e 6c 65 76 65 6c   (nodePtr->level
62d0: 20 3e 20 30 29 20 7b 0a 09 6e 6f 64 65 50 74 72   > 0) {..nodePtr
62e0: 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 63 68 69 6c   = nodePtr->chil
62f0: 64 72 65 6e 2e 6e 6f 64 65 50 74 72 3b 0a 20 20  dren.nodePtr;.  
6300: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6e    }.    return n
6310: 6f 64 65 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e  odePtr->children
6320: 2e 6c 69 6e 65 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a  .linePtr;.}.../*
6330: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6380: 54 6b 42 54 72 65 65 4c 69 6e 65 49 6e 64 65 78  TkBTreeLineIndex
6390: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 69 76 65 6e 20   --. *. *.Given 
63a0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6c  a pointer to a l
63b0: 69 6e 65 20 69 6e 20 61 20 42 2d 74 72 65 65 2c  ine in a B-tree,
63c0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65   return the nume
63d0: 72 69 63 61 6c 0a 20 2a 09 69 6e 64 65 78 20 6f  rical. *.index o
63e0: 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 20 2a 0a  f that line.. *.
63f0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54   * Results:. *.T
6400: 68 65 20 72 65 73 75 6c 74 20 69 73 20 74 68 65  he result is the
6410: 20 69 6e 64 65 78 20 6f 66 20 6c 69 6e 65 50 74   index of linePt
6420: 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 65  r within the tre
6430: 65 2c 20 77 68 65 72 65 20 30 0a 20 2a 09 63 6f  e, where 0. *.co
6440: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
6450: 20 66 69 72 73 74 20 6c 69 6e 65 20 69 6e 20 74   first line in t
6460: 68 65 20 74 72 65 65 2e 0a 20 2a 0a 20 2a 20 53  he tree.. *. * S
6470: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
6480: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64d0: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6b 42 54 72  -. */..int.TkBTr
64e0: 65 65 4c 69 6e 65 49 6e 64 65 78 28 6c 69 6e 65  eeLineIndex(line
64f0: 50 74 72 29 0a 20 20 20 20 54 6b 54 65 78 74 4c  Ptr).    TkTextL
6500: 69 6e 65 20 2a 6c 69 6e 65 50 74 72 3b 09 09 2f  ine *linePtr;../
6510: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 78 69  * Pointer to exi
6520: 73 74 69 6e 67 20 6c 69 6e 65 20 69 6e 0a 09 09  sting line in...
6530: 09 09 09 20 2a 20 42 2d 74 72 65 65 2e 20 2a 2f  ... * B-tree. */
6540: 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  .{.    register 
6550: 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 69 6e 65  TkTextLine *line
6560: 50 74 72 32 3b 0a 20 20 20 20 72 65 67 69 73 74  Ptr2;.    regist
6570: 65 72 20 4e 6f 64 65 20 2a 6e 6f 64 65 50 74 72  er Node *nodePtr
6580: 2c 20 2a 70 61 72 65 6e 74 50 74 72 2c 20 2a 6e  , *parentPtr, *n
6590: 6f 64 65 50 74 72 32 3b 0a 20 20 20 20 69 6e 74  odePtr2;.    int
65a0: 20 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a 0a   index;..    /*.
65b0: 20 20 20 20 20 2a 20 46 69 72 73 74 20 63 6f 75       * First cou
65c0: 6e 74 20 68 6f 77 20 6d 61 6e 79 20 6c 69 6e 65  nt how many line
65d0: 73 20 70 72 65 63 65 64 65 20 74 68 69 73 20 6f  s precede this o
65e0: 6e 65 20 69 6e 20 69 74 73 20 6c 65 76 65 6c 2d  ne in its level-
65f0: 30 0a 20 20 20 20 20 2a 20 6e 6f 64 65 2e 0a 20  0.     * node.. 
6600: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6e 6f 64 65      */..    node
6610: 50 74 72 20 3d 20 6c 69 6e 65 50 74 72 2d 3e 70  Ptr = linePtr->p
6620: 61 72 65 6e 74 50 74 72 3b 0a 20 20 20 20 69 6e  arentPtr;.    in
6630: 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  dex = 0;.    for
6640: 20 28 6c 69 6e 65 50 74 72 32 20 3d 20 6e 6f 64   (linePtr2 = nod
6650: 65 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e 2e 6c  ePtr->children.l
6660: 69 6e 65 50 74 72 3b 20 6c 69 6e 65 50 74 72 32  inePtr; linePtr2
6670: 20 21 3d 20 6c 69 6e 65 50 74 72 3b 0a 09 20 20   != linePtr;..  
6680: 20 20 6c 69 6e 65 50 74 72 32 20 3d 20 6c 69 6e    linePtr2 = lin
6690: 65 50 74 72 32 2d 3e 6e 65 78 74 50 74 72 29 20  ePtr2->nextPtr) 
66a0: 7b 0a 09 69 66 20 28 6c 69 6e 65 50 74 72 32 20  {..if (linePtr2 
66b0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
66c0: 70 61 6e 69 63 28 22 54 6b 42 54 72 65 65 4c 69  panic("TkBTreeLi
66d0: 6e 65 49 6e 64 65 78 20 63 6f 75 6c 64 6e 27 74  neIndex couldn't
66e0: 20 66 69 6e 64 20 6c 69 6e 65 22 29 3b 0a 09 7d   find line");..}
66f0: 0a 09 69 6e 64 65 78 20 2b 3d 20 31 3b 0a 20 20  ..index += 1;.  
6700: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
6710: 20 2a 20 4e 6f 77 20 77 6f 72 6b 20 75 70 20 74   * Now work up t
6720: 68 72 6f 75 67 68 20 74 68 65 20 6c 65 76 65 6c  hrough the level
6730: 73 20 6f 66 20 74 68 65 20 74 72 65 65 20 6f 6e  s of the tree on
6740: 65 20 61 74 20 61 20 74 69 6d 65 2c 0a 20 20 20  e at a time,.   
6750: 20 20 2a 20 63 6f 75 6e 74 69 6e 67 20 68 6f 77    * counting how
6760: 20 6d 61 6e 79 20 6c 69 6e 65 73 20 61 72 65 20   many lines are 
6770: 69 6e 20 6e 6f 64 65 73 20 70 72 65 63 65 64 69  in nodes precedi
6780: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  ng the current. 
6790: 20 20 20 20 2a 20 6e 6f 64 65 2e 0a 20 20 20 20      * node..    
67a0: 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 28 70 61   */..    for (pa
67b0: 72 65 6e 74 50 74 72 20 3d 20 6e 6f 64 65 50 74  rentPtr = nodePt
67c0: 72 2d 3e 70 61 72 65 6e 74 50 74 72 20 3b 20 70  r->parentPtr ; p
67d0: 61 72 65 6e 74 50 74 72 20 21 3d 20 4e 55 4c 4c  arentPtr != NULL
67e0: 3b 0a 09 20 20 20 20 6e 6f 64 65 50 74 72 20 3d  ;..    nodePtr =
67f0: 20 70 61 72 65 6e 74 50 74 72 2c 20 70 61 72 65   parentPtr, pare
6800: 6e 74 50 74 72 20 3d 20 70 61 72 65 6e 74 50 74  ntPtr = parentPt
6810: 72 2d 3e 70 61 72 65 6e 74 50 74 72 29 20 7b 0a  r->parentPtr) {.
6820: 09 66 6f 72 20 28 6e 6f 64 65 50 74 72 32 20 3d  .for (nodePtr2 =
6830: 20 70 61 72 65 6e 74 50 74 72 2d 3e 63 68 69 6c   parentPtr->chil
6840: 64 72 65 6e 2e 6e 6f 64 65 50 74 72 3b 20 6e 6f  dren.nodePtr; no
6850: 64 65 50 74 72 32 20 21 3d 20 6e 6f 64 65 50 74  dePtr2 != nodePt
6860: 72 3b 0a 09 09 6e 6f 64 65 50 74 72 32 20 3d 20  r;...nodePtr2 = 
6870: 6e 6f 64 65 50 74 72 32 2d 3e 6e 65 78 74 50 74  nodePtr2->nextPt
6880: 72 29 20 7b 0a 09 20 20 20 20 69 66 20 28 6e 6f  r) {..    if (no
6890: 64 65 50 74 72 32 20 3d 3d 20 4e 55 4c 4c 29 20  dePtr2 == NULL) 
68a0: 7b 0a 09 09 70 61 6e 69 63 28 22 54 6b 42 54 72  {...panic("TkBTr
68b0: 65 65 4c 69 6e 65 49 6e 64 65 78 20 63 6f 75 6c  eeLineIndex coul
68c0: 64 6e 27 74 20 66 69 6e 64 20 6e 6f 64 65 22 29  dn't find node")
68d0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 6e  ;..    }..    in
68e0: 64 65 78 20 2b 3d 20 6e 6f 64 65 50 74 72 32 2d  dex += nodePtr2-
68f0: 3e 6e 75 6d 4c 69 6e 65 73 3b 0a 09 7d 0a 20 20  >numLines;..}.  
6900: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69    }.    return i
6910: 6e 64 65 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  ndex;.}.../*. *-
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6960: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 42 54  -----. *. * TkBT
6970: 72 65 65 4c 69 6e 6b 53 65 67 6d 65 6e 74 20 2d  reeLinkSegment -
6980: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
6990: 63 65 64 75 72 65 20 61 64 64 73 20 61 20 6e 65  cedure adds a ne
69a0: 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 61 20 42  w segment to a B
69b0: 2d 74 72 65 65 20 61 74 20 61 20 67 69 76 65 6e  -tree at a given
69c0: 0a 20 2a 09 6c 6f 63 61 74 69 6f 6e 2e 0a 20 2a  . *.location.. *
69d0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
69e0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  None.. *. * Side
69f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 67   effects:. *.Seg
6a00: 50 74 72 20 77 69 6c 6c 20 62 65 20 6c 69 6e 6b  Ptr will be link
6a10: 65 64 20 69 6e 74 6f 20 69 74 73 20 74 72 65 65  ed into its tree
6a20: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 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 0a 20 2a  -------------. *
6a70: 2f 0a 0a 09 2f 2a 20 41 52 47 53 55 53 45 44 20  /.../* ARGSUSED 
6a80: 2a 2f 0a 76 6f 69 64 0a 54 6b 42 54 72 65 65 4c  */.void.TkBTreeL
6a90: 69 6e 6b 53 65 67 6d 65 6e 74 28 73 65 67 50 74  inkSegment(segPt
6aa0: 72 2c 20 69 6e 64 65 78 50 74 72 29 0a 20 20 20  r, indexPtr).   
6ab0: 20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a   TkTextSegment *
6ac0: 73 65 67 50 74 72 3b 09 2f 2a 20 50 6f 69 6e 74  segPtr;./* Point
6ad0: 65 72 20 74 6f 20 6e 65 77 20 73 65 67 6d 65 6e  er to new segmen
6ae0: 74 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  t to be added to
6af0: 0a 09 09 09 09 20 2a 20 42 2d 74 72 65 65 2e 20  ..... * B-tree. 
6b00: 20 53 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 6c   Should be compl
6b10: 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65  etely initialize
6b20: 64 0a 09 09 09 09 20 2a 20 62 79 20 63 61 6c 6c  d..... * by call
6b30: 65 72 20 65 78 63 65 70 74 20 66 6f 72 20 6e 65  er except for ne
6b40: 78 74 50 74 72 20 66 69 65 6c 64 2e 20 2a 2f 0a  xtPtr field. */.
6b50: 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20      TkTextIndex 
6b60: 2a 69 6e 64 65 78 50 74 72 3b 09 2f 2a 20 57 68  *indexPtr;./* Wh
6b70: 65 72 65 20 74 6f 20 61 64 64 20 73 65 67 6d 65  ere to add segme
6b80: 6e 74 3a 20 20 69 74 20 67 65 74 73 20 6c 69 6e  nt:  it gets lin
6b90: 6b 65 64 0a 09 09 09 09 20 2a 20 69 6e 20 6a 75  ked..... * in ju
6ba0: 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 73 65  st before the se
6bb0: 67 6d 65 6e 74 20 69 6e 64 69 63 61 74 65 64 0a  gment indicated.
6bc0: 09 09 09 09 20 2a 20 68 65 72 65 2e 20 2a 2f 0a  .... * here. */.
6bd0: 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54  {.    register T
6be0: 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 70 72  kTextSegment *pr
6bf0: 65 76 50 74 72 3b 0a 0a 20 20 20 20 70 72 65 76  evPtr;..    prev
6c00: 50 74 72 20 3d 20 53 70 6c 69 74 53 65 67 28 69  Ptr = SplitSeg(i
6c10: 6e 64 65 78 50 74 72 29 3b 0a 20 20 20 20 69 66  ndexPtr);.    if
6c20: 20 28 70 72 65 76 50 74 72 20 3d 3d 20 4e 55 4c   (prevPtr == NUL
6c30: 4c 29 20 7b 0a 09 73 65 67 50 74 72 2d 3e 6e 65  L) {..segPtr->ne
6c40: 78 74 50 74 72 20 3d 20 69 6e 64 65 78 50 74 72  xtPtr = indexPtr
6c50: 2d 3e 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50 74  ->linePtr->segPt
6c60: 72 3b 0a 09 69 6e 64 65 78 50 74 72 2d 3e 6c 69  r;..indexPtr->li
6c70: 6e 65 50 74 72 2d 3e 73 65 67 50 74 72 20 3d 20  nePtr->segPtr = 
6c80: 73 65 67 50 74 72 3b 0a 20 20 20 20 7d 20 65 6c  segPtr;.    } el
6c90: 73 65 20 7b 0a 09 73 65 67 50 74 72 2d 3e 6e 65  se {..segPtr->ne
6ca0: 78 74 50 74 72 20 3d 20 70 72 65 76 50 74 72 2d  xtPtr = prevPtr-
6cb0: 3e 6e 65 78 74 50 74 72 3b 0a 09 70 72 65 76 50  >nextPtr;..prevP
6cc0: 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 73 65  tr->nextPtr = se
6cd0: 67 50 74 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  gPtr;.    }.    
6ce0: 43 6c 65 61 6e 75 70 4c 69 6e 65 28 69 6e 64 65  CleanupLine(inde
6cf0: 78 50 74 72 2d 3e 6c 69 6e 65 50 74 72 29 3b 0a  xPtr->linePtr);.
6d00: 20 20 20 20 69 66 20 28 74 6b 42 54 72 65 65 44      if (tkBTreeD
6d10: 65 62 75 67 29 20 7b 0a 09 54 6b 42 54 72 65 65  ebug) {..TkBTree
6d20: 43 68 65 63 6b 28 69 6e 64 65 78 50 74 72 2d 3e  Check(indexPtr->
6d30: 74 72 65 65 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c  tree);.    }.}..
6d40: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6d90: 20 2a 20 54 6b 42 54 72 65 65 55 6e 6c 69 6e 6b   * TkBTreeUnlink
6da0: 53 65 67 6d 65 6e 74 20 2d 2d 0a 20 2a 0a 20 2a  Segment --. *. *
6db0: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
6dc0: 75 6e 6c 69 6e 6b 73 20 61 20 73 65 67 6d 65 6e  unlinks a segmen
6dd0: 74 20 66 72 6f 6d 20 69 74 73 20 6c 69 6e 65 20  t from its line 
6de0: 69 6e 20 61 20 42 2d 74 72 65 65 2e 0a 20 2a 0a  in a B-tree.. *.
6df0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
6e00: 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
6e10: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 67 50  effects:. *.SegP
6e20: 74 72 20 77 69 6c 6c 20 62 65 20 75 6e 6c 69 6e  tr will be unlin
6e30: 6b 65 64 20 66 72 6f 6d 20 6c 69 6e 65 50 74 72  ked from linePtr
6e40: 2e 20 20 54 68 65 20 73 65 67 6d 65 6e 74 20 69  .  The segment i
6e50: 74 73 65 6c 66 0a 20 2a 09 69 73 6e 27 74 20 6d  tself. *.isn't m
6e60: 6f 64 69 66 69 65 64 20 62 79 20 74 68 69 73 20  odified by this 
6e70: 70 72 6f 63 65 64 75 72 65 2e 0a 20 2a 0a 20 2a  procedure.. *. *
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 09 2f 2a 20  ------. */.../* 
6ed0: 41 52 47 53 55 53 45 44 20 2a 2f 0a 76 6f 69 64  ARGSUSED */.void
6ee0: 0a 54 6b 42 54 72 65 65 55 6e 6c 69 6e 6b 53 65  .TkBTreeUnlinkSe
6ef0: 67 6d 65 6e 74 28 74 72 65 65 2c 20 73 65 67 50  gment(tree, segP
6f00: 74 72 2c 20 6c 69 6e 65 50 74 72 29 0a 20 20 20  tr, linePtr).   
6f10: 20 54 6b 54 65 78 74 42 54 72 65 65 20 74 72 65   TkTextBTree tre
6f20: 65 3b 09 09 09 2f 2a 20 54 72 65 65 20 63 6f 6e  e;.../* Tree con
6f30: 74 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 2e  taining segment.
6f40: 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 53 65   */.    TkTextSe
6f50: 67 6d 65 6e 74 20 2a 73 65 67 50 74 72 3b 09 09  gment *segPtr;..
6f60: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 62 65  /* Segment to be
6f70: 20 75 6e 6c 69 6e 6b 65 64 2e 20 2a 2f 0a 20 20   unlinked. */.  
6f80: 20 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 69    TkTextLine *li
6f90: 6e 65 50 74 72 3b 09 09 2f 2a 20 4c 69 6e 65 20  nePtr;../* Line 
6fa0: 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63  that currently c
6fb0: 6f 6e 74 61 69 6e 73 0a 09 09 09 09 09 20 2a 20  ontains...... * 
6fc0: 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 7b 0a 20 20  segment. */.{.  
6fd0: 20 20 72 65 67 69 73 74 65 72 20 54 6b 54 65 78    register TkTex
6fe0: 74 53 65 67 6d 65 6e 74 20 2a 70 72 65 76 50 74  tSegment *prevPt
6ff0: 72 3b 0a 0a 20 20 20 20 69 66 20 28 6c 69 6e 65  r;..    if (line
7000: 50 74 72 2d 3e 73 65 67 50 74 72 20 3d 3d 20 73  Ptr->segPtr == s
7010: 65 67 50 74 72 29 20 7b 0a 09 6c 69 6e 65 50 74  egPtr) {..linePt
7020: 72 2d 3e 73 65 67 50 74 72 20 3d 20 73 65 67 50  r->segPtr = segP
7030: 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 20 20 20  tr->nextPtr;.   
7040: 20 7d 20 65 6c 73 65 20 7b 0a 09 66 6f 72 20 28   } else {..for (
7050: 70 72 65 76 50 74 72 20 3d 20 6c 69 6e 65 50 74  prevPtr = linePt
7060: 72 2d 3e 73 65 67 50 74 72 3b 20 70 72 65 76 50  r->segPtr; prevP
7070: 74 72 2d 3e 6e 65 78 74 50 74 72 20 21 3d 20 73  tr->nextPtr != s
7080: 65 67 50 74 72 3b 0a 09 09 70 72 65 76 50 74 72  egPtr;...prevPtr
7090: 20 3d 20 70 72 65 76 50 74 72 2d 3e 6e 65 78 74   = prevPtr->next
70a0: 50 74 72 29 20 7b 0a 09 20 20 20 20 2f 2a 20 45  Ptr) {..    /* E
70b0: 6d 70 74 79 20 6c 6f 6f 70 20 62 6f 64 79 2e 20  mpty loop body. 
70c0: 2a 2f 0a 09 7d 0a 09 70 72 65 76 50 74 72 2d 3e  */..}..prevPtr->
70d0: 6e 65 78 74 50 74 72 20 3d 20 73 65 67 50 74 72  nextPtr = segPtr
70e0: 2d 3e 6e 65 78 74 50 74 72 3b 0a 20 20 20 20 7d  ->nextPtr;.    }
70f0: 0a 20 20 20 20 43 6c 65 61 6e 75 70 4c 69 6e 65  .    CleanupLine
7100: 28 6c 69 6e 65 50 74 72 29 3b 0a 7d 0a 0c 0a 2f  (linePtr);.}.../
7110: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
7160: 20 54 6b 42 54 72 65 65 54 61 67 20 2d 2d 0a 20   TkBTreeTag --. 
7170: 2a 0a 20 2a 09 54 75 72 6e 20 61 20 67 69 76 65  *. *.Turn a give
7180: 6e 20 74 61 67 20 6f 6e 20 6f 72 20 6f 66 66 20  n tag on or off 
7190: 66 6f 72 20 61 20 67 69 76 65 6e 20 72 61 6e 67  for a given rang
71a0: 65 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  e of characters 
71b0: 69 6e 0a 20 2a 09 61 20 42 2d 74 72 65 65 20 6f  in. *.a B-tree o
71c0: 66 20 74 65 78 74 2e 0a 20 2a 0a 20 2a 20 52 65  f text.. *. * Re
71d0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
71e0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
71f0: 74 73 3a 0a 20 2a 09 54 68 65 20 67 69 76 65 6e  ts:. *.The given
7200: 20 74 61 67 20 69 73 20 61 64 64 65 64 20 74 6f   tag is added to
7210: 20 74 68 65 20 67 69 76 65 6e 20 72 61 6e 67 65   the given range
7220: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 0a 20   of characters. 
7230: 2a 09 69 6e 20 74 68 65 20 74 72 65 65 20 6f 72  *.in the tree or
7240: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 61 6c   removed from al
7250: 6c 20 74 68 6f 73 65 20 63 68 61 72 61 63 74 65  l those characte
7260: 72 73 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 2a  rs, depending. *
7270: 09 6f 6e 20 74 68 65 20 22 61 64 64 22 20 61 72  .on the "add" ar
7280: 67 75 6d 65 6e 74 2e 20 20 54 68 65 20 73 74 72  gument.  The str
7290: 75 63 74 75 72 65 20 6f 66 20 74 68 65 20 62 74  ucture of the bt
72a0: 72 65 65 20 69 73 20 6d 6f 64 69 66 69 65 64 0a  ree is modified.
72b0: 20 2a 09 65 6e 6f 75 67 68 20 74 68 61 74 20 69   *.enough that i
72c0: 6e 64 65 78 31 50 74 72 20 61 6e 64 20 69 6e 64  ndex1Ptr and ind
72d0: 65 78 32 50 74 72 20 61 72 65 20 6e 6f 20 6c 6f  ex2Ptr are no lo
72e0: 6e 67 65 72 20 76 61 6c 69 64 20 61 66 74 65 72  nger valid after
72f0: 0a 20 2a 09 74 68 69 73 20 70 72 6f 63 65 64 75  . *.this procedu
7300: 72 65 20 72 65 74 75 72 6e 73 2c 20 61 6e 64 20  re returns, and 
7310: 74 68 65 20 69 6e 64 65 78 65 73 20 6d 61 79 20  the indexes may 
7320: 62 65 20 6d 6f 64 69 66 69 65 64 20 62 79 0a 20  be modified by. 
7330: 2a 09 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.this procedure
7340: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
7350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7390: 2f 0a 0a 76 6f 69 64 0a 54 6b 42 54 72 65 65 54  /..void.TkBTreeT
73a0: 61 67 28 69 6e 64 65 78 31 50 74 72 2c 20 69 6e  ag(index1Ptr, in
73b0: 64 65 78 32 50 74 72 2c 20 74 61 67 50 74 72 2c  dex2Ptr, tagPtr,
73c0: 20 61 64 64 29 0a 20 20 20 20 72 65 67 69 73 74   add).    regist
73d0: 65 72 20 54 6b 54 65 78 74 49 6e 64 65 78 20 2a  er TkTextIndex *
73e0: 69 6e 64 65 78 31 50 74 72 3b 09 2f 2a 20 49 6e  index1Ptr;./* In
73f0: 64 69 63 61 74 65 73 20 66 69 72 73 74 20 63 68  dicates first ch
7400: 61 72 61 63 74 65 72 20 69 6e 0a 09 09 09 09 09  aracter in......
7410: 20 2a 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20   * range. */.   
7420: 20 72 65 67 69 73 74 65 72 20 54 6b 54 65 78 74   register TkText
7430: 49 6e 64 65 78 20 2a 69 6e 64 65 78 32 50 74 72  Index *index2Ptr
7440: 3b 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 63  ;./* Indicates c
7450: 68 61 72 61 63 74 65 72 20 6a 75 73 74 20 61 66  haracter just af
7460: 74 65 72 20 74 68 65 0a 09 09 09 09 09 20 2a 20  ter the...... * 
7470: 6c 61 73 74 20 6f 6e 65 20 69 6e 20 72 61 6e 67  last one in rang
7480: 65 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74  e. */.    TkText
7490: 54 61 67 20 2a 74 61 67 50 74 72 3b 09 09 09 2f  Tag *tagPtr;.../
74a0: 2a 20 54 61 67 20 74 6f 20 61 64 64 20 6f 72 20  * Tag to add or 
74b0: 72 65 6d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 69  remove. */.    i
74c0: 6e 74 20 61 64 64 3b 09 09 09 09 2f 2a 20 4f 6e  nt add;..../* On
74d0: 65 20 6d 65 61 6e 73 20 61 64 64 20 74 61 67 20  e means add tag 
74e0: 74 6f 20 74 68 65 20 67 69 76 65 6e 0a 09 09 09  to the given....
74f0: 09 09 20 2a 20 72 61 6e 67 65 20 6f 66 20 63 68  .. * range of ch
7500: 61 72 61 63 74 65 72 73 3b 20 20 7a 65 72 6f 20  aracters;  zero 
7510: 6d 65 61 6e 73 0a 09 09 09 09 09 20 2a 20 72 65  means...... * re
7520: 6d 6f 76 65 20 74 68 65 20 74 61 67 20 66 72 6f  move the tag fro
7530: 6d 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  m the range. */.
7540: 7b 0a 20 20 20 20 54 6b 54 65 78 74 53 65 67 6d  {.    TkTextSegm
7550: 65 6e 74 20 2a 73 65 67 50 74 72 2c 20 2a 70 72  ent *segPtr, *pr
7560: 65 76 50 74 72 3b 0a 20 20 20 20 54 6b 54 65 78  evPtr;.    TkTex
7570: 74 53 65 61 72 63 68 20 73 65 61 72 63 68 3b 0a  tSearch search;.
7580: 20 20 20 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a      TkTextLine *
7590: 63 6c 65 61 6e 75 70 4c 69 6e 65 50 74 72 3b 0a  cleanupLinePtr;.
75a0: 20 20 20 20 69 6e 74 20 6f 6c 64 53 74 61 74 65      int oldState
75b0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
75c0: 20 53 65 65 20 77 68 65 74 68 65 72 20 74 68 65   See whether the
75d0: 20 74 61 67 20 69 73 20 70 72 65 73 65 6e 74 20   tag is present 
75e0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
75f0: 74 68 65 20 72 61 6e 67 65 2e 20 20 49 66 0a 20  the range.  If. 
7600: 20 20 20 20 2a 20 74 68 65 20 73 74 61 74 65 20      * the state 
7610: 64 6f 65 73 6e 27 74 20 61 6c 72 65 61 64 79 20  doesn't already 
7620: 6d 61 74 63 68 20 77 68 61 74 20 77 65 20 77 61  match what we wa
7630: 6e 74 20 74 68 65 6e 20 61 64 64 20 61 20 74 6f  nt then add a to
7640: 67 67 6c 65 0a 20 20 20 20 20 2a 20 74 68 65 72  ggle.     * ther
7650: 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  e..     */..    
7660: 6f 6c 64 53 74 61 74 65 20 3d 20 54 6b 42 54 72  oldState = TkBTr
7670: 65 65 43 68 61 72 54 61 67 67 65 64 28 69 6e 64  eeCharTagged(ind
7680: 65 78 31 50 74 72 2c 20 74 61 67 50 74 72 29 3b  ex1Ptr, tagPtr);
7690: 0a 20 20 20 20 69 66 20 28 28 61 64 64 20 21 3d  .    if ((add !=
76a0: 20 30 29 20 5e 20 6f 6c 64 53 74 61 74 65 29 20   0) ^ oldState) 
76b0: 7b 0a 09 73 65 67 50 74 72 20 3d 20 28 54 6b 54  {..segPtr = (TkT
76c0: 65 78 74 53 65 67 6d 65 6e 74 20 2a 29 20 63 6b  extSegment *) ck
76d0: 61 6c 6c 6f 63 28 54 53 45 47 5f 53 49 5a 45 29  alloc(TSEG_SIZE)
76e0: 3b 0a 09 73 65 67 50 74 72 2d 3e 74 79 70 65 50  ;..segPtr->typeP
76f0: 74 72 20 3d 20 28 61 64 64 29 20 3f 20 26 74 6b  tr = (add) ? &tk
7700: 54 65 78 74 54 6f 67 67 6c 65 4f 6e 54 79 70 65  TextToggleOnType
7710: 20 3a 20 26 74 6b 54 65 78 74 54 6f 67 67 6c 65   : &tkTextToggle
7720: 4f 66 66 54 79 70 65 3b 0a 09 70 72 65 76 50 74  OffType;..prevPt
7730: 72 20 3d 20 53 70 6c 69 74 53 65 67 28 69 6e 64  r = SplitSeg(ind
7740: 65 78 31 50 74 72 29 3b 0a 09 69 66 20 28 70 72  ex1Ptr);..if (pr
7750: 65 76 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  evPtr == NULL) {
7760: 0a 09 20 20 20 20 73 65 67 50 74 72 2d 3e 6e 65  ..    segPtr->ne
7770: 78 74 50 74 72 20 3d 20 69 6e 64 65 78 31 50 74  xtPtr = index1Pt
7780: 72 2d 3e 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50  r->linePtr->segP
7790: 74 72 3b 0a 09 20 20 20 20 69 6e 64 65 78 31 50  tr;..    index1P
77a0: 74 72 2d 3e 6c 69 6e 65 50 74 72 2d 3e 73 65 67  tr->linePtr->seg
77b0: 50 74 72 20 3d 20 73 65 67 50 74 72 3b 0a 09 7d  Ptr = segPtr;..}
77c0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73 65 67   else {..    seg
77d0: 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 70  Ptr->nextPtr = p
77e0: 72 65 76 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b  revPtr->nextPtr;
77f0: 0a 09 20 20 20 20 70 72 65 76 50 74 72 2d 3e 6e  ..    prevPtr->n
7800: 65 78 74 50 74 72 20 3d 20 73 65 67 50 74 72 3b  extPtr = segPtr;
7810: 0a 09 7d 0a 09 73 65 67 50 74 72 2d 3e 73 69 7a  ..}..segPtr->siz
7820: 65 20 3d 20 30 3b 0a 09 73 65 67 50 74 72 2d 3e  e = 0;..segPtr->
7830: 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 74 61 67 50  body.toggle.tagP
7840: 74 72 20 3d 20 74 61 67 50 74 72 3b 0a 09 73 65  tr = tagPtr;..se
7850: 67 50 74 72 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c  gPtr->body.toggl
7860: 65 2e 69 6e 4e 6f 64 65 43 6f 75 6e 74 73 20 3d  e.inNodeCounts =
7870: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
7880: 2a 0a 20 20 20 20 20 2a 20 53 63 61 6e 20 74 68  *.     * Scan th
7890: 65 20 72 61 6e 67 65 20 6f 66 20 63 68 61 72 61  e range of chara
78a0: 63 74 65 72 73 20 61 6e 64 20 64 65 6c 65 74 65  cters and delete
78b0: 20 61 6e 79 20 69 6e 74 65 72 6e 61 6c 20 74 61   any internal ta
78c0: 67 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 69 74  g.     * transit
78d0: 69 6f 6e 73 2e 20 20 4b 65 65 70 20 74 72 61 63  ions.  Keep trac
78e0: 6b 20 6f 66 20 77 68 61 74 20 74 68 65 20 6f 6c  k of what the ol
78f0: 64 20 73 74 61 74 65 20 77 61 73 20 61 74 20 74  d state was at t
7900: 68 65 20 65 6e 64 0a 20 20 20 20 20 2a 20 6f 66  he end.     * of
7910: 20 74 68 65 20 72 61 6e 67 65 2c 20 61 6e 64 20   the range, and 
7920: 61 64 64 20 61 20 74 6f 67 67 6c 65 20 74 68 65  add a toggle the
7930: 72 65 20 69 66 20 69 74 27 73 20 6e 65 65 64 65  re if it's neede
7940: 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  d..     */..    
7950: 54 6b 42 54 72 65 65 53 74 61 72 74 53 65 61 72  TkBTreeStartSear
7960: 63 68 28 69 6e 64 65 78 31 50 74 72 2c 20 69 6e  ch(index1Ptr, in
7970: 64 65 78 32 50 74 72 2c 20 74 61 67 50 74 72 2c  dex2Ptr, tagPtr,
7980: 20 26 73 65 61 72 63 68 29 3b 0a 20 20 20 20 63   &search);.    c
7990: 6c 65 61 6e 75 70 4c 69 6e 65 50 74 72 20 3d 20  leanupLinePtr = 
79a0: 69 6e 64 65 78 31 50 74 72 2d 3e 6c 69 6e 65 50  index1Ptr->lineP
79b0: 74 72 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 54  tr;.    while (T
79c0: 6b 42 54 72 65 65 4e 65 78 74 54 61 67 28 26 73  kBTreeNextTag(&s
79d0: 65 61 72 63 68 29 29 20 7b 0a 09 6f 6c 64 53 74  earch)) {..oldSt
79e0: 61 74 65 20 5e 3d 20 31 3b 0a 09 73 65 67 50 74  ate ^= 1;..segPt
79f0: 72 20 3d 20 73 65 61 72 63 68 2e 73 65 67 50 74  r = search.segPt
7a00: 72 3b 0a 09 70 72 65 76 50 74 72 20 3d 20 73 65  r;..prevPtr = se
7a10: 61 72 63 68 2e 63 75 72 49 6e 64 65 78 2e 6c 69  arch.curIndex.li
7a20: 6e 65 50 74 72 2d 3e 73 65 67 50 74 72 3b 0a 09  nePtr->segPtr;..
7a30: 69 66 20 28 70 72 65 76 50 74 72 20 3d 3d 20 73  if (prevPtr == s
7a40: 65 67 50 74 72 29 20 7b 0a 09 20 20 20 20 73 65  egPtr) {..    se
7a50: 61 72 63 68 2e 63 75 72 49 6e 64 65 78 2e 6c 69  arch.curIndex.li
7a60: 6e 65 50 74 72 2d 3e 73 65 67 50 74 72 20 3d 20  nePtr->segPtr = 
7a70: 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b  segPtr->nextPtr;
7a80: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
7a90: 77 68 69 6c 65 20 28 70 72 65 76 50 74 72 2d 3e  while (prevPtr->
7aa0: 6e 65 78 74 50 74 72 20 21 3d 20 73 65 67 50 74  nextPtr != segPt
7ab0: 72 29 20 7b 0a 09 09 70 72 65 76 50 74 72 20 3d  r) {...prevPtr =
7ac0: 20 70 72 65 76 50 74 72 2d 3e 6e 65 78 74 50 74   prevPtr->nextPt
7ad0: 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70  r;..    }..    p
7ae0: 72 65 76 50 74 72 2d 3e 6e 65 78 74 50 74 72 20  revPtr->nextPtr 
7af0: 3d 20 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74  = segPtr->nextPt
7b00: 72 3b 0a 09 7d 0a 09 69 66 20 28 73 65 67 50 74  r;..}..if (segPt
7b10: 72 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 69  r->body.toggle.i
7b20: 6e 4e 6f 64 65 43 6f 75 6e 74 73 29 20 7b 0a 09  nNodeCounts) {..
7b30: 20 20 20 20 43 68 61 6e 67 65 4e 6f 64 65 54 6f      ChangeNodeTo
7b40: 67 67 6c 65 43 6f 75 6e 74 28 73 65 61 72 63 68  ggleCount(search
7b50: 2e 63 75 72 49 6e 64 65 78 2e 6c 69 6e 65 50 74  .curIndex.linePt
7b60: 72 2d 3e 70 61 72 65 6e 74 50 74 72 2c 0a 09 09  r->parentPtr,...
7b70: 20 20 20 20 73 65 67 50 74 72 2d 3e 62 6f 64 79      segPtr->body
7b80: 2e 74 6f 67 67 6c 65 2e 74 61 67 50 74 72 2c 20  .toggle.tagPtr, 
7b90: 2d 31 29 3b 0a 09 20 20 20 20 73 65 67 50 74 72  -1);..    segPtr
7ba0: 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 69 6e  ->body.toggle.in
7bb0: 4e 6f 64 65 43 6f 75 6e 74 73 20 3d 20 30 3b 0a  NodeCounts = 0;.
7bc0: 09 7d 0a 09 63 6b 66 72 65 65 28 28 63 68 61 72  .}..ckfree((char
7bd0: 20 2a 29 20 73 65 67 50 74 72 29 3b 0a 0a 09 2f   *) segPtr);.../
7be0: 2a 0a 09 20 2a 20 54 68 65 20 63 6f 64 65 20 62  *.. * The code b
7bf0: 65 6c 6f 77 20 69 73 20 61 20 62 69 74 20 74 72  elow is a bit tr
7c00: 69 63 6b 79 2e 20 20 41 66 74 65 72 20 64 65 6c  icky.  After del
7c10: 65 74 69 6e 67 20 61 20 74 6f 67 67 6c 65 0a 09  eting a toggle..
7c20: 20 2a 20 77 65 20 65 76 65 6e 74 75 61 6c 6c 79   * we eventually
7c30: 20 68 61 76 65 20 74 6f 20 63 61 6c 6c 20 43 6c   have to call Cl
7c40: 65 61 6e 75 70 4c 69 6e 65 2c 20 69 6e 20 6f 72  eanupLine, in or
7c50: 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a 09 20 2a  der to allow.. *
7c60: 20 63 68 61 72 61 63 74 65 72 20 73 65 67 6d 65   character segme
7c70: 6e 74 73 20 74 6f 20 62 65 20 6d 65 72 67 65 64  nts to be merged
7c80: 20 74 6f 67 65 74 68 65 72 2e 20 20 54 6f 20 64   together.  To d
7c90: 6f 20 74 68 69 73 2c 20 77 65 0a 09 20 2a 20 72  o this, we.. * r
7ca0: 65 6d 65 6d 62 65 72 20 69 6e 20 63 6c 65 61 6e  emember in clean
7cb0: 75 70 4c 69 6e 65 50 74 72 20 61 20 6c 69 6e 65  upLinePtr a line
7cc0: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
7cd0: 65 0a 09 20 2a 20 63 6c 65 61 6e 65 64 20 75 70  e.. * cleaned up
7ce0: 2c 20 62 75 74 20 77 65 20 64 6f 6e 27 74 20 63  , but we don't c
7cf0: 6c 65 61 6e 20 69 74 20 75 70 20 75 6e 74 69 6c  lean it up until
7d00: 20 77 65 27 76 65 20 6d 6f 76 65 64 0a 09 20 2a   we've moved.. *
7d10: 20 6f 6e 20 74 6f 20 61 20 64 69 66 66 65 72 65   on to a differe
7d20: 6e 74 20 6c 69 6e 65 2e 20 20 54 68 61 74 20 77  nt line.  That w
7d30: 61 79 20 74 68 65 20 63 6c 65 61 6e 75 70 20 70  ay the cleanup p
7d40: 72 6f 63 65 73 73 0a 09 20 2a 20 77 6f 6e 27 74  rocess.. * won't
7d50: 20 67 6f 6f 66 20 75 70 20 73 65 67 50 74 72 2e   goof up segPtr.
7d60: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 63 6c 65 61  .. */...if (clea
7d70: 6e 75 70 4c 69 6e 65 50 74 72 20 21 3d 20 73 65  nupLinePtr != se
7d80: 61 72 63 68 2e 63 75 72 49 6e 64 65 78 2e 6c 69  arch.curIndex.li
7d90: 6e 65 50 74 72 29 20 7b 0a 09 20 20 20 20 43 6c  nePtr) {..    Cl
7da0: 65 61 6e 75 70 4c 69 6e 65 28 63 6c 65 61 6e 75  eanupLine(cleanu
7db0: 70 4c 69 6e 65 50 74 72 29 3b 0a 09 20 20 20 20  pLinePtr);..    
7dc0: 63 6c 65 61 6e 75 70 4c 69 6e 65 50 74 72 20 3d  cleanupLinePtr =
7dd0: 20 73 65 61 72 63 68 2e 63 75 72 49 6e 64 65 78   search.curIndex
7de0: 2e 6c 69 6e 65 50 74 72 3b 0a 09 7d 0a 20 20 20  .linePtr;..}.   
7df0: 20 7d 0a 20 20 20 20 69 66 20 28 28 61 64 64 20   }.    if ((add 
7e00: 21 3d 20 30 29 20 5e 20 6f 6c 64 53 74 61 74 65  != 0) ^ oldState
7e10: 29 20 7b 0a 09 73 65 67 50 74 72 20 3d 20 28 54  ) {..segPtr = (T
7e20: 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 29 20  kTextSegment *) 
7e30: 63 6b 61 6c 6c 6f 63 28 54 53 45 47 5f 53 49 5a  ckalloc(TSEG_SIZ
7e40: 45 29 3b 0a 09 73 65 67 50 74 72 2d 3e 74 79 70  E);..segPtr->typ
7e50: 65 50 74 72 20 3d 20 28 61 64 64 29 20 3f 20 26  ePtr = (add) ? &
7e60: 74 6b 54 65 78 74 54 6f 67 67 6c 65 4f 66 66 54  tkTextToggleOffT
7e70: 79 70 65 20 3a 20 26 74 6b 54 65 78 74 54 6f 67  ype : &tkTextTog
7e80: 67 6c 65 4f 6e 54 79 70 65 3b 0a 09 70 72 65 76  gleOnType;..prev
7e90: 50 74 72 20 3d 20 53 70 6c 69 74 53 65 67 28 69  Ptr = SplitSeg(i
7ea0: 6e 64 65 78 32 50 74 72 29 3b 0a 09 69 66 20 28  ndex2Ptr);..if (
7eb0: 70 72 65 76 50 74 72 20 3d 3d 20 4e 55 4c 4c 29  prevPtr == NULL)
7ec0: 20 7b 0a 09 20 20 20 20 73 65 67 50 74 72 2d 3e   {..    segPtr->
7ed0: 6e 65 78 74 50 74 72 20 3d 20 69 6e 64 65 78 32  nextPtr = index2
7ee0: 50 74 72 2d 3e 6c 69 6e 65 50 74 72 2d 3e 73 65  Ptr->linePtr->se
7ef0: 67 50 74 72 3b 0a 09 20 20 20 20 69 6e 64 65 78  gPtr;..    index
7f00: 32 50 74 72 2d 3e 6c 69 6e 65 50 74 72 2d 3e 73  2Ptr->linePtr->s
7f10: 65 67 50 74 72 20 3d 20 73 65 67 50 74 72 3b 0a  egPtr = segPtr;.
7f20: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73  .} else {..    s
7f30: 65 67 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d  egPtr->nextPtr =
7f40: 20 70 72 65 76 50 74 72 2d 3e 6e 65 78 74 50 74   prevPtr->nextPt
7f50: 72 3b 0a 09 20 20 20 20 70 72 65 76 50 74 72 2d  r;..    prevPtr-
7f60: 3e 6e 65 78 74 50 74 72 20 3d 20 73 65 67 50 74  >nextPtr = segPt
7f70: 72 3b 0a 09 7d 0a 09 73 65 67 50 74 72 2d 3e 73  r;..}..segPtr->s
7f80: 69 7a 65 20 3d 20 30 3b 0a 09 73 65 67 50 74 72  ize = 0;..segPtr
7f90: 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 74 61  ->body.toggle.ta
7fa0: 67 50 74 72 20 3d 20 74 61 67 50 74 72 3b 0a 09  gPtr = tagPtr;..
7fb0: 73 65 67 50 74 72 2d 3e 62 6f 64 79 2e 74 6f 67  segPtr->body.tog
7fc0: 67 6c 65 2e 69 6e 4e 6f 64 65 43 6f 75 6e 74 73  gle.inNodeCounts
7fd0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
7fe0: 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6c 65 61 6e   /*.     * Clean
7ff0: 75 70 20 63 6c 65 61 6e 75 70 4c 69 6e 65 50 74  up cleanupLinePt
8000: 72 20 61 6e 64 20 74 68 65 20 6c 61 73 74 20 6c  r and the last l
8010: 69 6e 65 20 6f 66 20 74 68 65 20 72 61 6e 67 65  ine of the range
8020: 2c 20 69 66 0a 20 20 20 20 20 2a 20 74 68 65 73  , if.     * thes
8030: 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  e are different.
8040: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 43 6c  .     */..    Cl
8050: 65 61 6e 75 70 4c 69 6e 65 28 63 6c 65 61 6e 75  eanupLine(cleanu
8060: 70 4c 69 6e 65 50 74 72 29 3b 0a 20 20 20 20 69  pLinePtr);.    i
8070: 66 20 28 63 6c 65 61 6e 75 70 4c 69 6e 65 50 74  f (cleanupLinePt
8080: 72 20 21 3d 20 69 6e 64 65 78 32 50 74 72 2d 3e  r != index2Ptr->
8090: 6c 69 6e 65 50 74 72 29 20 7b 0a 09 43 6c 65 61  linePtr) {..Clea
80a0: 6e 75 70 4c 69 6e 65 28 69 6e 64 65 78 32 50 74  nupLine(index2Pt
80b0: 72 2d 3e 6c 69 6e 65 50 74 72 29 3b 0a 20 20 20  r->linePtr);.   
80c0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 74 6b 42 54   }..    if (tkBT
80d0: 72 65 65 44 65 62 75 67 29 20 7b 0a 09 54 6b 42  reeDebug) {..TkB
80e0: 54 72 65 65 43 68 65 63 6b 28 69 6e 64 65 78 31  TreeCheck(index1
80f0: 50 74 72 2d 3e 74 72 65 65 29 3b 0a 20 20 20 20  Ptr->tree);.    
8100: 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  }.}.../*. *-----
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8150: 2d 0a 20 2a 0a 20 2a 20 43 68 61 6e 67 65 4e 6f  -. *. * ChangeNo
8160: 64 65 54 6f 67 67 6c 65 43 6f 75 6e 74 20 2d 2d  deToggleCount --
8170: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
8180: 65 64 75 72 65 20 69 6e 63 72 65 6d 65 6e 74 73  edure increments
8190: 20 6f 72 20 64 65 63 72 65 6d 65 6e 74 73 20 74   or decrements t
81a0: 68 65 20 74 6f 67 67 6c 65 20 63 6f 75 6e 74 20  he toggle count 
81b0: 66 6f 72 0a 20 2a 09 61 20 70 61 72 74 69 63 75  for. *.a particu
81c0: 6c 61 72 20 74 61 67 20 69 6e 20 61 20 70 61 72  lar tag in a par
81d0: 74 69 63 75 6c 61 72 20 6e 6f 64 65 20 61 6e 64  ticular node and
81e0: 20 61 6c 6c 20 69 74 73 20 61 6e 63 65 73 74 6f   all its ancesto
81f0: 72 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  rs.. *. * Result
8200: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
8210: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
8220: 20 2a 09 54 68 65 20 74 6f 67 67 6c 65 20 63 6f   *.The toggle co
8230: 75 6e 74 20 66 6f 72 20 74 61 67 20 69 73 20 61  unt for tag is a
8240: 64 6a 75 73 74 65 64 20 75 70 20 6f 72 20 64 6f  djusted up or do
8250: 77 6e 20 62 79 20 22 64 65 6c 74 61 22 20 69 6e  wn by "delta" in
8260: 0a 20 2a 09 6e 6f 64 65 50 74 72 2e 0a 20 2a 0a  . *.nodePtr.. *.
8270: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
8280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
82c0: 61 74 69 63 20 76 6f 69 64 0a 43 68 61 6e 67 65  atic void.Change
82d0: 4e 6f 64 65 54 6f 67 67 6c 65 43 6f 75 6e 74 28  NodeToggleCount(
82e0: 6e 6f 64 65 50 74 72 2c 20 74 61 67 50 74 72 2c  nodePtr, tagPtr,
82f0: 20 64 65 6c 74 61 29 0a 20 20 20 20 72 65 67 69   delta).    regi
8300: 73 74 65 72 20 4e 6f 64 65 20 2a 6e 6f 64 65 50  ster Node *nodeP
8310: 74 72 3b 09 09 2f 2a 20 4e 6f 64 65 20 77 68 6f  tr;../* Node who
8320: 73 65 20 74 6f 67 67 6c 65 20 63 6f 75 6e 74 20  se toggle count 
8330: 66 6f 72 20 61 20 74 61 67 0a 09 09 09 09 09 20  for a tag...... 
8340: 2a 20 6d 75 73 74 20 62 65 20 63 68 61 6e 67 65  * must be change
8350: 64 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74  d. */.    TkText
8360: 54 61 67 20 2a 74 61 67 50 74 72 3b 09 09 09 2f  Tag *tagPtr;.../
8370: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
8380: 6f 75 74 20 74 61 67 2e 20 2a 2f 0a 20 20 20 20  out tag. */.    
8390: 69 6e 74 20 64 65 6c 74 61 3b 09 09 09 09 2f 2a  int delta;..../*
83a0: 20 41 6d 6f 75 6e 74 20 74 6f 20 61 64 64 20 74   Amount to add t
83b0: 6f 20 63 75 72 72 65 6e 74 20 74 6f 67 67 6c 65  o current toggle
83c0: 0a 09 09 09 09 09 20 2a 20 63 6f 75 6e 74 20 66  ...... * count f
83d0: 6f 72 20 74 61 67 20 28 6d 61 79 20 62 65 20 6e  or tag (may be n
83e0: 65 67 61 74 69 76 65 29 2e 20 2a 2f 0a 7b 0a 20  egative). */.{. 
83f0: 20 20 20 72 65 67 69 73 74 65 72 20 53 75 6d 6d     register Summ
8400: 61 72 79 20 2a 73 75 6d 6d 61 72 79 50 74 72 2c  ary *summaryPtr,
8410: 20 2a 70 72 65 76 50 74 72 3b 0a 0a 20 20 20 20   *prevPtr;..    
8420: 2f 2a 0a 20 20 20 20 20 2a 20 49 74 65 72 61 74  /*.     * Iterat
8430: 65 20 6f 76 65 72 20 74 68 65 20 6e 6f 64 65 20  e over the node 
8440: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 61  and all of its a
8450: 6e 63 65 73 74 6f 72 73 2e 0a 20 20 20 20 20 2a  ncestors..     *
8460: 2f 0a 0a 20 20 20 20 66 6f 72 20 28 20 3b 20 6e  /..    for ( ; n
8470: 6f 64 65 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 20  odePtr != NULL; 
8480: 6e 6f 64 65 50 74 72 20 3d 20 6e 6f 64 65 50 74  nodePtr = nodePt
8490: 72 2d 3e 70 61 72 65 6e 74 50 74 72 29 20 7b 0a  r->parentPtr) {.
84a0: 09 2f 2a 0a 09 20 2a 20 53 65 65 20 69 66 20 74  ./*.. * See if t
84b0: 68 65 72 65 27 73 20 61 6c 72 65 61 64 79 20 61  here's already a
84c0: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69 73  n entry for this
84d0: 20 74 61 67 20 66 6f 72 20 74 68 69 73 20 6e 6f   tag for this no
84e0: 64 65 2e 20 20 49 66 20 73 6f 2c 0a 09 20 2a 20  de.  If so,.. * 
84f0: 70 65 72 68 61 70 73 20 61 6c 6c 20 77 65 20 68  perhaps all we h
8500: 61 76 65 20 74 6f 20 64 6f 20 69 73 20 61 64 6a  ave to do is adj
8510: 75 73 74 20 69 74 73 20 63 6f 75 6e 74 2e 0a 09  ust its count...
8520: 20 2a 2f 0a 20 20 20 20 0a 09 66 6f 72 20 28 70   */.    ..for (p
8530: 72 65 76 50 74 72 20 3d 20 4e 55 4c 4c 2c 20 73  revPtr = NULL, s
8540: 75 6d 6d 61 72 79 50 74 72 20 3d 20 6e 6f 64 65  ummaryPtr = node
8550: 50 74 72 2d 3e 73 75 6d 6d 61 72 79 50 74 72 3b  Ptr->summaryPtr;
8560: 0a 09 09 73 75 6d 6d 61 72 79 50 74 72 20 21 3d  ...summaryPtr !=
8570: 20 4e 55 4c 4c 3b 0a 09 09 70 72 65 76 50 74 72   NULL;...prevPtr
8580: 20 3d 20 73 75 6d 6d 61 72 79 50 74 72 2c 20 73   = summaryPtr, s
8590: 75 6d 6d 61 72 79 50 74 72 20 3d 20 73 75 6d 6d  ummaryPtr = summ
85a0: 61 72 79 50 74 72 2d 3e 6e 65 78 74 50 74 72 29  aryPtr->nextPtr)
85b0: 20 7b 0a 09 20 20 20 20 69 66 20 28 73 75 6d 6d   {..    if (summ
85c0: 61 72 79 50 74 72 2d 3e 74 61 67 50 74 72 20 21  aryPtr->tagPtr !
85d0: 3d 20 74 61 67 50 74 72 29 20 7b 0a 09 09 63 6f  = tagPtr) {...co
85e0: 6e 74 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09  ntinue;..    }..
85f0: 20 20 20 20 73 75 6d 6d 61 72 79 50 74 72 2d 3e      summaryPtr->
8600: 74 6f 67 67 6c 65 43 6f 75 6e 74 20 2b 3d 20 64  toggleCount += d
8610: 65 6c 74 61 3b 0a 09 20 20 20 20 69 66 20 28 73  elta;..    if (s
8620: 75 6d 6d 61 72 79 50 74 72 2d 3e 74 6f 67 67 6c  ummaryPtr->toggl
8630: 65 43 6f 75 6e 74 20 3e 20 30 29 20 7b 0a 09 09  eCount > 0) {...
8640: 67 6f 74 6f 20 6e 65 78 74 41 6e 63 65 73 74 6f  goto nextAncesto
8650: 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69  r;..    }..    i
8660: 66 20 28 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74  f (summaryPtr->t
8670: 6f 67 67 6c 65 43 6f 75 6e 74 20 3c 20 30 29 20  oggleCount < 0) 
8680: 7b 0a 09 09 70 61 6e 69 63 28 22 43 68 61 6e 67  {...panic("Chang
8690: 65 4e 6f 64 65 54 6f 67 67 6c 65 43 6f 75 6e 74  eNodeToggleCount
86a0: 3a 20 6e 65 67 61 74 69 76 65 20 74 6f 67 67 6c  : negative toggl
86b0: 65 20 63 6f 75 6e 74 22 29 3b 0a 09 20 20 20 20  e count");..    
86c0: 7d 0a 20 20 20 20 0a 09 20 20 20 20 2f 2a 0a 09  }.    ..    /*..
86d0: 20 20 20 20 20 2a 20 5a 65 72 6f 20 63 6f 75 6e       * Zero coun
86e0: 74 3b 20 20 6d 75 73 74 20 72 65 6d 6f 76 65 20  t;  must remove 
86f0: 74 68 69 73 20 74 61 67 20 66 72 6f 6d 20 74 68  this tag from th
8700: 65 20 6c 69 73 74 2e 0a 09 20 20 20 20 20 2a 2f  e list...     */
8710: 0a 20 20 20 20 0a 09 20 20 20 20 69 66 20 28 70  .    ..    if (p
8720: 72 65 76 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  revPtr == NULL) 
8730: 7b 0a 09 09 6e 6f 64 65 50 74 72 2d 3e 73 75 6d  {...nodePtr->sum
8740: 6d 61 72 79 50 74 72 20 3d 20 73 75 6d 6d 61 72  maryPtr = summar
8750: 79 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09  yPtr->nextPtr;..
8760: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 70      } else {...p
8770: 72 65 76 50 74 72 2d 3e 6e 65 78 74 50 74 72 20  revPtr->nextPtr 
8780: 3d 20 73 75 6d 6d 61 72 79 50 74 72 2d 3e 6e 65  = summaryPtr->ne
8790: 78 74 50 74 72 3b 0a 09 20 20 20 20 7d 0a 09 20  xtPtr;..    }.. 
87a0: 20 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 20     ckfree((char 
87b0: 2a 29 20 73 75 6d 6d 61 72 79 50 74 72 29 3b 0a  *) summaryPtr);.
87c0: 09 20 20 20 20 67 6f 74 6f 20 6e 65 78 74 41 6e  .    goto nextAn
87d0: 63 65 73 74 6f 72 3b 0a 09 7d 0a 20 20 20 20 0a  cestor;..}.    .
87e0: 09 2f 2a 0a 09 20 2a 20 54 68 69 73 20 74 61 67  ./*.. * This tag
87f0: 20 69 73 6e 27 74 20 69 6e 20 74 68 65 20 6c 69   isn't in the li
8800: 73 74 2e 20 20 41 64 64 20 61 20 6e 65 77 20 65  st.  Add a new e
8810: 6e 74 72 79 20 74 6f 20 74 68 65 20 6c 69 73 74  ntry to the list
8820: 2e 0a 09 20 2a 2f 0a 20 20 20 20 0a 09 69 66 20  ... */.    ..if 
8830: 28 64 65 6c 74 61 20 3c 20 30 29 20 7b 0a 09 20  (delta < 0) {.. 
8840: 20 20 20 70 61 6e 69 63 28 22 43 68 61 6e 67 65     panic("Change
8850: 4e 6f 64 65 54 6f 67 67 6c 65 43 6f 75 6e 74 3a  NodeToggleCount:
8860: 20 6e 65 67 61 74 69 76 65 20 64 65 6c 74 61 2c   negative delta,
8870: 20 6e 6f 20 74 61 67 20 65 6e 74 72 79 22 29 3b   no tag entry");
8880: 0a 09 7d 0a 09 73 75 6d 6d 61 72 79 50 74 72 20  ..}..summaryPtr 
8890: 3d 20 28 53 75 6d 6d 61 72 79 20 2a 29 20 63 6b  = (Summary *) ck
88a0: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53 75 6d  alloc(sizeof(Sum
88b0: 6d 61 72 79 29 29 3b 0a 09 73 75 6d 6d 61 72 79  mary));..summary
88c0: 50 74 72 2d 3e 74 61 67 50 74 72 20 3d 20 74 61  Ptr->tagPtr = ta
88d0: 67 50 74 72 3b 0a 09 73 75 6d 6d 61 72 79 50 74  gPtr;..summaryPt
88e0: 72 2d 3e 74 6f 67 67 6c 65 43 6f 75 6e 74 20 3d  r->toggleCount =
88f0: 20 64 65 6c 74 61 3b 0a 09 73 75 6d 6d 61 72 79   delta;..summary
8900: 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 6e  Ptr->nextPtr = n
8910: 6f 64 65 50 74 72 2d 3e 73 75 6d 6d 61 72 79 50  odePtr->summaryP
8920: 74 72 3b 0a 09 6e 6f 64 65 50 74 72 2d 3e 73 75  tr;..nodePtr->su
8930: 6d 6d 61 72 79 50 74 72 20 3d 20 73 75 6d 6d 61  mmaryPtr = summa
8940: 72 79 50 74 72 3b 0a 0a 09 6e 65 78 74 41 6e 63  ryPtr;...nextAnc
8950: 65 73 74 6f 72 3a 0a 09 63 6f 6e 74 69 6e 75 65  estor:..continue
8960: 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20  ;.    }.}.../*. 
8970: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b  -------. *. * Tk
89c0: 42 54 72 65 65 53 74 61 72 74 53 65 61 72 63 68  BTreeStartSearch
89d0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
89e0: 72 6f 63 65 64 75 72 65 20 73 65 74 73 20 75 70  rocedure sets up
89f0: 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 74 61   a search for ta
8a00: 67 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  g transitions in
8a10: 76 6f 6c 76 69 6e 67 0a 20 2a 09 61 20 67 69 76  volving. *.a giv
8a20: 65 6e 20 74 61 67 20 28 6f 72 20 61 6c 6c 20 74  en tag (or all t
8a30: 61 67 73 29 20 69 6e 20 61 20 67 69 76 65 6e 20  ags) in a given 
8a40: 72 61 6e 67 65 20 6f 66 20 74 68 65 20 74 65 78  range of the tex
8a50: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  t.. *. * Results
8a60: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
8a70: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
8a80: 2a 09 54 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  *.The informatio
8a90: 6e 20 61 74 20 2a 73 65 61 72 63 68 50 74 72 20  n at *searchPtr 
8aa0: 69 73 20 73 65 74 20 75 70 20 73 6f 20 74 68 61  is set up so tha
8ab0: 74 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  t subsequent cal
8ac0: 6c 73 0a 20 2a 09 74 6f 20 54 6b 42 54 72 65 65  ls. *.to TkBTree
8ad0: 4e 65 78 74 54 61 67 20 77 69 6c 6c 20 72 65 74  NextTag will ret
8ae0: 75 72 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  urn information 
8af0: 61 62 6f 75 74 20 74 68 65 20 6c 6f 63 61 74 69  about the locati
8b00: 6f 6e 73 20 6f 66 0a 20 2a 09 74 61 67 20 74 72  ons of. *.tag tr
8b10: 61 6e 73 69 74 69 6f 6e 73 2e 20 20 4e 6f 74 65  ansitions.  Note
8b20: 20 74 68 61 74 20 54 6b 42 54 72 65 65 4e 65 78   that TkBTreeNex
8b30: 74 54 61 67 20 6d 75 73 74 20 62 65 20 63 61 6c  tTag must be cal
8b40: 6c 65 64 20 74 6f 20 67 65 74 0a 20 2a 09 74 68  led to get. *.th
8b50: 65 20 66 69 72 73 74 20 74 72 61 6e 73 69 74 69  e first transiti
8b60: 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  on.. *. *-------
8b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8bb0: 20 2a 2f 0a 0a 76 6f 69 64 0a 54 6b 42 54 72 65   */..void.TkBTre
8bc0: 65 53 74 61 72 74 53 65 61 72 63 68 28 69 6e 64  eStartSearch(ind
8bd0: 65 78 31 50 74 72 2c 20 69 6e 64 65 78 32 50 74  ex1Ptr, index2Pt
8be0: 72 2c 20 74 61 67 50 74 72 2c 20 73 65 61 72 63  r, tagPtr, searc
8bf0: 68 50 74 72 29 0a 20 20 20 20 54 6b 54 65 78 74  hPtr).    TkText
8c00: 49 6e 64 65 78 20 2a 69 6e 64 65 78 31 50 74 72  Index *index1Ptr
8c10: 3b 09 09 2f 2a 20 53 65 61 72 63 68 20 73 74 61  ;../* Search sta
8c20: 72 74 73 20 68 65 72 65 2e 20 20 54 61 67 20 74  rts here.  Tag t
8c30: 6f 67 67 6c 65 73 0a 09 09 09 09 09 20 2a 20 61  oggles...... * a
8c40: 74 20 74 68 69 73 20 70 6f 73 69 74 69 6f 6e 20  t this position 
8c50: 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 09 09 09 09  will not be.....
8c60: 09 20 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f  . * returned. */
8c70: 0a 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78  .    TkTextIndex
8c80: 20 2a 69 6e 64 65 78 32 50 74 72 3b 09 09 2f 2a   *index2Ptr;../*
8c90: 20 53 65 61 72 63 68 20 73 74 6f 70 73 20 68 65   Search stops he
8ca0: 72 65 2e 20 20 54 61 67 20 74 6f 67 67 6c 65 73  re.  Tag toggles
8cb0: 0a 09 09 09 09 09 20 2a 20 61 74 20 74 68 69 73  ...... * at this
8cc0: 20 70 6f 73 69 74 69 6f 6e 20 2a 77 69 6c 6c 2a   position *will*
8cd0: 20 62 65 0a 09 09 09 09 09 20 2a 20 72 65 74 75   be...... * retu
8ce0: 72 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 54 6b 54  rned. */.    TkT
8cf0: 65 78 74 54 61 67 20 2a 74 61 67 50 74 72 3b 09  extTag *tagPtr;.
8d00: 09 09 2f 2a 20 54 61 67 20 74 6f 20 73 65 61 72  ../* Tag to sear
8d10: 63 68 20 66 6f 72 2e 20 20 4e 55 4c 4c 20 6d 65  ch for.  NULL me
8d20: 61 6e 73 0a 09 09 09 09 09 20 2a 20 73 65 61 72  ans...... * sear
8d30: 63 68 20 66 6f 72 20 61 6e 79 20 74 61 67 2e 20  ch for any tag. 
8d40: 2a 2f 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  */.    register 
8d50: 54 6b 54 65 78 74 53 65 61 72 63 68 20 2a 73 65  TkTextSearch *se
8d60: 61 72 63 68 50 74 72 3b 09 2f 2a 20 57 68 65 72  archPtr;./* Wher
8d70: 65 20 74 6f 20 73 74 6f 72 65 20 69 6e 66 6f 72  e to store infor
8d80: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 0a 09 09 09  mation about....
8d90: 09 09 20 2a 20 73 65 61 72 63 68 27 73 20 70 72  .. * search's pr
8da0: 6f 67 72 65 73 73 2e 20 2a 2f 0a 7b 0a 20 20 20  ogress. */.{.   
8db0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 0a 0a 20 20   int offset;..  
8dc0: 20 20 73 65 61 72 63 68 50 74 72 2d 3e 63 75 72    searchPtr->cur
8dd0: 49 6e 64 65 78 20 3d 20 2a 69 6e 64 65 78 31 50  Index = *index1P
8de0: 74 72 3b 0a 20 20 20 20 73 65 61 72 63 68 50 74  tr;.    searchPt
8df0: 72 2d 3e 73 65 67 50 74 72 20 3d 20 4e 55 4c 4c  r->segPtr = NULL
8e00: 3b 0a 20 20 20 20 73 65 61 72 63 68 50 74 72 2d  ;.    searchPtr-
8e10: 3e 6e 65 78 74 50 74 72 20 3d 20 54 6b 54 65 78  >nextPtr = TkTex
8e20: 74 49 6e 64 65 78 54 6f 53 65 67 28 69 6e 64 65  tIndexToSeg(inde
8e30: 78 31 50 74 72 2c 20 26 6f 66 66 73 65 74 29 3b  x1Ptr, &offset);
8e40: 0a 20 20 20 20 73 65 61 72 63 68 50 74 72 2d 3e  .    searchPtr->
8e50: 63 75 72 49 6e 64 65 78 2e 63 68 61 72 49 6e 64  curIndex.charInd
8e60: 65 78 20 2d 3d 20 6f 66 66 73 65 74 3b 0a 20 20  ex -= offset;.  
8e70: 20 20 73 65 61 72 63 68 50 74 72 2d 3e 6c 61 73    searchPtr->las
8e80: 74 50 74 72 20 3d 20 54 6b 54 65 78 74 49 6e 64  tPtr = TkTextInd
8e90: 65 78 54 6f 53 65 67 28 69 6e 64 65 78 32 50 74  exToSeg(index2Pt
8ea0: 72 2c 20 28 69 6e 74 20 2a 29 20 4e 55 4c 4c 29  r, (int *) NULL)
8eb0: 3b 0a 20 20 20 20 73 65 61 72 63 68 50 74 72 2d  ;.    searchPtr-
8ec0: 3e 74 61 67 50 74 72 20 3d 20 74 61 67 50 74 72  >tagPtr = tagPtr
8ed0: 3b 0a 20 20 20 20 73 65 61 72 63 68 50 74 72 2d  ;.    searchPtr-
8ee0: 3e 6c 69 6e 65 73 4c 65 66 74 20 3d 20 54 6b 42  >linesLeft = TkB
8ef0: 54 72 65 65 4c 69 6e 65 49 6e 64 65 78 28 69 6e  TreeLineIndex(in
8f00: 64 65 78 32 50 74 72 2d 3e 6c 69 6e 65 50 74 72  dex2Ptr->linePtr
8f10: 29 20 2b 20 31 0a 09 20 20 20 20 2d 20 54 6b 42  ) + 1..    - TkB
8f20: 54 72 65 65 4c 69 6e 65 49 6e 64 65 78 28 69 6e  TreeLineIndex(in
8f30: 64 65 78 31 50 74 72 2d 3e 6c 69 6e 65 50 74 72  dex1Ptr->linePtr
8f40: 29 3b 0a 20 20 20 20 73 65 61 72 63 68 50 74 72  );.    searchPtr
8f50: 2d 3e 61 6c 6c 54 61 67 73 20 3d 20 28 74 61 67  ->allTags = (tag
8f60: 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 3b 0a 20 20  Ptr == NULL);.  
8f70: 20 20 69 66 20 28 73 65 61 72 63 68 50 74 72 2d    if (searchPtr-
8f80: 3e 6c 69 6e 65 73 4c 65 66 74 20 3d 3d 20 31 29  >linesLeft == 1)
8f90: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 74 61 72 74   {../*.. * Start
8fa0: 69 6e 67 20 61 6e 64 20 73 74 6f 70 70 69 6e 67  ing and stopping
8fb0: 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 69 6e   segments are in
8fc0: 20 74 68 65 20 73 61 6d 65 20 6c 69 6e 65 3b 20   the same line; 
8fd0: 6d 61 72 6b 20 74 68 65 0a 09 20 2a 20 73 65 61  mark the.. * sea
8fe0: 72 63 68 20 61 73 20 6f 76 65 72 20 69 6d 6d 65  rch as over imme
8ff0: 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 73  diately if the s
9000: 65 63 6f 6e 64 20 73 65 67 6d 65 6e 74 20 69 73  econd segment is
9010: 20 62 65 66 6f 72 65 20 74 68 65 0a 09 20 2a 20   before the.. * 
9020: 66 69 72 73 74 2e 0a 09 20 2a 2f 0a 0a 09 69 66  first... */...if
9030: 20 28 69 6e 64 65 78 31 50 74 72 2d 3e 63 68 61   (index1Ptr->cha
9040: 72 49 6e 64 65 78 20 3e 3d 20 69 6e 64 65 78 32  rIndex >= index2
9050: 50 74 72 2d 3e 63 68 61 72 49 6e 64 65 78 29 20  Ptr->charIndex) 
9060: 7b 0a 09 20 20 20 20 73 65 61 72 63 68 50 74 72  {..    searchPtr
9070: 2d 3e 6c 69 6e 65 73 4c 65 66 74 20 3d 20 30 3b  ->linesLeft = 0;
9080: 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a  ..}.    }.}.../*
9090: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
90a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
90e0: 54 6b 42 54 72 65 65 4e 65 78 74 54 61 67 20 2d  TkBTreeNextTag -
90f0: 2d 0a 20 2a 0a 20 2a 09 4f 6e 63 65 20 61 20 74  -. *. *.Once a t
9100: 61 67 20 73 65 61 72 63 68 20 68 61 73 20 62 65  ag search has be
9110: 67 75 6e 2c 20 73 75 63 63 65 73 73 69 76 65 20  gun, successive 
9120: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 70 72  calls to this pr
9130: 6f 63 65 64 75 72 65 0a 20 2a 09 72 65 74 75 72  ocedure. *.retur
9140: 6e 20 73 75 63 63 65 73 73 69 76 65 20 74 61 67  n successive tag
9150: 20 74 6f 67 67 6c 65 73 2e 20 20 4e 6f 74 65 3a   toggles.  Note:
9160: 20 20 69 74 20 69 73 20 4e 4f 54 20 53 41 46 45    it is NOT SAFE
9170: 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 0a 20 2a   to call this. *
9180: 09 70 72 6f 63 65 64 75 72 65 20 69 66 20 63 68  .procedure if ch
9190: 61 72 61 63 74 65 72 73 20 68 61 76 65 20 62 65  aracters have be
91a0: 65 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  en inserted into
91b0: 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d   or deleted from
91c0: 0a 20 2a 09 74 68 65 20 42 2d 74 72 65 65 20 73  . *.the B-tree s
91d0: 69 6e 63 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ince the call to
91e0: 20 54 6b 42 54 72 65 65 53 74 61 72 74 53 65 61   TkBTreeStartSea
91f0: 72 63 68 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  rch.. *. * Resul
9200: 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72  ts:. *.The retur
9210: 6e 20 76 61 6c 75 65 20 69 73 20 31 20 69 66 20  n value is 1 if 
9220: 61 6e 6f 74 68 65 72 20 74 6f 67 67 6c 65 20 77  another toggle w
9230: 61 73 20 66 6f 75 6e 64 20 74 68 61 74 20 6d 65  as found that me
9240: 74 20 74 68 65 0a 20 2a 09 63 72 69 74 65 72 69  t the. *.criteri
9250: 61 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  a specified in t
9260: 68 65 20 63 61 6c 6c 20 74 6f 20 54 6b 42 54 72  he call to TkBTr
9270: 65 65 53 74 61 72 74 53 65 61 72 63 68 3b 20 20  eeStartSearch;  
9280: 69 6e 20 74 68 69 73 0a 20 2a 09 63 61 73 65 20  in this. *.case 
9290: 73 65 61 72 63 68 50 74 72 2d 3e 63 75 72 49 6e  searchPtr->curIn
92a0: 64 65 78 20 67 69 76 65 73 20 74 68 65 20 74 6f  dex gives the to
92b0: 67 67 6c 65 27 73 20 70 6f 73 69 74 69 6f 6e 20  ggle's position 
92c0: 61 6e 64 0a 20 2a 09 73 65 61 72 63 68 50 74 72  and. *.searchPtr
92d0: 2d 3e 63 75 72 54 61 67 50 74 72 20 70 6f 69 6e  ->curTagPtr poin
92e0: 74 73 20 74 6f 20 69 74 73 20 73 65 67 6d 65 6e  ts to its segmen
92f0: 74 2e 20 20 30 20 69 73 20 72 65 74 75 72 6e 65  t.  0 is returne
9300: 64 20 69 66 0a 20 2a 09 6e 6f 20 6d 6f 72 65 20  d if. *.no more 
9310: 6d 61 74 63 68 69 6e 67 20 74 61 67 20 74 72 61  matching tag tra
9320: 6e 73 69 74 69 6f 6e 73 20 77 65 72 65 20 66 6f  nsitions were fo
9330: 75 6e 64 3b 20 69 6e 20 74 68 69 73 20 63 61 73  und; in this cas
9340: 65 0a 20 2a 09 73 65 61 72 63 68 50 74 72 2d 3e  e. *.searchPtr->
9350: 63 75 72 49 6e 64 65 78 20 69 73 20 74 68 65 20  curIndex is the 
9360: 73 61 6d 65 20 61 73 20 73 65 61 72 63 68 50 74  same as searchPt
9370: 72 2d 3e 73 74 6f 70 49 6e 64 65 78 2e 0a 20 2a  r->stopIndex.. *
9380: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
9390: 3a 0a 20 2a 09 49 6e 66 6f 72 6d 61 74 69 6f 6e  :. *.Information
93a0: 20 69 6e 20 2a 73 65 61 72 63 68 50 74 72 20 69   in *searchPtr i
93b0: 73 20 6d 6f 64 69 66 69 65 64 20 74 6f 20 75 70  s modified to up
93c0: 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f  date the state o
93d0: 66 20 74 68 65 0a 20 2a 09 73 65 61 72 63 68 20  f the. *.search 
93e0: 61 6e 64 20 69 6e 64 69 63 61 74 65 20 77 68 65  and indicate whe
93f0: 72 65 20 74 68 65 20 6e 65 78 74 20 74 61 67 20  re the next tag 
9400: 74 6f 67 67 6c 65 20 69 73 20 6c 6f 63 61 74 65  toggle is locate
9410: 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d.. *. *--------
9420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
9460: 2a 2f 0a 0a 69 6e 74 0a 54 6b 42 54 72 65 65 4e  */..int.TkBTreeN
9470: 65 78 74 54 61 67 28 73 65 61 72 63 68 50 74 72  extTag(searchPtr
9480: 29 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54  ).    register T
9490: 6b 54 65 78 74 53 65 61 72 63 68 20 2a 73 65 61  kTextSearch *sea
94a0: 72 63 68 50 74 72 3b 09 2f 2a 20 49 6e 66 6f 72  rchPtr;./* Infor
94b0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 73 65 61  mation about sea
94c0: 72 63 68 20 69 6e 0a 09 09 09 09 09 20 2a 20 70  rch in...... * p
94d0: 72 6f 67 72 65 73 73 3b 20 20 6d 75 73 74 20 68  rogress;  must h
94e0: 61 76 65 20 62 65 65 6e 20 73 65 74 20 75 70 20  ave been set up 
94f0: 62 79 0a 09 09 09 09 09 20 2a 20 63 61 6c 6c 20  by...... * call 
9500: 74 6f 20 54 6b 42 54 72 65 65 53 74 61 72 74 53  to TkBTreeStartS
9510: 65 61 72 63 68 2e 20 2a 2f 0a 7b 0a 20 20 20 20  earch. */.{.    
9520: 72 65 67 69 73 74 65 72 20 54 6b 54 65 78 74 53  register TkTextS
9530: 65 67 6d 65 6e 74 20 2a 73 65 67 50 74 72 3b 0a  egment *segPtr;.
9540: 20 20 20 20 72 65 67 69 73 74 65 72 20 4e 6f 64      register Nod
9550: 65 20 2a 6e 6f 64 65 50 74 72 3b 0a 20 20 20 20  e *nodePtr;.    
9560: 72 65 67 69 73 74 65 72 20 53 75 6d 6d 61 72 79  register Summary
9570: 20 2a 73 75 6d 6d 61 72 79 50 74 72 3b 0a 0a 20   *summaryPtr;.. 
9580: 20 20 20 69 66 20 28 73 65 61 72 63 68 50 74 72     if (searchPtr
9590: 2d 3e 6c 69 6e 65 73 4c 65 66 74 20 3c 3d 20 30  ->linesLeft <= 0
95a0: 29 20 7b 0a 09 67 6f 74 6f 20 73 65 61 72 63 68  ) {..goto search
95b0: 4f 76 65 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Over;.    }..   
95c0: 20 2f 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 6f   /*.     * The o
95d0: 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 69 74  utermost loop it
95e0: 65 72 61 74 65 73 20 6f 76 65 72 20 6c 69 6e 65  erates over line
95f0: 73 20 74 68 61 74 20 6d 61 79 20 70 6f 74 65 6e  s that may poten
9600: 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 0a 20  tially contain. 
9610: 20 20 20 20 2a 20 61 20 72 65 6c 65 76 61 6e 74      * a relevant
9620: 20 74 61 67 20 74 72 61 6e 73 69 74 69 6f 6e 2c   tag transition,
9630: 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 74   starting from t
9640: 68 65 20 63 75 72 72 65 6e 74 20 73 65 67 6d 65  he current segme
9650: 6e 74 20 69 6e 0a 20 20 20 20 20 2a 20 74 68 65  nt in.     * the
9660: 20 63 75 72 72 65 6e 74 20 6c 69 6e 65 2e 0a 20   current line.. 
9670: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 65 67 50      */..    segP
9680: 74 72 20 3d 20 73 65 61 72 63 68 50 74 72 2d 3e  tr = searchPtr->
9690: 6e 65 78 74 50 74 72 3b 0a 20 20 20 20 77 68 69  nextPtr;.    whi
96a0: 6c 65 20 28 31 29 20 7b 0a 09 2f 2a 0a 09 20 2a  le (1) {../*.. *
96b0: 20 43 68 65 63 6b 20 66 6f 72 20 6d 6f 72 65 20   Check for more 
96c0: 74 61 67 73 20 6f 6e 20 74 68 65 20 63 75 72 72  tags on the curr
96d0: 65 6e 74 20 6c 69 6e 65 2e 0a 09 20 2a 2f 0a 0a  ent line... */..
96e0: 09 66 6f 72 20 28 20 3b 20 73 65 67 50 74 72 20  .for ( ; segPtr 
96f0: 21 3d 20 4e 55 4c 4c 3b 20 73 65 67 50 74 72 20  != NULL; segPtr 
9700: 3d 20 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74  = segPtr->nextPt
9710: 72 29 20 7b 0a 09 20 20 20 20 69 66 20 28 73 65  r) {..    if (se
9720: 67 50 74 72 20 3d 3d 20 73 65 61 72 63 68 50 74  gPtr == searchPt
9730: 72 2d 3e 6c 61 73 74 50 74 72 29 20 7b 0a 09 09  r->lastPtr) {...
9740: 67 6f 74 6f 20 73 65 61 72 63 68 4f 76 65 72 3b  goto searchOver;
9750: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20  ..    }..    if 
9760: 28 28 28 73 65 67 50 74 72 2d 3e 74 79 70 65 50  (((segPtr->typeP
9770: 74 72 20 3d 3d 20 26 74 6b 54 65 78 74 54 6f 67  tr == &tkTextTog
9780: 67 6c 65 4f 6e 54 79 70 65 29 0a 09 09 20 20 20  gleOnType)...   
9790: 20 7c 7c 20 28 73 65 67 50 74 72 2d 3e 74 79 70   || (segPtr->typ
97a0: 65 50 74 72 20 3d 3d 20 26 74 6b 54 65 78 74 54  ePtr == &tkTextT
97b0: 6f 67 67 6c 65 4f 66 66 54 79 70 65 29 29 0a 09  oggleOffType))..
97c0: 09 20 20 20 20 26 26 20 28 73 65 61 72 63 68 50  .    && (searchP
97d0: 74 72 2d 3e 61 6c 6c 54 61 67 73 0a 09 09 20 20  tr->allTags...  
97e0: 20 20 7c 7c 20 28 73 65 67 50 74 72 2d 3e 62 6f    || (segPtr->bo
97f0: 64 79 2e 74 6f 67 67 6c 65 2e 74 61 67 50 74 72  dy.toggle.tagPtr
9800: 20 3d 3d 20 73 65 61 72 63 68 50 74 72 2d 3e 74   == searchPtr->t
9810: 61 67 50 74 72 29 29 29 20 7b 0a 09 09 73 65 61  agPtr))) {...sea
9820: 72 63 68 50 74 72 2d 3e 73 65 67 50 74 72 20 3d  rchPtr->segPtr =
9830: 20 73 65 67 50 74 72 3b 0a 09 09 73 65 61 72 63   segPtr;...searc
9840: 68 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20  hPtr->nextPtr = 
9850: 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b  segPtr->nextPtr;
9860: 0a 09 09 73 65 61 72 63 68 50 74 72 2d 3e 74 61  ...searchPtr->ta
9870: 67 50 74 72 20 3d 20 73 65 67 50 74 72 2d 3e 62  gPtr = segPtr->b
9880: 6f 64 79 2e 74 6f 67 67 6c 65 2e 74 61 67 50 74  ody.toggle.tagPt
9890: 72 3b 0a 09 09 72 65 74 75 72 6e 20 31 3b 0a 09  r;...return 1;..
98a0: 20 20 20 20 7d 0a 09 20 20 20 20 73 65 61 72 63      }..    searc
98b0: 68 50 74 72 2d 3e 63 75 72 49 6e 64 65 78 2e 63  hPtr->curIndex.c
98c0: 68 61 72 49 6e 64 65 78 20 2b 3d 20 73 65 67 50  harIndex += segP
98d0: 74 72 2d 3e 73 69 7a 65 3b 0a 09 7d 0a 20 20 20  tr->size;..}.   
98e0: 20 0a 09 2f 2a 0a 09 20 2a 20 53 65 65 20 69 66   ../*.. * See if
98f0: 20 74 68 65 72 65 20 61 72 65 20 6d 6f 72 65 20   there are more 
9900: 6c 69 6e 65 73 20 61 73 73 6f 63 69 61 74 65 64  lines associated
9910: 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
9920: 74 20 70 61 72 65 6e 74 0a 09 20 2a 20 6e 6f 64  t parent.. * nod
9930: 65 2e 20 20 49 66 20 73 6f 2c 20 67 6f 20 62 61  e.  If so, go ba
9940: 63 6b 20 74 6f 20 74 68 65 20 74 6f 70 20 6f 66  ck to the top of
9950: 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 73 65 61   the loop to sea
9960: 72 63 68 20 74 68 65 20 6e 65 78 74 0a 09 20 2a  rch the next.. *
9970: 20 6f 6e 65 2e 0a 09 20 2a 2f 0a 0a 09 6e 6f 64   one... */...nod
9980: 65 50 74 72 20 3d 20 73 65 61 72 63 68 50 74 72  ePtr = searchPtr
9990: 2d 3e 63 75 72 49 6e 64 65 78 2e 6c 69 6e 65 50  ->curIndex.lineP
99a0: 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 3b 0a 09  tr->parentPtr;..
99b0: 73 65 61 72 63 68 50 74 72 2d 3e 63 75 72 49 6e  searchPtr->curIn
99c0: 64 65 78 2e 6c 69 6e 65 50 74 72 20 3d 20 73 65  dex.linePtr = se
99d0: 61 72 63 68 50 74 72 2d 3e 63 75 72 49 6e 64 65  archPtr->curInde
99e0: 78 2e 6c 69 6e 65 50 74 72 2d 3e 6e 65 78 74 50  x.linePtr->nextP
99f0: 74 72 3b 0a 09 73 65 61 72 63 68 50 74 72 2d 3e  tr;..searchPtr->
9a00: 6c 69 6e 65 73 4c 65 66 74 2d 2d 3b 0a 09 69 66  linesLeft--;..if
9a10: 20 28 73 65 61 72 63 68 50 74 72 2d 3e 6c 69 6e   (searchPtr->lin
9a20: 65 73 4c 65 66 74 20 3c 3d 20 30 29 20 7b 0a 09  esLeft <= 0) {..
9a30: 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 4f      goto searchO
9a40: 76 65 72 3b 0a 09 7d 0a 09 69 66 20 28 73 65 61  ver;..}..if (sea
9a50: 72 63 68 50 74 72 2d 3e 63 75 72 49 6e 64 65 78  rchPtr->curIndex
9a60: 2e 6c 69 6e 65 50 74 72 20 21 3d 20 4e 55 4c 4c  .linePtr != NULL
9a70: 29 20 7b 0a 09 20 20 20 20 73 65 67 50 74 72 20  ) {..    segPtr 
9a80: 3d 20 73 65 61 72 63 68 50 74 72 2d 3e 63 75 72  = searchPtr->cur
9a90: 49 6e 64 65 78 2e 6c 69 6e 65 50 74 72 2d 3e 73  Index.linePtr->s
9aa0: 65 67 50 74 72 3b 0a 09 20 20 20 20 73 65 61 72  egPtr;..    sear
9ab0: 63 68 50 74 72 2d 3e 63 75 72 49 6e 64 65 78 2e  chPtr->curIndex.
9ac0: 63 68 61 72 49 6e 64 65 78 20 3d 20 30 3b 0a 09  charIndex = 0;..
9ad0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 7d      continue;..}
9ae0: 0a 20 20 20 20 0a 09 2f 2a 0a 09 20 2a 20 53 65  .    ../*.. * Se
9af0: 61 72 63 68 20 61 63 72 6f 73 73 20 61 6e 64 20  arch across and 
9b00: 75 70 20 74 68 72 6f 75 67 68 20 74 68 65 20 42  up through the B
9b10: 2d 74 72 65 65 27 73 20 6e 6f 64 65 20 68 69 65  -tree's node hie
9b20: 72 61 72 63 68 79 20 6c 6f 6f 6b 69 6e 67 0a 09  rarchy looking..
9b30: 20 2a 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20   * for the next 
9b40: 6e 6f 64 65 20 74 68 61 74 20 68 61 73 20 61 20  node that has a 
9b50: 72 65 6c 65 76 61 6e 74 20 74 61 67 20 74 72 61  relevant tag tra
9b60: 6e 73 69 74 69 6f 6e 20 73 6f 6d 65 77 68 65 72  nsition somewher
9b70: 65 20 69 6e 0a 09 20 2a 20 69 74 73 20 73 75 62  e in.. * its sub
9b80: 74 72 65 65 2e 20 20 42 65 20 73 75 72 65 20 74  tree.  Be sure t
9b90: 6f 20 75 70 64 61 74 65 20 6c 69 6e 65 73 4c 65  o update linesLe
9ba0: 66 74 20 61 73 20 77 65 20 73 6b 69 70 20 6f 76  ft as we skip ov
9bb0: 65 72 20 6c 61 72 67 65 0a 09 20 2a 20 63 68 75  er large.. * chu
9bc0: 6e 6b 73 20 6f 66 20 6c 69 6e 65 73 2e 0a 09 20  nks of lines... 
9bd0: 2a 2f 0a 20 20 20 20 0a 09 77 68 69 6c 65 20 28  */.    ..while (
9be0: 31 29 20 7b 0a 09 20 20 20 20 77 68 69 6c 65 20  1) {..    while 
9bf0: 28 6e 6f 64 65 50 74 72 2d 3e 6e 65 78 74 50 74  (nodePtr->nextPt
9c00: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69  r == NULL) {...i
9c10: 66 20 28 6e 6f 64 65 50 74 72 2d 3e 70 61 72 65  f (nodePtr->pare
9c20: 6e 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ntPtr == NULL) {
9c30: 0a 09 09 20 20 20 20 67 6f 74 6f 20 73 65 61 72  ...    goto sear
9c40: 63 68 4f 76 65 72 3b 0a 09 09 7d 0a 09 09 6e 6f  chOver;...}...no
9c50: 64 65 50 74 72 20 3d 20 6e 6f 64 65 50 74 72 2d  dePtr = nodePtr-
9c60: 3e 70 61 72 65 6e 74 50 74 72 3b 0a 09 20 20 20  >parentPtr;..   
9c70: 20 7d 0a 09 20 20 20 20 6e 6f 64 65 50 74 72 20   }..    nodePtr 
9c80: 3d 20 6e 6f 64 65 50 74 72 2d 3e 6e 65 78 74 50  = nodePtr->nextP
9c90: 74 72 3b 0a 09 20 20 20 20 66 6f 72 20 28 73 75  tr;..    for (su
9ca0: 6d 6d 61 72 79 50 74 72 20 3d 20 6e 6f 64 65 50  mmaryPtr = nodeP
9cb0: 74 72 2d 3e 73 75 6d 6d 61 72 79 50 74 72 3b 20  tr->summaryPtr; 
9cc0: 73 75 6d 6d 61 72 79 50 74 72 20 21 3d 20 4e 55  summaryPtr != NU
9cd0: 4c 4c 3b 0a 09 09 20 20 20 20 73 75 6d 6d 61 72  LL;...    summar
9ce0: 79 50 74 72 20 3d 20 73 75 6d 6d 61 72 79 50 74  yPtr = summaryPt
9cf0: 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 09  r->nextPtr) {...
9d00: 69 66 20 28 28 73 65 61 72 63 68 50 74 72 2d 3e  if ((searchPtr->
9d10: 61 6c 6c 54 61 67 73 29 20 7c 7c 0a 09 09 09 28  allTags) ||....(
9d20: 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74 61 67 50  summaryPtr->tagP
9d30: 74 72 20 3d 3d 20 73 65 61 72 63 68 50 74 72 2d  tr == searchPtr-
9d40: 3e 74 61 67 50 74 72 29 29 20 7b 0a 09 09 20 20  >tagPtr)) {...  
9d50: 20 20 67 6f 74 6f 20 67 6f 74 4e 6f 64 65 57 69    goto gotNodeWi
9d60: 74 68 54 61 67 3b 0a 09 09 7d 0a 09 20 20 20 20  thTag;...}..    
9d70: 7d 0a 09 20 20 20 20 73 65 61 72 63 68 50 74 72  }..    searchPtr
9d80: 2d 3e 6c 69 6e 65 73 4c 65 66 74 20 2d 3d 20 6e  ->linesLeft -= n
9d90: 6f 64 65 50 74 72 2d 3e 6e 75 6d 4c 69 6e 65 73  odePtr->numLines
9da0: 3b 0a 09 7d 0a 20 20 20 20 0a 09 2f 2a 0a 09 20  ;..}.    ../*.. 
9db0: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
9dc0: 77 65 27 76 65 20 66 6f 75 6e 64 20 61 20 73 75  we've found a su
9dd0: 62 74 72 65 65 20 74 68 61 74 20 68 61 73 20 61  btree that has a
9de0: 20 72 65 6c 65 76 61 6e 74 20 74 61 67 0a 09 20   relevant tag.. 
9df0: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 2e 20 20 4e  * transition.  N
9e00: 6f 77 20 73 65 61 72 63 68 20 64 6f 77 6e 20 28  ow search down (
9e10: 61 6e 64 20 61 63 72 6f 73 73 29 20 74 68 72 6f  and across) thro
9e20: 75 67 68 20 74 68 61 74 20 73 75 62 74 72 65 65  ugh that subtree
9e30: 0a 09 20 2a 20 74 6f 20 66 69 6e 64 20 74 68 65  .. * to find the
9e40: 20 66 69 72 73 74 20 6c 65 76 65 6c 2d 30 20 6e   first level-0 n
9e50: 6f 64 65 20 74 68 61 74 20 68 61 73 20 61 20 72  ode that has a r
9e60: 65 6c 65 76 61 6e 74 20 74 61 67 20 74 72 61 6e  elevant tag tran
9e70: 73 69 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 20 20 20  sition... */.   
9e80: 20 0a 09 67 6f 74 4e 6f 64 65 57 69 74 68 54 61   ..gotNodeWithTa
9e90: 67 3a 0a 09 77 68 69 6c 65 20 28 6e 6f 64 65 50  g:..while (nodeP
9ea0: 74 72 2d 3e 6c 65 76 65 6c 20 3e 20 30 29 20 7b  tr->level > 0) {
9eb0: 0a 09 20 20 20 20 66 6f 72 20 28 6e 6f 64 65 50  ..    for (nodeP
9ec0: 74 72 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 63 68  tr = nodePtr->ch
9ed0: 69 6c 64 72 65 6e 2e 6e 6f 64 65 50 74 72 3b 20  ildren.nodePtr; 
9ee0: 3b 0a 09 09 20 20 20 20 6e 6f 64 65 50 74 72 20  ;...    nodePtr 
9ef0: 3d 20 6e 6f 64 65 50 74 72 2d 3e 6e 65 78 74 50  = nodePtr->nextP
9f00: 74 72 29 20 7b 0a 09 09 66 6f 72 20 28 73 75 6d  tr) {...for (sum
9f10: 6d 61 72 79 50 74 72 20 3d 20 6e 6f 64 65 50 74  maryPtr = nodePt
9f20: 72 2d 3e 73 75 6d 6d 61 72 79 50 74 72 3b 20 73  r->summaryPtr; s
9f30: 75 6d 6d 61 72 79 50 74 72 20 21 3d 20 4e 55 4c  ummaryPtr != NUL
9f40: 4c 3b 0a 09 09 09 73 75 6d 6d 61 72 79 50 74 72  L;....summaryPtr
9f50: 20 3d 20 73 75 6d 6d 61 72 79 50 74 72 2d 3e 6e   = summaryPtr->n
9f60: 65 78 74 50 74 72 29 20 7b 0a 09 09 20 20 20 20  extPtr) {...    
9f70: 69 66 20 28 28 73 65 61 72 63 68 50 74 72 2d 3e  if ((searchPtr->
9f80: 61 6c 6c 54 61 67 73 29 0a 09 09 09 20 20 20 20  allTags)....    
9f90: 7c 7c 20 28 73 75 6d 6d 61 72 79 50 74 72 2d 3e  || (summaryPtr->
9fa0: 74 61 67 50 74 72 20 3d 3d 20 73 65 61 72 63 68  tagPtr == search
9fb0: 50 74 72 2d 3e 74 61 67 50 74 72 29 29 20 7b 0a  Ptr->tagPtr)) {.
9fc0: 09 09 09 67 6f 74 6f 20 6e 65 78 74 43 68 69 6c  ...goto nextChil
9fd0: 64 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09  d;...    }...}..
9fe0: 09 73 65 61 72 63 68 50 74 72 2d 3e 6c 69 6e 65  .searchPtr->line
9ff0: 73 4c 65 66 74 20 2d 3d 20 6e 6f 64 65 50 74 72  sLeft -= nodePtr
a000: 2d 3e 6e 75 6d 4c 69 6e 65 73 3b 0a 09 09 69 66  ->numLines;...if
a010: 20 28 6e 6f 64 65 50 74 72 2d 3e 6e 65 78 74 50   (nodePtr->nextP
a020: 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  tr == NULL) {...
a030: 20 20 20 20 70 61 6e 69 63 28 22 54 6b 42 54 72      panic("TkBTr
a040: 65 65 4e 65 78 74 54 61 67 20 66 6f 75 6e 64 20  eeNextTag found 
a050: 69 6e 63 6f 72 72 65 63 74 20 74 61 67 20 73 75  incorrect tag su
a060: 6d 6d 61 72 79 20 69 6e 66 6f 2e 22 29 3b 0a 09  mmary info.");..
a070: 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6e  .}..    }..    n
a080: 65 78 74 43 68 69 6c 64 3a 0a 09 20 20 20 20 63  extChild:..    c
a090: 6f 6e 74 69 6e 75 65 3b 0a 09 7d 0a 20 20 20 20  ontinue;..}.    
a0a0: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 77 20 77 65 27  ../*.. * Now we'
a0b0: 72 65 20 64 6f 77 6e 20 74 6f 20 61 20 6c 65 76  re down to a lev
a0c0: 65 6c 2d 30 20 6e 6f 64 65 20 74 68 61 74 20 63  el-0 node that c
a0d0: 6f 6e 74 61 69 6e 73 20 61 20 6c 69 6e 65 20 74  ontains a line t
a0e0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 09 20 2a  hat contains.. *
a0f0: 20 61 20 72 65 6c 65 76 61 6e 74 20 74 61 67 20   a relevant tag 
a100: 74 72 61 6e 73 69 74 69 6f 6e 2e 20 20 53 65 74  transition.  Set
a110: 20 75 70 20 6c 69 6e 65 20 69 6e 66 6f 72 6d 61   up line informa
a120: 74 69 6f 6e 20 61 6e 64 20 67 6f 20 62 61 63 6b  tion and go back
a130: 20 74 6f 0a 09 20 2a 20 74 68 65 20 62 65 67 69   to.. * the begi
a140: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
a150: 70 20 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f  p to search thro
a160: 75 67 68 20 6c 69 6e 65 73 2e 0a 09 20 2a 2f 0a  ugh lines... */.
a170: 0a 09 73 65 61 72 63 68 50 74 72 2d 3e 63 75 72  ..searchPtr->cur
a180: 49 6e 64 65 78 2e 6c 69 6e 65 50 74 72 20 3d 20  Index.linePtr = 
a190: 6e 6f 64 65 50 74 72 2d 3e 63 68 69 6c 64 72 65  nodePtr->childre
a1a0: 6e 2e 6c 69 6e 65 50 74 72 3b 0a 09 73 65 61 72  n.linePtr;..sear
a1b0: 63 68 50 74 72 2d 3e 63 75 72 49 6e 64 65 78 2e  chPtr->curIndex.
a1c0: 63 68 61 72 49 6e 64 65 78 20 3d 20 30 3b 0a 09  charIndex = 0;..
a1d0: 73 65 67 50 74 72 20 3d 20 73 65 61 72 63 68 50  segPtr = searchP
a1e0: 74 72 2d 3e 63 75 72 49 6e 64 65 78 2e 6c 69 6e  tr->curIndex.lin
a1f0: 65 50 74 72 2d 3e 73 65 67 50 74 72 3b 0a 09 69  ePtr->segPtr;..i
a200: 66 20 28 73 65 61 72 63 68 50 74 72 2d 3e 6c 69  f (searchPtr->li
a210: 6e 65 73 4c 65 66 74 20 3c 3d 20 30 29 20 7b 0a  nesLeft <= 0) {.
a220: 09 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68  .    goto search
a230: 4f 76 65 72 3b 0a 09 7d 0a 09 63 6f 6e 74 69 6e  Over;..}..contin
a240: 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ue;.    }..    s
a250: 65 61 72 63 68 4f 76 65 72 3a 0a 20 20 20 20 73  earchOver:.    s
a260: 65 61 72 63 68 50 74 72 2d 3e 6c 69 6e 65 73 4c  earchPtr->linesL
a270: 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 73 65 61  eft = 0;.    sea
a280: 72 63 68 50 74 72 2d 3e 73 65 67 50 74 72 20 3d  rchPtr->segPtr =
a290: 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72   NULL;.    retur
a2a0: 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  n 0;.}.../*. *--
a2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2f0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 42 54 72  ----. *. * TkBTr
a300: 65 65 43 68 61 72 54 61 67 67 65 64 20 2d 2d 0a  eeCharTagged --.
a310: 20 2a 0a 20 2a 09 44 65 74 65 72 6d 69 6e 65 20   *. *.Determine 
a320: 77 68 65 74 68 65 72 20 61 20 70 61 72 74 69 63  whether a partic
a330: 75 6c 61 72 20 63 68 61 72 61 63 74 65 72 20 68  ular character h
a340: 61 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  as a particular 
a350: 74 61 67 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  tag.. *. * Resul
a360: 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72  ts:. *.The retur
a370: 6e 20 76 61 6c 75 65 20 69 73 20 31 20 69 66 20  n value is 1 if 
a380: 74 68 65 20 67 69 76 65 6e 20 74 61 67 20 69 73  the given tag is
a390: 20 69 6e 20 65 66 66 65 63 74 20 61 74 20 74 68   in effect at th
a3a0: 65 0a 20 2a 09 63 68 61 72 61 63 74 65 72 20 67  e. *.character g
a3b0: 69 76 65 6e 20 62 79 20 6c 69 6e 65 50 74 72 20  iven by linePtr 
a3c0: 61 6e 64 20 63 68 2c 20 61 6e 64 20 30 20 6f 74  and ch, and 0 ot
a3d0: 68 65 72 77 69 73 65 2e 0a 20 2a 0a 20 2a 20 53  herwise.. *. * S
a3e0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
a3f0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
a400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a440: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6b 42 54 72  -. */..int.TkBTr
a450: 65 65 43 68 61 72 54 61 67 67 65 64 28 69 6e 64  eeCharTagged(ind
a460: 65 78 50 74 72 2c 20 74 61 67 50 74 72 29 0a 20  exPtr, tagPtr). 
a470: 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20 2a     TkTextIndex *
a480: 69 6e 64 65 78 50 74 72 3b 09 09 2f 2a 20 49 6e  indexPtr;../* In
a490: 64 69 63 61 74 65 73 20 61 20 63 68 61 72 61 63  dicates a charac
a4a0: 74 65 72 20 70 6f 73 69 74 69 6f 6e 20 61 74 0a  ter position at.
a4b0: 09 09 09 09 09 20 2a 20 77 68 69 63 68 20 74 6f  ..... * which to
a4c0: 20 63 68 65 63 6b 20 66 6f 72 20 61 20 74 61 67   check for a tag
a4d0: 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 54  . */.    TkTextT
a4e0: 61 67 20 2a 74 61 67 50 74 72 3b 09 09 09 2f 2a  ag *tagPtr;.../*
a4f0: 20 54 61 67 20 6f 66 20 69 6e 74 65 72 65 73 74   Tag of interest
a500: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73  . */.{.    regis
a510: 74 65 72 20 4e 6f 64 65 20 2a 6e 6f 64 65 50 74  ter Node *nodePt
a520: 72 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  r;.    register 
a530: 54 6b 54 65 78 74 4c 69 6e 65 20 2a 73 69 62 6c  TkTextLine *sibl
a540: 69 6e 67 4c 69 6e 65 50 74 72 3b 0a 20 20 20 20  ingLinePtr;.    
a550: 72 65 67 69 73 74 65 72 20 54 6b 54 65 78 74 53  register TkTextS
a560: 65 67 6d 65 6e 74 20 2a 73 65 67 50 74 72 3b 0a  egment *segPtr;.
a570: 20 20 20 20 54 6b 54 65 78 74 53 65 67 6d 65 6e      TkTextSegmen
a580: 74 20 2a 74 6f 67 67 6c 65 53 65 67 50 74 72 3b  t *toggleSegPtr;
a590: 0a 20 20 20 20 69 6e 74 20 74 6f 67 67 6c 65 73  .    int toggles
a5a0: 2c 20 69 6e 64 65 78 3b 0a 0a 20 20 20 20 2f 2a  , index;..    /*
a5b0: 20 0a 20 20 20 20 20 2a 20 43 68 65 63 6b 20 66   .     * Check f
a5c0: 6f 72 20 74 6f 67 67 6c 65 73 20 66 6f 72 20 74  or toggles for t
a5d0: 68 65 20 74 61 67 20 69 6e 20 69 6e 64 65 78 50  he tag in indexP
a5e0: 74 72 27 73 20 6c 69 6e 65 20 62 75 74 20 62 65  tr's line but be
a5f0: 66 6f 72 65 0a 20 20 20 20 20 2a 20 69 6e 64 65  fore.     * inde
a600: 78 50 74 72 2e 20 20 49 66 20 74 68 65 72 65 20  xPtr.  If there 
a610: 69 73 20 6f 6e 65 2c 20 69 74 73 20 74 79 70 65  is one, its type
a620: 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74 68   indicates wheth
a630: 65 72 20 6f 72 0a 20 20 20 20 20 2a 20 6e 6f 74  er or.     * not
a640: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 69   the character i
a650: 73 20 74 61 67 67 65 64 2e 0a 20 20 20 20 20 2a  s tagged..     *
a660: 2f 0a 0a 20 20 20 20 74 6f 67 67 6c 65 53 65 67  /..    toggleSeg
a670: 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Ptr = NULL;.    
a680: 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 2c 20  for (index = 0, 
a690: 73 65 67 50 74 72 20 3d 20 69 6e 64 65 78 50 74  segPtr = indexPt
a6a0: 72 2d 3e 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50  r->linePtr->segP
a6b0: 74 72 3b 0a 09 20 20 20 20 28 69 6e 64 65 78 20  tr;..    (index 
a6c0: 2b 20 73 65 67 50 74 72 2d 3e 73 69 7a 65 29 20  + segPtr->size) 
a6d0: 3c 3d 20 69 6e 64 65 78 50 74 72 2d 3e 63 68 61  <= indexPtr->cha
a6e0: 72 49 6e 64 65 78 3b 0a 09 20 20 20 20 69 6e 64  rIndex;..    ind
a6f0: 65 78 20 2b 3d 20 73 65 67 50 74 72 2d 3e 73 69  ex += segPtr->si
a700: 7a 65 2c 20 73 65 67 50 74 72 20 3d 20 73 65 67  ze, segPtr = seg
a710: 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a  Ptr->nextPtr) {.
a720: 09 69 66 20 28 28 28 73 65 67 50 74 72 2d 3e 74  .if (((segPtr->t
a730: 79 70 65 50 74 72 20 3d 3d 20 26 74 6b 54 65 78  ypePtr == &tkTex
a740: 74 54 6f 67 67 6c 65 4f 6e 54 79 70 65 29 0a 09  tToggleOnType)..
a750: 09 7c 7c 20 28 73 65 67 50 74 72 2d 3e 74 79 70  .|| (segPtr->typ
a760: 65 50 74 72 20 3d 3d 20 26 74 6b 54 65 78 74 54  ePtr == &tkTextT
a770: 6f 67 67 6c 65 4f 66 66 54 79 70 65 29 29 0a 09  oggleOffType))..
a780: 09 26 26 20 28 73 65 67 50 74 72 2d 3e 62 6f 64  .&& (segPtr->bod
a790: 79 2e 74 6f 67 67 6c 65 2e 74 61 67 50 74 72 20  y.toggle.tagPtr 
a7a0: 3d 3d 20 74 61 67 50 74 72 29 29 20 7b 0a 09 20  == tagPtr)) {.. 
a7b0: 20 20 20 74 6f 67 67 6c 65 53 65 67 50 74 72 20     toggleSegPtr 
a7c0: 3d 20 73 65 67 50 74 72 3b 0a 09 7d 0a 20 20 20  = segPtr;..}.   
a7d0: 20 7d 0a 20 20 20 20 69 66 20 28 74 6f 67 67 6c   }.    if (toggl
a7e0: 65 53 65 67 50 74 72 20 21 3d 20 4e 55 4c 4c 29  eSegPtr != NULL)
a7f0: 20 7b 0a 09 72 65 74 75 72 6e 20 28 74 6f 67 67   {..return (togg
a800: 6c 65 53 65 67 50 74 72 2d 3e 74 79 70 65 50 74  leSegPtr->typePt
a810: 72 20 3d 3d 20 26 74 6b 54 65 78 74 54 6f 67 67  r == &tkTextTogg
a820: 6c 65 4f 6e 54 79 70 65 29 3b 0a 20 20 20 20 7d  leOnType);.    }
a830: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
a840: 4e 6f 20 74 6f 67 67 6c 65 20 69 6e 20 74 68 69  No toggle in thi
a850: 73 20 6c 69 6e 65 2e 20 20 4c 6f 6f 6b 20 66 6f  s line.  Look fo
a860: 72 20 74 6f 67 67 6c 65 73 20 66 6f 72 20 74 68  r toggles for th
a870: 65 20 74 61 67 20 69 6e 20 6c 69 6e 65 73 0a 20  e tag in lines. 
a880: 20 20 20 20 2a 20 74 68 61 74 20 61 72 65 20 70      * that are p
a890: 72 65 64 65 63 65 73 73 6f 72 73 20 6f 66 20 69  redecessors of i
a8a0: 6e 64 65 78 50 74 72 2d 3e 6c 69 6e 65 50 74 72  ndexPtr->linePtr
a8b0: 20 62 75 74 20 75 6e 64 65 72 20 74 68 65 20 73   but under the s
a8c0: 61 6d 65 0a 20 20 20 20 20 2a 20 6c 65 76 65 6c  ame.     * level
a8d0: 2d 30 20 6e 6f 64 65 2e 0a 20 20 20 20 20 2a 2f  -0 node..     */
a8e0: 0a 0a 20 20 20 20 74 6f 67 67 6c 65 73 20 3d 20  ..    toggles = 
a8f0: 30 3b 0a 20 20 20 20 66 6f 72 20 28 73 69 62 6c  0;.    for (sibl
a900: 69 6e 67 4c 69 6e 65 50 74 72 20 3d 20 69 6e 64  ingLinePtr = ind
a910: 65 78 50 74 72 2d 3e 6c 69 6e 65 50 74 72 2d 3e  exPtr->linePtr->
a920: 70 61 72 65 6e 74 50 74 72 2d 3e 63 68 69 6c 64  parentPtr->child
a930: 72 65 6e 2e 6c 69 6e 65 50 74 72 3b 0a 09 20 20  ren.linePtr;..  
a940: 20 20 73 69 62 6c 69 6e 67 4c 69 6e 65 50 74 72    siblingLinePtr
a950: 20 21 3d 20 69 6e 64 65 78 50 74 72 2d 3e 6c 69   != indexPtr->li
a960: 6e 65 50 74 72 3b 0a 09 20 20 20 20 73 69 62 6c  nePtr;..    sibl
a970: 69 6e 67 4c 69 6e 65 50 74 72 20 3d 20 73 69 62  ingLinePtr = sib
a980: 6c 69 6e 67 4c 69 6e 65 50 74 72 2d 3e 6e 65 78  lingLinePtr->nex
a990: 74 50 74 72 29 20 7b 0a 09 66 6f 72 20 28 73 65  tPtr) {..for (se
a9a0: 67 50 74 72 20 3d 20 73 69 62 6c 69 6e 67 4c 69  gPtr = siblingLi
a9b0: 6e 65 50 74 72 2d 3e 73 65 67 50 74 72 3b 20 73  nePtr->segPtr; s
a9c0: 65 67 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09  egPtr != NULL;..
a9d0: 09 73 65 67 50 74 72 20 3d 20 73 65 67 50 74 72  .segPtr = segPtr
a9e0: 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 20 20  ->nextPtr) {..  
a9f0: 20 20 69 66 20 28 28 28 73 65 67 50 74 72 2d 3e    if (((segPtr->
aa00: 74 79 70 65 50 74 72 20 3d 3d 20 26 74 6b 54 65  typePtr == &tkTe
aa10: 78 74 54 6f 67 67 6c 65 4f 6e 54 79 70 65 29 0a  xtToggleOnType).
aa20: 09 09 20 20 20 20 7c 7c 20 28 73 65 67 50 74 72  ..    || (segPtr
aa30: 2d 3e 74 79 70 65 50 74 72 20 3d 3d 20 26 74 6b  ->typePtr == &tk
aa40: 54 65 78 74 54 6f 67 67 6c 65 4f 66 66 54 79 70  TextToggleOffTyp
aa50: 65 29 29 0a 09 09 20 20 20 20 26 26 20 28 73 65  e))...    && (se
aa60: 67 50 74 72 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c  gPtr->body.toggl
aa70: 65 2e 74 61 67 50 74 72 20 3d 3d 20 74 61 67 50  e.tagPtr == tagP
aa80: 74 72 29 29 20 7b 0a 09 09 74 6f 67 67 6c 65 53  tr)) {...toggleS
aa90: 65 67 50 74 72 20 3d 20 73 65 67 50 74 72 3b 0a  egPtr = segPtr;.
aaa0: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
aab0: 20 20 20 20 69 66 20 28 74 6f 67 67 6c 65 53 65      if (toggleSe
aac0: 67 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  gPtr != NULL) {.
aad0: 09 72 65 74 75 72 6e 20 28 74 6f 67 67 6c 65 53  .return (toggleS
aae0: 65 67 50 74 72 2d 3e 74 79 70 65 50 74 72 20 3d  egPtr->typePtr =
aaf0: 3d 20 26 74 6b 54 65 78 74 54 6f 67 67 6c 65 4f  = &tkTextToggleO
ab00: 6e 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  nType);.    }.. 
ab10: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 20     /*.     * No 
ab20: 74 6f 67 67 6c 65 20 69 6e 20 74 68 69 73 20 6e  toggle in this n
ab30: 6f 64 65 2e 20 20 53 63 61 6e 20 75 70 77 61 72  ode.  Scan upwar
ab40: 64 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 61  ds through the a
ab50: 6e 63 65 73 74 6f 72 73 20 6f 66 0a 20 20 20 20  ncestors of.    
ab60: 20 2a 20 74 68 69 73 20 6e 6f 64 65 2c 20 63 6f   * this node, co
ab70: 75 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  unting the numbe
ab80: 72 20 6f 66 20 74 6f 67 67 6c 65 73 20 6f 66 20  r of toggles of 
ab90: 74 68 65 20 67 69 76 65 6e 20 74 61 67 20 69 6e  the given tag in
aba0: 0a 20 20 20 20 20 2a 20 73 69 62 6c 69 6e 67 73  .     * siblings
abb0: 20 74 68 61 74 20 70 72 65 63 65 64 65 20 74 68   that precede th
abc0: 61 74 20 6e 6f 64 65 2e 0a 20 20 20 20 20 2a 2f  at node..     */
abd0: 0a 0a 20 20 20 20 74 6f 67 67 6c 65 73 20 3d 20  ..    toggles = 
abe0: 30 3b 0a 20 20 20 20 66 6f 72 20 28 6e 6f 64 65  0;.    for (node
abf0: 50 74 72 20 3d 20 69 6e 64 65 78 50 74 72 2d 3e  Ptr = indexPtr->
ac00: 6c 69 6e 65 50 74 72 2d 3e 70 61 72 65 6e 74 50  linePtr->parentP
ac10: 74 72 3b 20 6e 6f 64 65 50 74 72 2d 3e 70 61 72  tr; nodePtr->par
ac20: 65 6e 74 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a  entPtr != NULL;.
ac30: 09 20 20 20 20 6e 6f 64 65 50 74 72 20 3d 20 6e  .    nodePtr = n
ac40: 6f 64 65 50 74 72 2d 3e 70 61 72 65 6e 74 50 74  odePtr->parentPt
ac50: 72 29 20 7b 0a 09 72 65 67 69 73 74 65 72 20 4e  r) {..register N
ac60: 6f 64 65 20 2a 73 69 62 6c 69 6e 67 50 74 72 3b  ode *siblingPtr;
ac70: 0a 09 72 65 67 69 73 74 65 72 20 53 75 6d 6d 61  ..register Summa
ac80: 72 79 20 2a 73 75 6d 6d 61 72 79 50 74 72 3b 0a  ry *summaryPtr;.
ac90: 0a 09 66 6f 72 20 28 73 69 62 6c 69 6e 67 50 74  ..for (siblingPt
aca0: 72 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 70 61 72  r = nodePtr->par
acb0: 65 6e 74 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e  entPtr->children
acc0: 2e 6e 6f 64 65 50 74 72 3b 20 0a 09 09 73 69 62  .nodePtr; ...sib
acd0: 6c 69 6e 67 50 74 72 20 21 3d 20 6e 6f 64 65 50  lingPtr != nodeP
ace0: 74 72 3b 20 73 69 62 6c 69 6e 67 50 74 72 20 3d  tr; siblingPtr =
acf0: 20 73 69 62 6c 69 6e 67 50 74 72 2d 3e 6e 65 78   siblingPtr->nex
ad00: 74 50 74 72 29 20 7b 0a 09 20 20 20 20 66 6f 72  tPtr) {..    for
ad10: 20 28 73 75 6d 6d 61 72 79 50 74 72 20 3d 20 73   (summaryPtr = s
ad20: 69 62 6c 69 6e 67 50 74 72 2d 3e 73 75 6d 6d 61  iblingPtr->summa
ad30: 72 79 50 74 72 3b 20 73 75 6d 6d 61 72 79 50 74  ryPtr; summaryPt
ad40: 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 20 20 20  r != NULL;...   
ad50: 20 73 75 6d 6d 61 72 79 50 74 72 20 3d 20 73 75   summaryPtr = su
ad60: 6d 6d 61 72 79 50 74 72 2d 3e 6e 65 78 74 50 74  mmaryPtr->nextPt
ad70: 72 29 20 7b 0a 09 09 69 66 20 28 73 75 6d 6d 61  r) {...if (summa
ad80: 72 79 50 74 72 2d 3e 74 61 67 50 74 72 20 3d 3d  ryPtr->tagPtr ==
ad90: 20 74 61 67 50 74 72 29 20 7b 0a 09 09 20 20 20   tagPtr) {...   
ada0: 20 74 6f 67 67 6c 65 73 20 2b 3d 20 73 75 6d 6d   toggles += summ
adb0: 61 72 79 50 74 72 2d 3e 74 6f 67 67 6c 65 43 6f  aryPtr->toggleCo
adc0: 75 6e 74 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  unt;...}..    }.
add0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
ade0: 0a 20 20 20 20 20 2a 20 41 6e 20 6f 64 64 20 6e  .     * An odd n
adf0: 75 6d 62 65 72 20 6f 66 20 74 6f 67 67 6c 65 73  umber of toggles
ae00: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
ae10: 74 61 67 20 69 73 20 70 72 65 73 65 6e 74 20 61  tag is present a
ae20: 74 20 74 68 65 0a 20 20 20 20 20 2a 20 67 69 76  t the.     * giv
ae30: 65 6e 20 70 6f 69 6e 74 2e 0a 20 20 20 20 20 2a  en point..     *
ae40: 2f 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 74 6f  /..    return to
ae50: 67 67 6c 65 73 20 26 20 31 3b 0a 7d 0a 0c 0a 2f  ggles & 1;.}.../
ae60: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
ae70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
aeb0: 20 54 6b 42 54 72 65 65 47 65 74 54 61 67 73 20   TkBTreeGetTags 
aec0: 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20  --. *. *.Return 
aed0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
aee0: 74 20 61 6c 6c 20 6f 66 20 74 68 65 20 74 61 67  t all of the tag
aef0: 73 20 74 68 61 74 20 61 72 65 20 61 73 73 6f 63  s that are assoc
af00: 69 61 74 65 64 0a 20 2a 09 77 69 74 68 20 61 20  iated. *.with a 
af10: 70 61 72 74 69 63 75 6c 61 72 20 63 68 61 72 61  particular chara
af20: 63 74 65 72 20 69 6e 20 61 20 42 2d 74 72 65 65  cter in a B-tree
af30: 20 6f 66 20 74 65 78 74 2e 0a 20 2a 0a 20 2a 20   of text.. *. * 
af40: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20  Results:. *.The 
af50: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
af60: 61 20 6d 61 6c 6c 6f 63 2d 65 64 20 61 72 72 61  a malloc-ed arra
af70: 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 6f 69  y containing poi
af80: 6e 74 65 72 73 20 74 6f 0a 20 2a 09 69 6e 66 6f  nters to. *.info
af90: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 65 61 63 68  rmation for each
afa0: 20 6f 66 20 74 68 65 20 74 61 67 73 20 74 68 61   of the tags tha
afb0: 74 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20  t is associated 
afc0: 77 69 74 68 0a 20 2a 09 74 68 65 20 63 68 61 72  with. *.the char
afd0: 61 63 74 65 72 20 61 74 20 74 68 65 20 70 6f 73  acter at the pos
afe0: 69 74 69 6f 6e 20 67 69 76 65 6e 20 62 79 20 6c  ition given by l
aff0: 69 6e 65 50 74 72 20 61 6e 64 20 63 68 2e 20 20  inePtr and ch.  
b000: 54 68 65 0a 20 2a 09 77 6f 72 64 20 61 74 20 2a  The. *.word at *
b010: 6e 75 6d 54 61 67 73 50 74 72 20 69 73 20 66 69  numTagsPtr is fi
b020: 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65  lled in with the
b030: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
b040: 65 72 73 0a 20 2a 09 69 6e 20 74 68 65 20 61 72  ers. *.in the ar
b050: 72 61 79 2e 20 20 49 74 20 69 73 20 75 70 20 74  ray.  It is up t
b060: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  o the caller to 
b070: 66 72 65 65 20 74 68 65 20 61 72 72 61 79 20 62  free the array b
b080: 79 0a 20 2a 09 70 61 73 73 69 6e 67 20 69 74 20  y. *.passing it 
b090: 74 6f 20 66 72 65 65 2e 20 20 49 66 20 74 68 65  to free.  If the
b0a0: 72 65 20 61 72 65 20 6e 6f 20 74 61 67 73 20 61  re are no tags a
b0b0: 74 20 74 68 65 20 67 69 76 65 6e 20 63 68 61 72  t the given char
b0c0: 61 63 74 65 72 0a 20 2a 09 74 68 65 6e 20 61 20  acter. *.then a 
b0d0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20  NULL pointer is 
b0e0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 75  returned and *nu
b0f0: 6d 54 61 67 73 50 74 72 20 77 69 6c 6c 20 62 65  mTagsPtr will be
b100: 20 73 65 74 20 74 6f 20 30 2e 0a 20 2a 0a 20 2a   set to 0.. *. *
b110: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
b120: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
b130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b170: 2d 2d 2d 0a 20 2a 2f 0a 0a 09 2f 2a 20 41 52 47  ---. */.../* ARG
b180: 53 55 53 45 44 20 2a 2f 0a 54 6b 54 65 78 74 54  SUSED */.TkTextT
b190: 61 67 20 2a 2a 0a 54 6b 42 54 72 65 65 47 65 74  ag **.TkBTreeGet
b1a0: 54 61 67 73 28 69 6e 64 65 78 50 74 72 2c 20 6e  Tags(indexPtr, n
b1b0: 75 6d 54 61 67 73 50 74 72 29 0a 20 20 20 20 54  umTagsPtr).    T
b1c0: 6b 54 65 78 74 49 6e 64 65 78 20 2a 69 6e 64 65  kTextIndex *inde
b1d0: 78 50 74 72 3b 09 2f 2a 20 49 6e 64 69 63 61 74  xPtr;./* Indicat
b1e0: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
b1f0: 70 6f 73 69 74 69 6f 6e 20 69 6e 0a 09 09 09 09  position in.....
b200: 20 2a 20 74 68 65 20 42 2d 74 72 65 65 2e 20 2a   * the B-tree. *
b210: 2f 0a 20 20 20 20 69 6e 74 20 2a 6e 75 6d 54 61  /.    int *numTa
b220: 67 73 50 74 72 3b 09 09 2f 2a 20 53 74 6f 72 65  gsPtr;../* Store
b230: 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 67 73 20   number of tags 
b240: 66 6f 75 6e 64 20 61 74 20 74 68 69 73 0a 09 09  found at this...
b250: 09 09 20 2a 20 6c 6f 63 61 74 69 6f 6e 2e 20 2a  .. * location. *
b260: 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72  /.{.    register
b270: 20 4e 6f 64 65 20 2a 6e 6f 64 65 50 74 72 3b 0a   Node *nodePtr;.
b280: 20 20 20 20 72 65 67 69 73 74 65 72 20 54 6b 54      register TkT
b290: 65 78 74 4c 69 6e 65 20 2a 73 69 62 6c 69 6e 67  extLine *sibling
b2a0: 4c 69 6e 65 50 74 72 3b 0a 20 20 20 20 72 65 67  LinePtr;.    reg
b2b0: 69 73 74 65 72 20 54 6b 54 65 78 74 53 65 67 6d  ister TkTextSegm
b2c0: 65 6e 74 20 2a 73 65 67 50 74 72 3b 0a 20 20 20  ent *segPtr;.   
b2d0: 20 69 6e 74 20 73 72 63 2c 20 64 73 74 2c 20 69   int src, dst, i
b2e0: 6e 64 65 78 3b 0a 20 20 20 20 54 61 67 49 6e 66  ndex;.    TagInf
b2f0: 6f 20 74 61 67 49 6e 66 6f 3b 0a 23 64 65 66 69  o tagInfo;.#defi
b300: 6e 65 20 4e 55 4d 5f 54 41 47 5f 49 4e 46 4f 53  ne NUM_TAG_INFOS
b310: 20 31 30 0a 0a 20 20 20 20 74 61 67 49 6e 66 6f   10..    tagInfo
b320: 2e 6e 75 6d 54 61 67 73 20 3d 20 30 3b 0a 20 20  .numTags = 0;.  
b330: 20 20 74 61 67 49 6e 66 6f 2e 61 72 72 61 79 53    tagInfo.arrayS
b340: 69 7a 65 20 3d 20 4e 55 4d 5f 54 41 47 5f 49 4e  ize = NUM_TAG_IN
b350: 46 4f 53 3b 0a 20 20 20 20 74 61 67 49 6e 66 6f  FOS;.    tagInfo
b360: 2e 74 61 67 50 74 72 73 20 3d 20 28 54 6b 54 65  .tagPtrs = (TkTe
b370: 78 74 54 61 67 20 2a 2a 29 20 63 6b 61 6c 6c 6f  xtTag **) ckallo
b380: 63 28 28 75 6e 73 69 67 6e 65 64 29 0a 09 20 20  c((unsigned)..  
b390: 20 20 4e 55 4d 5f 54 41 47 5f 49 4e 46 4f 53 2a    NUM_TAG_INFOS*
b3a0: 73 69 7a 65 6f 66 28 54 6b 54 65 78 74 54 61 67  sizeof(TkTextTag
b3b0: 20 2a 29 29 3b 0a 20 20 20 20 74 61 67 49 6e 66   *));.    tagInf
b3c0: 6f 2e 63 6f 75 6e 74 73 20 3d 20 28 69 6e 74 20  o.counts = (int 
b3d0: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
b3e0: 67 6e 65 64 29 0a 09 20 20 20 20 4e 55 4d 5f 54  gned)..    NUM_T
b3f0: 41 47 5f 49 4e 46 4f 53 2a 73 69 7a 65 6f 66 28  AG_INFOS*sizeof(
b400: 69 6e 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  int));..    /*. 
b410: 20 20 20 20 2a 20 52 65 63 6f 72 64 20 74 61 67      * Record tag
b420: 20 74 6f 67 67 6c 65 73 20 77 69 74 68 69 6e 20   toggles within 
b430: 74 68 65 20 6c 69 6e 65 20 6f 66 20 69 6e 64 65  the line of inde
b440: 78 50 74 72 20 62 75 74 20 70 72 65 63 65 64 69  xPtr but precedi
b450: 6e 67 0a 20 20 20 20 20 2a 20 69 6e 64 65 78 50  ng.     * indexP
b460: 74 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  tr..     */..   
b470: 20 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 2c   for (index = 0,
b480: 20 73 65 67 50 74 72 20 3d 20 69 6e 64 65 78 50   segPtr = indexP
b490: 74 72 2d 3e 6c 69 6e 65 50 74 72 2d 3e 73 65 67  tr->linePtr->seg
b4a0: 50 74 72 3b 0a 09 20 20 20 20 28 69 6e 64 65 78  Ptr;..    (index
b4b0: 20 2b 20 73 65 67 50 74 72 2d 3e 73 69 7a 65 29   + segPtr->size)
b4c0: 20 3c 3d 20 69 6e 64 65 78 50 74 72 2d 3e 63 68   <= indexPtr->ch
b4d0: 61 72 49 6e 64 65 78 3b 0a 09 20 20 20 20 69 6e  arIndex;..    in
b4e0: 64 65 78 20 2b 3d 20 73 65 67 50 74 72 2d 3e 73  dex += segPtr->s
b4f0: 69 7a 65 2c 20 73 65 67 50 74 72 20 3d 20 73 65  ize, segPtr = se
b500: 67 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b  gPtr->nextPtr) {
b510: 0a 09 69 66 20 28 28 73 65 67 50 74 72 2d 3e 74  ..if ((segPtr->t
b520: 79 70 65 50 74 72 20 3d 3d 20 26 74 6b 54 65 78  ypePtr == &tkTex
b530: 74 54 6f 67 67 6c 65 4f 6e 54 79 70 65 29 0a 09  tToggleOnType)..
b540: 09 7c 7c 20 28 73 65 67 50 74 72 2d 3e 74 79 70  .|| (segPtr->typ
b550: 65 50 74 72 20 3d 3d 20 26 74 6b 54 65 78 74 54  ePtr == &tkTextT
b560: 6f 67 67 6c 65 4f 66 66 54 79 70 65 29 29 20 7b  oggleOffType)) {
b570: 0a 09 20 20 20 20 49 6e 63 43 6f 75 6e 74 28 73  ..    IncCount(s
b580: 65 67 50 74 72 2d 3e 62 6f 64 79 2e 74 6f 67 67  egPtr->body.togg
b590: 6c 65 2e 74 61 67 50 74 72 2c 20 31 2c 20 26 74  le.tagPtr, 1, &t
b5a0: 61 67 49 6e 66 6f 29 3b 0a 09 7d 0a 20 20 20 20  agInfo);..}.    
b5b0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
b5c0: 20 52 65 63 6f 72 64 20 74 6f 67 67 6c 65 73 20   Record toggles 
b5d0: 66 6f 72 20 74 61 67 73 20 69 6e 20 6c 69 6e 65  for tags in line
b5e0: 73 20 74 68 61 74 20 61 72 65 20 70 72 65 64 65  s that are prede
b5f0: 63 65 73 73 6f 72 73 20 6f 66 0a 20 20 20 20 20  cessors of.     
b600: 2a 20 69 6e 64 65 78 50 74 72 2d 3e 6c 69 6e 65  * indexPtr->line
b610: 50 74 72 20 62 75 74 20 75 6e 64 65 72 20 74 68  Ptr but under th
b620: 65 20 73 61 6d 65 20 6c 65 76 65 6c 2d 30 20 6e  e same level-0 n
b630: 6f 64 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ode..     */..  
b640: 20 20 66 6f 72 20 28 73 69 62 6c 69 6e 67 4c 69    for (siblingLi
b650: 6e 65 50 74 72 20 3d 20 69 6e 64 65 78 50 74 72  nePtr = indexPtr
b660: 2d 3e 6c 69 6e 65 50 74 72 2d 3e 70 61 72 65 6e  ->linePtr->paren
b670: 74 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e 2e 6c  tPtr->children.l
b680: 69 6e 65 50 74 72 3b 0a 09 20 20 20 20 73 69 62  inePtr;..    sib
b690: 6c 69 6e 67 4c 69 6e 65 50 74 72 20 21 3d 20 69  lingLinePtr != i
b6a0: 6e 64 65 78 50 74 72 2d 3e 6c 69 6e 65 50 74 72  ndexPtr->linePtr
b6b0: 3b 0a 09 20 20 20 20 73 69 62 6c 69 6e 67 4c 69  ;..    siblingLi
b6c0: 6e 65 50 74 72 20 3d 20 73 69 62 6c 69 6e 67 4c  nePtr = siblingL
b6d0: 69 6e 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 29  inePtr->nextPtr)
b6e0: 20 7b 0a 09 66 6f 72 20 28 73 65 67 50 74 72 20   {..for (segPtr 
b6f0: 3d 20 73 69 62 6c 69 6e 67 4c 69 6e 65 50 74 72  = siblingLinePtr
b700: 2d 3e 73 65 67 50 74 72 3b 20 73 65 67 50 74 72  ->segPtr; segPtr
b710: 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 73 65 67 50   != NULL;...segP
b720: 74 72 20 3d 20 73 65 67 50 74 72 2d 3e 6e 65 78  tr = segPtr->nex
b730: 74 50 74 72 29 20 7b 0a 09 20 20 20 20 69 66 20  tPtr) {..    if 
b740: 28 28 73 65 67 50 74 72 2d 3e 74 79 70 65 50 74  ((segPtr->typePt
b750: 72 20 3d 3d 20 26 74 6b 54 65 78 74 54 6f 67 67  r == &tkTextTogg
b760: 6c 65 4f 6e 54 79 70 65 29 0a 09 09 20 20 20 20  leOnType)...    
b770: 7c 7c 20 28 73 65 67 50 74 72 2d 3e 74 79 70 65  || (segPtr->type
b780: 50 74 72 20 3d 3d 20 26 74 6b 54 65 78 74 54 6f  Ptr == &tkTextTo
b790: 67 67 6c 65 4f 66 66 54 79 70 65 29 29 20 7b 0a  ggleOffType)) {.
b7a0: 09 09 49 6e 63 43 6f 75 6e 74 28 73 65 67 50 74  ..IncCount(segPt
b7b0: 72 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 74  r->body.toggle.t
b7c0: 61 67 50 74 72 2c 20 31 2c 20 26 74 61 67 49 6e  agPtr, 1, &tagIn
b7d0: 66 6f 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  fo);..    }..}. 
b7e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
b7f0: 20 20 2a 20 46 6f 72 20 65 61 63 68 20 6e 6f 64    * For each nod
b800: 65 20 69 6e 20 74 68 65 20 61 6e 63 65 73 74 72  e in the ancestr
b810: 79 20 6f 66 20 74 68 69 73 20 6c 69 6e 65 2c 20  y of this line, 
b820: 72 65 63 6f 72 64 20 74 61 67 20 74 6f 67 67 6c  record tag toggl
b830: 65 73 0a 20 20 20 20 20 2a 20 66 6f 72 20 61 6c  es.     * for al
b840: 6c 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20  l siblings that 
b850: 70 72 65 63 65 64 65 20 74 68 61 74 20 6e 6f 64  precede that nod
b860: 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  e..     */..    
b870: 66 6f 72 20 28 6e 6f 64 65 50 74 72 20 3d 20 69  for (nodePtr = i
b880: 6e 64 65 78 50 74 72 2d 3e 6c 69 6e 65 50 74 72  ndexPtr->linePtr
b890: 2d 3e 70 61 72 65 6e 74 50 74 72 3b 20 6e 6f 64  ->parentPtr; nod
b8a0: 65 50 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 20  ePtr->parentPtr 
b8b0: 21 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6e 6f  != NULL;..    no
b8c0: 64 65 50 74 72 20 3d 20 6e 6f 64 65 50 74 72 2d  dePtr = nodePtr-
b8d0: 3e 70 61 72 65 6e 74 50 74 72 29 20 7b 0a 09 72  >parentPtr) {..r
b8e0: 65 67 69 73 74 65 72 20 4e 6f 64 65 20 2a 73 69  egister Node *si
b8f0: 62 6c 69 6e 67 50 74 72 3b 0a 09 72 65 67 69 73  blingPtr;..regis
b900: 74 65 72 20 53 75 6d 6d 61 72 79 20 2a 73 75 6d  ter Summary *sum
b910: 6d 61 72 79 50 74 72 3b 0a 0a 09 66 6f 72 20 28  maryPtr;...for (
b920: 73 69 62 6c 69 6e 67 50 74 72 20 3d 20 6e 6f 64  siblingPtr = nod
b930: 65 50 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 2d  ePtr->parentPtr-
b940: 3e 63 68 69 6c 64 72 65 6e 2e 6e 6f 64 65 50 74  >children.nodePt
b950: 72 3b 20 0a 09 09 73 69 62 6c 69 6e 67 50 74 72  r; ...siblingPtr
b960: 20 21 3d 20 6e 6f 64 65 50 74 72 3b 20 73 69 62   != nodePtr; sib
b970: 6c 69 6e 67 50 74 72 20 3d 20 73 69 62 6c 69 6e  lingPtr = siblin
b980: 67 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b  gPtr->nextPtr) {
b990: 0a 09 20 20 20 20 66 6f 72 20 28 73 75 6d 6d 61  ..    for (summa
b9a0: 72 79 50 74 72 20 3d 20 73 69 62 6c 69 6e 67 50  ryPtr = siblingP
b9b0: 74 72 2d 3e 73 75 6d 6d 61 72 79 50 74 72 3b 20  tr->summaryPtr; 
b9c0: 73 75 6d 6d 61 72 79 50 74 72 20 21 3d 20 4e 55  summaryPtr != NU
b9d0: 4c 4c 3b 0a 09 09 20 20 20 20 73 75 6d 6d 61 72  LL;...    summar
b9e0: 79 50 74 72 20 3d 20 73 75 6d 6d 61 72 79 50 74  yPtr = summaryPt
b9f0: 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 09  r->nextPtr) {...
ba00: 69 66 20 28 73 75 6d 6d 61 72 79 50 74 72 2d 3e  if (summaryPtr->
ba10: 74 6f 67 67 6c 65 43 6f 75 6e 74 20 26 20 31 29  toggleCount & 1)
ba20: 20 7b 0a 09 09 20 20 20 20 49 6e 63 43 6f 75 6e   {...    IncCoun
ba30: 74 28 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74 61  t(summaryPtr->ta
ba40: 67 50 74 72 2c 20 73 75 6d 6d 61 72 79 50 74 72  gPtr, summaryPtr
ba50: 2d 3e 74 6f 67 67 6c 65 43 6f 75 6e 74 2c 0a 09  ->toggleCount,..
ba60: 09 09 20 20 20 20 26 74 61 67 49 6e 66 6f 29 3b  ..    &tagInfo);
ba70: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  ...}..    }..}. 
ba80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
ba90: 20 20 2a 20 47 6f 20 74 68 72 6f 75 67 68 20 74    * Go through t
baa0: 68 65 20 74 61 67 20 69 6e 66 6f 72 6d 61 74 69  he tag informati
bab0: 6f 6e 20 61 6e 64 20 73 71 75 61 73 68 20 6f 75  on and squash ou
bac0: 74 20 61 6c 6c 20 6f 66 20 74 68 65 20 74 61 67  t all of the tag
bad0: 73 0a 20 20 20 20 20 2a 20 74 68 61 74 20 68 61  s.     * that ha
bae0: 76 65 20 65 76 65 6e 20 74 6f 67 67 6c 65 20 63  ve even toggle c
baf0: 6f 75 6e 74 73 20 28 74 68 65 73 65 20 74 61 67  ounts (these tag
bb00: 73 20 65 78 69 73 74 20 62 65 66 6f 72 65 20 74  s exist before t
bb10: 68 65 20 70 6f 69 6e 74 0a 20 20 20 20 20 2a 20  he point.     * 
bb20: 6f 66 20 69 6e 74 65 72 65 73 74 2c 20 62 75 74  of interest, but
bb30: 20 6e 6f 74 20 61 74 20 74 68 65 20 64 65 73 69   not at the desi
bb40: 72 65 64 20 63 68 61 72 61 63 74 65 72 20 69 74  red character it
bb50: 73 65 6c 66 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a  self)..     */..
bb60: 20 20 20 20 66 6f 72 20 28 73 72 63 20 3d 20 30      for (src = 0
bb70: 2c 20 64 73 74 20 3d 20 30 3b 20 73 72 63 20 3c  , dst = 0; src <
bb80: 20 74 61 67 49 6e 66 6f 2e 6e 75 6d 54 61 67 73   tagInfo.numTags
bb90: 3b 20 73 72 63 2b 2b 29 20 7b 0a 09 69 66 20 28  ; src++) {..if (
bba0: 74 61 67 49 6e 66 6f 2e 63 6f 75 6e 74 73 5b 73  tagInfo.counts[s
bbb0: 72 63 5d 20 26 20 31 29 20 7b 0a 09 20 20 20 20  rc] & 1) {..    
bbc0: 74 61 67 49 6e 66 6f 2e 74 61 67 50 74 72 73 5b  tagInfo.tagPtrs[
bbd0: 64 73 74 5d 20 3d 20 74 61 67 49 6e 66 6f 2e 74  dst] = tagInfo.t
bbe0: 61 67 50 74 72 73 5b 73 72 63 5d 3b 0a 09 20 20  agPtrs[src];..  
bbf0: 20 20 64 73 74 2b 2b 3b 0a 09 7d 0a 20 20 20 20    dst++;..}.    
bc00: 7d 0a 20 20 20 20 2a 6e 75 6d 54 61 67 73 50 74  }.    *numTagsPt
bc10: 72 20 3d 20 64 73 74 3b 0a 20 20 20 20 63 6b 66  r = dst;.    ckf
bc20: 72 65 65 28 28 63 68 61 72 20 2a 29 20 74 61 67  ree((char *) tag
bc30: 49 6e 66 6f 2e 63 6f 75 6e 74 73 29 3b 0a 20 20  Info.counts);.  
bc40: 20 20 69 66 20 28 64 73 74 20 3d 3d 20 30 29 20    if (dst == 0) 
bc50: 7b 0a 09 63 6b 66 72 65 65 28 28 63 68 61 72 20  {..ckfree((char 
bc60: 2a 29 20 74 61 67 49 6e 66 6f 2e 74 61 67 50 74  *) tagInfo.tagPt
bc70: 72 73 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  rs);..return NUL
bc80: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  L;.    }.    ret
bc90: 75 72 6e 20 74 61 67 49 6e 66 6f 2e 74 61 67 50  urn tagInfo.tagP
bca0: 74 72 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  trs;.}.../*. *--
bcb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bcf0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 63 43 6f  ----. *. * IncCo
bd00: 75 6e 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  unt --. *. *.Thi
bd10: 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 70  s is a utility p
bd20: 72 6f 63 65 64 75 72 65 20 75 73 65 64 20 62 79  rocedure used by
bd30: 20 54 6b 42 54 72 65 65 47 65 74 54 61 67 73 2e   TkBTreeGetTags.
bd40: 20 20 49 74 0a 20 2a 09 69 6e 63 72 65 6d 65 6e    It. *.incremen
bd50: 74 73 20 74 68 65 20 63 6f 75 6e 74 20 66 6f 72  ts the count for
bd60: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 61   a particular ta
bd70: 67 2c 20 61 64 64 69 6e 67 20 61 20 6e 65 77 0a  g, adding a new.
bd80: 20 2a 09 65 6e 74 72 79 20 66 6f 72 20 74 68 61   *.entry for tha
bd90: 74 20 74 61 67 20 69 66 20 74 68 65 72 65 20 77  t tag if there w
bda0: 61 73 6e 27 74 20 6f 6e 65 20 70 72 65 76 69 6f  asn't one previo
bdb0: 75 73 6c 79 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  usly.. *. * Resu
bdc0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  lts:. *.None.. *
bdd0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
bde0: 3a 0a 20 2a 09 54 68 65 20 69 6e 66 6f 72 6d 61  :. *.The informa
bdf0: 74 69 6f 6e 20 61 74 20 2a 74 61 67 49 6e 66 6f  tion at *tagInfo
be00: 50 74 72 20 6d 61 79 20 62 65 20 6d 6f 64 69 66  Ptr may be modif
be10: 69 65 64 2c 20 61 6e 64 20 74 68 65 20 61 72 72  ied, and the arr
be20: 61 79 73 0a 20 2a 09 6d 61 79 20 62 65 20 72 65  ays. *.may be re
be30: 61 6c 6c 6f 63 61 74 65 64 20 74 6f 20 6d 61 6b  allocated to mak
be40: 65 20 74 68 65 6d 20 6c 61 72 67 65 72 2e 0a 20  e them larger.. 
be50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
be60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
bea0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 63 43  static void.IncC
beb0: 6f 75 6e 74 28 74 61 67 50 74 72 2c 20 69 6e 63  ount(tagPtr, inc
bec0: 2c 20 74 61 67 49 6e 66 6f 50 74 72 29 0a 20 20  , tagInfoPtr).  
bed0: 20 20 54 6b 54 65 78 74 54 61 67 20 2a 74 61 67    TkTextTag *tag
bee0: 50 74 72 3b 09 09 2f 2a 20 48 61 6e 64 6c 65 20  Ptr;../* Handle 
bef0: 66 6f 72 20 74 61 67 2e 20 2a 2f 0a 20 20 20 20  for tag. */.    
bf00: 69 6e 74 20 69 6e 63 3b 09 09 09 2f 2a 20 41 6d  int inc;.../* Am
bf10: 6f 75 6e 74 20 62 79 20 77 68 69 63 68 20 74 6f  ount by which to
bf20: 20 69 6e 63 72 65 6d 65 6e 74 20 74 61 67 20 63   increment tag c
bf30: 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20 54 61 67  ount. */.    Tag
bf40: 49 6e 66 6f 20 2a 74 61 67 49 6e 66 6f 50 74 72  Info *tagInfoPtr
bf50: 3b 09 2f 2a 20 48 6f 6c 64 73 20 63 75 6d 75 6c  ;./* Holds cumul
bf60: 61 74 69 76 65 20 69 6e 66 6f 72 6d 61 74 69 6f  ative informatio
bf70: 6e 20 61 62 6f 75 74 20 74 61 67 73 3b 0a 09 09  n about tags;...
bf80: 09 09 20 2a 20 69 6e 63 72 65 6d 65 6e 74 20 63  .. * increment c
bf90: 6f 75 6e 74 20 68 65 72 65 2e 20 2a 2f 0a 7b 0a  ount here. */.{.
bfa0: 20 20 20 20 72 65 67 69 73 74 65 72 20 54 6b 54      register TkT
bfb0: 65 78 74 54 61 67 20 2a 2a 74 61 67 50 74 72 50  extTag **tagPtrP
bfc0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e  tr;.    int coun
bfd0: 74 3b 0a 0a 20 20 20 20 66 6f 72 20 28 74 61 67  t;..    for (tag
bfe0: 50 74 72 50 74 72 20 3d 20 74 61 67 49 6e 66 6f  PtrPtr = tagInfo
bff0: 50 74 72 2d 3e 74 61 67 50 74 72 73 2c 20 63 6f  Ptr->tagPtrs, co
c000: 75 6e 74 20 3d 20 74 61 67 49 6e 66 6f 50 74 72  unt = tagInfoPtr
c010: 2d 3e 6e 75 6d 54 61 67 73 3b 0a 09 20 20 20 20  ->numTags;..    
c020: 63 6f 75 6e 74 20 3e 20 30 3b 20 74 61 67 50 74  count > 0; tagPt
c030: 72 50 74 72 2b 2b 2c 20 63 6f 75 6e 74 2d 2d 29  rPtr++, count--)
c040: 20 7b 0a 09 69 66 20 28 2a 74 61 67 50 74 72 50   {..if (*tagPtrP
c050: 74 72 20 3d 3d 20 74 61 67 50 74 72 29 20 7b 0a  tr == tagPtr) {.
c060: 09 20 20 20 20 74 61 67 49 6e 66 6f 50 74 72 2d  .    tagInfoPtr-
c070: 3e 63 6f 75 6e 74 73 5b 74 61 67 49 6e 66 6f 50  >counts[tagInfoP
c080: 74 72 2d 3e 6e 75 6d 54 61 67 73 2d 63 6f 75 6e  tr->numTags-coun
c090: 74 5d 20 2b 3d 20 69 6e 63 3b 0a 09 20 20 20 20  t] += inc;..    
c0a0: 72 65 74 75 72 6e 3b 0a 09 7d 0a 20 20 20 20 7d  return;..}.    }
c0b0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
c0c0: 54 68 65 72 65 20 69 73 6e 27 74 20 63 75 72 72  There isn't curr
c0d0: 65 6e 74 6c 79 20 61 6e 20 65 6e 74 72 79 20 66  ently an entry f
c0e0: 6f 72 20 74 68 69 73 20 74 61 67 2c 20 73 6f 20  or this tag, so 
c0f0: 77 65 20 68 61 76 65 20 74 6f 0a 20 20 20 20 20  we have to.     
c100: 2a 20 6d 61 6b 65 20 61 20 6e 65 77 20 6f 6e 65  * make a new one
c110: 2e 20 20 49 66 20 74 68 65 20 61 72 72 61 79 73  .  If the arrays
c120: 20 61 72 65 20 66 75 6c 6c 2c 20 74 68 65 6e 20   are full, then 
c130: 65 6e 6c 61 72 67 65 20 74 68 65 0a 20 20 20 20  enlarge the.    
c140: 20 2a 20 61 72 72 61 79 73 20 66 69 72 73 74 2e   * arrays first.
c150: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66  .     */..    if
c160: 20 28 74 61 67 49 6e 66 6f 50 74 72 2d 3e 6e 75   (tagInfoPtr->nu
c170: 6d 54 61 67 73 20 3d 3d 20 74 61 67 49 6e 66 6f  mTags == tagInfo
c180: 50 74 72 2d 3e 61 72 72 61 79 53 69 7a 65 29 20  Ptr->arraySize) 
c190: 7b 0a 09 54 6b 54 65 78 74 54 61 67 20 2a 2a 6e  {..TkTextTag **n
c1a0: 65 77 54 61 67 73 3b 0a 09 69 6e 74 20 2a 6e 65  ewTags;..int *ne
c1b0: 77 43 6f 75 6e 74 73 2c 20 6e 65 77 53 69 7a 65  wCounts, newSize
c1c0: 3b 0a 0a 09 6e 65 77 53 69 7a 65 20 3d 20 32 2a  ;...newSize = 2*
c1d0: 74 61 67 49 6e 66 6f 50 74 72 2d 3e 61 72 72 61  tagInfoPtr->arra
c1e0: 79 53 69 7a 65 3b 0a 09 6e 65 77 54 61 67 73 20  ySize;..newTags 
c1f0: 3d 20 28 54 6b 54 65 78 74 54 61 67 20 2a 2a 29  = (TkTextTag **)
c200: 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e   ckalloc((unsign
c210: 65 64 29 0a 09 09 28 6e 65 77 53 69 7a 65 2a 73  ed)...(newSize*s
c220: 69 7a 65 6f 66 28 54 6b 54 65 78 74 54 61 67 20  izeof(TkTextTag 
c230: 2a 29 29 29 3b 0a 09 6d 65 6d 63 70 79 28 28 56  *)));..memcpy((V
c240: 4f 49 44 20 2a 29 20 6e 65 77 54 61 67 73 2c 20  OID *) newTags, 
c250: 28 56 4f 49 44 20 2a 29 20 74 61 67 49 6e 66 6f  (VOID *) tagInfo
c260: 50 74 72 2d 3e 74 61 67 50 74 72 73 2c 0a 09 09  Ptr->tagPtrs,...
c270: 74 61 67 49 6e 66 6f 50 74 72 2d 3e 61 72 72 61  tagInfoPtr->arra
c280: 79 53 69 7a 65 20 2a 20 73 69 7a 65 6f 66 28 54  ySize * sizeof(T
c290: 6b 54 65 78 74 54 61 67 20 2a 29 29 3b 0a 09 63  kTextTag *));..c
c2a0: 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 74  kfree((char *) t
c2b0: 61 67 49 6e 66 6f 50 74 72 2d 3e 74 61 67 50 74  agInfoPtr->tagPt
c2c0: 72 73 29 3b 0a 09 74 61 67 49 6e 66 6f 50 74 72  rs);..tagInfoPtr
c2d0: 2d 3e 74 61 67 50 74 72 73 20 3d 20 6e 65 77 54  ->tagPtrs = newT
c2e0: 61 67 73 3b 0a 09 6e 65 77 43 6f 75 6e 74 73 20  ags;..newCounts 
c2f0: 3d 20 28 69 6e 74 20 2a 29 20 63 6b 61 6c 6c 6f  = (int *) ckallo
c300: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 28 6e 65  c((unsigned) (ne
c310: 77 53 69 7a 65 2a 73 69 7a 65 6f 66 28 69 6e 74  wSize*sizeof(int
c320: 29 29 29 3b 0a 09 6d 65 6d 63 70 79 28 28 56 4f  )));..memcpy((VO
c330: 49 44 20 2a 29 20 6e 65 77 43 6f 75 6e 74 73 2c  ID *) newCounts,
c340: 20 28 56 4f 49 44 20 2a 29 20 74 61 67 49 6e 66   (VOID *) tagInf
c350: 6f 50 74 72 2d 3e 63 6f 75 6e 74 73 2c 0a 09 09  oPtr->counts,...
c360: 74 61 67 49 6e 66 6f 50 74 72 2d 3e 61 72 72 61  tagInfoPtr->arra
c370: 79 53 69 7a 65 20 2a 20 73 69 7a 65 6f 66 28 69  ySize * sizeof(i
c380: 6e 74 29 29 3b 0a 09 63 6b 66 72 65 65 28 28 63  nt));..ckfree((c
c390: 68 61 72 20 2a 29 20 74 61 67 49 6e 66 6f 50 74  har *) tagInfoPt
c3a0: 72 2d 3e 63 6f 75 6e 74 73 29 3b 0a 09 74 61 67  r->counts);..tag
c3b0: 49 6e 66 6f 50 74 72 2d 3e 63 6f 75 6e 74 73 20  InfoPtr->counts 
c3c0: 3d 20 6e 65 77 43 6f 75 6e 74 73 3b 0a 09 74 61  = newCounts;..ta
c3d0: 67 49 6e 66 6f 50 74 72 2d 3e 61 72 72 61 79 53  gInfoPtr->arrayS
c3e0: 69 7a 65 20 3d 20 6e 65 77 53 69 7a 65 3b 0a 20  ize = newSize;. 
c3f0: 20 20 20 7d 0a 0a 20 20 20 20 74 61 67 49 6e 66     }..    tagInf
c400: 6f 50 74 72 2d 3e 74 61 67 50 74 72 73 5b 74 61  oPtr->tagPtrs[ta
c410: 67 49 6e 66 6f 50 74 72 2d 3e 6e 75 6d 54 61 67  gInfoPtr->numTag
c420: 73 5d 20 3d 20 74 61 67 50 74 72 3b 0a 20 20 20  s] = tagPtr;.   
c430: 20 74 61 67 49 6e 66 6f 50 74 72 2d 3e 63 6f 75   tagInfoPtr->cou
c440: 6e 74 73 5b 74 61 67 49 6e 66 6f 50 74 72 2d 3e  nts[tagInfoPtr->
c450: 6e 75 6d 54 61 67 73 5d 20 3d 20 69 6e 63 3b 0a  numTags] = inc;.
c460: 20 20 20 20 74 61 67 49 6e 66 6f 50 74 72 2d 3e      tagInfoPtr->
c470: 6e 75 6d 54 61 67 73 2b 2b 3b 0a 7d 0a 0c 0a 2f  numTags++;.}.../
c480: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
c490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
c4d0: 20 54 6b 42 54 72 65 65 43 68 65 63 6b 20 2d 2d   TkBTreeCheck --
c4e0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
c4f0: 65 64 75 72 65 20 72 75 6e 73 20 61 20 73 65 74  edure runs a set
c500: 20 6f 66 20 63 6f 6e 73 69 73 74 65 6e 63 79 20   of consistency 
c510: 63 68 65 63 6b 73 20 6f 76 65 72 20 61 20 42 2d  checks over a B-
c520: 74 72 65 65 0a 20 2a 09 61 6e 64 20 70 61 6e 69  tree. *.and pani
c530: 63 73 20 69 66 20 61 6e 79 20 69 6e 63 6f 6e 73  cs if any incons
c540: 69 73 74 65 6e 63 69 65 73 20 61 72 65 20 66 6f  istencies are fo
c550: 75 6e 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  und.. *. * Resul
c560: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
c570: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
c580: 0a 20 2a 09 49 66 20 61 20 73 74 72 75 63 74 75  . *.If a structu
c590: 72 61 6c 20 64 65 66 65 63 74 20 69 73 20 66 6f  ral defect is fo
c5a0: 75 6e 64 2c 20 74 68 65 20 70 72 6f 63 65 64 75  und, the procedu
c5b0: 72 65 20 70 61 6e 69 63 73 20 77 69 74 68 20 61  re panics with a
c5c0: 6e 0a 20 2a 09 65 72 72 6f 72 20 6d 65 73 73 61  n. *.error messa
c5d0: 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ge.. *. *-------
c5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c620: 20 2a 2f 0a 0a 76 6f 69 64 0a 54 6b 42 54 72 65   */..void.TkBTre
c630: 65 43 68 65 63 6b 28 74 72 65 65 29 0a 20 20 20  eCheck(tree).   
c640: 20 54 6b 54 65 78 74 42 54 72 65 65 20 74 72 65   TkTextBTree tre
c650: 65 3b 09 09 2f 2a 20 54 72 65 65 20 74 6f 20 63  e;../* Tree to c
c660: 68 65 63 6b 2e 20 2a 2f 0a 7b 0a 20 20 20 20 42  heck. */.{.    B
c670: 54 72 65 65 20 2a 74 72 65 65 50 74 72 20 3d 20  Tree *treePtr = 
c680: 28 42 54 72 65 65 20 2a 29 20 74 72 65 65 3b 0a  (BTree *) tree;.
c690: 20 20 20 20 72 65 67 69 73 74 65 72 20 53 75 6d      register Sum
c6a0: 6d 61 72 79 20 2a 73 75 6d 6d 61 72 79 50 74 72  mary *summaryPtr
c6b0: 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 4e  ;.    register N
c6c0: 6f 64 65 20 2a 6e 6f 64 65 50 74 72 3b 0a 20 20  ode *nodePtr;.  
c6d0: 20 20 72 65 67 69 73 74 65 72 20 54 6b 54 65 78    register TkTex
c6e0: 74 4c 69 6e 65 20 2a 6c 69 6e 65 50 74 72 3b 0a  tLine *linePtr;.
c6f0: 20 20 20 20 72 65 67 69 73 74 65 72 20 54 6b 54      register TkT
c700: 65 78 74 53 65 67 6d 65 6e 74 20 2a 73 65 67 50  extSegment *segP
c710: 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  tr;..    /*.    
c720: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61   * Make sure tha
c730: 74 20 6f 76 65 72 61 6c 6c 20 74 68 65 72 65 20  t overall there 
c740: 69 73 20 61 6e 20 65 76 65 6e 20 63 6f 75 6e 74  is an even count
c750: 20 6f 66 20 74 61 67 20 74 72 61 6e 73 69 74 69   of tag transiti
c760: 6f 6e 73 0a 20 20 20 20 20 2a 20 66 6f 72 20 74  ons.     * for t
c770: 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2e 0a 20  he whole tree.. 
c780: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 20      */..    for 
c790: 28 73 75 6d 6d 61 72 79 50 74 72 20 3d 20 74 72  (summaryPtr = tr
c7a0: 65 65 50 74 72 2d 3e 72 6f 6f 74 50 74 72 2d 3e  eePtr->rootPtr->
c7b0: 73 75 6d 6d 61 72 79 50 74 72 3b 20 73 75 6d 6d  summaryPtr; summ
c7c0: 61 72 79 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a  aryPtr != NULL;.
c7d0: 09 20 20 20 20 73 75 6d 6d 61 72 79 50 74 72 20  .    summaryPtr 
c7e0: 3d 20 73 75 6d 6d 61 72 79 50 74 72 2d 3e 6e 65  = summaryPtr->ne
c7f0: 78 74 50 74 72 29 20 7b 0a 09 69 66 20 28 73 75  xtPtr) {..if (su
c800: 6d 6d 61 72 79 50 74 72 2d 3e 74 6f 67 67 6c 65  mmaryPtr->toggle
c810: 43 6f 75 6e 74 20 26 20 31 29 20 7b 0a 09 20 20  Count & 1) {..  
c820: 20 20 70 61 6e 69 63 28 22 54 6b 42 54 72 65 65    panic("TkBTree
c830: 43 68 65 63 6b 20 66 6f 75 6e 64 20 6f 64 64 20  Check found odd 
c840: 74 6f 67 67 6c 65 20 63 6f 75 6e 74 20 66 6f 72  toggle count for
c850: 20 5c 22 25 73 5c 22 20 28 25 64 29 22 2c 0a 09   \"%s\" (%d)",..
c860: 09 20 20 20 20 73 75 6d 6d 61 72 79 50 74 72 2d  .    summaryPtr-
c870: 3e 74 61 67 50 74 72 2d 3e 6e 61 6d 65 2c 20 73  >tagPtr->name, s
c880: 75 6d 6d 61 72 79 50 74 72 2d 3e 74 6f 67 67 6c  ummaryPtr->toggl
c890: 65 43 6f 75 6e 74 29 3b 0a 09 7d 0a 20 20 20 20  eCount);..}.    
c8a0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
c8b0: 20 43 61 6c 6c 20 61 20 72 65 63 75 72 73 69 76   Call a recursiv
c8c0: 65 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 64  e procedure to d
c8d0: 6f 20 74 68 65 20 6d 61 69 6e 20 62 6f 64 79 20  o the main body 
c8e0: 6f 66 20 63 68 65 63 6b 73 2e 0a 20 20 20 20 20  of checks..     
c8f0: 2a 2f 0a 0a 20 20 20 20 6e 6f 64 65 50 74 72 20  */..    nodePtr 
c900: 3d 20 74 72 65 65 50 74 72 2d 3e 72 6f 6f 74 50  = treePtr->rootP
c910: 74 72 3b 0a 20 20 20 20 43 68 65 63 6b 4e 6f 64  tr;.    CheckNod
c920: 65 43 6f 6e 73 69 73 74 65 6e 63 79 28 74 72 65  eConsistency(tre
c930: 65 50 74 72 2d 3e 72 6f 6f 74 50 74 72 29 3b 0a  ePtr->rootPtr);.
c940: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d  .    /*.     * M
c950: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
c960: 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73 74  ere are at least
c970: 20 74 77 6f 20 6c 69 6e 65 73 20 69 6e 20 74 68   two lines in th
c980: 65 20 74 65 78 74 20 61 6e 64 0a 20 20 20 20 20  e text and.     
c990: 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  * that the last 
c9a0: 6c 69 6e 65 20 68 61 73 20 6e 6f 20 63 68 61 72  line has no char
c9b0: 61 63 74 65 72 73 20 65 78 63 65 70 74 20 61 20  acters except a 
c9c0: 6e 65 77 6c 69 6e 65 2e 0a 20 20 20 20 20 2a 2f  newline..     */
c9d0: 0a 0a 20 20 20 20 69 66 20 28 6e 6f 64 65 50 74  ..    if (nodePt
c9e0: 72 2d 3e 6e 75 6d 4c 69 6e 65 73 20 3c 20 32 29  r->numLines < 2)
c9f0: 20 7b 0a 09 70 61 6e 69 63 28 22 54 6b 42 54 72   {..panic("TkBTr
ca00: 65 65 43 68 65 63 6b 3a 20 6c 65 73 73 20 74 68  eeCheck: less th
ca10: 61 6e 20 32 20 6c 69 6e 65 73 20 69 6e 20 74 72  an 2 lines in tr
ca20: 65 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ee");.    }.    
ca30: 77 68 69 6c 65 20 28 6e 6f 64 65 50 74 72 2d 3e  while (nodePtr->
ca40: 6c 65 76 65 6c 20 3e 20 30 29 20 7b 0a 09 6e 6f  level > 0) {..no
ca50: 64 65 50 74 72 20 3d 20 6e 6f 64 65 50 74 72 2d  dePtr = nodePtr-
ca60: 3e 63 68 69 6c 64 72 65 6e 2e 6e 6f 64 65 50 74  >children.nodePt
ca70: 72 3b 0a 09 77 68 69 6c 65 20 28 6e 6f 64 65 50  r;..while (nodeP
ca80: 74 72 2d 3e 6e 65 78 74 50 74 72 20 21 3d 20 4e  tr->nextPtr != N
ca90: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6e 6f 64 65  ULL) {..    node
caa0: 50 74 72 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 6e  Ptr = nodePtr->n
cab0: 65 78 74 50 74 72 3b 0a 09 7d 0a 20 20 20 20 7d  extPtr;..}.    }
cac0: 0a 20 20 20 20 6c 69 6e 65 50 74 72 20 3d 20 6e  .    linePtr = n
cad0: 6f 64 65 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e  odePtr->children
cae0: 2e 6c 69 6e 65 50 74 72 3b 0a 20 20 20 20 77 68  .linePtr;.    wh
caf0: 69 6c 65 20 28 6c 69 6e 65 50 74 72 2d 3e 6e 65  ile (linePtr->ne
cb00: 78 74 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  xtPtr != NULL) {
cb10: 0a 09 6c 69 6e 65 50 74 72 20 3d 20 6c 69 6e 65  ..linePtr = line
cb20: 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 20 20  Ptr->nextPtr;.  
cb30: 20 20 7d 0a 20 20 20 20 73 65 67 50 74 72 20 3d    }.    segPtr =
cb40: 20 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50 74 72   linePtr->segPtr
cb50: 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 28 73 65  ;.    while ((se
cb60: 67 50 74 72 2d 3e 74 79 70 65 50 74 72 20 3d 3d  gPtr->typePtr ==
cb70: 20 26 74 6b 54 65 78 74 54 6f 67 67 6c 65 4f 66   &tkTextToggleOf
cb80: 66 54 79 70 65 29 0a 09 20 20 20 20 7c 7c 20 28  fType)..    || (
cb90: 73 65 67 50 74 72 2d 3e 74 79 70 65 50 74 72 20  segPtr->typePtr 
cba0: 3d 3d 20 26 74 6b 54 65 78 74 52 69 67 68 74 4d  == &tkTextRightM
cbb0: 61 72 6b 54 79 70 65 29 0a 09 20 20 20 20 7c 7c  arkType)..    ||
cbc0: 20 28 73 65 67 50 74 72 2d 3e 74 79 70 65 50 74   (segPtr->typePt
cbd0: 72 20 3d 3d 20 26 74 6b 54 65 78 74 4c 65 66 74  r == &tkTextLeft
cbe0: 4d 61 72 6b 54 79 70 65 29 29 20 7b 0a 09 2f 2a  MarkType)) {../*
cbf0: 0a 09 20 2a 20 49 74 27 73 20 4f 4b 20 74 6f 20  .. * It's OK to 
cc00: 74 6f 67 67 6c 65 20 61 20 74 61 67 20 6f 66 66  toggle a tag off
cc10: 20 69 6e 20 74 68 65 20 6c 61 73 74 20 6c 69 6e   in the last lin
cc20: 65 2c 20 62 75 74 0a 09 20 2a 20 6e 6f 74 20 74  e, but.. * not t
cc30: 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 72 61  o start a new ra
cc40: 6e 67 65 2e 20 20 49 74 27 73 20 61 6c 73 6f 20  nge.  It's also 
cc50: 4f 4b 20 74 6f 20 68 61 76 65 20 6d 61 72 6b 73  OK to have marks
cc60: 0a 09 20 2a 20 69 6e 20 74 68 65 20 6c 61 73 74  .. * in the last
cc70: 20 6c 69 6e 65 2e 0a 09 20 2a 2f 0a 0a 09 73 65   line... */...se
cc80: 67 50 74 72 20 3d 20 73 65 67 50 74 72 2d 3e 6e  gPtr = segPtr->n
cc90: 65 78 74 50 74 72 3b 0a 20 20 20 20 7d 0a 20 20  extPtr;.    }.  
cca0: 20 20 69 66 20 28 73 65 67 50 74 72 2d 3e 74 79    if (segPtr->ty
ccb0: 70 65 50 74 72 20 21 3d 20 26 74 6b 54 65 78 74  pePtr != &tkText
ccc0: 43 68 61 72 54 79 70 65 29 20 7b 0a 09 70 61 6e  CharType) {..pan
ccd0: 69 63 28 22 54 6b 42 54 72 65 65 43 68 65 63 6b  ic("TkBTreeCheck
cce0: 3a 20 6c 61 73 74 20 6c 69 6e 65 20 68 61 73 20  : last line has 
ccf0: 62 6f 67 75 73 20 73 65 67 6d 65 6e 74 20 74 79  bogus segment ty
cd00: 70 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pe");.    }.    
cd10: 69 66 20 28 73 65 67 50 74 72 2d 3e 6e 65 78 74  if (segPtr->next
cd20: 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Ptr != NULL) {..
cd30: 70 61 6e 69 63 28 22 54 6b 42 54 72 65 65 43 68  panic("TkBTreeCh
cd40: 65 63 6b 3a 20 6c 61 73 74 20 6c 69 6e 65 20 68  eck: last line h
cd50: 61 73 20 74 6f 6f 20 6d 61 6e 79 20 73 65 67 6d  as too many segm
cd60: 65 6e 74 73 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ents");.    }.  
cd70: 20 20 69 66 20 28 73 65 67 50 74 72 2d 3e 73 69    if (segPtr->si
cd80: 7a 65 20 21 3d 20 31 29 20 7b 0a 09 70 61 6e 69  ze != 1) {..pani
cd90: 63 28 22 54 6b 42 54 72 65 65 43 68 65 63 6b 3a  c("TkBTreeCheck:
cda0: 20 6c 61 73 74 20 6c 69 6e 65 20 68 61 73 20 77   last line has w
cdb0: 72 6f 6e 67 20 23 20 63 68 61 72 61 63 74 65 72  rong # character
cdc0: 73 3a 20 25 64 22 2c 0a 09 09 73 65 67 50 74 72  s: %d",...segPtr
cdd0: 2d 3e 73 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  ->size);.    }. 
cde0: 20 20 20 69 66 20 28 28 73 65 67 50 74 72 2d 3e     if ((segPtr->
cdf0: 62 6f 64 79 2e 63 68 61 72 73 5b 30 5d 20 21 3d  body.chars[0] !=
ce00: 20 27 5c 6e 27 29 20 7c 7c 20 28 73 65 67 50 74   '\n') || (segPt
ce10: 72 2d 3e 62 6f 64 79 2e 63 68 61 72 73 5b 31 5d  r->body.chars[1]
ce20: 20 21 3d 20 30 29 29 20 7b 0a 09 70 61 6e 69 63   != 0)) {..panic
ce30: 28 22 54 6b 42 54 72 65 65 43 68 65 63 6b 3a 20  ("TkBTreeCheck: 
ce40: 6c 61 73 74 20 6c 69 6e 65 20 68 61 64 20 62 61  last line had ba
ce50: 64 20 76 61 6c 75 65 3a 20 25 73 22 2c 0a 09 09  d value: %s",...
ce60: 73 65 67 50 74 72 2d 3e 62 6f 64 79 2e 63 68 61  segPtr->body.cha
ce70: 72 73 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f  rs);.    }.}.../
ce80: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
ce90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
ced0: 20 43 68 65 63 6b 4e 6f 64 65 43 6f 6e 73 69 73   CheckNodeConsis
cee0: 74 65 6e 63 79 20 2d 2d 0a 20 2a 0a 20 2a 09 54  tency --. *. *.T
cef0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
cf00: 20 63 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20   called as part 
cf10: 6f 66 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 63  of consistency c
cf20: 68 65 63 6b 69 6e 67 20 66 6f 72 0a 20 2a 09 42  hecking for. *.B
cf30: 2d 74 72 65 65 73 3a 20 20 69 74 20 63 68 65 63  -trees:  it chec
cf40: 6b 73 20 73 65 76 65 72 61 6c 20 61 73 70 65 63  ks several aspec
cf50: 74 73 20 6f 66 20 61 20 6e 6f 64 65 20 61 6e 64  ts of a node and
cf60: 20 61 6c 73 6f 20 72 75 6e 73 0a 20 2a 09 63 68   also runs. *.ch
cf70: 65 63 6b 73 20 72 65 63 75 72 73 69 76 65 6c 79  ecks recursively
cf80: 20 6f 6e 20 74 68 65 20 6e 6f 64 65 27 73 20 63   on the node's c
cf90: 68 69 6c 64 72 65 6e 2e 0a 20 2a 0a 20 2a 20 52  hildren.. *. * R
cfa0: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
cfb0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
cfc0: 63 74 73 3a 0a 20 2a 09 49 66 20 61 6e 79 74 68  cts:. *.If anyth
cfd0: 69 6e 67 20 73 75 73 70 69 63 69 6f 75 73 20 69  ing suspicious i
cfe0: 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 74  s found in the t
cff0: 72 65 65 20 73 74 72 75 63 74 75 72 65 2c 20 74  ree structure, t
d000: 68 65 0a 20 2a 09 70 72 6f 63 65 64 75 72 65 20  he. *.procedure 
d010: 70 61 6e 69 63 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  panics.. *. *---
d020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d060: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
d070: 76 6f 69 64 0a 43 68 65 63 6b 4e 6f 64 65 43 6f  void.CheckNodeCo
d080: 6e 73 69 73 74 65 6e 63 79 28 6e 6f 64 65 50 74  nsistency(nodePt
d090: 72 29 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  r).    register 
d0a0: 4e 6f 64 65 20 2a 6e 6f 64 65 50 74 72 3b 09 09  Node *nodePtr;..
d0b0: 2f 2a 20 4e 6f 64 65 20 77 68 6f 73 65 20 73 75  /* Node whose su
d0c0: 62 74 72 65 65 20 73 68 6f 75 6c 64 20 62 65 0a  btree should be.
d0d0: 09 09 09 09 09 20 2a 20 63 68 65 63 6b 65 64 2e  ..... * checked.
d0e0: 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74   */.{.    regist
d0f0: 65 72 20 4e 6f 64 65 20 2a 63 68 69 6c 64 4e 6f  er Node *childNo
d100: 64 65 50 74 72 3b 0a 20 20 20 20 72 65 67 69 73  dePtr;.    regis
d110: 74 65 72 20 53 75 6d 6d 61 72 79 20 2a 73 75 6d  ter Summary *sum
d120: 6d 61 72 79 50 74 72 2c 20 2a 73 75 6d 6d 61 72  maryPtr, *summar
d130: 79 50 74 72 32 3b 0a 20 20 20 20 72 65 67 69 73  yPtr2;.    regis
d140: 74 65 72 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a  ter TkTextLine *
d150: 6c 69 6e 65 50 74 72 3b 0a 20 20 20 20 72 65 67  linePtr;.    reg
d160: 69 73 74 65 72 20 54 6b 54 65 78 74 53 65 67 6d  ister TkTextSegm
d170: 65 6e 74 20 2a 73 65 67 50 74 72 3b 0a 20 20 20  ent *segPtr;.   
d180: 20 69 6e 74 20 6e 75 6d 43 68 69 6c 64 72 65 6e   int numChildren
d190: 2c 20 6e 75 6d 4c 69 6e 65 73 2c 20 74 6f 67 67  , numLines, togg
d1a0: 6c 65 43 6f 75 6e 74 2c 20 6d 69 6e 43 68 69 6c  leCount, minChil
d1b0: 64 72 65 6e 3b 0a 0a 20 20 20 20 69 66 20 28 6e  dren;..    if (n
d1c0: 6f 64 65 50 74 72 2d 3e 70 61 72 65 6e 74 50 74  odePtr->parentPt
d1d0: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 69  r != NULL) {..mi
d1e0: 6e 43 68 69 6c 64 72 65 6e 20 3d 20 4d 49 4e 5f  nChildren = MIN_
d1f0: 43 48 49 4c 44 52 45 4e 3b 0a 20 20 20 20 7d 20  CHILDREN;.    } 
d200: 65 6c 73 65 20 69 66 20 28 6e 6f 64 65 50 74 72  else if (nodePtr
d210: 2d 3e 6c 65 76 65 6c 20 3e 20 30 29 20 7b 0a 09  ->level > 0) {..
d220: 6d 69 6e 43 68 69 6c 64 72 65 6e 20 3d 20 32 3b  minChildren = 2;
d230: 0a 20 20 20 20 7d 20 65 6c 73 65 20 20 7b 0a 09  .    } else  {..
d240: 6d 69 6e 43 68 69 6c 64 72 65 6e 20 3d 20 31 3b  minChildren = 1;
d250: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
d260: 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d 43 68 69 6c  nodePtr->numChil
d270: 64 72 65 6e 20 3c 20 6d 69 6e 43 68 69 6c 64 72  dren < minChildr
d280: 65 6e 29 0a 09 20 20 20 20 7c 7c 20 28 6e 6f 64  en)..    || (nod
d290: 65 50 74 72 2d 3e 6e 75 6d 43 68 69 6c 64 72 65  ePtr->numChildre
d2a0: 6e 20 3e 20 4d 41 58 5f 43 48 49 4c 44 52 45 4e  n > MAX_CHILDREN
d2b0: 29 29 20 7b 0a 09 70 61 6e 69 63 28 22 43 68 65  )) {..panic("Che
d2c0: 63 6b 4e 6f 64 65 43 6f 6e 73 69 73 74 65 6e 63  ckNodeConsistenc
d2d0: 79 3a 20 62 61 64 20 63 68 69 6c 64 20 63 6f 75  y: bad child cou
d2e0: 6e 74 20 28 25 64 29 22 2c 0a 09 09 6e 6f 64 65  nt (%d)",...node
d2f0: 50 74 72 2d 3e 6e 75 6d 43 68 69 6c 64 72 65 6e  Ptr->numChildren
d300: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 75  );.    }..    nu
d310: 6d 43 68 69 6c 64 72 65 6e 20 3d 20 30 3b 0a 20  mChildren = 0;. 
d320: 20 20 20 6e 75 6d 4c 69 6e 65 73 20 3d 20 30 3b     numLines = 0;
d330: 0a 20 20 20 20 69 66 20 28 6e 6f 64 65 50 74 72  .    if (nodePtr
d340: 2d 3e 6c 65 76 65 6c 20 3d 3d 20 30 29 20 7b 0a  ->level == 0) {.
d350: 09 66 6f 72 20 28 6c 69 6e 65 50 74 72 20 3d 20  .for (linePtr = 
d360: 6e 6f 64 65 50 74 72 2d 3e 63 68 69 6c 64 72 65  nodePtr->childre
d370: 6e 2e 6c 69 6e 65 50 74 72 3b 20 6c 69 6e 65 50  n.linePtr; lineP
d380: 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 6c 69  tr != NULL;...li
d390: 6e 65 50 74 72 20 3d 20 6c 69 6e 65 50 74 72 2d  nePtr = linePtr-
d3a0: 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 20 20 20  >nextPtr) {..   
d3b0: 20 69 66 20 28 6c 69 6e 65 50 74 72 2d 3e 70 61   if (linePtr->pa
d3c0: 72 65 6e 74 50 74 72 20 21 3d 20 6e 6f 64 65 50  rentPtr != nodeP
d3d0: 74 72 29 20 7b 0a 09 09 70 61 6e 69 63 28 22 43  tr) {...panic("C
d3e0: 68 65 63 6b 4e 6f 64 65 43 6f 6e 73 69 73 74 65  heckNodeConsiste
d3f0: 6e 63 79 3a 20 6c 69 6e 65 20 64 6f 65 73 6e 27  ncy: line doesn'
d400: 74 20 70 6f 69 6e 74 20 74 6f 20 70 61 72 65 6e  t point to paren
d410: 74 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  t");..    }..   
d420: 20 69 66 20 28 6c 69 6e 65 50 74 72 2d 3e 73 65   if (linePtr->se
d430: 67 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  gPtr == NULL) {.
d440: 09 09 70 61 6e 69 63 28 22 43 68 65 63 6b 4e 6f  ..panic("CheckNo
d450: 64 65 43 6f 6e 73 69 73 74 65 6e 63 79 3a 20 6c  deConsistency: l
d460: 69 6e 65 20 68 61 73 20 6e 6f 20 73 65 67 6d 65  ine has no segme
d470: 6e 74 73 22 29 3b 0a 09 20 20 20 20 7d 0a 09 20  nts");..    }.. 
d480: 20 20 20 66 6f 72 20 28 73 65 67 50 74 72 20 3d     for (segPtr =
d490: 20 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50 74 72   linePtr->segPtr
d4a0: 3b 20 73 65 67 50 74 72 20 21 3d 20 4e 55 4c 4c  ; segPtr != NULL
d4b0: 3b 0a 09 09 20 20 20 20 73 65 67 50 74 72 20 3d  ;...    segPtr =
d4c0: 20 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74 72   segPtr->nextPtr
d4d0: 29 20 7b 0a 09 09 69 66 20 28 73 65 67 50 74 72  ) {...if (segPtr
d4e0: 2d 3e 74 79 70 65 50 74 72 2d 3e 63 68 65 63 6b  ->typePtr->check
d4f0: 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  Proc != NULL) {.
d500: 09 09 20 20 20 20 28 2a 73 65 67 50 74 72 2d 3e  ..    (*segPtr->
d510: 74 79 70 65 50 74 72 2d 3e 63 68 65 63 6b 50 72  typePtr->checkPr
d520: 6f 63 29 28 73 65 67 50 74 72 2c 20 6c 69 6e 65  oc)(segPtr, line
d530: 50 74 72 29 3b 0a 09 09 7d 0a 09 09 69 66 20 28  Ptr);...}...if (
d540: 28 73 65 67 50 74 72 2d 3e 73 69 7a 65 20 3d 3d  (segPtr->size ==
d550: 20 30 29 20 26 26 20 28 21 73 65 67 50 74 72 2d   0) && (!segPtr-
d560: 3e 74 79 70 65 50 74 72 2d 3e 6c 65 66 74 47 72  >typePtr->leftGr
d570: 61 76 69 74 79 29 0a 09 09 09 26 26 20 28 73 65  avity)....&& (se
d580: 67 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 21 3d  gPtr->nextPtr !=
d590: 20 4e 55 4c 4c 29 0a 09 09 09 26 26 20 28 73 65   NULL)....&& (se
d5a0: 67 50 74 72 2d 3e 6e 65 78 74 50 74 72 2d 3e 73  gPtr->nextPtr->s
d5b0: 69 7a 65 20 3d 3d 20 30 29 0a 09 09 09 26 26 20  ize == 0)....&& 
d5c0: 28 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74 72  (segPtr->nextPtr
d5d0: 2d 3e 74 79 70 65 50 74 72 2d 3e 6c 65 66 74 47  ->typePtr->leftG
d5e0: 72 61 76 69 74 79 29 29 20 7b 0a 09 09 20 20 20  ravity)) {...   
d5f0: 20 70 61 6e 69 63 28 22 43 68 65 63 6b 4e 6f 64   panic("CheckNod
d600: 65 43 6f 6e 73 69 73 74 65 6e 63 79 3a 20 77 72  eConsistency: wr
d610: 6f 6e 67 20 73 65 67 6d 65 6e 74 20 6f 72 64 65  ong segment orde
d620: 72 20 66 6f 72 20 67 72 61 76 69 74 79 22 29 3b  r for gravity");
d630: 0a 09 09 7d 0a 09 09 69 66 20 28 28 73 65 67 50  ...}...if ((segP
d640: 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 3d 20 4e  tr->nextPtr == N
d650: 55 4c 4c 29 0a 09 09 09 26 26 20 28 73 65 67 50  ULL)....&& (segP
d660: 74 72 2d 3e 74 79 70 65 50 74 72 20 21 3d 20 26  tr->typePtr != &
d670: 74 6b 54 65 78 74 43 68 61 72 54 79 70 65 29 29  tkTextCharType))
d680: 20 7b 0a 09 09 20 20 20 20 70 61 6e 69 63 28 22   {...    panic("
d690: 43 68 65 63 6b 4e 6f 64 65 43 6f 6e 73 69 73 74  CheckNodeConsist
d6a0: 65 6e 63 79 3a 20 6c 69 6e 65 20 65 6e 64 65 64  ency: line ended
d6b0: 20 77 69 74 68 20 77 72 6f 6e 67 20 74 79 70 65   with wrong type
d6c0: 22 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09  ");...}..    }..
d6d0: 20 20 20 20 6e 75 6d 43 68 69 6c 64 72 65 6e 2b      numChildren+
d6e0: 2b 3b 0a 09 20 20 20 20 6e 75 6d 4c 69 6e 65 73  +;..    numLines
d6f0: 2b 2b 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  ++;..}.    } els
d700: 65 20 7b 0a 09 66 6f 72 20 28 63 68 69 6c 64 4e  e {..for (childN
d710: 6f 64 65 50 74 72 20 3d 20 6e 6f 64 65 50 74 72  odePtr = nodePtr
d720: 2d 3e 63 68 69 6c 64 72 65 6e 2e 6e 6f 64 65 50  ->children.nodeP
d730: 74 72 3b 20 63 68 69 6c 64 4e 6f 64 65 50 74 72  tr; childNodePtr
d740: 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 63 68 69 6c   != NULL;...chil
d750: 64 4e 6f 64 65 50 74 72 20 3d 20 63 68 69 6c 64  dNodePtr = child
d760: 4e 6f 64 65 50 74 72 2d 3e 6e 65 78 74 50 74 72  NodePtr->nextPtr
d770: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 63 68 69  ) {..    if (chi
d780: 6c 64 4e 6f 64 65 50 74 72 2d 3e 70 61 72 65 6e  ldNodePtr->paren
d790: 74 50 74 72 20 21 3d 20 6e 6f 64 65 50 74 72 29  tPtr != nodePtr)
d7a0: 20 7b 0a 09 09 70 61 6e 69 63 28 22 43 68 65 63   {...panic("Chec
d7b0: 6b 4e 6f 64 65 43 6f 6e 73 69 73 74 65 6e 63 79  kNodeConsistency
d7c0: 3a 20 6e 6f 64 65 20 64 6f 65 73 6e 27 74 20 70  : node doesn't p
d7d0: 6f 69 6e 74 20 74 6f 20 70 61 72 65 6e 74 22 29  oint to parent")
d7e0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66  ;..    }..    if
d7f0: 20 28 63 68 69 6c 64 4e 6f 64 65 50 74 72 2d 3e   (childNodePtr->
d800: 6c 65 76 65 6c 20 21 3d 20 28 6e 6f 64 65 50 74  level != (nodePt
d810: 72 2d 3e 6c 65 76 65 6c 2d 31 29 29 20 7b 0a 09  r->level-1)) {..
d820: 09 70 61 6e 69 63 28 22 43 68 65 63 6b 4e 6f 64  .panic("CheckNod
d830: 65 43 6f 6e 73 69 73 74 65 6e 63 79 3a 20 6c 65  eConsistency: le
d840: 76 65 6c 20 6d 69 73 6d 61 74 63 68 20 28 25 64  vel mismatch (%d
d850: 20 25 64 29 22 2c 0a 09 09 09 6e 6f 64 65 50 74   %d)",....nodePt
d860: 72 2d 3e 6c 65 76 65 6c 2c 20 63 68 69 6c 64 4e  r->level, childN
d870: 6f 64 65 50 74 72 2d 3e 6c 65 76 65 6c 29 3b 0a  odePtr->level);.
d880: 09 20 20 20 20 7d 0a 09 20 20 20 20 43 68 65 63  .    }..    Chec
d890: 6b 4e 6f 64 65 43 6f 6e 73 69 73 74 65 6e 63 79  kNodeConsistency
d8a0: 28 63 68 69 6c 64 4e 6f 64 65 50 74 72 29 3b 0a  (childNodePtr);.
d8b0: 09 20 20 20 20 66 6f 72 20 28 73 75 6d 6d 61 72  .    for (summar
d8c0: 79 50 74 72 20 3d 20 63 68 69 6c 64 4e 6f 64 65  yPtr = childNode
d8d0: 50 74 72 2d 3e 73 75 6d 6d 61 72 79 50 74 72 3b  Ptr->summaryPtr;
d8e0: 20 73 75 6d 6d 61 72 79 50 74 72 20 21 3d 20 4e   summaryPtr != N
d8f0: 55 4c 4c 3b 0a 09 09 09 73 75 6d 6d 61 72 79 50  ULL;....summaryP
d900: 74 72 20 3d 20 73 75 6d 6d 61 72 79 50 74 72 2d  tr = summaryPtr-
d910: 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 09 66 6f  >nextPtr) {...fo
d920: 72 20 28 73 75 6d 6d 61 72 79 50 74 72 32 20 3d  r (summaryPtr2 =
d930: 20 6e 6f 64 65 50 74 72 2d 3e 73 75 6d 6d 61 72   nodePtr->summar
d940: 79 50 74 72 3b 20 3b 0a 09 09 09 73 75 6d 6d 61  yPtr; ;....summa
d950: 72 79 50 74 72 32 20 3d 20 73 75 6d 6d 61 72 79  ryPtr2 = summary
d960: 50 74 72 32 2d 3e 6e 65 78 74 50 74 72 29 20 7b  Ptr2->nextPtr) {
d970: 0a 09 09 20 20 20 20 69 66 20 28 73 75 6d 6d 61  ...    if (summa
d980: 72 79 50 74 72 32 20 3d 3d 20 4e 55 4c 4c 29 20  ryPtr2 == NULL) 
d990: 7b 0a 09 09 09 70 61 6e 69 63 28 22 43 68 65 63  {....panic("Chec
d9a0: 6b 4e 6f 64 65 43 6f 6e 73 69 73 74 65 6e 63 79  kNodeConsistency
d9b0: 3a 20 6e 6f 64 65 20 74 61 67 20 5c 22 25 73 5c  : node tag \"%s\
d9c0: 22 20 6e 6f 74 20 25 73 22 2c 0a 09 09 09 09 73  " not %s",.....s
d9d0: 75 6d 6d 61 72 79 50 74 72 2d 3e 74 61 67 50 74  ummaryPtr->tagPt
d9e0: 72 2d 3e 6e 61 6d 65 2c 0a 09 09 09 09 22 70 72  r->name,....."pr
d9f0: 65 73 65 6e 74 20 69 6e 20 70 61 72 65 6e 74 20  esent in parent 
da00: 73 75 6d 6d 61 72 69 65 73 22 29 3b 0a 09 09 20  summaries");... 
da10: 20 20 20 7d 0a 09 09 20 20 20 20 69 66 20 28 73     }...    if (s
da20: 75 6d 6d 61 72 79 50 74 72 2d 3e 74 61 67 50 74  ummaryPtr->tagPt
da30: 72 20 3d 3d 20 73 75 6d 6d 61 72 79 50 74 72 32  r == summaryPtr2
da40: 2d 3e 74 61 67 50 74 72 29 20 7b 0a 09 09 09 62  ->tagPtr) {....b
da50: 72 65 61 6b 3b 0a 09 09 20 20 20 20 7d 0a 09 09  reak;...    }...
da60: 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6e 75  }..    }..    nu
da70: 6d 43 68 69 6c 64 72 65 6e 2b 2b 3b 0a 09 20 20  mChildren++;..  
da80: 20 20 6e 75 6d 4c 69 6e 65 73 20 2b 3d 20 63 68    numLines += ch
da90: 69 6c 64 4e 6f 64 65 50 74 72 2d 3e 6e 75 6d 4c  ildNodePtr->numL
daa0: 69 6e 65 73 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  ines;..}.    }. 
dab0: 20 20 20 69 66 20 28 6e 75 6d 43 68 69 6c 64 72     if (numChildr
dac0: 65 6e 20 21 3d 20 6e 6f 64 65 50 74 72 2d 3e 6e  en != nodePtr->n
dad0: 75 6d 43 68 69 6c 64 72 65 6e 29 20 7b 0a 09 70  umChildren) {..p
dae0: 61 6e 69 63 28 22 43 68 65 63 6b 4e 6f 64 65 43  anic("CheckNodeC
daf0: 6f 6e 73 69 73 74 65 6e 63 79 3a 20 6d 69 73 6d  onsistency: mism
db00: 61 74 63 68 20 69 6e 20 6e 75 6d 43 68 69 6c 64  atch in numChild
db10: 72 65 6e 20 28 25 64 20 25 64 29 22 2c 0a 09 09  ren (%d %d)",...
db20: 6e 75 6d 43 68 69 6c 64 72 65 6e 2c 20 6e 6f 64  numChildren, nod
db30: 65 50 74 72 2d 3e 6e 75 6d 43 68 69 6c 64 72 65  ePtr->numChildre
db40: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
db50: 20 28 6e 75 6d 4c 69 6e 65 73 20 21 3d 20 6e 6f   (numLines != no
db60: 64 65 50 74 72 2d 3e 6e 75 6d 4c 69 6e 65 73 29  dePtr->numLines)
db70: 20 7b 0a 09 70 61 6e 69 63 28 22 43 68 65 63 6b   {..panic("Check
db80: 4e 6f 64 65 43 6f 6e 73 69 73 74 65 6e 63 79 3a  NodeConsistency:
db90: 20 6d 69 73 6d 61 74 63 68 20 69 6e 20 6e 75 6d   mismatch in num
dba0: 4c 69 6e 65 73 20 28 25 64 20 25 64 29 22 2c 0a  Lines (%d %d)",.
dbb0: 09 09 6e 75 6d 4c 69 6e 65 73 2c 20 6e 6f 64 65  ..numLines, node
dbc0: 50 74 72 2d 3e 6e 75 6d 4c 69 6e 65 73 29 3b 0a  Ptr->numLines);.
dbd0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28      }..    for (
dbe0: 73 75 6d 6d 61 72 79 50 74 72 20 3d 20 6e 6f 64  summaryPtr = nod
dbf0: 65 50 74 72 2d 3e 73 75 6d 6d 61 72 79 50 74 72  ePtr->summaryPtr
dc00: 3b 20 73 75 6d 6d 61 72 79 50 74 72 20 21 3d 20  ; summaryPtr != 
dc10: 4e 55 4c 4c 3b 0a 09 20 20 20 20 73 75 6d 6d 61  NULL;..    summa
dc20: 72 79 50 74 72 20 3d 20 73 75 6d 6d 61 72 79 50  ryPtr = summaryP
dc30: 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09  tr->nextPtr) {..
dc40: 74 6f 67 67 6c 65 43 6f 75 6e 74 20 3d 20 30 3b  toggleCount = 0;
dc50: 0a 09 69 66 20 28 6e 6f 64 65 50 74 72 2d 3e 6c  ..if (nodePtr->l
dc60: 65 76 65 6c 20 3d 3d 20 30 29 20 7b 0a 09 20 20  evel == 0) {..  
dc70: 20 20 66 6f 72 20 28 6c 69 6e 65 50 74 72 20 3d    for (linePtr =
dc80: 20 6e 6f 64 65 50 74 72 2d 3e 63 68 69 6c 64 72   nodePtr->childr
dc90: 65 6e 2e 6c 69 6e 65 50 74 72 3b 20 6c 69 6e 65  en.linePtr; line
dca0: 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 20  Ptr != NULL;... 
dcb0: 20 20 20 6c 69 6e 65 50 74 72 20 3d 20 6c 69 6e     linePtr = lin
dcc0: 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b  ePtr->nextPtr) {
dcd0: 0a 09 09 66 6f 72 20 28 73 65 67 50 74 72 20 3d  ...for (segPtr =
dce0: 20 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50 74 72   linePtr->segPtr
dcf0: 3b 20 73 65 67 50 74 72 20 21 3d 20 4e 55 4c 4c  ; segPtr != NULL
dd00: 3b 0a 09 09 09 73 65 67 50 74 72 20 3d 20 73 65  ;....segPtr = se
dd10: 67 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b  gPtr->nextPtr) {
dd20: 0a 09 09 20 20 20 20 69 66 20 28 28 73 65 67 50  ...    if ((segP
dd30: 74 72 2d 3e 74 79 70 65 50 74 72 20 21 3d 20 26  tr->typePtr != &
dd40: 74 6b 54 65 78 74 54 6f 67 67 6c 65 4f 6e 54 79  tkTextToggleOnTy
dd50: 70 65 29 0a 09 09 09 20 20 20 20 26 26 20 28 73  pe)....    && (s
dd60: 65 67 50 74 72 2d 3e 74 79 70 65 50 74 72 20 21  egPtr->typePtr !
dd70: 3d 20 26 74 6b 54 65 78 74 54 6f 67 67 6c 65 4f  = &tkTextToggleO
dd80: 66 66 54 79 70 65 29 29 20 7b 0a 09 09 09 63 6f  ffType)) {....co
dd90: 6e 74 69 6e 75 65 3b 0a 09 09 20 20 20 20 7d 0a  ntinue;...    }.
dda0: 09 09 20 20 20 20 69 66 20 28 73 65 67 50 74 72  ..    if (segPtr
ddb0: 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 74 61  ->body.toggle.ta
ddc0: 67 50 74 72 20 3d 3d 20 73 75 6d 6d 61 72 79 50  gPtr == summaryP
ddd0: 74 72 2d 3e 74 61 67 50 74 72 29 20 7b 0a 09 09  tr->tagPtr) {...
dde0: 09 74 6f 67 67 6c 65 43 6f 75 6e 74 20 2b 2b 3b  .toggleCount ++;
ddf0: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20  ...    }...}..  
de00: 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20    }..} else {.. 
de10: 20 20 20 66 6f 72 20 28 63 68 69 6c 64 4e 6f 64     for (childNod
de20: 65 50 74 72 20 3d 20 6e 6f 64 65 50 74 72 2d 3e  ePtr = nodePtr->
de30: 63 68 69 6c 64 72 65 6e 2e 6e 6f 64 65 50 74 72  children.nodePtr
de40: 3b 0a 09 09 20 20 20 20 63 68 69 6c 64 4e 6f 64  ;...    childNod
de50: 65 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09  ePtr != NULL;...
de60: 20 20 20 20 63 68 69 6c 64 4e 6f 64 65 50 74 72      childNodePtr
de70: 20 3d 20 63 68 69 6c 64 4e 6f 64 65 50 74 72 2d   = childNodePtr-
de80: 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 09 66 6f  >nextPtr) {...fo
de90: 72 20 28 73 75 6d 6d 61 72 79 50 74 72 32 20 3d  r (summaryPtr2 =
dea0: 20 63 68 69 6c 64 4e 6f 64 65 50 74 72 2d 3e 73   childNodePtr->s
deb0: 75 6d 6d 61 72 79 50 74 72 3b 0a 09 09 09 73 75  ummaryPtr;....su
dec0: 6d 6d 61 72 79 50 74 72 32 20 21 3d 20 4e 55 4c  mmaryPtr2 != NUL
ded0: 4c 3b 0a 09 09 09 73 75 6d 6d 61 72 79 50 74 72  L;....summaryPtr
dee0: 32 20 3d 20 73 75 6d 6d 61 72 79 50 74 72 32 2d  2 = summaryPtr2-
def0: 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 09 20 20  >nextPtr) {...  
df00: 20 20 69 66 20 28 73 75 6d 6d 61 72 79 50 74 72    if (summaryPtr
df10: 32 2d 3e 74 61 67 50 74 72 20 3d 3d 20 73 75 6d  2->tagPtr == sum
df20: 6d 61 72 79 50 74 72 2d 3e 74 61 67 50 74 72 29  maryPtr->tagPtr)
df30: 20 7b 0a 09 09 09 74 6f 67 67 6c 65 43 6f 75 6e   {....toggleCoun
df40: 74 20 2b 3d 20 73 75 6d 6d 61 72 79 50 74 72 32  t += summaryPtr2
df50: 2d 3e 74 6f 67 67 6c 65 43 6f 75 6e 74 3b 0a 09  ->toggleCount;..
df60: 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20  .    }...}..    
df70: 7d 0a 09 7d 0a 09 69 66 20 28 74 6f 67 67 6c 65  }..}..if (toggle
df80: 43 6f 75 6e 74 20 21 3d 20 73 75 6d 6d 61 72 79  Count != summary
df90: 50 74 72 2d 3e 74 6f 67 67 6c 65 43 6f 75 6e 74  Ptr->toggleCount
dfa0: 29 20 7b 0a 09 20 20 20 20 70 61 6e 69 63 28 22  ) {..    panic("
dfb0: 43 68 65 63 6b 4e 6f 64 65 43 6f 6e 73 69 73 74  CheckNodeConsist
dfc0: 65 6e 63 79 3a 20 6d 69 73 6d 61 74 63 68 20 69  ency: mismatch i
dfd0: 6e 20 74 6f 67 67 6c 65 43 6f 75 6e 74 20 28 25  n toggleCount (%
dfe0: 64 20 25 64 29 22 2c 0a 09 09 20 20 20 20 74 6f  d %d)",...    to
dff0: 67 67 6c 65 43 6f 75 6e 74 2c 20 73 75 6d 6d 61  ggleCount, summa
e000: 72 79 50 74 72 2d 3e 74 6f 67 67 6c 65 43 6f 75  ryPtr->toggleCou
e010: 6e 74 29 3b 0a 09 7d 0a 09 66 6f 72 20 28 73 75  nt);..}..for (su
e020: 6d 6d 61 72 79 50 74 72 32 20 3d 20 73 75 6d 6d  mmaryPtr2 = summ
e030: 61 72 79 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b  aryPtr->nextPtr;
e040: 20 73 75 6d 6d 61 72 79 50 74 72 32 20 21 3d 20   summaryPtr2 != 
e050: 4e 55 4c 4c 3b 0a 09 09 73 75 6d 6d 61 72 79 50  NULL;...summaryP
e060: 74 72 32 20 3d 20 73 75 6d 6d 61 72 79 50 74 72  tr2 = summaryPtr
e070: 32 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 20  2->nextPtr) {.. 
e080: 20 20 20 69 66 20 28 73 75 6d 6d 61 72 79 50 74     if (summaryPt
e090: 72 32 2d 3e 74 61 67 50 74 72 20 3d 3d 20 73 75  r2->tagPtr == su
e0a0: 6d 6d 61 72 79 50 74 72 2d 3e 74 61 67 50 74 72  mmaryPtr->tagPtr
e0b0: 29 20 7b 0a 09 09 70 61 6e 69 63 28 22 43 68 65  ) {...panic("Che
e0c0: 63 6b 4e 6f 64 65 43 6f 6e 73 69 73 74 65 6e 63  ckNodeConsistenc
e0d0: 79 3a 20 64 75 70 6c 69 63 61 74 65 64 20 6e 6f  y: duplicated no
e0e0: 64 65 20 74 61 67 3a 20 25 73 22 2c 0a 09 09 09  de tag: %s",....
e0f0: 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74 61 67 50  summaryPtr->tagP
e100: 74 72 2d 3e 6e 61 6d 65 29 3b 0a 09 20 20 20 20  tr->name);..    
e110: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f  }..}.    }.}.../
e120: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
e130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
e170: 20 52 65 62 61 6c 61 6e 63 65 20 2d 2d 0a 20 2a   Rebalance --. *
e180: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
e190: 72 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  re is called whe
e1a0: 6e 20 61 20 6e 6f 64 65 20 6f 66 20 61 20 42 2d  n a node of a B-
e1b0: 74 72 65 65 20 61 70 70 65 61 72 73 20 74 6f 20  tree appears to 
e1c0: 62 65 0a 20 2a 09 6f 75 74 20 6f 66 20 62 61 6c  be. *.out of bal
e1d0: 61 6e 63 65 20 28 74 6f 6f 20 6d 61 6e 79 20 63  ance (too many c
e1e0: 68 69 6c 64 72 65 6e 2c 20 6f 72 20 74 6f 6f 20  hildren, or too 
e1f0: 66 65 77 29 2e 20 20 49 74 20 72 65 62 61 6c 61  few).  It rebala
e200: 6e 63 65 73 0a 20 2a 09 74 68 61 74 20 6e 6f 64  nces. *.that nod
e210: 65 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  e and all of its
e220: 20 61 6e 63 65 73 74 6f 72 73 20 69 6e 20 74 68   ancestors in th
e230: 65 20 74 72 65 65 2e 0a 20 2a 0a 20 2a 20 52 65  e tree.. *. * Re
e240: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  sults:. *.None..
e250: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
e260: 74 73 3a 0a 20 2a 09 54 68 65 20 69 6e 74 65 72  ts:. *.The inter
e270: 6e 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f 66  nal structure of
e280: 20 74 72 65 65 50 74 72 20 6d 61 79 20 63 68 61   treePtr may cha
e290: 6e 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nge.. *. *------
e2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e2e0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  . */..static voi
e2f0: 64 0a 52 65 62 61 6c 61 6e 63 65 28 74 72 65 65  d.Rebalance(tree
e300: 50 74 72 2c 20 6e 6f 64 65 50 74 72 29 0a 20 20  Ptr, nodePtr).  
e310: 20 20 42 54 72 65 65 20 2a 74 72 65 65 50 74 72    BTree *treePtr
e320: 3b 09 09 09 2f 2a 20 54 72 65 65 20 74 68 61 74  ;.../* Tree that
e330: 20 69 73 20 62 65 69 6e 67 20 72 65 62 61 6c 61   is being rebala
e340: 6e 63 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 67  nced. */.    reg
e350: 69 73 74 65 72 20 4e 6f 64 65 20 2a 6e 6f 64 65  ister Node *node
e360: 50 74 72 3b 09 09 2f 2a 20 4e 6f 64 65 20 74 68  Ptr;../* Node th
e370: 61 74 20 6d 61 79 20 62 65 20 6f 75 74 20 6f 66  at may be out of
e380: 20 62 61 6c 61 6e 63 65 2e 20 2a 2f 0a 7b 0a 20   balance. */.{. 
e390: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4c 6f 6f     /*.     * Loo
e3a0: 70 20 6f 76 65 72 20 74 68 65 20 65 6e 74 69 72  p over the entir
e3b0: 65 20 61 6e 63 65 73 74 72 61 6c 20 63 68 61 69  e ancestral chai
e3c0: 6e 20 6f 66 20 74 68 65 20 6e 6f 64 65 2c 20 77  n of the node, w
e3d0: 6f 72 6b 69 6e 67 20 75 70 0a 20 20 20 20 20 2a  orking up.     *
e3e0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 72 65   through the tre
e3f0: 65 20 6f 6e 65 20 6e 6f 64 65 20 61 74 20 61 20  e one node at a 
e400: 74 69 6d 65 20 75 6e 74 69 6c 20 74 68 65 20 72  time until the r
e410: 6f 6f 74 20 6e 6f 64 65 20 68 61 73 0a 20 20 20  oot node has.   
e420: 20 20 2a 20 62 65 65 6e 20 70 72 6f 63 65 73 73    * been process
e430: 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ed..     */..   
e440: 20 66 6f 72 20 28 20 3b 20 6e 6f 64 65 50 74 72   for ( ; nodePtr
e450: 20 21 3d 20 4e 55 4c 4c 3b 20 6e 6f 64 65 50 74   != NULL; nodePt
e460: 72 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 70 61 72  r = nodePtr->par
e470: 65 6e 74 50 74 72 29 20 7b 0a 09 72 65 67 69 73  entPtr) {..regis
e480: 74 65 72 20 4e 6f 64 65 20 2a 6e 65 77 50 74 72  ter Node *newPtr
e490: 2c 20 2a 63 68 69 6c 64 50 74 72 3b 0a 09 72 65  , *childPtr;..re
e4a0: 67 69 73 74 65 72 20 54 6b 54 65 78 74 4c 69 6e  gister TkTextLin
e4b0: 65 20 2a 6c 69 6e 65 50 74 72 3b 0a 09 69 6e 74  e *linePtr;..int
e4c0: 20 69 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 43 68 65   i;.../*.. * Che
e4d0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
e4e0: 20 6e 6f 64 65 20 68 61 73 20 74 6f 6f 20 6d 61   node has too ma
e4f0: 6e 79 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66  ny children.  If
e500: 20 69 74 20 64 6f 65 73 2c 0a 09 20 2a 20 74 68   it does,.. * th
e510: 65 6e 20 73 70 6c 69 74 20 6f 66 66 20 61 6c 6c  en split off all
e520: 20 62 75 74 20 74 68 65 20 66 69 72 73 74 20 4d   but the first M
e530: 49 4e 5f 43 48 49 4c 44 52 45 4e 20 69 6e 74 6f  IN_CHILDREN into
e540: 20 61 20 73 65 70 61 72 61 74 65 0a 09 20 2a 20   a separate.. * 
e550: 6e 6f 64 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  node following t
e560: 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 6e 65 2e  he original one.
e570: 20 20 54 68 65 6e 20 72 65 70 65 61 74 20 75 6e    Then repeat un
e580: 74 69 6c 20 74 68 65 0a 09 20 2a 20 6e 6f 64 65  til the.. * node
e590: 20 68 61 73 20 61 20 64 65 63 65 6e 74 20 73 69   has a decent si
e5a0: 7a 65 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 6e  ze... */...if (n
e5b0: 6f 64 65 50 74 72 2d 3e 6e 75 6d 43 68 69 6c 64  odePtr->numChild
e5c0: 72 65 6e 20 3e 20 4d 41 58 5f 43 48 49 4c 44 52  ren > MAX_CHILDR
e5d0: 45 4e 29 20 7b 0a 09 20 20 20 20 77 68 69 6c 65  EN) {..    while
e5e0: 20 28 31 29 20 7b 0a 09 09 2f 2a 0a 09 09 20 2a   (1) {.../*... *
e5f0: 20 49 66 20 74 68 65 20 6e 6f 64 65 20 62 65 69   If the node bei
e600: 6e 67 20 73 70 6c 69 74 20 69 73 20 74 68 65 20  ng split is the 
e610: 72 6f 6f 74 20 6e 6f 64 65 2c 20 74 68 65 6e 20  root node, then 
e620: 6d 61 6b 65 20 61 0a 09 09 20 2a 20 6e 65 77 20  make a... * new 
e630: 72 6f 6f 74 20 6e 6f 64 65 20 61 62 6f 76 65 20  root node above 
e640: 69 74 20 66 69 72 73 74 2e 0a 09 09 20 2a 2f 0a  it first.... */.
e650: 20 20 20 20 0a 09 09 69 66 20 28 6e 6f 64 65 50      ...if (nodeP
e660: 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 20 3d 3d  tr->parentPtr ==
e670: 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 6e   NULL) {...    n
e680: 65 77 50 74 72 20 3d 20 28 4e 6f 64 65 20 2a 29  ewPtr = (Node *)
e690: 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28   ckalloc(sizeof(
e6a0: 4e 6f 64 65 29 29 3b 0a 09 09 20 20 20 20 6e 65  Node));...    ne
e6b0: 77 50 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 20  wPtr->parentPtr 
e6c0: 3d 20 4e 55 4c 4c 3b 0a 09 09 20 20 20 20 6e 65  = NULL;...    ne
e6d0: 77 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20  wPtr->nextPtr = 
e6e0: 4e 55 4c 4c 3b 0a 09 09 20 20 20 20 6e 65 77 50  NULL;...    newP
e6f0: 74 72 2d 3e 73 75 6d 6d 61 72 79 50 74 72 20 3d  tr->summaryPtr =
e700: 20 4e 55 4c 4c 3b 0a 09 09 20 20 20 20 6e 65 77   NULL;...    new
e710: 50 74 72 2d 3e 6c 65 76 65 6c 20 3d 20 6e 6f 64  Ptr->level = nod
e720: 65 50 74 72 2d 3e 6c 65 76 65 6c 20 2b 20 31 3b  ePtr->level + 1;
e730: 0a 09 09 20 20 20 20 6e 65 77 50 74 72 2d 3e 63  ...    newPtr->c
e740: 68 69 6c 64 72 65 6e 2e 6e 6f 64 65 50 74 72 20  hildren.nodePtr 
e750: 3d 20 6e 6f 64 65 50 74 72 3b 0a 09 09 20 20 20  = nodePtr;...   
e760: 20 6e 65 77 50 74 72 2d 3e 6e 75 6d 43 68 69 6c   newPtr->numChil
e770: 64 72 65 6e 20 3d 20 31 3b 0a 09 09 20 20 20 20  dren = 1;...    
e780: 6e 65 77 50 74 72 2d 3e 6e 75 6d 4c 69 6e 65 73  newPtr->numLines
e790: 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d 4c   = nodePtr->numL
e7a0: 69 6e 65 73 3b 0a 09 09 20 20 20 20 52 65 63 6f  ines;...    Reco
e7b0: 6d 70 75 74 65 4e 6f 64 65 43 6f 75 6e 74 73 28  mputeNodeCounts(
e7c0: 6e 65 77 50 74 72 29 3b 0a 09 09 20 20 20 20 74  newPtr);...    t
e7d0: 72 65 65 50 74 72 2d 3e 72 6f 6f 74 50 74 72 20  reePtr->rootPtr 
e7e0: 3d 20 6e 65 77 50 74 72 3b 0a 09 09 7d 0a 09 09  = newPtr;...}...
e7f0: 6e 65 77 50 74 72 20 3d 20 28 4e 6f 64 65 20 2a  newPtr = (Node *
e800: 29 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  ) ckalloc(sizeof
e810: 28 4e 6f 64 65 29 29 3b 0a 09 09 6e 65 77 50 74  (Node));...newPt
e820: 72 2d 3e 70 61 72 65 6e 74 50 74 72 20 3d 20 6e  r->parentPtr = n
e830: 6f 64 65 50 74 72 2d 3e 70 61 72 65 6e 74 50 74  odePtr->parentPt
e840: 72 3b 0a 09 09 6e 65 77 50 74 72 2d 3e 6e 65 78  r;...newPtr->nex
e850: 74 50 74 72 20 3d 20 6e 6f 64 65 50 74 72 2d 3e  tPtr = nodePtr->
e860: 6e 65 78 74 50 74 72 3b 0a 09 09 6e 6f 64 65 50  nextPtr;...nodeP
e870: 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 6e 65  tr->nextPtr = ne
e880: 77 50 74 72 3b 0a 09 09 6e 65 77 50 74 72 2d 3e  wPtr;...newPtr->
e890: 73 75 6d 6d 61 72 79 50 74 72 20 3d 20 4e 55 4c  summaryPtr = NUL
e8a0: 4c 3b 0a 09 09 6e 65 77 50 74 72 2d 3e 6c 65 76  L;...newPtr->lev
e8b0: 65 6c 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 6c 65  el = nodePtr->le
e8c0: 76 65 6c 3b 0a 09 09 6e 65 77 50 74 72 2d 3e 6e  vel;...newPtr->n
e8d0: 75 6d 43 68 69 6c 64 72 65 6e 20 3d 20 6e 6f 64  umChildren = nod
e8e0: 65 50 74 72 2d 3e 6e 75 6d 43 68 69 6c 64 72 65  ePtr->numChildre
e8f0: 6e 20 2d 20 4d 49 4e 5f 43 48 49 4c 44 52 45 4e  n - MIN_CHILDREN
e900: 3b 0a 09 09 69 66 20 28 6e 6f 64 65 50 74 72 2d  ;...if (nodePtr-
e910: 3e 6c 65 76 65 6c 20 3d 3d 20 30 29 20 7b 0a 09  >level == 0) {..
e920: 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20 4d 49  .    for (i = MI
e930: 4e 5f 43 48 49 4c 44 52 45 4e 2d 31 2c 0a 09 09  N_CHILDREN-1,...
e940: 09 20 20 20 20 6c 69 6e 65 50 74 72 20 3d 20 6e  .    linePtr = n
e950: 6f 64 65 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e  odePtr->children
e960: 2e 6c 69 6e 65 50 74 72 3b 0a 09 09 09 20 20 20  .linePtr;....   
e970: 20 69 20 3e 20 30 3b 20 69 2d 2d 2c 20 6c 69 6e   i > 0; i--, lin
e980: 65 50 74 72 20 3d 20 6c 69 6e 65 50 74 72 2d 3e  ePtr = linePtr->
e990: 6e 65 78 74 50 74 72 29 20 7b 0a 09 09 09 2f 2a  nextPtr) {..../*
e9a0: 20 45 6d 70 74 79 20 6c 6f 6f 70 20 62 6f 64 79   Empty loop body
e9b0: 2e 20 2a 2f 0a 09 09 20 20 20 20 7d 0a 09 09 20  . */...    }... 
e9c0: 20 20 20 6e 65 77 50 74 72 2d 3e 63 68 69 6c 64     newPtr->child
e9d0: 72 65 6e 2e 6c 69 6e 65 50 74 72 20 3d 20 6c 69  ren.linePtr = li
e9e0: 6e 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a  nePtr->nextPtr;.
e9f0: 09 09 20 20 20 20 6c 69 6e 65 50 74 72 2d 3e 6e  ..    linePtr->n
ea00: 65 78 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09  extPtr = NULL;..
ea10: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
ea20: 66 6f 72 20 28 69 20 3d 20 4d 49 4e 5f 43 48 49  for (i = MIN_CHI
ea30: 4c 44 52 45 4e 2d 31 2c 0a 09 09 09 20 20 20 20  LDREN-1,....    
ea40: 63 68 69 6c 64 50 74 72 20 3d 20 6e 6f 64 65 50  childPtr = nodeP
ea50: 74 72 2d 3e 63 68 69 6c 64 72 65 6e 2e 6e 6f 64  tr->children.nod
ea60: 65 50 74 72 3b 0a 09 09 09 20 20 20 20 69 20 3e  ePtr;....    i >
ea70: 20 30 3b 20 69 2d 2d 2c 20 63 68 69 6c 64 50 74   0; i--, childPt
ea80: 72 20 3d 20 63 68 69 6c 64 50 74 72 2d 3e 6e 65  r = childPtr->ne
ea90: 78 74 50 74 72 29 20 7b 0a 09 09 09 2f 2a 20 45  xtPtr) {..../* E
eaa0: 6d 70 74 79 20 6c 6f 6f 70 20 62 6f 64 79 2e 20  mpty loop body. 
eab0: 2a 2f 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 20  */...    }...   
eac0: 20 6e 65 77 50 74 72 2d 3e 63 68 69 6c 64 72 65   newPtr->childre
ead0: 6e 2e 6e 6f 64 65 50 74 72 20 3d 20 63 68 69 6c  n.nodePtr = chil
eae0: 64 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09  dPtr->nextPtr;..
eaf0: 09 20 20 20 20 63 68 69 6c 64 50 74 72 2d 3e 6e  .    childPtr->n
eb00: 65 78 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09  extPtr = NULL;..
eb10: 09 7d 0a 09 09 52 65 63 6f 6d 70 75 74 65 4e 6f  .}...RecomputeNo
eb20: 64 65 43 6f 75 6e 74 73 28 6e 6f 64 65 50 74 72  deCounts(nodePtr
eb30: 29 3b 0a 09 09 6e 6f 64 65 50 74 72 2d 3e 70 61  );...nodePtr->pa
eb40: 72 65 6e 74 50 74 72 2d 3e 6e 75 6d 43 68 69 6c  rentPtr->numChil
eb50: 64 72 65 6e 2b 2b 3b 0a 09 09 6e 6f 64 65 50 74  dren++;...nodePt
eb60: 72 20 3d 20 6e 65 77 50 74 72 3b 0a 09 09 69 66  r = newPtr;...if
eb70: 20 28 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d 43 68   (nodePtr->numCh
eb80: 69 6c 64 72 65 6e 20 3c 3d 20 4d 41 58 5f 43 48  ildren <= MAX_CH
eb90: 49 4c 44 52 45 4e 29 20 7b 0a 09 09 20 20 20 20  ILDREN) {...    
eba0: 52 65 63 6f 6d 70 75 74 65 4e 6f 64 65 43 6f 75  RecomputeNodeCou
ebb0: 6e 74 73 28 6e 6f 64 65 50 74 72 29 3b 0a 09 09  nts(nodePtr);...
ebc0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09      break;...}..
ebd0: 20 20 20 20 7d 0a 09 7d 0a 0a 09 77 68 69 6c 65      }..}...while
ebe0: 20 28 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d 43 68   (nodePtr->numCh
ebf0: 69 6c 64 72 65 6e 20 3c 20 4d 49 4e 5f 43 48 49  ildren < MIN_CHI
ec00: 4c 44 52 45 4e 29 20 7b 0a 09 20 20 20 20 72 65  LDREN) {..    re
ec10: 67 69 73 74 65 72 20 4e 6f 64 65 20 2a 6f 74 68  gister Node *oth
ec20: 65 72 50 74 72 3b 0a 09 20 20 20 20 4e 6f 64 65  erPtr;..    Node
ec30: 20 2a 68 61 6c 66 77 61 79 4e 6f 64 65 50 74 72   *halfwayNodePtr
ec40: 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 49 6e 69 74   = NULL;./* Init
ec50: 69 61 6c 69 7a 61 74 69 6f 6e 20 6e 65 65 64 65  ialization neede
ec60: 64 20 6f 6e 6c 79 20 2a 2f 0a 09 20 20 20 20 54  d only */..    T
ec70: 6b 54 65 78 74 4c 69 6e 65 20 2a 68 61 6c 66 77  kTextLine *halfw
ec80: 61 79 4c 69 6e 65 50 74 72 20 3d 20 4e 55 4c 4c  ayLinePtr = NULL
ec90: 3b 09 2f 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  ;./* to prevent 
eca0: 63 63 20 77 61 72 6e 69 6e 67 73 2e 20 2a 2f 0a  cc warnings. */.
ecb0: 09 20 20 20 20 69 6e 74 20 74 6f 74 61 6c 43 68  .    int totalCh
ecc0: 69 6c 64 72 65 6e 2c 20 66 69 72 73 74 43 68 69  ildren, firstChi
ecd0: 6c 64 72 65 6e 2c 20 69 3b 0a 0a 09 20 20 20 20  ldren, i;...    
ece0: 2f 2a 0a 09 20 20 20 20 20 2a 20 54 6f 6f 20 66  /*..     * Too f
ecf0: 65 77 20 63 68 69 6c 64 72 65 6e 20 66 6f 72 20  ew children for 
ed00: 74 68 69 73 20 6e 6f 64 65 2e 20 20 49 66 20 74  this node.  If t
ed10: 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f 74 20  his is the root 
ed20: 74 68 65 6e 2c 0a 09 20 20 20 20 20 2a 20 69 74  then,..     * it
ed30: 27 73 20 4f 4b 20 66 6f 72 20 69 74 20 74 6f 20  's OK for it to 
ed40: 68 61 76 65 20 6c 65 73 73 20 74 68 61 6e 20 4d  have less than M
ed50: 49 4e 5f 43 48 49 4c 44 52 45 4e 20 63 68 69 6c  IN_CHILDREN chil
ed60: 64 72 65 6e 0a 09 20 20 20 20 20 2a 20 61 73 20  dren..     * as 
ed70: 6c 6f 6e 67 20 61 73 20 69 74 27 73 20 67 6f 74  long as it's got
ed80: 20 61 74 20 6c 65 61 73 74 20 74 77 6f 2e 20 20   at least two.  
ed90: 49 66 20 69 74 20 68 61 73 20 6f 6e 6c 79 20 6f  If it has only o
eda0: 6e 65 0a 09 20 20 20 20 20 2a 20 28 61 6e 64 20  ne..     * (and 
edb0: 69 73 6e 27 74 20 61 74 20 6c 65 76 65 6c 20 30  isn't at level 0
edc0: 29 2c 20 74 68 65 6e 20 63 68 6f 70 20 74 68 65  ), then chop the
edd0: 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 75 74 20 6f   root node out o
ede0: 66 0a 09 20 20 20 20 20 2a 20 74 68 65 20 74 72  f..     * the tr
edf0: 65 65 20 61 6e 64 20 75 73 65 20 69 74 73 20 63  ee and use its c
ee00: 68 69 6c 64 20 61 73 20 74 68 65 20 6e 65 77 20  hild as the new 
ee10: 72 6f 6f 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  root...     */..
ee20: 09 20 20 20 20 69 66 20 28 6e 6f 64 65 50 74 72  .    if (nodePtr
ee30: 2d 3e 70 61 72 65 6e 74 50 74 72 20 3d 3d 20 4e  ->parentPtr == N
ee40: 55 4c 4c 29 20 7b 0a 09 09 69 66 20 28 28 6e 6f  ULL) {...if ((no
ee50: 64 65 50 74 72 2d 3e 6e 75 6d 43 68 69 6c 64 72  dePtr->numChildr
ee60: 65 6e 20 3d 3d 20 31 29 20 26 26 20 28 6e 6f 64  en == 1) && (nod
ee70: 65 50 74 72 2d 3e 6c 65 76 65 6c 20 3e 20 30 29  ePtr->level > 0)
ee80: 29 20 7b 0a 09 09 20 20 20 20 74 72 65 65 50 74  ) {...    treePt
ee90: 72 2d 3e 72 6f 6f 74 50 74 72 20 3d 20 6e 6f 64  r->rootPtr = nod
eea0: 65 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e 2e 6e  ePtr->children.n
eeb0: 6f 64 65 50 74 72 3b 0a 09 09 20 20 20 20 74 72  odePtr;...    tr
eec0: 65 65 50 74 72 2d 3e 72 6f 6f 74 50 74 72 2d 3e  eePtr->rootPtr->
eed0: 70 61 72 65 6e 74 50 74 72 20 3d 20 4e 55 4c 4c  parentPtr = NULL
eee0: 3b 0a 09 09 20 20 20 20 44 65 6c 65 74 65 53 75  ;...    DeleteSu
eef0: 6d 6d 61 72 69 65 73 28 6e 6f 64 65 50 74 72 2d  mmaries(nodePtr-
ef00: 3e 73 75 6d 6d 61 72 79 50 74 72 29 3b 0a 09 09  >summaryPtr);...
ef10: 20 20 20 20 63 6b 66 72 65 65 28 28 63 68 61 72      ckfree((char
ef20: 20 2a 29 20 6e 6f 64 65 50 74 72 29 3b 0a 09 09   *) nodePtr);...
ef30: 7d 0a 09 09 72 65 74 75 72 6e 3b 0a 09 20 20 20  }...return;..   
ef40: 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20   }...    /*..   
ef50: 20 20 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74    * Not the root
ef60: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61  .  Make sure tha
ef70: 74 20 74 68 65 72 65 20 61 72 65 20 73 69 62 6c  t there are sibl
ef80: 69 6e 67 73 20 74 6f 0a 09 20 20 20 20 20 2a 20  ings to..     * 
ef90: 62 61 6c 61 6e 63 65 20 77 69 74 68 2e 0a 09 20  balance with... 
efa0: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20      */...    if 
efb0: 28 6e 6f 64 65 50 74 72 2d 3e 70 61 72 65 6e 74  (nodePtr->parent
efc0: 50 74 72 2d 3e 6e 75 6d 43 68 69 6c 64 72 65 6e  Ptr->numChildren
efd0: 20 3c 20 32 29 20 7b 0a 09 09 52 65 62 61 6c 61   < 2) {...Rebala
efe0: 6e 63 65 28 74 72 65 65 50 74 72 2c 20 6e 6f 64  nce(treePtr, nod
eff0: 65 50 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 29  ePtr->parentPtr)
f000: 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20  ;...continue;.. 
f010: 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20     }...    /*.. 
f020: 20 20 20 20 2a 20 46 69 6e 64 20 61 20 73 69 62      * Find a sib
f030: 6c 69 6e 67 20 6e 65 69 67 68 62 6f 72 20 74 6f  ling neighbor to
f040: 20 62 6f 72 72 6f 77 20 66 72 6f 6d 2c 20 61 6e   borrow from, an
f050: 64 20 61 72 72 61 6e 67 65 20 66 6f 72 0a 09 20  d arrange for.. 
f060: 20 20 20 20 2a 20 6e 6f 64 65 50 74 72 20 74 6f      * nodePtr to
f070: 20 62 65 20 74 68 65 20 65 61 72 6c 69 65 72 20   be the earlier 
f080: 6f 66 20 74 68 65 20 70 61 69 72 2e 0a 09 20 20  of the pair...  
f090: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28     */...    if (
f0a0: 6e 6f 64 65 50 74 72 2d 3e 6e 65 78 74 50 74 72  nodePtr->nextPtr
f0b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 66 6f   == NULL) {...fo
f0c0: 72 20 28 6f 74 68 65 72 50 74 72 20 3d 20 6e 6f  r (otherPtr = no
f0d0: 64 65 50 74 72 2d 3e 70 61 72 65 6e 74 50 74 72  dePtr->parentPtr
f0e0: 2d 3e 63 68 69 6c 64 72 65 6e 2e 6e 6f 64 65 50  ->children.nodeP
f0f0: 74 72 3b 0a 09 09 09 6f 74 68 65 72 50 74 72 2d  tr;....otherPtr-
f100: 3e 6e 65 78 74 50 74 72 20 21 3d 20 6e 6f 64 65  >nextPtr != node
f110: 50 74 72 3b 0a 09 09 09 6f 74 68 65 72 50 74 72  Ptr;....otherPtr
f120: 20 3d 20 6f 74 68 65 72 50 74 72 2d 3e 6e 65 78   = otherPtr->nex
f130: 74 50 74 72 29 20 7b 0a 09 09 20 20 20 20 2f 2a  tPtr) {...    /*
f140: 20 45 6d 70 74 79 20 6c 6f 6f 70 20 62 6f 64 79   Empty loop body
f150: 2e 20 2a 2f 0a 09 09 7d 0a 09 09 6e 6f 64 65 50  . */...}...nodeP
f160: 74 72 20 3d 20 6f 74 68 65 72 50 74 72 3b 0a 09  tr = otherPtr;..
f170: 20 20 20 20 7d 0a 09 20 20 20 20 6f 74 68 65 72      }..    other
f180: 50 74 72 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 6e  Ptr = nodePtr->n
f190: 65 78 74 50 74 72 3b 0a 0a 09 20 20 20 20 2f 2a  extPtr;...    /*
f1a0: 0a 09 20 20 20 20 20 2a 20 57 65 27 72 65 20 67  ..     * We're g
f1b0: 6f 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 6d  oing to either m
f1c0: 65 72 67 65 20 74 68 65 20 74 77 6f 20 73 69 62  erge the two sib
f1d0: 6c 69 6e 67 73 20 74 6f 67 65 74 68 65 72 0a 09  lings together..
f1e0: 20 20 20 20 20 2a 20 69 6e 74 6f 20 6f 6e 65 20       * into one 
f1f0: 6e 6f 64 65 20 6f 72 20 72 65 64 69 76 69 64 65  node or redivide
f200: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 6d   the children am
f210: 6f 6e 67 20 74 68 65 6d 20 74 6f 0a 09 20 20 20  ong them to..   
f220: 20 20 2a 20 62 61 6c 61 6e 63 65 20 74 68 65 69    * balance thei
f230: 72 20 6c 6f 61 64 73 2e 20 20 41 73 20 70 72 65  r loads.  As pre
f240: 70 61 72 61 74 69 6f 6e 2c 20 6a 6f 69 6e 20 74  paration, join t
f250: 68 65 69 72 20 74 77 6f 0a 09 20 20 20 20 20 2a  heir two..     *
f260: 20 63 68 69 6c 64 20 6c 69 73 74 73 20 69 6e 74   child lists int
f270: 6f 20 61 20 73 69 6e 67 6c 65 20 6c 69 73 74 20  o a single list 
f280: 61 6e 64 20 72 65 6d 65 6d 62 65 72 20 74 68 65  and remember the
f290: 20 68 61 6c 66 2d 77 61 79 0a 09 20 20 20 20 20   half-way..     
f2a0: 2a 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 6c  * point in the l
f2b0: 69 73 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  ist...     */...
f2c0: 20 20 20 20 74 6f 74 61 6c 43 68 69 6c 64 72 65      totalChildre
f2d0: 6e 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d  n = nodePtr->num
f2e0: 43 68 69 6c 64 72 65 6e 20 2b 20 6f 74 68 65 72  Children + other
f2f0: 50 74 72 2d 3e 6e 75 6d 43 68 69 6c 64 72 65 6e  Ptr->numChildren
f300: 3b 0a 09 20 20 20 20 66 69 72 73 74 43 68 69 6c  ;..    firstChil
f310: 64 72 65 6e 20 3d 20 74 6f 74 61 6c 43 68 69 6c  dren = totalChil
f320: 64 72 65 6e 2f 32 3b 0a 09 20 20 20 20 69 66 20  dren/2;..    if 
f330: 28 6e 6f 64 65 50 74 72 2d 3e 63 68 69 6c 64 72  (nodePtr->childr
f340: 65 6e 2e 6e 6f 64 65 50 74 72 20 3d 3d 20 4e 55  en.nodePtr == NU
f350: 4c 4c 29 20 7b 0a 09 09 6e 6f 64 65 50 74 72 2d  LL) {...nodePtr-
f360: 3e 63 68 69 6c 64 72 65 6e 20 3d 20 6f 74 68 65  >children = othe
f370: 72 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e 3b 0a  rPtr->children;.
f380: 09 09 6f 74 68 65 72 50 74 72 2d 3e 63 68 69 6c  ..otherPtr->chil
f390: 64 72 65 6e 2e 6e 6f 64 65 50 74 72 20 3d 20 4e  dren.nodePtr = N
f3a0: 55 4c 4c 3b 0a 09 09 6f 74 68 65 72 50 74 72 2d  ULL;...otherPtr-
f3b0: 3e 63 68 69 6c 64 72 65 6e 2e 6c 69 6e 65 50 74  >children.linePt
f3c0: 72 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  r = NULL;..    }
f3d0: 0a 09 20 20 20 20 69 66 20 28 6e 6f 64 65 50 74  ..    if (nodePt
f3e0: 72 2d 3e 6c 65 76 65 6c 20 3d 3d 20 30 29 20 7b  r->level == 0) {
f3f0: 0a 09 09 72 65 67 69 73 74 65 72 20 54 6b 54 65  ...register TkTe
f400: 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50 74 72 3b  xtLine *linePtr;
f410: 0a 0a 09 09 66 6f 72 20 28 6c 69 6e 65 50 74 72  ....for (linePtr
f420: 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 63 68 69 6c   = nodePtr->chil
f430: 64 72 65 6e 2e 6c 69 6e 65 50 74 72 2c 20 69 20  dren.linePtr, i 
f440: 3d 20 31 3b 0a 09 09 09 6c 69 6e 65 50 74 72 2d  = 1;....linePtr-
f450: 3e 6e 65 78 74 50 74 72 20 21 3d 20 4e 55 4c 4c  >nextPtr != NULL
f460: 3b 0a 09 09 09 6c 69 6e 65 50 74 72 20 3d 20 6c  ;....linePtr = l
f470: 69 6e 65 50 74 72 2d 3e 6e 65 78 74 50 74 72 2c  inePtr->nextPtr,
f480: 20 69 2b 2b 29 20 7b 0a 09 09 20 20 20 20 69 66   i++) {...    if
f490: 20 28 69 20 3d 3d 20 66 69 72 73 74 43 68 69 6c   (i == firstChil
f4a0: 64 72 65 6e 29 20 7b 0a 09 09 09 68 61 6c 66 77  dren) {....halfw
f4b0: 61 79 4c 69 6e 65 50 74 72 20 3d 20 6c 69 6e 65  ayLinePtr = line
f4c0: 50 74 72 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  Ptr;...    }...}
f4d0: 0a 09 09 6c 69 6e 65 50 74 72 2d 3e 6e 65 78 74  ...linePtr->next
f4e0: 50 74 72 20 3d 20 6f 74 68 65 72 50 74 72 2d 3e  Ptr = otherPtr->
f4f0: 63 68 69 6c 64 72 65 6e 2e 6c 69 6e 65 50 74 72  children.linePtr
f500: 3b 0a 09 09 77 68 69 6c 65 20 28 69 20 3c 3d 20  ;...while (i <= 
f510: 66 69 72 73 74 43 68 69 6c 64 72 65 6e 29 20 7b  firstChildren) {
f520: 0a 09 09 20 20 20 20 68 61 6c 66 77 61 79 4c 69  ...    halfwayLi
f530: 6e 65 50 74 72 20 3d 20 6c 69 6e 65 50 74 72 3b  nePtr = linePtr;
f540: 0a 09 09 20 20 20 20 6c 69 6e 65 50 74 72 20 3d  ...    linePtr =
f550: 20 6c 69 6e 65 50 74 72 2d 3e 6e 65 78 74 50 74   linePtr->nextPt
f560: 72 3b 0a 09 09 20 20 20 20 69 2b 2b 3b 0a 09 09  r;...    i++;...
f570: 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  }..    } else {.
f580: 09 09 72 65 67 69 73 74 65 72 20 4e 6f 64 65 20  ..register Node 
f590: 2a 63 68 69 6c 64 50 74 72 3b 0a 0a 09 09 66 6f  *childPtr;....fo
f5a0: 72 20 28 63 68 69 6c 64 50 74 72 20 3d 20 6e 6f  r (childPtr = no
f5b0: 64 65 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e 2e  dePtr->children.
f5c0: 6e 6f 64 65 50 74 72 2c 20 69 20 3d 20 31 3b 0a  nodePtr, i = 1;.
f5d0: 09 09 09 63 68 69 6c 64 50 74 72 2d 3e 6e 65 78  ...childPtr->nex
f5e0: 74 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09  tPtr != NULL;...
f5f0: 09 63 68 69 6c 64 50 74 72 20 3d 20 63 68 69 6c  .childPtr = chil
f600: 64 50 74 72 2d 3e 6e 65 78 74 50 74 72 2c 20 69  dPtr->nextPtr, i
f610: 2b 2b 29 20 7b 0a 09 09 20 20 20 20 69 66 20 28  ++) {...    if (
f620: 69 20 3c 3d 20 66 69 72 73 74 43 68 69 6c 64 72  i <= firstChildr
f630: 65 6e 29 20 7b 0a 09 09 09 69 66 20 28 69 20 3d  en) {....if (i =
f640: 3d 20 66 69 72 73 74 43 68 69 6c 64 72 65 6e 29  = firstChildren)
f650: 20 7b 0a 09 09 09 20 20 20 20 68 61 6c 66 77 61   {....    halfwa
f660: 79 4e 6f 64 65 50 74 72 20 3d 20 63 68 69 6c 64  yNodePtr = child
f670: 50 74 72 3b 0a 09 09 09 7d 0a 09 09 20 20 20 20  Ptr;....}...    
f680: 7d 0a 09 09 7d 0a 09 09 63 68 69 6c 64 50 74 72  }...}...childPtr
f690: 2d 3e 6e 65 78 74 50 74 72 20 3d 20 6f 74 68 65  ->nextPtr = othe
f6a0: 72 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e 2e 6e  rPtr->children.n
f6b0: 6f 64 65 50 74 72 3b 0a 09 09 77 68 69 6c 65 20  odePtr;...while 
f6c0: 28 69 20 3c 3d 20 66 69 72 73 74 43 68 69 6c 64  (i <= firstChild
f6d0: 72 65 6e 29 20 7b 0a 09 09 20 20 20 20 68 61 6c  ren) {...    hal
f6e0: 66 77 61 79 4e 6f 64 65 50 74 72 20 3d 20 63 68  fwayNodePtr = ch
f6f0: 69 6c 64 50 74 72 3b 0a 09 09 20 20 20 20 63 68  ildPtr;...    ch
f700: 69 6c 64 50 74 72 20 3d 20 63 68 69 6c 64 50 74  ildPtr = childPt
f710: 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 09 20 20  r->nextPtr;...  
f720: 20 20 69 2b 2b 3b 0a 09 09 7d 0a 09 20 20 20 20    i++;...}..    
f730: 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20  }...    /*..    
f740: 20 2a 20 49 66 20 74 68 65 20 74 77 6f 20 73 69   * If the two si
f750: 62 6c 69 6e 67 73 20 63 61 6e 20 73 69 6d 70 6c  blings can simpl
f760: 79 20 62 65 20 6d 65 72 67 65 64 20 74 6f 67 65  y be merged toge
f770: 74 68 65 72 2c 20 64 6f 20 69 74 2e 0a 09 20 20  ther, do it...  
f780: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28     */...    if (
f790: 74 6f 74 61 6c 43 68 69 6c 64 72 65 6e 20 3c 3d  totalChildren <=
f7a0: 20 4d 41 58 5f 43 48 49 4c 44 52 45 4e 29 20 7b   MAX_CHILDREN) {
f7b0: 0a 09 09 52 65 63 6f 6d 70 75 74 65 4e 6f 64 65  ...RecomputeNode
f7c0: 43 6f 75 6e 74 73 28 6e 6f 64 65 50 74 72 29 3b  Counts(nodePtr);
f7d0: 0a 09 09 6e 6f 64 65 50 74 72 2d 3e 6e 65 78 74  ...nodePtr->next
f7e0: 50 74 72 20 3d 20 6f 74 68 65 72 50 74 72 2d 3e  Ptr = otherPtr->
f7f0: 6e 65 78 74 50 74 72 3b 0a 09 09 6e 6f 64 65 50  nextPtr;...nodeP
f800: 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 2d 3e 6e  tr->parentPtr->n
f810: 75 6d 43 68 69 6c 64 72 65 6e 2d 2d 3b 0a 09 09  umChildren--;...
f820: 44 65 6c 65 74 65 53 75 6d 6d 61 72 69 65 73 28  DeleteSummaries(
f830: 6f 74 68 65 72 50 74 72 2d 3e 73 75 6d 6d 61 72  otherPtr->summar
f840: 79 50 74 72 29 3b 0a 09 09 63 6b 66 72 65 65 28  yPtr);...ckfree(
f850: 28 63 68 61 72 20 2a 29 20 6f 74 68 65 72 50 74  (char *) otherPt
f860: 72 29 3b 0a 09 09 63 6f 6e 74 69 6e 75 65 3b 0a  r);...continue;.
f870: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a  .    }...    /*.
f880: 09 20 20 20 20 20 2a 20 54 68 65 20 73 69 62 6c  .     * The sibl
f890: 69 6e 67 73 20 63 61 6e 27 74 20 62 65 20 6d 65  ings can't be me
f8a0: 72 67 65 64 2c 20 73 6f 20 6a 75 73 74 20 64 69  rged, so just di
f8b0: 76 69 64 65 20 74 68 65 69 72 0a 09 20 20 20 20  vide their..    
f8c0: 20 2a 20 63 68 69 6c 64 72 65 6e 20 65 76 65 6e   * children even
f8d0: 6c 79 20 62 65 74 77 65 65 6e 20 74 68 65 6d 2e  ly between them.
f8e0: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
f8f0: 69 66 20 28 6e 6f 64 65 50 74 72 2d 3e 6c 65 76  if (nodePtr->lev
f900: 65 6c 20 3d 3d 20 30 29 20 7b 0a 09 09 6f 74 68  el == 0) {...oth
f910: 65 72 50 74 72 2d 3e 63 68 69 6c 64 72 65 6e 2e  erPtr->children.
f920: 6c 69 6e 65 50 74 72 20 3d 20 68 61 6c 66 77 61  linePtr = halfwa
f930: 79 4c 69 6e 65 50 74 72 2d 3e 6e 65 78 74 50 74  yLinePtr->nextPt
f940: 72 3b 0a 09 09 68 61 6c 66 77 61 79 4c 69 6e 65  r;...halfwayLine
f950: 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 4e  Ptr->nextPtr = N
f960: 55 4c 4c 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  ULL;..    } else
f970: 20 7b 0a 09 09 6f 74 68 65 72 50 74 72 2d 3e 63   {...otherPtr->c
f980: 68 69 6c 64 72 65 6e 2e 6e 6f 64 65 50 74 72 20  hildren.nodePtr 
f990: 3d 20 68 61 6c 66 77 61 79 4e 6f 64 65 50 74 72  = halfwayNodePtr
f9a0: 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 09 68 61 6c  ->nextPtr;...hal
f9b0: 66 77 61 79 4e 6f 64 65 50 74 72 2d 3e 6e 65 78  fwayNodePtr->nex
f9c0: 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  tPtr = NULL;..  
f9d0: 20 20 7d 0a 09 20 20 20 20 52 65 63 6f 6d 70 75    }..    Recompu
f9e0: 74 65 4e 6f 64 65 43 6f 75 6e 74 73 28 6e 6f 64  teNodeCounts(nod
f9f0: 65 50 74 72 29 3b 0a 09 20 20 20 20 52 65 63 6f  ePtr);..    Reco
fa00: 6d 70 75 74 65 4e 6f 64 65 43 6f 75 6e 74 73 28  mputeNodeCounts(
fa10: 6f 74 68 65 72 50 74 72 29 3b 0a 09 7d 0a 20 20  otherPtr);..}.  
fa20: 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d    }.}.../*. *---
fa30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa70: 2d 2d 2d 0a 20 2a 0a 20 2a 20 52 65 63 6f 6d 70  ---. *. * Recomp
fa80: 75 74 65 4e 6f 64 65 43 6f 75 6e 74 73 20 2d 2d  uteNodeCounts --
fa90: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
faa0: 65 64 75 72 65 20 69 73 20 63 61 6c 6c 65 64 20  edure is called 
fab0: 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  to recompute all
fac0: 20 74 68 65 20 63 6f 75 6e 74 73 20 69 6e 20 61   the counts in a
fad0: 20 6e 6f 64 65 0a 20 2a 09 28 74 61 67 73 2c 20   node. *.(tags, 
fae0: 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f  child informatio
faf0: 6e 2c 20 65 74 63 2e 29 20 62 79 20 73 63 61 6e  n, etc.) by scan
fb00: 6e 69 6e 67 20 74 68 65 20 69 6e 66 6f 72 6d 61  ning the informa
fb10: 74 69 6f 6e 20 69 6e 0a 20 2a 09 69 74 73 20 64  tion in. *.its d
fb20: 65 73 63 65 6e 64 61 6e 74 73 2e 20 20 54 68 69  escendants.  Thi
fb30: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 63  s procedure is c
fb40: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 72 65 62  alled during reb
fb50: 61 6c 61 6e 63 69 6e 67 0a 20 2a 09 77 68 65 6e  alancing. *.when
fb60: 20 61 20 6e 6f 64 65 27 73 20 63 68 69 6c 64 20   a node's child 
fb70: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 63 68  structure has ch
fb80: 61 6e 67 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73  anged.. *. * Res
fb90: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ults:. *.None.. 
fba0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
fbb0: 73 3a 0a 20 2a 09 54 68 65 20 74 61 67 20 63 6f  s:. *.The tag co
fbc0: 75 6e 74 73 20 66 6f 72 20 6e 6f 64 65 50 74 72  unts for nodePtr
fbd0: 20 61 72 65 20 6d 6f 64 69 66 69 65 64 20 74 6f   are modified to
fbe0: 20 72 65 66 6c 65 63 74 20 69 74 73 20 63 75 72   reflect its cur
fbf0: 72 65 6e 74 0a 20 2a 09 63 68 69 6c 64 20 73 74  rent. *.child st
fc00: 72 75 63 74 75 72 65 2c 20 61 73 20 61 72 65 20  ructure, as are 
fc10: 69 74 73 20 6e 75 6d 43 68 69 6c 64 72 65 6e 20  its numChildren 
fc20: 61 6e 64 20 6e 75 6d 4c 69 6e 65 73 20 66 69 65  and numLines fie
fc30: 6c 64 73 2e 0a 20 2a 09 41 6c 73 6f 2c 20 61 6c  lds.. *.Also, al
fc40: 6c 20 6f 66 20 74 68 65 20 63 68 69 6c 64 72 65  l of the childre
fc50: 6e 73 27 20 70 61 72 65 6e 74 50 74 72 20 66 69  ns' parentPtr fi
fc60: 65 6c 64 73 20 61 72 65 20 6d 61 64 65 20 74 6f  elds are made to
fc70: 20 70 6f 69 6e 74 0a 20 2a 09 74 6f 20 6e 6f 64   point. *.to nod
fc80: 65 50 74 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ePtr.. *. *-----
fc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcd0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  -. */..static vo
fce0: 69 64 0a 52 65 63 6f 6d 70 75 74 65 4e 6f 64 65  id.RecomputeNode
fcf0: 43 6f 75 6e 74 73 28 6e 6f 64 65 50 74 72 29 0a  Counts(nodePtr).
fd00: 20 20 20 20 72 65 67 69 73 74 65 72 20 4e 6f 64      register Nod
fd10: 65 20 2a 6e 6f 64 65 50 74 72 3b 09 09 2f 2a 20  e *nodePtr;../* 
fd20: 4e 6f 64 65 20 77 68 6f 73 65 20 74 61 67 20 73  Node whose tag s
fd30: 75 6d 6d 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  ummary informati
fd40: 6f 6e 0a 09 09 09 09 09 20 2a 20 6d 75 73 74 20  on...... * must 
fd50: 62 65 20 72 65 63 6f 6d 70 75 74 65 64 2e 20 2a  be recomputed. *
fd60: 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72  /.{.    register
fd70: 20 53 75 6d 6d 61 72 79 20 2a 73 75 6d 6d 61 72   Summary *summar
fd80: 79 50 74 72 2c 20 2a 73 75 6d 6d 61 72 79 50 74  yPtr, *summaryPt
fd90: 72 32 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72  r2;.    register
fda0: 20 4e 6f 64 65 20 2a 63 68 69 6c 64 50 74 72 3b   Node *childPtr;
fdb0: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54 6b  .    register Tk
fdc0: 54 65 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50 74  TextLine *linePt
fdd0: 72 3b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  r;.    register 
fde0: 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 73  TkTextSegment *s
fdf0: 65 67 50 74 72 3b 0a 20 20 20 20 54 6b 54 65 78  egPtr;.    TkTex
fe00: 74 54 61 67 20 2a 74 61 67 50 74 72 3b 0a 0a 20  tTag *tagPtr;.. 
fe10: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 5a 65 72     /*.     * Zer
fe20: 6f 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 65 78  o out all the ex
fe30: 69 73 74 69 6e 67 20 63 6f 75 6e 74 73 20 66 6f  isting counts fo
fe40: 72 20 74 68 65 20 6e 6f 64 65 2c 20 62 75 74 20  r the node, but 
fe50: 64 6f 6e 27 74 20 64 65 6c 65 74 65 0a 20 20 20  don't delete.   
fe60: 20 20 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67    * the existing
fe70: 20 53 75 6d 6d 61 72 79 20 72 65 63 6f 72 64 73   Summary records
fe80: 20 28 6d 6f 73 74 20 6f 66 20 74 68 65 6d 20 77   (most of them w
fe90: 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 62 65 20  ill probably be 
fea0: 72 65 75 73 65 64 29 2e 0a 20 20 20 20 20 2a 2f  reused)..     */
feb0: 0a 0a 20 20 20 20 66 6f 72 20 28 73 75 6d 6d 61  ..    for (summa
fec0: 72 79 50 74 72 20 3d 20 6e 6f 64 65 50 74 72 2d  ryPtr = nodePtr-
fed0: 3e 73 75 6d 6d 61 72 79 50 74 72 3b 20 73 75 6d  >summaryPtr; sum
fee0: 6d 61 72 79 50 74 72 20 21 3d 20 4e 55 4c 4c 3b  maryPtr != NULL;
fef0: 0a 09 20 20 20 20 73 75 6d 6d 61 72 79 50 74 72  ..    summaryPtr
ff00: 20 3d 20 73 75 6d 6d 61 72 79 50 74 72 2d 3e 6e   = summaryPtr->n
ff10: 65 78 74 50 74 72 29 20 7b 0a 09 73 75 6d 6d 61  extPtr) {..summa
ff20: 72 79 50 74 72 2d 3e 74 6f 67 67 6c 65 43 6f 75  ryPtr->toggleCou
ff30: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nt = 0;.    }.  
ff40: 20 20 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d 43 68    nodePtr->numCh
ff50: 69 6c 64 72 65 6e 20 3d 20 30 3b 0a 20 20 20 20  ildren = 0;.    
ff60: 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d 4c 69 6e 65  nodePtr->numLine
ff70: 73 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 0a 20  s = 0;..    /*. 
ff80: 20 20 20 20 2a 20 53 63 61 6e 20 74 68 72 6f 75      * Scan throu
ff90: 67 68 20 74 68 65 20 63 68 69 6c 64 72 65 6e 2c  gh the children,
ffa0: 20 61 64 64 69 6e 67 20 74 68 65 20 63 68 69 6c   adding the chil
ffb0: 64 72 65 6e 73 27 20 74 61 67 20 63 6f 75 6e 74  drens' tag count
ffc0: 73 20 69 6e 74 6f 0a 20 20 20 20 20 2a 20 74 68  s into.     * th
ffd0: 65 20 6e 6f 64 65 27 73 20 74 61 67 20 63 6f 75  e node's tag cou
ffe0: 6e 74 73 20 61 6e 64 20 61 64 64 69 6e 67 20 6e  nts and adding n
fff0: 65 77 20 53 75 6d 6d 61 72 79 20 73 74 72 75 63  ew Summary struc
10000 74 75 72 65 73 20 69 66 0a 20 20 20 20 20 2a 20  tures if.     * 
10010 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 20 20  necessary..     
10020 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6e 6f 64 65  */..    if (node
10030 50 74 72 2d 3e 6c 65 76 65 6c 20 3d 3d 20 30 29  Ptr->level == 0)
10040 20 7b 0a 09 66 6f 72 20 28 6c 69 6e 65 50 74 72   {..for (linePtr
10050 20 3d 20 6e 6f 64 65 50 74 72 2d 3e 63 68 69 6c   = nodePtr->chil
10060 64 72 65 6e 2e 6c 69 6e 65 50 74 72 3b 20 6c 69  dren.linePtr; li
10070 6e 65 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09  nePtr != NULL;..
10080 09 6c 69 6e 65 50 74 72 20 3d 20 6c 69 6e 65 50  .linePtr = lineP
10090 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09  tr->nextPtr) {..
100a0 20 20 20 20 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d      nodePtr->num
100b0 43 68 69 6c 64 72 65 6e 2b 2b 3b 0a 09 20 20 20  Children++;..   
100c0 20 6e 6f 64 65 50 74 72 2d 3e 6e 75 6d 4c 69 6e   nodePtr->numLin
100d0 65 73 2b 2b 3b 0a 09 20 20 20 20 6c 69 6e 65 50  es++;..    lineP
100e0 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 20 3d 20  tr->parentPtr = 
100f0 6e 6f 64 65 50 74 72 3b 0a 09 20 20 20 20 66 6f  nodePtr;..    fo
10100 72 20 28 73 65 67 50 74 72 20 3d 20 6c 69 6e 65  r (segPtr = line
10110 50 74 72 2d 3e 73 65 67 50 74 72 3b 20 73 65 67  Ptr->segPtr; seg
10120 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 20  Ptr != NULL;... 
10130 20 20 20 73 65 67 50 74 72 20 3d 20 73 65 67 50     segPtr = segP
10140 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09  tr->nextPtr) {..
10150 09 69 66 20 28 28 28 73 65 67 50 74 72 2d 3e 74  .if (((segPtr->t
10160 79 70 65 50 74 72 20 21 3d 20 26 74 6b 54 65 78  ypePtr != &tkTex
10170 74 54 6f 67 67 6c 65 4f 6e 54 79 70 65 29 0a 09  tToggleOnType)..
10180 09 09 26 26 20 28 73 65 67 50 74 72 2d 3e 74 79  ..&& (segPtr->ty
10190 70 65 50 74 72 20 21 3d 20 26 74 6b 54 65 78 74  pePtr != &tkText
101a0 54 6f 67 67 6c 65 4f 66 66 54 79 70 65 29 29 0a  ToggleOffType)).
101b0 09 09 09 7c 7c 20 21 28 73 65 67 50 74 72 2d 3e  ...|| !(segPtr->
101c0 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 69 6e 4e 6f  body.toggle.inNo
101d0 64 65 43 6f 75 6e 74 73 29 29 20 7b 0a 09 09 20  deCounts)) {... 
101e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 09 09 7d     continue;...}
101f0 0a 09 09 74 61 67 50 74 72 20 3d 20 73 65 67 50  ...tagPtr = segP
10200 74 72 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e  tr->body.toggle.
10210 74 61 67 50 74 72 3b 0a 09 09 66 6f 72 20 28 73  tagPtr;...for (s
10220 75 6d 6d 61 72 79 50 74 72 20 3d 20 6e 6f 64 65  ummaryPtr = node
10230 50 74 72 2d 3e 73 75 6d 6d 61 72 79 50 74 72 3b  Ptr->summaryPtr;
10240 20 3b 0a 09 09 09 73 75 6d 6d 61 72 79 50 74 72   ;....summaryPtr
10250 20 3d 20 73 75 6d 6d 61 72 79 50 74 72 2d 3e 6e   = summaryPtr->n
10260 65 78 74 50 74 72 29 20 7b 0a 09 09 20 20 20 20  extPtr) {...    
10270 69 66 20 28 73 75 6d 6d 61 72 79 50 74 72 20 3d  if (summaryPtr =
10280 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 73 75 6d  = NULL) {....sum
10290 6d 61 72 79 50 74 72 20 3d 20 28 53 75 6d 6d 61  maryPtr = (Summa
102a0 72 79 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69  ry *) ckalloc(si
102b0 7a 65 6f 66 28 53 75 6d 6d 61 72 79 29 29 3b 0a  zeof(Summary));.
102c0 09 09 09 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74  ...summaryPtr->t
102d0 61 67 50 74 72 20 3d 20 74 61 67 50 74 72 3b 0a  agPtr = tagPtr;.
102e0 09 09 09 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74  ...summaryPtr->t
102f0 6f 67 67 6c 65 43 6f 75 6e 74 20 3d 20 31 3b 0a  oggleCount = 1;.
10300 09 09 09 73 75 6d 6d 61 72 79 50 74 72 2d 3e 6e  ...summaryPtr->n
10310 65 78 74 50 74 72 20 3d 20 6e 6f 64 65 50 74 72  extPtr = nodePtr
10320 2d 3e 73 75 6d 6d 61 72 79 50 74 72 3b 0a 09 09  ->summaryPtr;...
10330 09 6e 6f 64 65 50 74 72 2d 3e 73 75 6d 6d 61 72  .nodePtr->summar
10340 79 50 74 72 20 3d 20 73 75 6d 6d 61 72 79 50 74  yPtr = summaryPt
10350 72 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 20  r;....break;... 
10360 20 20 20 7d 0a 09 09 20 20 20 20 69 66 20 28 73     }...    if (s
10370 75 6d 6d 61 72 79 50 74 72 2d 3e 74 61 67 50 74  ummaryPtr->tagPt
10380 72 20 3d 3d 20 74 61 67 50 74 72 29 20 7b 0a 09  r == tagPtr) {..
10390 09 09 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74 6f  ..summaryPtr->to
103a0 67 67 6c 65 43 6f 75 6e 74 2b 2b 3b 0a 09 09 09  ggleCount++;....
103b0 62 72 65 61 6b 3b 0a 09 09 20 20 20 20 7d 0a 09  break;...    }..
103c0 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  .}..    }..}.   
103d0 20 7d 20 65 6c 73 65 20 7b 0a 09 66 6f 72 20 28   } else {..for (
103e0 63 68 69 6c 64 50 74 72 20 3d 20 6e 6f 64 65 50  childPtr = nodeP
103f0 74 72 2d 3e 63 68 69 6c 64 72 65 6e 2e 6e 6f 64  tr->children.nod
10400 65 50 74 72 3b 20 63 68 69 6c 64 50 74 72 20 21  ePtr; childPtr !
10410 3d 20 4e 55 4c 4c 3b 0a 09 09 63 68 69 6c 64 50  = NULL;...childP
10420 74 72 20 3d 20 63 68 69 6c 64 50 74 72 2d 3e 6e  tr = childPtr->n
10430 65 78 74 50 74 72 29 20 7b 0a 09 20 20 20 20 6e  extPtr) {..    n
10440 6f 64 65 50 74 72 2d 3e 6e 75 6d 43 68 69 6c 64  odePtr->numChild
10450 72 65 6e 2b 2b 3b 0a 09 20 20 20 20 6e 6f 64 65  ren++;..    node
10460 50 74 72 2d 3e 6e 75 6d 4c 69 6e 65 73 20 2b 3d  Ptr->numLines +=
10470 20 63 68 69 6c 64 50 74 72 2d 3e 6e 75 6d 4c 69   childPtr->numLi
10480 6e 65 73 3b 0a 09 20 20 20 20 63 68 69 6c 64 50  nes;..    childP
10490 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 20 3d 20  tr->parentPtr = 
104a0 6e 6f 64 65 50 74 72 3b 0a 09 20 20 20 20 66 6f  nodePtr;..    fo
104b0 72 20 28 73 75 6d 6d 61 72 79 50 74 72 32 20 3d  r (summaryPtr2 =
104c0 20 63 68 69 6c 64 50 74 72 2d 3e 73 75 6d 6d 61   childPtr->summa
104d0 72 79 50 74 72 3b 20 73 75 6d 6d 61 72 79 50 74  ryPtr; summaryPt
104e0 72 32 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 20 20  r2 != NULL;...  
104f0 20 20 73 75 6d 6d 61 72 79 50 74 72 32 20 3d 20    summaryPtr2 = 
10500 73 75 6d 6d 61 72 79 50 74 72 32 2d 3e 6e 65 78  summaryPtr2->nex
10510 74 50 74 72 29 20 7b 0a 09 09 66 6f 72 20 28 73  tPtr) {...for (s
10520 75 6d 6d 61 72 79 50 74 72 20 3d 20 6e 6f 64 65  ummaryPtr = node
10530 50 74 72 2d 3e 73 75 6d 6d 61 72 79 50 74 72 3b  Ptr->summaryPtr;
10540 20 3b 0a 09 09 09 73 75 6d 6d 61 72 79 50 74 72   ;....summaryPtr
10550 20 3d 20 73 75 6d 6d 61 72 79 50 74 72 2d 3e 6e   = summaryPtr->n
10560 65 78 74 50 74 72 29 20 7b 0a 09 09 20 20 20 20  extPtr) {...    
10570 69 66 20 28 73 75 6d 6d 61 72 79 50 74 72 20 3d  if (summaryPtr =
10580 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 09 73 75 6d  = NULL) {....sum
10590 6d 61 72 79 50 74 72 20 3d 20 28 53 75 6d 6d 61  maryPtr = (Summa
105a0 72 79 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 73 69  ry *) ckalloc(si
105b0 7a 65 6f 66 28 53 75 6d 6d 61 72 79 29 29 3b 0a  zeof(Summary));.
105c0 09 09 09 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74  ...summaryPtr->t
105d0 61 67 50 74 72 20 3d 20 73 75 6d 6d 61 72 79 50  agPtr = summaryP
105e0 74 72 32 2d 3e 74 61 67 50 74 72 3b 0a 09 09 09  tr2->tagPtr;....
105f0 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74 6f 67 67  summaryPtr->togg
10600 6c 65 43 6f 75 6e 74 20 3d 20 73 75 6d 6d 61 72  leCount = summar
10610 79 50 74 72 32 2d 3e 74 6f 67 67 6c 65 43 6f 75  yPtr2->toggleCou
10620 6e 74 3b 0a 09 09 09 73 75 6d 6d 61 72 79 50 74  nt;....summaryPt
10630 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 6e 6f 64  r->nextPtr = nod
10640 65 50 74 72 2d 3e 73 75 6d 6d 61 72 79 50 74 72  ePtr->summaryPtr
10650 3b 0a 09 09 09 6e 6f 64 65 50 74 72 2d 3e 73 75  ;....nodePtr->su
10660 6d 6d 61 72 79 50 74 72 20 3d 20 73 75 6d 6d 61  mmaryPtr = summa
10670 72 79 50 74 72 3b 0a 09 09 09 62 72 65 61 6b 3b  ryPtr;....break;
10680 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 20 20 69  ...    }...    i
10690 66 20 28 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74  f (summaryPtr->t
106a0 61 67 50 74 72 20 3d 3d 20 73 75 6d 6d 61 72 79  agPtr == summary
106b0 50 74 72 32 2d 3e 74 61 67 50 74 72 29 20 7b 0a  Ptr2->tagPtr) {.
106c0 09 09 09 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74  ...summaryPtr->t
106d0 6f 67 67 6c 65 43 6f 75 6e 74 20 2b 3d 20 73 75  oggleCount += su
106e0 6d 6d 61 72 79 50 74 72 32 2d 3e 74 6f 67 67 6c  mmaryPtr2->toggl
106f0 65 43 6f 75 6e 74 3b 0a 09 09 09 62 72 65 61 6b  eCount;....break
10700 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20  ;...    }...}.. 
10710 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20     }..}.    }.. 
10720 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 63 61     /*.     * Sca
10730 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 6e 6f  n through the no
10740 64 65 27 73 20 74 61 67 20 72 65 63 6f 72 64 73  de's tag records
10750 20 61 67 61 69 6e 20 61 6e 64 20 64 65 6c 65 74   again and delet
10760 65 20 61 6e 79 20 53 75 6d 6d 61 72 79 0a 20 20  e any Summary.  
10770 20 20 20 2a 20 72 65 63 6f 72 64 73 20 74 68 61     * records tha
10780 74 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 7a  t still have a z
10790 65 72 6f 20 63 6f 75 6e 74 2e 0a 20 20 20 20 20  ero count..     
107a0 2a 2f 0a 0a 20 20 20 20 73 75 6d 6d 61 72 79 50  */..    summaryP
107b0 74 72 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tr2 = NULL;.    
107c0 66 6f 72 20 28 73 75 6d 6d 61 72 79 50 74 72 20  for (summaryPtr 
107d0 3d 20 6e 6f 64 65 50 74 72 2d 3e 73 75 6d 6d 61  = nodePtr->summa
107e0 72 79 50 74 72 3b 20 73 75 6d 6d 61 72 79 50 74  ryPtr; summaryPt
107f0 72 20 21 3d 20 4e 55 4c 4c 3b 20 29 20 7b 0a 09  r != NULL; ) {..
10800 69 66 20 28 73 75 6d 6d 61 72 79 50 74 72 2d 3e  if (summaryPtr->
10810 74 6f 67 67 6c 65 43 6f 75 6e 74 20 3e 20 30 29  toggleCount > 0)
10820 20 7b 0a 09 20 20 20 20 73 75 6d 6d 61 72 79 50   {..    summaryP
10830 74 72 32 20 3d 20 73 75 6d 6d 61 72 79 50 74 72  tr2 = summaryPtr
10840 3b 0a 09 20 20 20 20 73 75 6d 6d 61 72 79 50 74  ;..    summaryPt
10850 72 20 3d 20 73 75 6d 6d 61 72 79 50 74 72 2d 3e  r = summaryPtr->
10860 6e 65 78 74 50 74 72 3b 0a 09 20 20 20 20 63 6f  nextPtr;..    co
10870 6e 74 69 6e 75 65 3b 0a 09 7d 0a 09 69 66 20 28  ntinue;..}..if (
10880 73 75 6d 6d 61 72 79 50 74 72 32 20 21 3d 20 4e  summaryPtr2 != N
10890 55 4c 4c 29 20 7b 0a 09 20 20 20 20 73 75 6d 6d  ULL) {..    summ
108a0 61 72 79 50 74 72 32 2d 3e 6e 65 78 74 50 74 72  aryPtr2->nextPtr
108b0 20 3d 20 73 75 6d 6d 61 72 79 50 74 72 2d 3e 6e   = summaryPtr->n
108c0 65 78 74 50 74 72 3b 0a 09 20 20 20 20 63 6b 66  extPtr;..    ckf
108d0 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 75 6d  ree((char *) sum
108e0 6d 61 72 79 50 74 72 29 3b 0a 09 20 20 20 20 73  maryPtr);..    s
108f0 75 6d 6d 61 72 79 50 74 72 20 3d 20 73 75 6d 6d  ummaryPtr = summ
10900 61 72 79 50 74 72 32 2d 3e 6e 65 78 74 50 74 72  aryPtr2->nextPtr
10910 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
10920 20 6e 6f 64 65 50 74 72 2d 3e 73 75 6d 6d 61 72   nodePtr->summar
10930 79 50 74 72 20 3d 20 73 75 6d 6d 61 72 79 50 74  yPtr = summaryPt
10940 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 20 20 20  r->nextPtr;..   
10950 20 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29   ckfree((char *)
10960 20 73 75 6d 6d 61 72 79 50 74 72 29 3b 0a 09 20   summaryPtr);.. 
10970 20 20 20 73 75 6d 6d 61 72 79 50 74 72 20 3d 20     summaryPtr = 
10980 6e 6f 64 65 50 74 72 2d 3e 73 75 6d 6d 61 72 79  nodePtr->summary
10990 50 74 72 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a  Ptr;..}.    }.}.
109a0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
109b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
109f0 0a 20 2a 20 54 6b 42 54 72 65 65 4e 75 6d 4c 69  . * TkBTreeNumLi
10a00 6e 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  nes --. *. *.Thi
10a10 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
10a20 72 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  rns a count of t
10a30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69 6e  he number of lin
10a40 65 73 20 6f 66 0a 20 2a 09 74 65 78 74 20 70 72  es of. *.text pr
10a50 65 73 65 6e 74 20 69 6e 20 61 20 67 69 76 65 6e  esent in a given
10a60 20 42 2d 74 72 65 65 2e 0a 20 2a 0a 20 2a 20 52   B-tree.. *. * R
10a70 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72  esults:. *.The r
10a80 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
10a90 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75   count of the nu
10aa0 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 6c  mber of usable l
10ab0 69 6e 65 73 0a 20 2a 09 69 6e 20 74 72 65 65 20  ines. *.in tree 
10ac0 28 69 2e 65 2e 20 69 74 20 64 6f 65 73 6e 27 74  (i.e. it doesn't
10ad0 20 69 6e 63 6c 75 64 65 20 74 68 65 20 64 75 6d   include the dum
10ae0 6d 79 20 6c 69 6e 65 20 74 68 61 74 20 69 73 20  my line that is 
10af0 6a 75 73 74 0a 20 2a 20 09 75 73 65 64 20 74 6f  just. * .used to
10b00 20 6d 61 72 6b 20 74 68 65 20 65 6e 64 20 6f 66   mark the end of
10b10 20 74 68 65 20 74 72 65 65 29 2e 0a 20 2a 0a 20   the tree).. *. 
10b20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
10b30 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b80 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6b  ----. */..int.Tk
10b90 42 54 72 65 65 4e 75 6d 4c 69 6e 65 73 28 74 72  BTreeNumLines(tr
10ba0 65 65 29 0a 20 20 20 20 54 6b 54 65 78 74 42 54  ee).    TkTextBT
10bb0 72 65 65 20 74 72 65 65 3b 09 09 09 2f 2a 20 49  ree tree;.../* I
10bc0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
10bd0 20 74 72 65 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20   tree. */.{.    
10be0 42 54 72 65 65 20 2a 74 72 65 65 50 74 72 20 3d  BTree *treePtr =
10bf0 20 28 42 54 72 65 65 20 2a 29 20 74 72 65 65 3b   (BTree *) tree;
10c00 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 65 65  .    return tree
10c10 50 74 72 2d 3e 72 6f 6f 74 50 74 72 2d 3e 6e 75  Ptr->rootPtr->nu
10c20 6d 4c 69 6e 65 73 20 2d 20 31 3b 0a 7d 0a 0c 0a  mLines - 1;.}...
10c30 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
10c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c70 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 68 61 72 53 70  ---. *. * CharSp
10c80 6c 69 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a  litProc --. *. *
10c90 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
10ca0 69 6d 70 6c 65 6d 65 6e 74 73 20 73 70 6c 69 74  implements split
10cb0 74 69 6e 67 20 66 6f 72 20 63 68 61 72 61 63 74  ting for charact
10cc0 65 72 20 73 65 67 6d 65 6e 74 73 2e 0a 20 2a 0a  er segments.. *.
10cd0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54   * Results:. *.T
10ce0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
10cf0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
10d00 61 20 63 68 61 69 6e 20 6f 66 20 74 77 6f 20 73  a chain of two s
10d10 65 67 6d 65 6e 74 73 0a 20 2a 09 74 68 61 74 20  egments. *.that 
10d20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 63 68  have the same ch
10d30 61 72 61 63 74 65 72 73 20 61 73 20 73 65 67 50  aracters as segP
10d40 74 72 20 65 78 63 65 70 74 20 73 70 6c 69 74 0a  tr except split.
10d50 20 2a 09 61 6d 6f 6e 67 20 74 68 65 20 74 77 6f   *.among the two
10d60 20 73 65 67 6d 65 6e 74 73 2e 0a 20 2a 0a 20 2a   segments.. *. *
10d70 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
10d80 2a 09 53 74 6f 72 61 67 65 20 66 6f 72 20 73 65  *.Storage for se
10d90 67 50 74 72 20 69 73 20 66 72 65 65 64 2e 0a 20  gPtr is freed.. 
10da0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10de0 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54  --. */..static T
10df0 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 0a 43  kTextSegment *.C
10e00 68 61 72 53 70 6c 69 74 50 72 6f 63 28 73 65 67  harSplitProc(seg
10e10 50 74 72 2c 20 69 6e 64 65 78 29 0a 20 20 20 20  Ptr, index).    
10e20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 73  TkTextSegment *s
10e30 65 67 50 74 72 3b 09 09 2f 2a 20 50 6f 69 6e 74  egPtr;../* Point
10e40 65 72 20 74 6f 20 73 65 67 6d 65 6e 74 20 74 6f  er to segment to
10e50 20 73 70 6c 69 74 2e 20 2a 2f 0a 20 20 20 20 69   split. */.    i
10e60 6e 74 20 69 6e 64 65 78 3b 09 09 09 09 2f 2a 20  nt index;..../* 
10e70 50 6f 73 69 74 69 6f 6e 20 77 69 74 68 69 6e 20  Position within 
10e80 73 65 67 6d 65 6e 74 20 61 74 20 77 68 69 63 68  segment at which
10e90 0a 09 09 09 09 09 20 2a 20 74 6f 20 73 70 6c 69  ...... * to spli
10ea0 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 6b 54 65  t. */.{.    TkTe
10eb0 78 74 53 65 67 6d 65 6e 74 20 2a 6e 65 77 50 74  xtSegment *newPt
10ec0 72 31 2c 20 2a 6e 65 77 50 74 72 32 3b 0a 0a 20  r1, *newPtr2;.. 
10ed0 20 20 20 6e 65 77 50 74 72 31 20 3d 20 28 54 6b     newPtr1 = (Tk
10ee0 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 29 20 63  TextSegment *) c
10ef0 6b 61 6c 6c 6f 63 28 43 53 45 47 5f 53 49 5a 45  kalloc(CSEG_SIZE
10f00 28 69 6e 64 65 78 29 29 3b 0a 20 20 20 20 6e 65  (index));.    ne
10f10 77 50 74 72 32 20 3d 20 28 54 6b 54 65 78 74 53  wPtr2 = (TkTextS
10f20 65 67 6d 65 6e 74 20 2a 29 20 63 6b 61 6c 6c 6f  egment *) ckallo
10f30 63 28 0a 09 20 20 20 20 43 53 45 47 5f 53 49 5a  c(..    CSEG_SIZ
10f40 45 28 73 65 67 50 74 72 2d 3e 73 69 7a 65 20 2d  E(segPtr->size -
10f50 20 69 6e 64 65 78 29 29 3b 0a 20 20 20 20 6e 65   index));.    ne
10f60 77 50 74 72 31 2d 3e 74 79 70 65 50 74 72 20 3d  wPtr1->typePtr =
10f70 20 26 74 6b 54 65 78 74 43 68 61 72 54 79 70 65   &tkTextCharType
10f80 3b 0a 20 20 20 20 6e 65 77 50 74 72 31 2d 3e 6e  ;.    newPtr1->n
10f90 65 78 74 50 74 72 20 3d 20 6e 65 77 50 74 72 32  extPtr = newPtr2
10fa0 3b 0a 20 20 20 20 6e 65 77 50 74 72 31 2d 3e 73  ;.    newPtr1->s
10fb0 69 7a 65 20 3d 20 69 6e 64 65 78 3b 0a 20 20 20  ize = index;.   
10fc0 20 73 74 72 6e 63 70 79 28 6e 65 77 50 74 72 31   strncpy(newPtr1
10fd0 2d 3e 62 6f 64 79 2e 63 68 61 72 73 2c 20 73 65  ->body.chars, se
10fe0 67 50 74 72 2d 3e 62 6f 64 79 2e 63 68 61 72 73  gPtr->body.chars
10ff0 2c 20 28 73 69 7a 65 5f 74 29 20 69 6e 64 65 78  , (size_t) index
11000 29 3b 0a 20 20 20 20 6e 65 77 50 74 72 31 2d 3e  );.    newPtr1->
11010 62 6f 64 79 2e 63 68 61 72 73 5b 69 6e 64 65 78  body.chars[index
11020 5d 20 3d 20 30 3b 0a 20 20 20 20 6e 65 77 50 74  ] = 0;.    newPt
11030 72 32 2d 3e 74 79 70 65 50 74 72 20 3d 20 26 74  r2->typePtr = &t
11040 6b 54 65 78 74 43 68 61 72 54 79 70 65 3b 0a 20  kTextCharType;. 
11050 20 20 20 6e 65 77 50 74 72 32 2d 3e 6e 65 78 74     newPtr2->next
11060 50 74 72 20 3d 20 73 65 67 50 74 72 2d 3e 6e 65  Ptr = segPtr->ne
11070 78 74 50 74 72 3b 0a 20 20 20 20 6e 65 77 50 74  xtPtr;.    newPt
11080 72 32 2d 3e 73 69 7a 65 20 3d 20 73 65 67 50 74  r2->size = segPt
11090 72 2d 3e 73 69 7a 65 20 2d 20 69 6e 64 65 78 3b  r->size - index;
110a0 0a 20 20 20 20 73 74 72 63 70 79 28 6e 65 77 50  .    strcpy(newP
110b0 74 72 32 2d 3e 62 6f 64 79 2e 63 68 61 72 73 2c  tr2->body.chars,
110c0 20 73 65 67 50 74 72 2d 3e 62 6f 64 79 2e 63 68   segPtr->body.ch
110d0 61 72 73 20 2b 20 69 6e 64 65 78 29 3b 0a 20 20  ars + index);.  
110e0 20 20 63 6b 66 72 65 65 28 28 63 68 61 72 2a 29    ckfree((char*)
110f0 20 73 65 67 50 74 72 29 3b 0a 20 20 20 20 72 65   segPtr);.    re
11100 74 75 72 6e 20 6e 65 77 50 74 72 31 3b 0a 7d 0a  turn newPtr1;.}.
11110 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
11120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11150 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 68 61 72  -----. *. * Char
11160 43 6c 65 61 6e 75 70 50 72 6f 63 20 2d 2d 0a 20  CleanupProc --. 
11170 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
11180 75 72 65 20 6d 65 72 67 65 73 20 61 64 6a 61 63  ure merges adjac
11190 65 6e 74 20 63 68 61 72 61 63 74 65 72 20 73 65  ent character se
111a0 67 6d 65 6e 74 73 20 69 6e 74 6f 0a 20 2a 09 61  gments into. *.a
111b0 20 73 69 6e 67 6c 65 20 63 68 61 72 61 63 74 65   single characte
111c0 72 20 73 65 67 6d 65 6e 74 2c 20 69 66 20 70 6f  r segment, if po
111d0 73 73 69 62 6c 65 2e 0a 20 2a 0a 20 2a 20 52 65  ssible.. *. * Re
111e0 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65  sults:. *.The re
111f0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
11200 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66  pointer to the f
11210 69 72 73 74 20 73 65 67 6d 65 6e 74 20 69 6e 0a  irst segment in.
11220 20 2a 09 74 68 65 20 28 6e 65 77 29 20 6c 69 73   *.the (new) lis
11230 74 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 68  t of segments th
11240 61 74 20 75 73 65 64 20 74 6f 20 73 74 61 72 74  at used to start
11250 20 77 69 74 68 20 73 65 67 50 74 72 2e 0a 20 2a   with segPtr.. *
11260 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
11270 3a 0a 20 2a 09 53 74 6f 72 61 67 65 20 66 6f 72  :. *.Storage for
11280 20 74 68 65 20 73 65 67 6d 65 6e 74 73 20 6d 61   the segments ma
11290 79 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  y be allocated a
112a0 6e 64 20 66 72 65 65 64 2e 0a 20 2a 0a 20 2a 2d  nd freed.. *. *-
112b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
112e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
112f0 2f 0a 0a 09 2f 2a 20 41 52 47 53 55 53 45 44 20  /.../* ARGSUSED 
11300 2a 2f 0a 73 74 61 74 69 63 20 54 6b 54 65 78 74  */.static TkText
11310 53 65 67 6d 65 6e 74 20 2a 0a 43 68 61 72 43 6c  Segment *.CharCl
11320 65 61 6e 75 70 50 72 6f 63 28 73 65 67 50 74 72  eanupProc(segPtr
11330 2c 20 6c 69 6e 65 50 74 72 29 0a 20 20 20 20 54  , linePtr).    T
11340 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 73 65  kTextSegment *se
11350 67 50 74 72 3b 09 09 2f 2a 20 50 6f 69 6e 74 65  gPtr;../* Pointe
11360 72 20 74 6f 20 66 69 72 73 74 20 6f 66 20 74 77  r to first of tw
11370 6f 20 61 64 6a 61 63 65 6e 74 0a 09 09 09 09 09  o adjacent......
11380 20 2a 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6a   * segments to j
11390 6f 69 6e 2e 20 2a 2f 0a 20 20 20 20 54 6b 54 65  oin. */.    TkTe
113a0 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50 74 72 3b  xtLine *linePtr;
113b0 09 09 2f 2a 20 4c 69 6e 65 20 63 6f 6e 74 61 69  ../* Line contai
113c0 6e 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 28 6e  ning segments (n
113d0 6f 74 0a 09 09 09 09 09 20 2a 20 75 73 65 64 29  ot...... * used)
113e0 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 6b 54 65 78  . */.{.    TkTex
113f0 74 53 65 67 6d 65 6e 74 20 2a 73 65 67 50 74 72  tSegment *segPtr
11400 32 2c 20 2a 6e 65 77 50 74 72 3b 0a 0a 20 20 20  2, *newPtr;..   
11410 20 73 65 67 50 74 72 32 20 3d 20 73 65 67 50 74   segPtr2 = segPt
11420 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 20 20 20 20  r->nextPtr;.    
11430 69 66 20 28 28 73 65 67 50 74 72 32 20 3d 3d 20  if ((segPtr2 == 
11440 4e 55 4c 4c 29 20 7c 7c 20 28 73 65 67 50 74 72  NULL) || (segPtr
11450 32 2d 3e 74 79 70 65 50 74 72 20 21 3d 20 26 74  2->typePtr != &t
11460 6b 54 65 78 74 43 68 61 72 54 79 70 65 29 29 20  kTextCharType)) 
11470 7b 0a 09 72 65 74 75 72 6e 20 73 65 67 50 74 72  {..return segPtr
11480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 77 50  ;.    }.    newP
11490 74 72 20 3d 20 28 54 6b 54 65 78 74 53 65 67 6d  tr = (TkTextSegm
114a0 65 6e 74 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 43  ent *) ckalloc(C
114b0 53 45 47 5f 53 49 5a 45 28 0a 09 20 20 20 20 73  SEG_SIZE(..    s
114c0 65 67 50 74 72 2d 3e 73 69 7a 65 20 2b 20 73 65  egPtr->size + se
114d0 67 50 74 72 32 2d 3e 73 69 7a 65 29 29 3b 0a 20  gPtr2->size));. 
114e0 20 20 20 6e 65 77 50 74 72 2d 3e 74 79 70 65 50     newPtr->typeP
114f0 74 72 20 3d 20 26 74 6b 54 65 78 74 43 68 61 72  tr = &tkTextChar
11500 54 79 70 65 3b 0a 20 20 20 20 6e 65 77 50 74 72  Type;.    newPtr
11510 2d 3e 6e 65 78 74 50 74 72 20 3d 20 73 65 67 50  ->nextPtr = segP
11520 74 72 32 2d 3e 6e 65 78 74 50 74 72 3b 0a 20 20  tr2->nextPtr;.  
11530 20 20 6e 65 77 50 74 72 2d 3e 73 69 7a 65 20 3d    newPtr->size =
11540 20 73 65 67 50 74 72 2d 3e 73 69 7a 65 20 2b 20   segPtr->size + 
11550 73 65 67 50 74 72 32 2d 3e 73 69 7a 65 3b 0a 20  segPtr2->size;. 
11560 20 20 20 73 74 72 63 70 79 28 6e 65 77 50 74 72     strcpy(newPtr
11570 2d 3e 62 6f 64 79 2e 63 68 61 72 73 2c 20 73 65  ->body.chars, se
11580 67 50 74 72 2d 3e 62 6f 64 79 2e 63 68 61 72 73  gPtr->body.chars
11590 29 3b 0a 20 20 20 20 73 74 72 63 70 79 28 6e 65  );.    strcpy(ne
115a0 77 50 74 72 2d 3e 62 6f 64 79 2e 63 68 61 72 73  wPtr->body.chars
115b0 20 2b 20 73 65 67 50 74 72 2d 3e 73 69 7a 65 2c   + segPtr->size,
115c0 20 73 65 67 50 74 72 32 2d 3e 62 6f 64 79 2e 63   segPtr2->body.c
115d0 68 61 72 73 29 3b 0a 20 20 20 20 63 6b 66 72 65  hars);.    ckfre
115e0 65 28 28 63 68 61 72 2a 29 20 73 65 67 50 74 72  e((char*) segPtr
115f0 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 28 63  );.    ckfree((c
11600 68 61 72 2a 29 20 73 65 67 50 74 72 32 29 3b 0a  har*) segPtr2);.
11610 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77 50 74      return newPt
11620 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  r;.}.../*. *----
11630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
11670 20 43 68 61 72 44 65 6c 65 74 65 50 72 6f 63 20   CharDeleteProc 
11680 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
11690 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
116a0 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 20 63  ed to delete a c
116b0 68 61 72 61 63 74 65 72 20 73 65 67 6d 65 6e 74  haracter segment
116c0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
116d0 0a 20 2a 09 41 6c 77 61 79 73 20 72 65 74 75 72  . *.Always retur
116e0 6e 73 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65  ns 0 to indicate
116f0 20 74 68 61 74 20 74 68 65 20 73 65 67 6d 65 6e   that the segmen
11700 74 20 77 61 73 20 64 65 6c 65 74 65 64 2e 0a 20  t was deleted.. 
11710 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
11720 73 3a 0a 20 2a 09 53 74 6f 72 61 67 65 20 66 6f  s:. *.Storage fo
11730 72 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73  r the segment is
11740 20 66 72 65 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d   freed.. *. *---
11750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
11790 0a 09 2f 2a 20 41 52 47 53 55 53 45 44 20 2a 2f  ../* ARGSUSED */
117a0 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 68 61 72  .static int.Char
117b0 44 65 6c 65 74 65 50 72 6f 63 28 73 65 67 50 74  DeleteProc(segPt
117c0 72 2c 20 6c 69 6e 65 50 74 72 2c 20 74 72 65 65  r, linePtr, tree
117d0 47 6f 6e 65 29 0a 20 20 20 20 54 6b 54 65 78 74  Gone).    TkText
117e0 53 65 67 6d 65 6e 74 20 2a 73 65 67 50 74 72 3b  Segment *segPtr;
117f0 09 09 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20  ../* Segment to 
11800 64 65 6c 65 74 65 2e 20 2a 2f 0a 20 20 20 20 54  delete. */.    T
11810 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50  kTextLine *lineP
11820 74 72 3b 09 09 2f 2a 20 4c 69 6e 65 20 63 6f 6e  tr;../* Line con
11830 74 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74 2e  taining segment.
11840 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 72 65 65   */.    int tree
11850 47 6f 6e 65 3b 09 09 09 2f 2a 20 4e 6f 6e 2d 7a  Gone;.../* Non-z
11860 65 72 6f 20 6d 65 61 6e 73 20 74 68 65 20 65 6e  ero means the en
11870 74 69 72 65 20 74 72 65 65 20 69 73 0a 09 09 09  tire tree is....
11880 09 09 20 2a 20 62 65 69 6e 67 20 64 65 6c 65 74  .. * being delet
11890 65 64 2c 20 73 6f 20 65 76 65 72 79 74 68 69 6e  ed, so everythin
118a0 67 20 6d 75 73 74 0a 09 09 09 09 09 20 2a 20 67  g must...... * g
118b0 65 74 20 63 6c 65 61 6e 65 64 20 75 70 2e 20 2a  et cleaned up. *
118c0 2f 0a 7b 0a 20 20 20 20 63 6b 66 72 65 65 28 28  /.{.    ckfree((
118d0 63 68 61 72 2a 29 20 73 65 67 50 74 72 29 3b 0a  char*) segPtr);.
118e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a      return 0;.}.
118f0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
11900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11930 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 68 61 72  -----. *. * Char
11940 43 68 65 63 6b 50 72 6f 63 20 2d 2d 0a 20 2a 0a  CheckProc --. *.
11950 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
11960 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
11970 70 65 72 66 6f 72 6d 20 63 6f 6e 73 69 73 74 65  perform consiste
11980 6e 63 79 20 63 68 65 63 6b 73 0a 20 2a 09 6f 6e  ncy checks. *.on
11990 20 63 68 61 72 61 63 74 65 72 20 73 65 67 6d 65   character segme
119a0 6e 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  nts.. *. * Resul
119b0 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
119c0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
119d0 0a 20 2a 09 49 66 20 74 68 65 20 73 65 67 6d 65  . *.If the segme
119e0 6e 74 20 69 73 6e 27 74 20 69 6e 63 6f 6e 73 69  nt isn't inconsi
119f0 73 74 65 6e 74 20 74 68 65 6e 20 74 68 65 20 70  stent then the p
11a00 72 6f 63 65 64 75 72 65 0a 20 2a 09 70 61 6e 69  rocedure. *.pani
11a10 63 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  cs.. *. *-------
11a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a50 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 09 2f 2a  -------. */.../*
11a60 20 41 52 47 53 55 53 45 44 20 2a 2f 0a 73 74 61   ARGSUSED */.sta
11a70 74 69 63 20 76 6f 69 64 0a 43 68 61 72 43 68 65  tic void.CharChe
11a80 63 6b 50 72 6f 63 28 73 65 67 50 74 72 2c 20 6c  ckProc(segPtr, l
11a90 69 6e 65 50 74 72 29 0a 20 20 20 20 54 6b 54 65  inePtr).    TkTe
11aa0 78 74 53 65 67 6d 65 6e 74 20 2a 73 65 67 50 74  xtSegment *segPt
11ab0 72 3b 09 09 2f 2a 20 53 65 67 6d 65 6e 74 20 74  r;../* Segment t
11ac0 6f 20 63 68 65 63 6b 2e 20 2a 2f 0a 20 20 20 20  o check. */.    
11ad0 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 69 6e 65  TkTextLine *line
11ae0 50 74 72 3b 09 09 2f 2a 20 4c 69 6e 65 20 63 6f  Ptr;../* Line co
11af0 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d 65 6e 74  ntaining segment
11b00 2e 20 2a 2f 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20  . */.{.    /*.  
11b10 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74     * Make sure t
11b20 68 61 74 20 74 68 65 20 73 65 67 6d 65 6e 74 20  hat the segment 
11b30 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
11b40 62 65 72 20 6f 66 0a 20 20 20 20 20 2a 20 63 68  ber of.     * ch
11b50 61 72 61 63 74 65 72 73 20 69 6e 64 69 63 61 74  aracters indicat
11b60 65 64 20 62 79 20 69 74 73 20 68 65 61 64 65 72  ed by its header
11b70 2c 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 6c  , and that the l
11b80 61 73 74 0a 20 20 20 20 20 2a 20 73 65 67 6d 65  ast.     * segme
11b90 6e 74 20 69 6e 20 61 20 6c 69 6e 65 20 65 6e 64  nt in a line end
11ba0 73 20 69 6e 20 61 20 6e 65 77 6c 69 6e 65 2e 20  s in a newline. 
11bb0 20 41 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 0a   Also make sure.
11bc0 20 20 20 20 20 2a 20 74 68 61 74 20 74 68 65 72       * that ther
11bd0 65 20 61 72 65 6e 27 74 20 65 76 65 72 20 74 77  e aren't ever tw
11be0 6f 20 63 68 61 72 61 63 74 65 72 20 73 65 67 6d  o character segm
11bf0 65 6e 74 73 20 61 64 6a 61 63 65 6e 74 0a 20 20  ents adjacent.  
11c00 20 20 20 2a 20 74 6f 20 65 61 63 68 20 6f 74 68     * to each oth
11c10 65 72 3a 20 20 74 68 65 79 20 73 68 6f 75 6c 64  er:  they should
11c20 20 62 65 20 6d 65 72 67 65 64 20 74 6f 67 65 74   be merged toget
11c30 68 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  her..     */..  
11c40 20 20 69 66 20 28 73 65 67 50 74 72 2d 3e 73 69    if (segPtr->si
11c50 7a 65 20 3c 3d 20 30 29 20 7b 0a 09 70 61 6e 69  ze <= 0) {..pani
11c60 63 28 22 43 68 61 72 43 68 65 63 6b 50 72 6f 63  c("CharCheckProc
11c70 3a 20 73 65 67 6d 65 6e 74 20 68 61 73 20 73 69  : segment has si
11c80 7a 65 20 3c 3d 20 30 22 29 3b 0a 20 20 20 20 7d  ze <= 0");.    }
11c90 0a 20 20 20 20 69 66 20 28 73 74 72 6c 65 6e 28  .    if (strlen(
11ca0 73 65 67 50 74 72 2d 3e 62 6f 64 79 2e 63 68 61  segPtr->body.cha
11cb0 72 73 29 20 21 3d 20 73 65 67 50 74 72 2d 3e 73  rs) != segPtr->s
11cc0 69 7a 65 29 20 7b 0a 09 70 61 6e 69 63 28 22 43  ize) {..panic("C
11cd0 68 61 72 43 68 65 63 6b 50 72 6f 63 3a 20 73 65  harCheckProc: se
11ce0 67 6d 65 6e 74 20 68 61 73 20 77 72 6f 6e 67 20  gment has wrong 
11cf0 73 69 7a 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20  size");.    }.  
11d00 20 20 69 66 20 28 73 65 67 50 74 72 2d 3e 6e 65    if (segPtr->ne
11d10 78 74 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  xtPtr == NULL) {
11d20 0a 09 69 66 20 28 73 65 67 50 74 72 2d 3e 62 6f  ..if (segPtr->bo
11d30 64 79 2e 63 68 61 72 73 5b 73 65 67 50 74 72 2d  dy.chars[segPtr-
11d40 3e 73 69 7a 65 2d 31 5d 20 21 3d 20 27 5c 6e 27  >size-1] != '\n'
11d50 29 20 7b 0a 09 20 20 20 20 70 61 6e 69 63 28 22  ) {..    panic("
11d60 43 68 61 72 43 68 65 63 6b 50 72 6f 63 3a 20 6c  CharCheckProc: l
11d70 69 6e 65 20 64 6f 65 73 6e 27 74 20 65 6e 64 20  ine doesn't end 
11d80 77 69 74 68 20 6e 65 77 6c 69 6e 65 22 29 3b 0a  with newline");.
11d90 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
11da0 09 69 66 20 28 73 65 67 50 74 72 2d 3e 6e 65 78  .if (segPtr->nex
11db0 74 50 74 72 2d 3e 74 79 70 65 50 74 72 20 3d 3d  tPtr->typePtr ==
11dc0 20 26 74 6b 54 65 78 74 43 68 61 72 54 79 70 65   &tkTextCharType
11dd0 29 20 7b 0a 09 20 20 20 20 70 61 6e 69 63 28 22  ) {..    panic("
11de0 43 68 61 72 43 68 65 63 6b 50 72 6f 63 3a 20 61  CharCheckProc: a
11df0 64 6a 61 63 65 6e 74 20 63 68 61 72 61 63 74 65  djacent characte
11e00 72 20 73 65 67 6d 65 6e 74 73 20 77 65 72 65 6e  r segments weren
11e10 27 74 20 6d 65 72 67 65 64 22 29 3b 0a 09 7d 0a  't merged");..}.
11e20 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d      }.}.../*. *-
11e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
11e70 0a 20 2a 20 54 6f 67 67 6c 65 44 65 6c 65 74 65  . * ToggleDelete
11e80 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Proc --. *. *.Th
11e90 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
11ea0 69 6e 76 6f 6b 65 64 20 74 6f 20 64 65 6c 65 74  invoked to delet
11eb0 65 20 74 6f 67 67 6c 65 20 73 65 67 6d 65 6e 74  e toggle segment
11ec0 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
11ed0 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 31 20 74  :. *.Returns 1 t
11ee0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
11ef0 74 68 65 20 73 65 67 6d 65 6e 74 20 6d 61 79 20  the segment may 
11f00 6e 6f 74 20 62 65 20 64 65 6c 65 74 65 64 2c 0a  not be deleted,.
11f10 20 2a 09 75 6e 6c 65 73 73 20 74 68 65 20 65 6e   *.unless the en
11f20 74 69 72 65 20 42 2d 74 72 65 65 20 69 73 20 67  tire B-tree is g
11f30 6f 69 6e 67 20 61 77 61 79 2e 0a 20 2a 0a 20 2a  oing away.. *. *
11f40 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
11f50 2a 09 49 66 20 74 68 65 20 74 72 65 65 20 69 73  *.If the tree is
11f60 20 67 6f 69 6e 67 20 61 77 61 79 20 74 68 65 6e   going away then
11f70 20 74 68 65 20 74 6f 67 67 6c 65 27 73 20 6d 65   the toggle's me
11f80 6d 6f 72 79 20 69 73 0a 20 2a 09 66 72 65 65 64  mory is. *.freed
11f90 3b 20 20 6f 74 68 65 72 77 69 73 65 20 74 68 65  ;  otherwise the
11fa0 20 74 6f 67 67 6c 65 20 63 6f 75 6e 74 73 20 69   toggle counts i
11fb0 6e 20 6e 6f 64 65 73 20 61 62 6f 76 65 20 74 68  n nodes above th
11fc0 65 0a 20 2a 09 73 65 67 6d 65 6e 74 20 67 65 74  e. *.segment get
11fd0 20 75 70 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 2d   updated.. *. *-
11fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
12020 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 54 6f  /..static int.To
12030 67 67 6c 65 44 65 6c 65 74 65 50 72 6f 63 28 73  ggleDeleteProc(s
12040 65 67 50 74 72 2c 20 6c 69 6e 65 50 74 72 2c 20  egPtr, linePtr, 
12050 74 72 65 65 47 6f 6e 65 29 0a 20 20 20 20 54 6b  treeGone).    Tk
12060 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 73 65 67  TextSegment *seg
12070 50 74 72 3b 09 09 2f 2a 20 53 65 67 6d 65 6e 74  Ptr;../* Segment
12080 20 74 6f 20 63 68 65 63 6b 2e 20 2a 2f 0a 20 20   to check. */.  
12090 20 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 69    TkTextLine *li
120a0 6e 65 50 74 72 3b 09 09 2f 2a 20 4c 69 6e 65 20  nePtr;../* Line 
120b0 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d 65  containing segme
120c0 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74  nt. */.    int t
120d0 72 65 65 47 6f 6e 65 3b 09 09 09 2f 2a 20 4e 6f  reeGone;.../* No
120e0 6e 2d 7a 65 72 6f 20 6d 65 61 6e 73 20 74 68 65  n-zero means the
120f0 20 65 6e 74 69 72 65 20 74 72 65 65 20 69 73 0a   entire tree is.
12100 09 09 09 09 09 20 2a 20 62 65 69 6e 67 20 64 65  ..... * being de
12110 6c 65 74 65 64 2c 20 73 6f 20 65 76 65 72 79 74  leted, so everyt
12120 68 69 6e 67 20 6d 75 73 74 0a 09 09 09 09 09 20  hing must...... 
12130 2a 20 67 65 74 20 63 6c 65 61 6e 65 64 20 75 70  * get cleaned up
12140 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 66 20 28 74  . */.{.    if (t
12150 72 65 65 47 6f 6e 65 29 20 7b 0a 09 63 6b 66 72  reeGone) {..ckfr
12160 65 65 28 28 63 68 61 72 20 2a 29 20 73 65 67 50  ee((char *) segP
12170 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a  tr);..return 0;.
12180 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
12190 20 20 20 2a 20 54 68 69 73 20 74 6f 67 67 6c 65     * This toggle
121a0 20 69 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c   is in the middl
121b0 65 20 6f 66 20 61 20 72 61 6e 67 65 20 6f 66 20  e of a range of 
121c0 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 27  characters that'
121d0 73 0a 20 20 20 20 20 2a 20 62 65 69 6e 67 20 64  s.     * being d
121e0 65 6c 65 74 65 64 2e 20 20 52 65 66 75 73 65 20  eleted.  Refuse 
121f0 74 6f 20 64 69 65 2e 20 20 57 65 27 6c 6c 20 62  to die.  We'll b
12200 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 65  e moved to the e
12210 6e 64 20 6f 66 0a 20 20 20 20 20 2a 20 74 68 65  nd of.     * the
12220 20 64 65 6c 65 74 65 64 20 72 61 6e 67 65 20 61   deleted range a
12230 6e 64 20 6f 75 72 20 63 6c 65 61 6e 75 70 20 70  nd our cleanup p
12240 72 6f 63 65 64 75 72 65 20 77 69 6c 6c 20 62 65  rocedure will be
12250 20 63 61 6c 6c 65 64 0a 20 20 20 20 20 2a 20 6c   called.     * l
12260 61 74 65 72 2e 20 20 44 65 63 72 65 6d 65 6e 74  ater.  Decrement
12270 20 6e 6f 64 65 20 74 6f 67 67 6c 65 20 63 6f 75   node toggle cou
12280 6e 74 73 20 68 65 72 65 2c 20 61 6e 64 20 73 65  nts here, and se
12290 74 20 61 20 66 6c 61 67 0a 20 20 20 20 20 2a 20  t a flag.     * 
122a0 73 6f 20 77 65 27 6c 6c 20 72 65 2d 69 6e 63 72  so we'll re-incr
122b0 65 6d 65 6e 74 20 74 68 65 6d 20 69 6e 20 74 68  ement them in th
122c0 65 20 63 6c 65 61 6e 75 70 20 70 72 6f 63 65 64  e cleanup proced
122d0 75 72 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ure..     */..  
122e0 20 20 69 66 20 28 73 65 67 50 74 72 2d 3e 62 6f    if (segPtr->bo
122f0 64 79 2e 74 6f 67 67 6c 65 2e 69 6e 4e 6f 64 65  dy.toggle.inNode
12300 43 6f 75 6e 74 73 29 20 7b 0a 09 43 68 61 6e 67  Counts) {..Chang
12310 65 4e 6f 64 65 54 6f 67 67 6c 65 43 6f 75 6e 74  eNodeToggleCount
12320 28 6c 69 6e 65 50 74 72 2d 3e 70 61 72 65 6e 74  (linePtr->parent
12330 50 74 72 2c 0a 09 09 73 65 67 50 74 72 2d 3e 62  Ptr,...segPtr->b
12340 6f 64 79 2e 74 6f 67 67 6c 65 2e 74 61 67 50 74  ody.toggle.tagPt
12350 72 2c 20 2d 31 29 3b 0a 09 73 65 67 50 74 72 2d  r, -1);..segPtr-
12360 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 69 6e 4e  >body.toggle.inN
12370 6f 64 65 43 6f 75 6e 74 73 20 3d 20 30 3b 0a 20  odeCounts = 0;. 
12380 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
12390 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  1;.}.../*. *----
123a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
123d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
123e0 20 54 6f 67 67 6c 65 43 6c 65 61 6e 75 70 50 72   ToggleCleanupPr
123f0 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  oc --. *. *.This
12400 20 70 72 6f 63 65 64 75 72 65 20 77 68 65 6e 20   procedure when 
12410 61 20 74 6f 67 67 6c 65 20 69 73 20 70 61 72 74  a toggle is part
12420 20 6f 66 20 61 20 6c 69 6e 65 20 74 68 61 74 27   of a line that'
12430 73 0a 20 2a 09 62 65 65 6e 20 6d 6f 64 69 66 69  s. *.been modifi
12440 65 64 20 69 6e 20 73 6f 6d 65 20 77 61 79 2e 20  ed in some way. 
12450 20 49 74 27 73 20 69 6e 76 6f 6b 65 64 20 61 66   It's invoked af
12460 74 65 72 20 74 68 65 0a 20 2a 09 6d 6f 64 69 66  ter the. *.modif
12470 69 63 61 74 69 6f 6e 73 20 61 72 65 20 63 6f 6d  ications are com
12480 70 6c 65 74 65 2e 0a 20 2a 0a 20 2a 20 52 65 73  plete.. *. * Res
12490 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 74  ults:. *.The ret
124a0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
124b0 20 68 65 61 64 20 73 65 67 6d 65 6e 74 20 69 6e   head segment in
124c0 20 61 20 6e 65 77 20 6c 69 73 74 0a 20 2a 09 74   a new list. *.t
124d0 68 61 74 20 69 73 20 74 6f 20 72 65 70 6c 61 63  hat is to replac
124e0 65 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74 68  e the tail of th
124f0 65 20 6c 69 6e 65 20 74 68 61 74 20 75 73 65 64  e line that used
12500 20 74 6f 0a 20 2a 09 73 74 61 72 74 20 61 74 20   to. *.start at 
12510 73 65 67 50 74 72 2e 20 20 54 68 69 73 20 61 6c  segPtr.  This al
12520 6c 6f 77 73 20 74 68 65 20 70 72 6f 63 65 64 75  lows the procedu
12530 72 65 20 74 6f 20 64 65 6c 65 74 65 0a 20 2a 09  re to delete. *.
12540 6f 72 20 6d 6f 64 69 66 79 20 73 65 67 50 74 72  or modify segPtr
12550 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
12560 65 63 74 73 3a 0a 20 2a 09 54 6f 67 67 6c 65 20  ects:. *.Toggle 
12570 63 6f 75 6e 74 73 20 69 6e 20 74 68 65 20 6e 6f  counts in the no
12580 64 65 73 20 61 62 6f 76 65 20 74 68 65 20 6e 65  des above the ne
12590 77 20 6c 69 6e 65 20 77 69 6c 6c 20 62 65 0a 20  w line will be. 
125a0 2a 09 75 70 64 61 74 65 64 20 69 66 20 74 68 65  *.updated if the
125b0 79 27 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79  y're not already
125c0 2e 20 20 54 6f 67 67 6c 65 73 20 6d 61 79 20 62  .  Toggles may b
125d0 65 20 63 6f 6c 6c 61 70 73 65 64 0a 20 2a 09 69  e collapsed. *.i
125e0 66 20 74 68 65 72 65 20 61 72 65 20 64 75 70 6c  f there are dupl
125f0 69 63 61 74 65 20 74 6f 67 67 6c 65 73 20 61 74  icate toggles at
12600 20 74 68 65 20 73 61 6d 65 20 70 6f 73 69 74 69   the same positi
12610 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  on.. *. *-------
12620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12650 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
12660 74 69 63 20 54 6b 54 65 78 74 53 65 67 6d 65 6e  tic TkTextSegmen
12670 74 20 2a 0a 54 6f 67 67 6c 65 43 6c 65 61 6e 75  t *.ToggleCleanu
12680 70 50 72 6f 63 28 73 65 67 50 74 72 2c 20 6c 69  pProc(segPtr, li
12690 6e 65 50 74 72 29 0a 20 20 20 20 54 6b 54 65 78  nePtr).    TkTex
126a0 74 53 65 67 6d 65 6e 74 20 2a 73 65 67 50 74 72  tSegment *segPtr
126b0 3b 09 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20  ;./* Segment to 
126c0 63 68 65 63 6b 2e 20 2a 2f 0a 20 20 20 20 54 6b  check. */.    Tk
126d0 54 65 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50 74  TextLine *linePt
126e0 72 3b 09 2f 2a 20 4c 69 6e 65 20 74 68 61 74 20  r;./* Line that 
126f0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 73 65 67  now contains seg
12700 6d 65 6e 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54  ment. */.{.    T
12710 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 73 65  kTextSegment *se
12720 67 50 74 72 32 2c 20 2a 70 72 65 76 50 74 72 3b  gPtr2, *prevPtr;
12730 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 73 3b  .    int counts;
12740 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
12750 49 66 20 74 68 69 73 20 69 73 20 61 20 74 6f 67  If this is a tog
12760 67 6c 65 2d 6f 66 66 20 73 65 67 6d 65 6e 74 2c  gle-off segment,
12770 20 6c 6f 6f 6b 20 61 68 65 61 64 20 74 68 72 6f   look ahead thro
12780 75 67 68 20 74 68 65 20 6e 65 78 74 0a 20 20 20  ugh the next.   
12790 20 20 2a 20 73 65 67 6d 65 6e 74 73 20 74 6f 20    * segments to 
127a0 73 65 65 20 69 66 20 74 68 65 72 65 27 73 20 61  see if there's a
127b0 20 74 6f 67 67 6c 65 2d 6f 6e 20 73 65 67 6d 65   toggle-on segme
127c0 6e 74 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  nt for the same 
127d0 74 61 67 0a 20 20 20 20 20 2a 20 62 65 66 6f 72  tag.     * befor
127e0 65 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 77  e any segments w
127f0 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 69 7a  ith non-zero siz
12800 65 2e 20 20 49 66 20 73 6f 20 74 68 65 6e 20 74  e.  If so then t
12810 68 65 20 74 77 6f 0a 20 20 20 20 20 2a 20 74 6f  he two.     * to
12820 67 67 6c 65 73 20 63 61 6e 63 65 6c 20 65 61 63  ggles cancel eac
12830 68 20 6f 74 68 65 72 3b 20 20 72 65 6d 6f 76 65  h other;  remove
12840 20 74 68 65 6d 20 62 6f 74 68 2e 0a 20 20 20 20   them both..    
12850 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 65 67   */..    if (seg
12860 50 74 72 2d 3e 74 79 70 65 50 74 72 20 3d 3d 20  Ptr->typePtr == 
12870 26 74 6b 54 65 78 74 54 6f 67 67 6c 65 4f 66 66  &tkTextToggleOff
12880 54 79 70 65 29 20 7b 0a 09 66 6f 72 20 28 70 72  Type) {..for (pr
12890 65 76 50 74 72 20 3d 20 73 65 67 50 74 72 2c 20  evPtr = segPtr, 
128a0 73 65 67 50 74 72 32 20 3d 20 70 72 65 76 50 74  segPtr2 = prevPt
128b0 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 09 28 73  r->nextPtr;...(s
128c0 65 67 50 74 72 32 20 21 3d 20 4e 55 4c 4c 29 20  egPtr2 != NULL) 
128d0 26 26 20 28 73 65 67 50 74 72 32 2d 3e 73 69 7a  && (segPtr2->siz
128e0 65 20 3d 3d 20 30 29 3b 0a 09 09 70 72 65 76 50  e == 0);...prevP
128f0 74 72 20 3d 20 73 65 67 50 74 72 32 2c 20 73 65  tr = segPtr2, se
12900 67 50 74 72 32 20 3d 20 70 72 65 76 50 74 72 2d  gPtr2 = prevPtr-
12910 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 20 20 20  >nextPtr) {..   
12920 20 69 66 20 28 73 65 67 50 74 72 32 2d 3e 74 79   if (segPtr2->ty
12930 70 65 50 74 72 20 21 3d 20 26 74 6b 54 65 78 74  pePtr != &tkText
12940 54 6f 67 67 6c 65 4f 6e 54 79 70 65 29 20 7b 0a  ToggleOnType) {.
12950 09 09 63 6f 6e 74 69 6e 75 65 3b 0a 09 20 20 20  ..continue;..   
12960 20 7d 0a 09 20 20 20 20 69 66 20 28 73 65 67 50   }..    if (segP
12970 74 72 32 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65  tr2->body.toggle
12980 2e 74 61 67 50 74 72 20 21 3d 20 73 65 67 50 74  .tagPtr != segPt
12990 72 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 74  r->body.toggle.t
129a0 61 67 50 74 72 29 20 7b 0a 09 09 63 6f 6e 74 69  agPtr) {...conti
129b0 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  nue;..    }..   
129c0 20 63 6f 75 6e 74 73 20 3d 20 73 65 67 50 74 72   counts = segPtr
129d0 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 69 6e  ->body.toggle.in
129e0 4e 6f 64 65 43 6f 75 6e 74 73 0a 09 09 20 20 20  NodeCounts...   
129f0 20 2b 20 73 65 67 50 74 72 32 2d 3e 62 6f 64 79   + segPtr2->body
12a00 2e 74 6f 67 67 6c 65 2e 69 6e 4e 6f 64 65 43 6f  .toggle.inNodeCo
12a10 75 6e 74 73 3b 0a 09 20 20 20 20 69 66 20 28 63  unts;..    if (c
12a20 6f 75 6e 74 73 20 21 3d 20 30 29 20 7b 0a 09 09  ounts != 0) {...
12a30 43 68 61 6e 67 65 4e 6f 64 65 54 6f 67 67 6c 65  ChangeNodeToggle
12a40 43 6f 75 6e 74 28 6c 69 6e 65 50 74 72 2d 3e 70  Count(linePtr->p
12a50 61 72 65 6e 74 50 74 72 2c 0a 09 09 09 73 65 67  arentPtr,....seg
12a60 50 74 72 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65  Ptr->body.toggle
12a70 2e 74 61 67 50 74 72 2c 20 2d 63 6f 75 6e 74 73  .tagPtr, -counts
12a80 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70  );..    }..    p
12a90 72 65 76 50 74 72 2d 3e 6e 65 78 74 50 74 72 20  revPtr->nextPtr 
12aa0 3d 20 73 65 67 50 74 72 32 2d 3e 6e 65 78 74 50  = segPtr2->nextP
12ab0 74 72 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28  tr;..    ckfree(
12ac0 28 63 68 61 72 20 2a 29 20 73 65 67 50 74 72 32  (char *) segPtr2
12ad0 29 3b 0a 09 20 20 20 20 73 65 67 50 74 72 32 20  );..    segPtr2 
12ae0 3d 20 73 65 67 50 74 72 2d 3e 6e 65 78 74 50 74  = segPtr->nextPt
12af0 72 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 28  r;..    ckfree((
12b00 63 68 61 72 20 2a 29 20 73 65 67 50 74 72 29 3b  char *) segPtr);
12b10 0a 09 20 20 20 20 72 65 74 75 72 6e 20 73 65 67  ..    return seg
12b20 50 74 72 32 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  Ptr2;..}.    }..
12b30 20 20 20 20 69 66 20 28 21 73 65 67 50 74 72 2d      if (!segPtr-
12b40 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 69 6e 4e  >body.toggle.inN
12b50 6f 64 65 43 6f 75 6e 74 73 29 20 7b 0a 09 43 68  odeCounts) {..Ch
12b60 61 6e 67 65 4e 6f 64 65 54 6f 67 67 6c 65 43 6f  angeNodeToggleCo
12b70 75 6e 74 28 6c 69 6e 65 50 74 72 2d 3e 70 61 72  unt(linePtr->par
12b80 65 6e 74 50 74 72 2c 0a 09 09 73 65 67 50 74 72  entPtr,...segPtr
12b90 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 74 61  ->body.toggle.ta
12ba0 67 50 74 72 2c 20 31 29 3b 0a 09 73 65 67 50 74  gPtr, 1);..segPt
12bb0 72 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 69  r->body.toggle.i
12bc0 6e 4e 6f 64 65 43 6f 75 6e 74 73 20 3d 20 31 3b  nNodeCounts = 1;
12bd0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
12be0 6e 20 73 65 67 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a  n segPtr;.}.../*
12bf0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
12c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c30 2d 0a 20 2a 0a 20 2a 20 54 6f 67 67 6c 65 4c 69  -. *. * ToggleLi
12c40 6e 65 43 68 61 6e 67 65 50 72 6f 63 20 2d 2d 0a  neChangeProc --.
12c50 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
12c60 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
12c70 77 68 65 6e 20 61 20 74 6f 67 67 6c 65 20 73 65  when a toggle se
12c80 67 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 0a 20  gment is about. 
12c90 2a 09 74 6f 20 6d 6f 76 65 20 66 72 6f 6d 20 6f  *.to move from o
12ca0 6e 65 20 6c 69 6e 65 20 74 6f 20 61 6e 6f 74 68  ne line to anoth
12cb0 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  er.. *. * Result
12cc0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
12cd0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
12ce0 20 2a 09 54 6f 67 67 6c 65 20 63 6f 75 6e 74 73   *.Toggle counts
12cf0 20 61 72 65 20 64 65 63 72 65 6d 65 6e 74 65 64   are decremented
12d00 20 69 6e 20 74 68 65 20 6e 6f 64 65 73 20 61 62   in the nodes ab
12d10 6f 76 65 20 74 68 65 20 6c 69 6e 65 2e 0a 20 2a  ove the line.. *
12d20 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
12d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d60 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  -. */..static vo
12d70 69 64 0a 54 6f 67 67 6c 65 4c 69 6e 65 43 68 61  id.ToggleLineCha
12d80 6e 67 65 50 72 6f 63 28 73 65 67 50 74 72 2c 20  ngeProc(segPtr, 
12d90 6c 69 6e 65 50 74 72 29 0a 20 20 20 20 54 6b 54  linePtr).    TkT
12da0 65 78 74 53 65 67 6d 65 6e 74 20 2a 73 65 67 50  extSegment *segP
12db0 74 72 3b 09 2f 2a 20 53 65 67 6d 65 6e 74 20 74  tr;./* Segment t
12dc0 6f 20 63 68 65 63 6b 2e 20 2a 2f 0a 20 20 20 20  o check. */.    
12dd0 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 69 6e 65  TkTextLine *line
12de0 50 74 72 3b 09 2f 2a 20 4c 69 6e 65 20 74 68 61  Ptr;./* Line tha
12df0 74 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 61 69  t used to contai
12e00 6e 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 7b 0a  n segment. */.{.
12e10 20 20 20 20 69 66 20 28 73 65 67 50 74 72 2d 3e      if (segPtr->
12e20 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 69 6e 4e 6f  body.toggle.inNo
12e30 64 65 43 6f 75 6e 74 73 29 20 7b 0a 09 43 68 61  deCounts) {..Cha
12e40 6e 67 65 4e 6f 64 65 54 6f 67 67 6c 65 43 6f 75  ngeNodeToggleCou
12e50 6e 74 28 6c 69 6e 65 50 74 72 2d 3e 70 61 72 65  nt(linePtr->pare
12e60 6e 74 50 74 72 2c 0a 09 09 73 65 67 50 74 72 2d  ntPtr,...segPtr-
12e70 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 74 61 67  >body.toggle.tag
12e80 50 74 72 2c 20 2d 31 29 3b 0a 09 73 65 67 50 74  Ptr, -1);..segPt
12e90 72 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 69  r->body.toggle.i
12ea0 6e 4e 6f 64 65 43 6f 75 6e 74 73 20 3d 20 30 3b  nNodeCounts = 0;
12eb0 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  .    }.}.../*. *
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
12f00 2a 0a 20 2a 20 54 6f 67 67 6c 65 43 68 65 63 6b  *. * ToggleCheck
12f10 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Proc --. *. *.Th
12f20 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
12f30 69 6e 76 6f 6b 65 64 20 74 6f 20 70 65 72 66 6f  invoked to perfo
12f40 72 6d 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 63  rm consistency c
12f50 68 65 63 6b 73 0a 20 2a 09 6f 6e 20 74 6f 67 67  hecks. *.on togg
12f60 6c 65 20 73 65 67 6d 65 6e 74 73 2e 0a 20 2a 0a  le segments.. *.
12f70 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
12f80 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  one.. *. * Side 
12f90 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 66 20 61  effects:. *.If a
12fa0 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 70 72 6f   consistency pro
12fb0 62 6c 65 6d 20 69 73 20 66 6f 75 6e 64 20 74 68  blem is found th
12fc0 65 20 70 72 6f 63 65 64 75 72 65 20 70 61 6e 69  e procedure pani
12fd0 63 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  cs.. *. *-------
12fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13010 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
13020 74 69 63 20 76 6f 69 64 0a 54 6f 67 67 6c 65 43  tic void.ToggleC
13030 68 65 63 6b 50 72 6f 63 28 73 65 67 50 74 72 2c  heckProc(segPtr,
13040 20 6c 69 6e 65 50 74 72 29 0a 20 20 20 20 54 6b   linePtr).    Tk
13050 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 73 65 67  TextSegment *seg
13060 50 74 72 3b 09 09 2f 2a 20 53 65 67 6d 65 6e 74  Ptr;../* Segment
13070 20 74 6f 20 63 68 65 63 6b 2e 20 2a 2f 0a 20 20   to check. */.  
13080 20 20 54 6b 54 65 78 74 4c 69 6e 65 20 2a 6c 69    TkTextLine *li
13090 6e 65 50 74 72 3b 09 09 2f 2a 20 4c 69 6e 65 20  nePtr;../* Line 
130a0 63 6f 6e 74 61 69 6e 69 6e 67 20 73 65 67 6d 65  containing segme
130b0 6e 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 67  nt. */.{.    reg
130c0 69 73 74 65 72 20 53 75 6d 6d 61 72 79 20 2a 73  ister Summary *s
130d0 75 6d 6d 61 72 79 50 74 72 3b 0a 0a 20 20 20 20  ummaryPtr;..    
130e0 69 66 20 28 73 65 67 50 74 72 2d 3e 73 69 7a 65  if (segPtr->size
130f0 20 21 3d 20 30 29 20 7b 0a 09 70 61 6e 69 63 28   != 0) {..panic(
13100 22 54 6f 67 67 6c 65 43 68 65 63 6b 50 72 6f 63  "ToggleCheckProc
13110 3a 20 73 65 67 6d 65 6e 74 20 68 61 64 20 6e 6f  : segment had no
13120 6e 2d 7a 65 72 6f 20 73 69 7a 65 22 29 3b 0a 20  n-zero size");. 
13130 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 73 65     }.    if (!se
13140 67 50 74 72 2d 3e 62 6f 64 79 2e 74 6f 67 67 6c  gPtr->body.toggl
13150 65 2e 69 6e 4e 6f 64 65 43 6f 75 6e 74 73 29 20  e.inNodeCounts) 
13160 7b 0a 09 70 61 6e 69 63 28 22 54 6f 67 67 6c 65  {..panic("Toggle
13170 43 68 65 63 6b 50 72 6f 63 3a 20 74 6f 67 67 6c  CheckProc: toggl
13180 65 20 63 6f 75 6e 74 73 20 6e 6f 74 20 75 70 64  e counts not upd
13190 61 74 65 64 20 69 6e 20 6e 6f 64 65 73 22 29 3b  ated in nodes");
131a0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 20 28  .    }.    for (
131b0 73 75 6d 6d 61 72 79 50 74 72 20 3d 20 6c 69 6e  summaryPtr = lin
131c0 65 50 74 72 2d 3e 70 61 72 65 6e 74 50 74 72 2d  ePtr->parentPtr-
131d0 3e 73 75 6d 6d 61 72 79 50 74 72 3b 20 3b 0a 09  >summaryPtr; ;..
131e0 20 20 20 20 73 75 6d 6d 61 72 79 50 74 72 20 3d      summaryPtr =
131f0 20 73 75 6d 6d 61 72 79 50 74 72 2d 3e 6e 65 78   summaryPtr->nex
13200 74 50 74 72 29 20 7b 0a 09 69 66 20 28 73 75 6d  tPtr) {..if (sum
13210 6d 61 72 79 50 74 72 20 3d 3d 20 4e 55 4c 4c 29  maryPtr == NULL)
13220 20 7b 0a 09 20 20 20 20 70 61 6e 69 63 28 22 54   {..    panic("T
13230 6f 67 67 6c 65 43 68 65 63 6b 50 72 6f 63 3a 20  oggleCheckProc: 
13240 74 61 67 20 6e 6f 74 20 70 72 65 73 65 6e 74 20  tag not present 
13250 69 6e 20 6e 6f 64 65 22 29 3b 0a 09 7d 0a 09 69  in node");..}..i
13260 66 20 28 73 75 6d 6d 61 72 79 50 74 72 2d 3e 74  f (summaryPtr->t
13270 61 67 50 74 72 20 3d 3d 20 73 65 67 50 74 72 2d  agPtr == segPtr-
13280 3e 62 6f 64 79 2e 74 6f 67 67 6c 65 2e 74 61 67  >body.toggle.tag
13290 50 74 72 29 20 7b 0a 09 20 20 20 20 62 72 65 61  Ptr) {..    brea
132a0 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  k;..}.    }.}...
132b0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
132c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
13300 2a 20 54 6b 42 54 72 65 65 43 68 61 72 73 49 6e  * TkBTreeCharsIn
13310 4c 69 6e 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Line --. *. *.Th
13320 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74  is procedure ret
13330 75 72 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20  urns a count of 
13340 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
13350 61 72 61 63 74 65 72 73 0a 20 2a 09 69 6e 20 61  aracters. *.in a
13360 20 67 69 76 65 6e 20 6c 69 6e 65 2e 0a 20 2a 0a   given line.. *.
13370 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54   * Results:. *.T
13380 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
13390 69 73 20 74 68 65 20 63 68 61 72 61 63 74 65 72  is the character
133a0 20 63 6f 75 6e 74 20 66 6f 72 20 6c 69 6e 65 50   count for lineP
133b0 74 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  tr.. *. * Side e
133c0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
133d0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
133e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
133f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
13420 0a 0a 69 6e 74 0a 54 6b 42 54 72 65 65 43 68 61  ..int.TkBTreeCha
13430 72 73 49 6e 4c 69 6e 65 28 6c 69 6e 65 50 74 72  rsInLine(linePtr
13440 29 0a 20 20 20 20 54 6b 54 65 78 74 4c 69 6e 65  ).    TkTextLine
13450 20 2a 6c 69 6e 65 50 74 72 3b 09 09 2f 2a 20 4c   *linePtr;../* L
13460 69 6e 65 20 77 68 6f 73 65 20 63 68 61 72 61 63  ine whose charac
13470 74 65 72 73 20 73 68 6f 75 6c 64 20 62 65 0a 09  ters should be..
13480 09 09 09 09 20 2a 20 63 6f 75 6e 74 65 64 2e 20  .... * counted. 
13490 2a 2f 0a 7b 0a 20 20 20 20 54 6b 54 65 78 74 53  */.{.    TkTextS
134a0 65 67 6d 65 6e 74 20 2a 73 65 67 50 74 72 3b 0a  egment *segPtr;.
134b0 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 3b 0a 0a      int count;..
134c0 20 20 20 20 63 6f 75 6e 74 20 3d 20 30 3b 0a 20      count = 0;. 
134d0 20 20 20 66 6f 72 20 28 73 65 67 50 74 72 20 3d     for (segPtr =
134e0 20 6c 69 6e 65 50 74 72 2d 3e 73 65 67 50 74 72   linePtr->segPtr
134f0 3b 20 73 65 67 50 74 72 20 21 3d 20 4e 55 4c 4c  ; segPtr != NULL
13500 3b 20 73 65 67 50 74 72 20 3d 20 73 65 67 50 74  ; segPtr = segPt
13510 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 63  r->nextPtr) {..c
13520 6f 75 6e 74 20 2b 3d 20 73 65 67 50 74 72 2d 3e  ount += segPtr->
13530 73 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  size;.    }.    
13540 72 65 74 75 72 6e 20 63 6f 75 6e 74 3b 0a 7d 0a  return count;.}.