Hex Artifact Content

Artifact 9f14f00d692e364b25cb705665dad131c1254c7d:


0000: 2f 2a 20 0a 20 2a 20 74 6b 54 65 78 74 49 6e 64  /* . * tkTextInd
0010: 65 78 2e 63 20 28 43 54 6b 29 20 2d 2d 0a 20 2a  ex.c (CTk) --. *
0020: 0a 20 2a 09 54 68 69 73 20 6d 6f 64 75 6c 65 20  . *.This module 
0030: 70 72 6f 76 69 64 65 73 20 70 72 6f 63 65 64 75  provides procedu
0040: 72 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  res that manipul
0050: 61 74 65 20 69 6e 64 69 63 65 73 20 66 6f 72 0a  ate indices for.
0060: 20 2a 09 74 65 78 74 20 77 69 64 67 65 74 73 2e   *.text widgets.
0070: 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74  . *. * Copyright
0080: 20 28 63 29 20 31 39 39 32 2d 31 39 39 34 20 54   (c) 1992-1994 T
0090: 68 65 20 52 65 67 65 6e 74 73 20 6f 66 20 74 68  he Regents of th
00a0: 65 20 55 6e 69 76 65 72 73 69 74 79 20 6f 66 20  e University of 
00b0: 43 61 6c 69 66 6f 72 6e 69 61 2e 0a 20 2a 20 43  California.. * C
00c0: 6f 70 79 72 69 67 68 74 20 28 63 29 20 31 39 39  opyright (c) 199
00d0: 34 2d 31 39 39 35 20 53 75 6e 20 4d 69 63 72 6f  4-1995 Sun Micro
00e0: 73 79 73 74 65 6d 73 2c 20 49 6e 63 2e 0a 20 2a  systems, Inc.. *
00f0: 0a 20 2a 20 53 65 65 20 74 68 65 20 66 69 6c 65  . * See the file
0100: 20 22 6c 69 63 65 6e 73 65 2e 74 65 72 6d 73 22   "license.terms"
0110: 20 66 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   for information
0120: 20 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 72 65   on usage and re
0130: 64 69 73 74 72 69 62 75 74 69 6f 6e 0a 20 2a 20  distribution. * 
0140: 6f 66 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e  of this file, an
0150: 64 20 66 6f 72 20 61 20 44 49 53 43 4c 41 49 4d  d for a DISCLAIM
0160: 45 52 20 4f 46 20 41 4c 4c 20 57 41 52 52 41 4e  ER OF ALL WARRAN
0170: 54 49 45 53 2e 0a 20 2a 0a 20 2a 20 40 28 23 29  TIES.. *. * @(#)
0180: 20 24 49 64 3a 20 63 74 6b 2e 73 68 61 72 2c 76   $Id: ctk.shar,v
0190: 20 31 2e 35 30 20 31 39 39 36 2f 30 31 2f 31 35   1.50 1996/01/15
01a0: 20 31 34 3a 34 37 3a 31 36 20 61 6e 64 72 65 77   14:47:16 andrew
01b0: 6d 20 45 78 70 20 61 6e 64 72 65 77 6d 20 24 0a  m Exp andrewm $.
01c0: 20 2a 2f 0a 0a 0a 23 69 6e 63 6c 75 64 65 20 22   */...#include "
01d0: 64 65 66 61 75 6c 74 2e 68 22 0a 23 69 6e 63 6c  default.h".#incl
01e0: 75 64 65 20 22 74 6b 50 6f 72 74 2e 68 22 0a 23  ude "tkPort.h".#
01f0: 69 6e 63 6c 75 64 65 20 22 74 6b 49 6e 74 2e 68  include "tkInt.h
0200: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 6b 54 65  ".#include "tkTe
0210: 78 74 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 49 6e 64  xt.h"../*. * Ind
0220: 65 78 20 74 6f 20 75 73 65 20 74 6f 20 73 65 6c  ex to use to sel
0230: 65 63 74 20 6c 61 73 74 20 63 68 61 72 61 63 74  ect last charact
0240: 65 72 20 69 6e 20 6c 69 6e 65 20 28 76 65 72 79  er in line (very
0250: 20 6c 61 72 67 65 20 69 6e 74 65 67 65 72 29 3a   large integer):
0260: 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 4c 41  . */..#define LA
0270: 53 54 5f 43 48 41 52 20 31 30 30 30 30 30 30 0a  ST_CHAR 1000000.
0280: 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64  ./*. * Forward d
0290: 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 20  eclarations for 
02a0: 70 72 6f 63 65 64 75 72 65 73 20 64 65 66 69 6e  procedures defin
02b0: 65 64 20 6c 61 74 65 72 20 69 6e 20 74 68 69 73  ed later in this
02c0: 20 66 69 6c 65 3a 0a 20 2a 2f 0a 0a 73 74 61 74   file:. */..stat
02d0: 69 63 20 63 68 61 72 20 2a 09 09 46 6f 72 77 42  ic char *..ForwB
02e0: 61 63 6b 20 5f 41 4e 53 49 5f 41 52 47 53 5f 28  ack _ANSI_ARGS_(
02f0: 28 63 68 61 72 20 2a 73 74 72 69 6e 67 2c 0a 09  (char *string,..
0300: 09 09 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65  ..    TkTextInde
0310: 78 20 2a 69 6e 64 65 78 50 74 72 29 29 3b 0a 73  x *indexPtr));.s
0320: 74 61 74 69 63 20 63 68 61 72 20 2a 09 09 53 74  tatic char *..St
0330: 61 72 74 45 6e 64 20 5f 41 4e 53 49 5f 41 52 47  artEnd _ANSI_ARG
0340: 53 5f 28 28 20 63 68 61 72 20 2a 73 74 72 69 6e  S_(( char *strin
0350: 67 2c 0a 09 09 09 20 20 20 20 54 6b 54 65 78 74  g,....    TkText
0360: 49 6e 64 65 78 20 2a 69 6e 64 65 78 50 74 72 29  Index *indexPtr)
0370: 29 3b 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  );.../*. *------
0380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
03c0: 6b 54 65 78 74 4d 61 6b 65 49 6e 64 65 78 20 2d  kTextMakeIndex -
03d0: 2d 0a 20 2a 0a 20 2a 09 47 69 76 65 6e 20 61 20  -. *. *.Given a 
03e0: 6c 69 6e 65 20 69 6e 64 65 78 20 61 6e 64 20 61  line index and a
03f0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
0400: 2c 20 6c 6f 6f 6b 20 74 68 69 6e 67 73 20 75 70  , look things up
0410: 0a 20 2a 09 69 6e 20 74 68 65 20 42 2d 74 72 65  . *.in the B-tre
0420: 65 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 61 20  e and fill in a 
0430: 54 6b 54 65 78 74 49 6e 64 65 78 20 73 74 72 75  TkTextIndex stru
0440: 63 74 75 72 65 2e 0a 20 2a 0a 20 2a 20 52 65 73  cture.. *. * Res
0450: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 73 74 72  ults:. *.The str
0460: 75 63 74 75 72 65 20 61 74 20 2a 69 6e 64 65 78  ucture at *index
0470: 50 74 72 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  Ptr is filled in
0480: 20 77 69 74 68 20 69 6e 66 6f 72 6d 61 74 69 6f   with informatio
0490: 6e 0a 20 2a 09 61 62 6f 75 74 20 74 68 65 20 63  n. *.about the c
04a0: 68 61 72 61 63 74 65 72 20 61 74 20 6c 69 6e 65  haracter at line
04b0: 49 6e 64 65 78 20 61 6e 64 20 63 68 61 72 49 6e  Index and charIn
04c0: 64 65 78 20 28 6f 72 20 74 68 65 0a 20 2a 09 63  dex (or the. *.c
04d0: 6c 6f 73 65 73 74 20 65 78 69 73 74 69 6e 67 20  losest existing 
04e0: 63 68 61 72 61 63 74 65 72 2c 20 69 66 20 74 68  character, if th
04f0: 65 20 73 70 65 63 69 66 69 65 64 20 6f 6e 65 20  e specified one 
0500: 64 6f 65 73 6e 27 74 0a 20 2a 09 65 78 69 73 74  doesn't. *.exist
0510: 29 2c 20 61 6e 64 20 69 6e 64 65 78 50 74 72 20  ), and indexPtr 
0520: 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 72  is returned as r
0530: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
0540: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
0550: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
0560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 6b 54  -------. */..TkT
05a0: 65 78 74 49 6e 64 65 78 20 2a 0a 54 6b 54 65 78  extIndex *.TkTex
05b0: 74 4d 61 6b 65 49 6e 64 65 78 28 74 72 65 65 2c  tMakeIndex(tree,
05c0: 20 6c 69 6e 65 49 6e 64 65 78 2c 20 63 68 61 72   lineIndex, char
05d0: 49 6e 64 65 78 2c 20 69 6e 64 65 78 50 74 72 29  Index, indexPtr)
05e0: 0a 20 20 20 20 54 6b 54 65 78 74 42 54 72 65 65  .    TkTextBTree
05f0: 20 74 72 65 65 3b 09 09 2f 2a 20 54 72 65 65 20   tree;../* Tree 
0600: 74 68 61 74 20 6c 69 6e 65 49 6e 64 65 78 20 61  that lineIndex a
0610: 6e 64 20 63 68 61 72 49 6e 64 65 78 20 72 65 66  nd charIndex ref
0620: 65 72 0a 09 09 09 09 20 2a 20 74 6f 2e 20 2a 2f  er..... * to. */
0630: 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 49 6e 64  .    int lineInd
0640: 65 78 3b 09 09 2f 2a 20 49 6e 64 65 78 20 6f 66  ex;../* Index of
0650: 20 64 65 73 69 72 65 64 20 6c 69 6e 65 20 28 30   desired line (0
0660: 20 6d 65 61 6e 73 20 66 69 72 73 74 0a 09 09 09   means first....
0670: 09 20 2a 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  . * line of text
0680: 29 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 63 68  ). */.    int ch
0690: 61 72 49 6e 64 65 78 3b 09 09 2f 2a 20 49 6e 64  arIndex;../* Ind
06a0: 65 78 20 6f 66 20 64 65 73 69 72 65 64 20 63 68  ex of desired ch
06b0: 61 72 61 63 74 65 72 2e 20 2a 2f 0a 20 20 20 20  aracter. */.    
06c0: 54 6b 54 65 78 74 49 6e 64 65 78 20 2a 69 6e 64  TkTextIndex *ind
06d0: 65 78 50 74 72 3b 09 2f 2a 20 53 74 72 75 63 74  exPtr;./* Struct
06e0: 75 72 65 20 74 6f 20 66 69 6c 6c 20 69 6e 2e 20  ure to fill in. 
06f0: 2a 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65  */.{.    registe
0700: 72 20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20  r TkTextSegment 
0710: 2a 73 65 67 50 74 72 3b 0a 20 20 20 20 69 6e 74  *segPtr;.    int
0720: 20 69 6e 64 65 78 3b 0a 0a 20 20 20 20 69 6e 64   index;..    ind
0730: 65 78 50 74 72 2d 3e 74 72 65 65 20 3d 20 74 72  exPtr->tree = tr
0740: 65 65 3b 0a 20 20 20 20 69 66 20 28 6c 69 6e 65  ee;.    if (line
0750: 49 6e 64 65 78 20 3c 20 30 29 20 7b 0a 09 6c 69  Index < 0) {..li
0760: 6e 65 49 6e 64 65 78 20 3d 20 30 3b 0a 09 63 68  neIndex = 0;..ch
0770: 61 72 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  arIndex = 0;.   
0780: 20 7d 0a 20 20 20 20 69 66 20 28 63 68 61 72 49   }.    if (charI
0790: 6e 64 65 78 20 3c 20 30 29 20 7b 0a 09 63 68 61  ndex < 0) {..cha
07a0: 72 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  rIndex = 0;.    
07b0: 7d 0a 20 20 20 20 69 6e 64 65 78 50 74 72 2d 3e  }.    indexPtr->
07c0: 6c 69 6e 65 50 74 72 20 3d 20 54 6b 42 54 72 65  linePtr = TkBTre
07d0: 65 46 69 6e 64 4c 69 6e 65 28 74 72 65 65 2c 20  eFindLine(tree, 
07e0: 6c 69 6e 65 49 6e 64 65 78 29 3b 0a 20 20 20 20  lineIndex);.    
07f0: 69 66 20 28 69 6e 64 65 78 50 74 72 2d 3e 6c 69  if (indexPtr->li
0800: 6e 65 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  nePtr == NULL) {
0810: 0a 09 69 6e 64 65 78 50 74 72 2d 3e 6c 69 6e 65  ..indexPtr->line
0820: 50 74 72 20 3d 20 54 6b 42 54 72 65 65 46 69 6e  Ptr = TkBTreeFin
0830: 64 4c 69 6e 65 28 74 72 65 65 2c 20 54 6b 42 54  dLine(tree, TkBT
0840: 72 65 65 4e 75 6d 4c 69 6e 65 73 28 74 72 65 65  reeNumLines(tree
0850: 29 29 3b 0a 09 63 68 61 72 49 6e 64 65 78 20 3d  ));..charIndex =
0860: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
0870: 2a 0a 20 20 20 20 20 2a 20 56 65 72 69 66 79 20  *.     * Verify 
0880: 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
0890: 73 20 77 69 74 68 69 6e 20 74 68 65 20 72 61 6e  s within the ran
08a0: 67 65 20 6f 66 20 74 68 65 20 6c 69 6e 65 2e 0a  ge of the line..
08b0: 20 20 20 20 20 2a 20 49 66 20 6e 6f 74 2c 20 6a       * If not, j
08c0: 75 73 74 20 75 73 65 20 74 68 65 20 69 6e 64 65  ust use the inde
08d0: 78 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 68  x of the last ch
08e0: 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20 6c  aracter in the l
08f0: 69 6e 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ine..     */..  
0900: 20 20 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 30    for (index = 0
0910: 2c 20 73 65 67 50 74 72 20 3d 20 69 6e 64 65 78  , segPtr = index
0920: 50 74 72 2d 3e 6c 69 6e 65 50 74 72 2d 3e 73 65  Ptr->linePtr->se
0930: 67 50 74 72 3b 20 3b 0a 09 20 20 20 20 73 65 67  gPtr; ;..    seg
0940: 50 74 72 20 3d 20 73 65 67 50 74 72 2d 3e 6e 65  Ptr = segPtr->ne
0950: 78 74 50 74 72 29 20 7b 0a 09 69 66 20 28 73 65  xtPtr) {..if (se
0960: 67 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  gPtr == NULL) {.
0970: 09 20 20 20 20 69 6e 64 65 78 50 74 72 2d 3e 63  .    indexPtr->c
0980: 68 61 72 49 6e 64 65 78 20 3d 20 69 6e 64 65 78  harIndex = index
0990: 2d 31 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -1;..    break;.
09a0: 09 7d 0a 09 69 6e 64 65 78 20 2b 3d 20 73 65 67  .}..index += seg
09b0: 50 74 72 2d 3e 73 69 7a 65 3b 0a 09 69 66 20 28  Ptr->size;..if (
09c0: 69 6e 64 65 78 20 3e 20 63 68 61 72 49 6e 64 65  index > charInde
09d0: 78 29 20 7b 0a 09 20 20 20 20 69 6e 64 65 78 50  x) {..    indexP
09e0: 74 72 2d 3e 63 68 61 72 49 6e 64 65 78 20 3d 20  tr->charIndex = 
09f0: 63 68 61 72 49 6e 64 65 78 3b 0a 09 20 20 20 20  charIndex;..    
0a00: 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a  break;..}.    }.
0a10: 20 20 20 20 72 65 74 75 72 6e 20 69 6e 64 65 78      return index
0a20: 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  Ptr;.}.../*. *--
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0a70: 20 2a 20 54 6b 54 65 78 74 49 6e 64 65 78 54 6f   * TkTextIndexTo
0a80: 53 65 67 20 2d 2d 0a 20 2a 0a 20 2a 09 47 69 76  Seg --. *. *.Giv
0a90: 65 6e 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 69  en an index, thi
0aa0: 73 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75  s procedure retu
0ab0: 72 6e 73 20 74 68 65 20 73 65 67 6d 65 6e 74 20  rns the segment 
0ac0: 61 6e 64 0a 20 2a 09 6f 66 66 73 65 74 20 77 69  and. *.offset wi
0ad0: 74 68 69 6e 20 73 65 67 6d 65 6e 74 20 66 6f 72  thin segment for
0ae0: 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 2a 0a 20   the index.. *. 
0af0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
0b00: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
0b10: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
0b20: 68 65 20 73 65 67 6d 65 6e 74 20 72 65 66 65 72  he segment refer
0b30: 72 65 64 20 74 6f 0a 20 2a 09 62 79 20 69 6e 64  red to. *.by ind
0b40: 65 78 50 74 72 3b 20 20 74 68 69 73 20 77 69 6c  exPtr;  this wil
0b50: 6c 20 61 6c 77 61 79 73 20 62 65 20 61 20 73 65  l always be a se
0b60: 67 6d 65 6e 74 20 77 69 74 68 20 6e 6f 6e 2d 7a  gment with non-z
0b70: 65 72 6f 0a 20 2a 09 73 69 7a 65 2e 20 20 54 68  ero. *.size.  Th
0b80: 65 20 76 61 72 69 61 62 6c 65 20 61 74 20 2a 6f  e variable at *o
0b90: 66 66 73 65 74 50 74 72 20 69 73 20 73 65 74 20  ffsetPtr is set 
0ba0: 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 2a 09 69  to hold the. *.i
0bb0: 6e 74 65 67 65 72 20 6f 66 66 73 65 74 20 77 69  nteger offset wi
0bc0: 74 68 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  thin the segment
0bd0: 20 6f 66 20 74 68 65 20 63 68 61 72 61 63 74 65   of the characte
0be0: 72 0a 20 2a 09 67 69 76 65 6e 20 62 79 20 69 6e  r. *.given by in
0bf0: 64 65 78 50 74 72 2e 0a 20 2a 0a 20 2a 20 53 69  dexPtr.. *. * Si
0c00: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
0c10: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 6b  --------. */..Tk
0c60: 54 65 78 74 53 65 67 6d 65 6e 74 20 2a 0a 54 6b  TextSegment *.Tk
0c70: 54 65 78 74 49 6e 64 65 78 54 6f 53 65 67 28 69  TextIndexToSeg(i
0c80: 6e 64 65 78 50 74 72 2c 20 6f 66 66 73 65 74 50  ndexPtr, offsetP
0c90: 74 72 29 0a 20 20 20 20 54 6b 54 65 78 74 49 6e  tr).    TkTextIn
0ca0: 64 65 78 20 2a 69 6e 64 65 78 50 74 72 3b 09 09  dex *indexPtr;..
0cb0: 2f 2a 20 54 65 78 74 20 69 6e 64 65 78 2e 20 2a  /* Text index. *
0cc0: 2f 0a 20 20 20 20 69 6e 74 20 2a 6f 66 66 73 65  /.    int *offse
0cd0: 74 50 74 72 3b 09 09 09 2f 2a 20 57 68 65 72 65  tPtr;.../* Where
0ce0: 20 74 6f 20 73 74 6f 72 65 20 6f 66 66 73 65 74   to store offset
0cf0: 20 77 69 74 68 69 6e 0a 09 09 09 09 09 20 2a 20   within...... * 
0d00: 73 65 67 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c  segment, or NULL
0d10: 20 69 66 20 6f 66 66 73 65 74 20 69 73 6e 27 74   if offset isn't
0d20: 0a 09 09 09 09 09 20 2a 20 77 61 6e 74 65 64 2e  ...... * wanted.
0d30: 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74   */.{.    regist
0d40: 65 72 20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74  er TkTextSegment
0d50: 20 2a 73 65 67 50 74 72 3b 0a 20 20 20 20 69 6e   *segPtr;.    in
0d60: 74 20 6f 66 66 73 65 74 3b 0a 0a 20 20 20 20 66  t offset;..    f
0d70: 6f 72 20 28 6f 66 66 73 65 74 20 3d 20 69 6e 64  or (offset = ind
0d80: 65 78 50 74 72 2d 3e 63 68 61 72 49 6e 64 65 78  exPtr->charIndex
0d90: 2c 20 73 65 67 50 74 72 20 3d 20 69 6e 64 65 78  , segPtr = index
0da0: 50 74 72 2d 3e 6c 69 6e 65 50 74 72 2d 3e 73 65  Ptr->linePtr->se
0db0: 67 50 74 72 3b 0a 09 20 20 20 20 6f 66 66 73 65  gPtr;..    offse
0dc0: 74 20 3e 3d 20 73 65 67 50 74 72 2d 3e 73 69 7a  t >= segPtr->siz
0dd0: 65 3b 0a 09 20 20 20 20 6f 66 66 73 65 74 20 2d  e;..    offset -
0de0: 3d 20 73 65 67 50 74 72 2d 3e 73 69 7a 65 2c 20  = segPtr->size, 
0df0: 73 65 67 50 74 72 20 3d 20 73 65 67 50 74 72 2d  segPtr = segPtr-
0e00: 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 2f 2a 20  >nextPtr) {../* 
0e10: 45 6d 70 74 79 20 6c 6f 6f 70 20 62 6f 64 79 2e  Empty loop body.
0e20: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
0e30: 20 28 6f 66 66 73 65 74 50 74 72 20 21 3d 20 4e   (offsetPtr != N
0e40: 55 4c 4c 29 20 7b 0a 09 2a 6f 66 66 73 65 74 50  ULL) {..*offsetP
0e50: 74 72 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 20  tr = offset;.   
0e60: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 65   }.    return se
0e70: 67 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  gPtr;.}.../*. *-
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0ec0: 0a 20 2a 20 54 6b 54 65 78 74 53 65 67 54 6f 4f  . * TkTextSegToO
0ed0: 66 66 73 65 74 20 2d 2d 0a 20 2a 0a 20 2a 09 47  ffset --. *. *.G
0ee0: 69 76 65 6e 20 61 20 73 65 67 6d 65 6e 74 20 70  iven a segment p
0ef0: 6f 69 6e 74 65 72 20 61 6e 64 20 74 68 65 20 6c  ointer and the l
0f00: 69 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69  ine containing i
0f10: 74 2c 20 74 68 69 73 0a 20 2a 09 70 72 6f 63 65  t, this. *.proce
0f20: 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68 65  dure returns the
0f30: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
0f40: 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 69 74  egment within it
0f50: 73 0a 20 2a 09 6c 69 6e 65 2e 0a 20 2a 0a 20 2a  s. *.line.. *. *
0f60: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65   Results:. *.The
0f70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
0f80: 20 74 68 65 20 6f 66 66 73 65 74 20 28 77 69 74   the offset (wit
0f90: 68 69 6e 20 69 74 73 20 6c 69 6e 65 29 20 6f 66  hin its line) of
0fa0: 20 74 68 65 0a 20 2a 09 66 69 72 73 74 20 63 68   the. *.first ch
0fb0: 61 72 61 63 74 65 72 20 69 6e 20 73 65 67 50 74  aracter in segPt
0fc0: 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  r.. *. * Side ef
0fd0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
0fe0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6b 54  ---. */..int.TkT
1030: 65 78 74 53 65 67 54 6f 4f 66 66 73 65 74 28 73  extSegToOffset(s
1040: 65 67 50 74 72 2c 20 6c 69 6e 65 50 74 72 29 0a  egPtr, linePtr).
1050: 20 20 20 20 54 6b 54 65 78 74 53 65 67 6d 65 6e      TkTextSegmen
1060: 74 20 2a 73 65 67 50 74 72 3b 09 09 2f 2a 20 53  t *segPtr;../* S
1070: 65 67 6d 65 6e 74 20 77 68 6f 73 65 20 6f 66 66  egment whose off
1080: 73 65 74 20 69 73 20 64 65 73 69 72 65 64 2e 20  set is desired. 
1090: 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 4c 69 6e  */.    TkTextLin
10a0: 65 20 2a 6c 69 6e 65 50 74 72 3b 09 09 2f 2a 20  e *linePtr;../* 
10b0: 4c 69 6e 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Line containing 
10c0: 73 65 67 50 74 72 2e 20 2a 2f 0a 7b 0a 20 20 20  segPtr. */.{.   
10d0: 20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a   TkTextSegment *
10e0: 73 65 67 50 74 72 32 3b 0a 20 20 20 20 69 6e 74  segPtr2;.    int
10f0: 20 6f 66 66 73 65 74 3b 0a 0a 20 20 20 20 6f 66   offset;..    of
1100: 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f  fset = 0;.    fo
1110: 72 20 28 73 65 67 50 74 72 32 20 3d 20 6c 69 6e  r (segPtr2 = lin
1120: 65 50 74 72 2d 3e 73 65 67 50 74 72 3b 20 73 65  ePtr->segPtr; se
1130: 67 50 74 72 32 20 21 3d 20 73 65 67 50 74 72 3b  gPtr2 != segPtr;
1140: 0a 09 20 20 20 20 73 65 67 50 74 72 32 20 3d 20  ..    segPtr2 = 
1150: 73 65 67 50 74 72 32 2d 3e 6e 65 78 74 50 74 72  segPtr2->nextPtr
1160: 29 20 7b 0a 09 6f 66 66 73 65 74 20 2b 3d 20 73  ) {..offset += s
1170: 65 67 50 74 72 32 2d 3e 73 69 7a 65 3b 0a 20 20  egPtr2->size;.  
1180: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6f    }.    return o
1190: 66 66 73 65 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ffset;.}.../*. *
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 54  ------. *. * TkT
11f0: 65 78 74 47 65 74 49 6e 64 65 78 20 2d 2d 0a 20  extGetIndex --. 
1200: 2a 0a 20 2a 09 47 69 76 65 6e 20 61 20 73 74 72  *. *.Given a str
1210: 69 6e 67 2c 20 72 65 74 75 72 6e 20 74 68 65 20  ing, return the 
1220: 6c 69 6e 65 20 61 6e 64 20 63 68 61 72 61 63 74  line and charact
1230: 65 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 0a  er indices that.
1240: 20 2a 09 69 74 20 64 65 73 63 72 69 62 65 73 2e   *.it describes.
1250: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
1260: 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 61   *.The return va
1270: 6c 75 65 20 69 73 20 61 20 73 74 61 6e 64 61 72  lue is a standar
1280: 64 20 54 63 6c 20 72 65 74 75 72 6e 20 72 65 73  d Tcl return res
1290: 75 6c 74 2e 20 20 49 66 0a 20 2a 09 54 43 4c 5f  ult.  If. *.TCL_
12a0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
12b0: 74 68 65 6e 20 65 76 65 72 79 74 68 69 6e 67 20  then everything 
12c0: 77 65 6e 74 20 77 65 6c 6c 20 61 6e 64 20 74 68  went well and th
12d0: 65 20 69 6e 64 65 78 0a 20 2a 09 61 74 20 2a 69  e index. *.at *i
12e0: 6e 64 65 78 50 74 72 20 69 73 20 66 69 6c 6c 65  ndexPtr is fille
12f0: 64 20 69 6e 3b 20 20 6f 74 68 65 72 77 69 73 65  d in;  otherwise
1300: 20 54 43 4c 5f 45 52 52 4f 52 20 69 73 20 72 65   TCL_ERROR is re
1310: 74 75 72 6e 65 64 0a 20 2a 09 61 6e 64 20 61 6e  turned. *.and an
1320: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
1330: 73 20 6c 65 66 74 20 69 6e 20 69 6e 74 65 72 70  s left in interp
1340: 2d 3e 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  ->result.. *. * 
1350: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
1360: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
1370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b0: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6b 54 65  --. */..int.TkTe
13c0: 78 74 47 65 74 49 6e 64 65 78 28 69 6e 74 65 72  xtGetIndex(inter
13d0: 70 2c 20 74 65 78 74 50 74 72 2c 20 73 74 72 69  p, textPtr, stri
13e0: 6e 67 2c 20 69 6e 64 65 78 50 74 72 29 0a 20 20  ng, indexPtr).  
13f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1400: 74 65 72 70 3b 09 09 2f 2a 20 55 73 65 20 74 68  terp;../* Use th
1410: 69 73 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70  is for error rep
1420: 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 54  orting. */.    T
1430: 6b 54 65 78 74 20 2a 74 65 78 74 50 74 72 3b 09  kText *textPtr;.
1440: 09 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  ./* Information 
1450: 61 62 6f 75 74 20 74 65 78 74 20 77 69 64 67 65  about text widge
1460: 74 2e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  t. */.    char *
1470: 73 74 72 69 6e 67 3b 09 09 2f 2a 20 54 65 78 74  string;../* Text
1480: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ual description 
1490: 6f 66 20 70 6f 73 69 74 69 6f 6e 2e 20 2a 2f 0a  of position. */.
14a0: 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20      TkTextIndex 
14b0: 2a 69 6e 64 65 78 50 74 72 3b 09 2f 2a 20 49 6e  *indexPtr;./* In
14c0: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
14d0: 20 66 69 6c 6c 20 69 6e 2e 20 2a 2f 0a 7b 0a 20   fill in. */.{. 
14e0: 20 20 20 72 65 67 69 73 74 65 72 20 63 68 61 72     register char
14f0: 20 2a 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 65   *p;.    char *e
1500: 6e 64 2c 20 2a 65 6e 64 4f 66 42 61 73 65 3b 0a  nd, *endOfBase;.
1510: 20 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72      Tcl_HashEntr
1520: 79 20 2a 68 50 74 72 3b 0a 20 20 20 20 54 6b 54  y *hPtr;.    TkT
1530: 65 78 74 54 61 67 20 2a 74 61 67 50 74 72 3b 0a  extTag *tagPtr;.
1540: 20 20 20 20 54 6b 54 65 78 74 53 65 61 72 63 68      TkTextSearch
1550: 20 73 65 61 72 63 68 3b 0a 20 20 20 20 54 6b 54   search;.    TkT
1560: 65 78 74 49 6e 64 65 78 20 66 69 72 73 74 2c 20  extIndex first, 
1570: 6c 61 73 74 3b 0a 20 20 20 20 69 6e 74 20 77 61  last;.    int wa
1580: 6e 74 4c 61 73 74 2c 20 72 65 73 75 6c 74 3b 0a  ntLast, result;.
1590: 20 20 20 20 63 68 61 72 20 63 3b 0a 0a 20 20 20      char c;..   
15a0: 20 2f 2a 0a 20 20 20 20 20 2a 2d 2d 2d 2d 2d 2d   /*.     *------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
15f0: 20 20 20 20 20 2a 20 53 74 61 67 65 20 31 3a 20       * Stage 1: 
1600: 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
1610: 74 68 65 20 69 6e 64 65 78 20 63 6f 6e 73 69 73  the index consis
1620: 74 73 20 6f 66 20 6e 6f 74 68 69 6e 67 20 62 75  ts of nothing bu
1630: 74 20 61 20 6d 61 72 0a 20 20 20 20 20 2a 20 6e  t a mar.     * n
1640: 61 6d 65 2e 20 20 57 65 20 64 6f 20 74 68 69 73  ame.  We do this
1650: 20 63 68 65 63 6b 20 6e 6f 77 20 65 76 65 6e 20   check now even 
1660: 74 68 6f 75 67 68 20 69 74 27 73 20 61 6c 73 6f  though it's also
1670: 20 64 6f 6e 65 20 6c 61 74 65 72 2c 20 69 6e 0a   done later, in.
1680: 20 20 20 20 20 2a 20 6f 72 64 65 72 20 74 6f 20       * order to 
1690: 61 6c 6c 6f 77 20 6d 61 72 6b 20 6e 61 6d 65 73  allow mark names
16a0: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 20 66 75   that include fu
16b0: 6e 6e 79 20 63 68 61 72 61 63 74 65 72 73 20 73  nny characters s
16c0: 75 63 68 20 61 73 0a 20 20 20 20 20 2a 20 73 70  uch as.     * sp
16d0: 61 63 65 73 20 6f 72 20 22 2b 31 63 22 2e 0a 20  aces or "+1c".. 
16e0: 20 20 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      *-----------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 20 20 20  ----------.     
1730: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 54 6b 54 65  */..    if (TkTe
1740: 78 74 4d 61 72 6b 4e 61 6d 65 54 6f 49 6e 64 65  xtMarkNameToInde
1750: 78 28 74 65 78 74 50 74 72 2c 20 73 74 72 69 6e  x(textPtr, strin
1760: 67 2c 20 69 6e 64 65 78 50 74 72 29 20 3d 3d 20  g, indexPtr) == 
1770: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
1780: 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  n TCL_OK;.    }.
1790: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 2d 2d  .    /*.     *--
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17b0: 2d 2d 2d 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 0a 20  --------------. 
17d0: 20 20 20 20 2a 20 53 74 61 67 65 20 32 3a 20 73      * Stage 2: s
17e0: 74 61 72 74 20 61 67 61 69 6e 20 62 79 20 70 61  tart again by pa
17f0: 72 73 69 6e 67 20 74 68 65 20 62 61 73 65 20 69  rsing the base i
1800: 6e 64 65 78 2e 0a 20 20 20 20 20 2a 2d 2d 2d 2d  ndex..     *----
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 20  ------------.   
1840: 20 20 2a 2f 0a 0a 20 20 20 20 69 6e 64 65 78 50    */..    indexP
1850: 74 72 2d 3e 74 72 65 65 20 3d 20 74 65 78 74 50  tr->tree = textP
1860: 74 72 2d 3e 74 72 65 65 3b 0a 0a 20 20 20 20 2f  tr->tree;..    /
1870: 2a 0a 20 20 20 20 20 2a 20 46 69 72 73 74 20 6c  *.     * First l
1880: 6f 6f 6b 20 66 6f 72 20 74 68 65 20 66 6f 72 6d  ook for the form
1890: 20 22 74 61 67 2e 66 69 72 73 74 22 20 6f 72 20   "tag.first" or 
18a0: 22 74 61 67 2e 6c 61 73 74 22 20 77 68 65 72 65  "tag.last" where
18b0: 20 22 74 61 67 22 0a 20 20 20 20 20 2a 20 69 73   "tag".     * is
18c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76   the name of a v
18d0: 61 6c 69 64 20 74 61 67 2e 20 20 54 72 79 20 74  alid tag.  Try t
18e0: 6f 20 75 73 65 20 75 70 20 61 73 20 6d 75 63 68  o use up as much
18f0: 20 61 73 20 70 6f 73 73 69 62 6c 65 0a 20 20 20   as possible.   
1900: 20 20 2a 20 6f 66 20 74 68 65 20 73 74 72 69 6e    * of the strin
1910: 67 20 69 6e 20 74 68 69 73 20 63 68 65 63 6b 20  g in this check 
1920: 28 73 74 72 72 63 68 72 20 69 6e 73 74 65 61 64  (strrchr instead
1930: 20 6f 66 20 73 74 72 63 68 72 20 62 65 6c 6f 77   of strchr below
1940: 29 2e 0a 20 20 20 20 20 2a 20 44 6f 69 6e 67 20  )..     * Doing 
1950: 74 68 65 20 63 68 65 63 6b 20 6e 6f 77 2c 20 61  the check now, a
1960: 6e 64 20 69 6e 20 74 68 69 73 20 77 61 79 2c 20  nd in this way, 
1970: 61 6c 6c 6f 77 73 20 74 61 67 20 6e 61 6d 65 73  allows tag names
1980: 20 74 6f 20 69 6e 63 6c 75 64 65 0a 20 20 20 20   to include.    
1990: 20 2a 20 66 75 6e 6e 79 20 63 68 61 72 61 63 74   * funny charact
19a0: 65 72 73 20 6c 69 6b 65 20 22 40 22 20 6f 72 20  ers like "@" or 
19b0: 22 2b 31 63 22 2e 0a 20 20 20 20 20 2a 2f 0a 0a  "+1c"..     */..
19c0: 20 20 20 20 70 20 3d 20 73 74 72 72 63 68 72 28      p = strrchr(
19d0: 73 74 72 69 6e 67 2c 20 27 2e 27 29 3b 0a 20 20  string, '.');.  
19e0: 20 20 69 66 20 28 70 20 21 3d 20 4e 55 4c 4c 29    if (p != NULL)
19f0: 20 7b 0a 09 69 66 20 28 28 70 5b 31 5d 20 3d 3d   {..if ((p[1] ==
1a00: 20 27 66 27 29 20 26 26 20 28 73 74 72 6e 63 6d   'f') && (strncm
1a10: 70 28 70 2b 31 2c 20 22 66 69 72 73 74 22 2c 20  p(p+1, "first", 
1a20: 35 29 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20  5) == 0)) {..   
1a30: 20 77 61 6e 74 4c 61 73 74 20 3d 20 30 3b 0a 09   wantLast = 0;..
1a40: 20 20 20 20 65 6e 64 4f 66 42 61 73 65 20 3d 20      endOfBase = 
1a50: 70 2b 36 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  p+6;..} else if 
1a60: 28 28 70 5b 31 5d 20 3d 3d 20 27 6c 27 29 20 26  ((p[1] == 'l') &
1a70: 26 20 28 73 74 72 6e 63 6d 70 28 70 2b 31 2c 20  & (strncmp(p+1, 
1a80: 22 6c 61 73 74 22 2c 20 34 29 20 3d 3d 20 30 29  "last", 4) == 0)
1a90: 29 20 7b 0a 09 20 20 20 20 77 61 6e 74 4c 61 73  ) {..    wantLas
1aa0: 74 20 3d 20 31 3b 0a 09 20 20 20 20 65 6e 64 4f  t = 1;..    endO
1ab0: 66 42 61 73 65 20 3d 20 70 2b 35 3b 0a 09 7d 20  fBase = p+5;..} 
1ac0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 67 6f 74 6f  else {..    goto
1ad0: 20 74 72 79 78 79 3b 0a 09 7d 0a 09 2a 70 20 3d   tryxy;..}..*p =
1ae0: 20 30 3b 0a 09 68 50 74 72 20 3d 20 54 63 6c 5f   0;..hPtr = Tcl_
1af0: 46 69 6e 64 48 61 73 68 45 6e 74 72 79 28 26 74  FindHashEntry(&t
1b00: 65 78 74 50 74 72 2d 3e 74 61 67 54 61 62 6c 65  extPtr->tagTable
1b10: 2c 20 73 74 72 69 6e 67 29 3b 0a 09 2a 70 20 3d  , string);..*p =
1b20: 20 27 2e 27 3b 0a 09 69 66 20 28 68 50 74 72 20   '.';..if (hPtr 
1b30: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
1b40: 67 6f 74 6f 20 74 72 79 78 79 3b 0a 09 7d 0a 09  goto tryxy;..}..
1b50: 74 61 67 50 74 72 20 3d 20 28 54 6b 54 65 78 74  tagPtr = (TkText
1b60: 54 61 67 20 2a 29 20 54 63 6c 5f 47 65 74 48 61  Tag *) Tcl_GetHa
1b70: 73 68 56 61 6c 75 65 28 68 50 74 72 29 3b 0a 09  shValue(hPtr);..
1b80: 54 6b 54 65 78 74 4d 61 6b 65 49 6e 64 65 78 28  TkTextMakeIndex(
1b90: 74 65 78 74 50 74 72 2d 3e 74 72 65 65 2c 20 30  textPtr->tree, 0
1ba0: 2c 20 30 2c 20 26 66 69 72 73 74 29 3b 0a 09 54  , 0, &first);..T
1bb0: 6b 54 65 78 74 4d 61 6b 65 49 6e 64 65 78 28 74  kTextMakeIndex(t
1bc0: 65 78 74 50 74 72 2d 3e 74 72 65 65 2c 20 54 6b  extPtr->tree, Tk
1bd0: 42 54 72 65 65 4e 75 6d 4c 69 6e 65 73 28 74 65  BTreeNumLines(te
1be0: 78 74 50 74 72 2d 3e 74 72 65 65 29 2c 20 30 2c  xtPtr->tree), 0,
1bf0: 0a 09 09 26 6c 61 73 74 29 3b 0a 09 54 6b 42 54  ...&last);..TkBT
1c00: 72 65 65 53 74 61 72 74 53 65 61 72 63 68 28 26  reeStartSearch(&
1c10: 66 69 72 73 74 2c 20 26 6c 61 73 74 2c 20 74 61  first, &last, ta
1c20: 67 50 74 72 2c 20 26 73 65 61 72 63 68 29 3b 0a  gPtr, &search);.
1c30: 09 69 66 20 28 21 54 6b 42 54 72 65 65 43 68 61  .if (!TkBTreeCha
1c40: 72 54 61 67 67 65 64 28 26 66 69 72 73 74 2c 20  rTagged(&first, 
1c50: 74 61 67 50 74 72 29 20 26 26 20 21 54 6b 42 54  tagPtr) && !TkBT
1c60: 72 65 65 4e 65 78 74 54 61 67 28 26 73 65 61 72  reeNextTag(&sear
1c70: 63 68 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ch)) {..    Tcl_
1c80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c90: 65 72 70 2c 0a 09 09 20 20 20 20 22 74 65 78 74  erp,...    "text
1ca0: 20 64 6f 65 73 6e 27 74 20 63 6f 6e 74 61 69 6e   doesn't contain
1cb0: 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 73 20   any characters 
1cc0: 74 61 67 67 65 64 20 77 69 74 68 20 5c 22 22 2c  tagged with \"",
1cd0: 0a 09 09 20 20 20 20 54 63 6c 5f 47 65 74 48 61  ...    Tcl_GetHa
1ce0: 73 68 4b 65 79 28 26 74 65 78 74 50 74 72 2d 3e  shKey(&textPtr->
1cf0: 74 61 67 54 61 62 6c 65 2c 20 68 50 74 72 29 2c  tagTable, hPtr),
1d00: 20 22 5c 22 22 2c 0a 09 09 09 20 20 20 20 28 63   "\"",....    (c
1d10: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
1d20: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1d30: 52 4f 52 3b 0a 09 7d 0a 09 2a 69 6e 64 65 78 50  ROR;..}..*indexP
1d40: 74 72 20 3d 20 73 65 61 72 63 68 2e 63 75 72 49  tr = search.curI
1d50: 6e 64 65 78 3b 0a 09 69 66 20 28 77 61 6e 74 4c  ndex;..if (wantL
1d60: 61 73 74 29 20 7b 0a 09 20 20 20 20 77 68 69 6c  ast) {..    whil
1d70: 65 20 28 54 6b 42 54 72 65 65 4e 65 78 74 54 61  e (TkBTreeNextTa
1d80: 67 28 26 73 65 61 72 63 68 29 29 20 7b 0a 09 09  g(&search)) {...
1d90: 2a 69 6e 64 65 78 50 74 72 20 3d 20 73 65 61 72  *indexPtr = sear
1da0: 63 68 2e 63 75 72 49 6e 64 65 78 3b 0a 09 20 20  ch.curIndex;..  
1db0: 20 20 7d 0a 09 7d 0a 09 67 6f 74 6f 20 67 6f 74    }..}..goto got
1dc0: 42 61 73 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Base;.    }..   
1dd0: 20 74 72 79 78 79 3a 0a 20 20 20 20 69 66 20 28   tryxy:.    if (
1de0: 73 74 72 69 6e 67 5b 30 5d 20 3d 3d 20 27 40 27  string[0] == '@'
1df0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 46 69 6e 64  ) {../*.. * Find
1e00: 20 63 68 61 72 61 63 74 65 72 20 61 74 20 61 20   character at a 
1e10: 67 69 76 65 6e 20 78 2c 79 20 6c 6f 63 61 74 69  given x,y locati
1e20: 6f 6e 20 69 6e 20 74 68 65 20 77 69 6e 64 6f 77  on in the window
1e30: 2e 0a 09 20 2a 2f 0a 0a 09 69 6e 74 20 78 2c 20  ... */...int x, 
1e40: 79 3b 0a 0a 09 70 20 3d 20 73 74 72 69 6e 67 2b  y;...p = string+
1e50: 31 3b 0a 09 78 20 3d 20 73 74 72 74 6f 6c 28 70  1;..x = strtol(p
1e60: 2c 20 26 65 6e 64 2c 20 30 29 3b 0a 09 69 66 20  , &end, 0);..if 
1e70: 28 28 65 6e 64 20 3d 3d 20 70 29 20 7c 7c 20 28  ((end == p) || (
1e80: 2a 65 6e 64 20 21 3d 20 27 2c 27 29 29 20 7b 0a  *end != ',')) {.
1e90: 09 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b  .    goto error;
1ea0: 0a 09 7d 0a 09 70 20 3d 20 65 6e 64 2b 31 3b 0a  ..}..p = end+1;.
1eb0: 09 79 20 3d 20 73 74 72 74 6f 6c 28 70 2c 20 26  .y = strtol(p, &
1ec0: 65 6e 64 2c 20 30 29 3b 0a 09 69 66 20 28 65 6e  end, 0);..if (en
1ed0: 64 20 3d 3d 20 70 29 20 7b 0a 09 20 20 20 20 67  d == p) {..    g
1ee0: 6f 74 6f 20 65 72 72 6f 72 3b 0a 09 7d 0a 09 54  oto error;..}..T
1ef0: 6b 54 65 78 74 50 69 78 65 6c 49 6e 64 65 78 28  kTextPixelIndex(
1f00: 74 65 78 74 50 74 72 2c 20 78 2c 20 79 2c 20 69  textPtr, x, y, i
1f10: 6e 64 65 78 50 74 72 29 3b 0a 09 65 6e 64 4f 66  ndexPtr);..endOf
1f20: 42 61 73 65 20 3d 20 65 6e 64 3b 0a 09 67 6f 74  Base = end;..got
1f30: 6f 20 67 6f 74 42 61 73 65 3b 20 0a 20 20 20 20  o gotBase; .    
1f40: 7d 0a 0a 20 20 20 20 69 66 20 28 69 73 64 69 67  }..    if (isdig
1f50: 69 74 28 55 43 48 41 52 28 73 74 72 69 6e 67 5b  it(UCHAR(string[
1f60: 30 5d 29 29 20 7c 7c 20 28 73 74 72 69 6e 67 5b  0])) || (string[
1f70: 30 5d 20 3d 3d 20 27 2d 27 29 29 20 7b 0a 09 69  0] == '-')) {..i
1f80: 6e 74 20 6c 69 6e 65 49 6e 64 65 78 2c 20 63 68  nt lineIndex, ch
1f90: 61 72 49 6e 64 65 78 3b 0a 0a 09 2f 2a 0a 09 20  arIndex;.../*.. 
1fa0: 2a 20 42 61 73 65 20 69 73 20 69 64 65 6e 74 69  * Base is identi
1fb0: 66 69 65 64 20 77 69 74 68 20 6c 69 6e 65 20 61  fied with line a
1fc0: 6e 64 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  nd character ind
1fd0: 69 63 65 73 2e 0a 09 20 2a 2f 0a 0a 09 6c 69 6e  ices... */...lin
1fe0: 65 49 6e 64 65 78 20 3d 20 73 74 72 74 6f 6c 28  eIndex = strtol(
1ff0: 73 74 72 69 6e 67 2c 20 26 65 6e 64 2c 20 30 29  string, &end, 0)
2000: 20 2d 20 31 3b 0a 09 69 66 20 28 28 65 6e 64 20   - 1;..if ((end 
2010: 3d 3d 20 73 74 72 69 6e 67 29 20 7c 7c 20 28 2a  == string) || (*
2020: 65 6e 64 20 21 3d 20 27 2e 27 29 29 20 7b 0a 09  end != '.')) {..
2030: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 3b 0a      goto error;.
2040: 09 7d 0a 09 70 20 3d 20 65 6e 64 2b 31 3b 0a 09  .}..p = end+1;..
2050: 69 66 20 28 28 2a 70 20 3d 3d 20 27 65 27 29 20  if ((*p == 'e') 
2060: 26 26 20 28 73 74 72 6e 63 6d 70 28 70 2c 20 22  && (strncmp(p, "
2070: 65 6e 64 22 2c 20 33 29 20 3d 3d 20 30 29 29 20  end", 3) == 0)) 
2080: 7b 0a 09 20 20 20 20 63 68 61 72 49 6e 64 65 78  {..    charIndex
2090: 20 3d 20 4c 41 53 54 5f 43 48 41 52 3b 0a 09 20   = LAST_CHAR;.. 
20a0: 20 20 20 65 6e 64 4f 66 42 61 73 65 20 3d 20 70     endOfBase = p
20b0: 2b 33 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  +3;..} else {.. 
20c0: 20 20 20 63 68 61 72 49 6e 64 65 78 20 3d 20 73     charIndex = s
20d0: 74 72 74 6f 6c 28 70 2c 20 26 65 6e 64 2c 20 30  trtol(p, &end, 0
20e0: 29 3b 0a 09 20 20 20 20 69 66 20 28 65 6e 64 20  );..    if (end 
20f0: 3d 3d 20 70 29 20 7b 0a 09 09 67 6f 74 6f 20 65  == p) {...goto e
2100: 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20  rror;..    }..  
2110: 20 20 65 6e 64 4f 66 42 61 73 65 20 3d 20 65 6e    endOfBase = en
2120: 64 3b 0a 09 7d 0a 09 54 6b 54 65 78 74 4d 61 6b  d;..}..TkTextMak
2130: 65 49 6e 64 65 78 28 74 65 78 74 50 74 72 2d 3e  eIndex(textPtr->
2140: 74 72 65 65 2c 20 6c 69 6e 65 49 6e 64 65 78 2c  tree, lineIndex,
2150: 20 63 68 61 72 49 6e 64 65 78 2c 20 69 6e 64 65   charIndex, inde
2160: 78 50 74 72 29 3b 0a 09 67 6f 74 6f 20 67 6f 74  xPtr);..goto got
2170: 42 61 73 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Base;.    }..   
2180: 20 66 6f 72 20 28 70 20 3d 20 73 74 72 69 6e 67   for (p = string
2190: 3b 20 2a 70 20 21 3d 20 30 3b 20 70 2b 2b 29 20  ; *p != 0; p++) 
21a0: 7b 0a 09 69 66 20 28 69 73 73 70 61 63 65 28 55  {..if (isspace(U
21b0: 43 48 41 52 28 2a 70 29 29 20 7c 7c 20 28 2a 70  CHAR(*p)) || (*p
21c0: 20 3d 3d 20 27 2b 27 29 20 7c 7c 20 28 2a 70 20   == '+') || (*p 
21d0: 3d 3d 20 27 2d 27 29 29 20 7b 0a 09 20 20 20 20  == '-')) {..    
21e0: 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a  break;..}.    }.
21f0: 20 20 20 20 65 6e 64 4f 66 42 61 73 65 20 3d 20      endOfBase = 
2200: 70 3b 0a 23 69 66 20 30 0a 20 20 20 20 69 66 20  p;.#if 0.    if 
2210: 28 73 74 72 69 6e 67 5b 30 5d 20 3d 3d 20 27 2e  (string[0] == '.
2220: 27 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 53 65 65  ') {../*.. * See
2230: 20 69 66 20 74 68 65 20 62 61 73 65 20 70 6f 73   if the base pos
2240: 69 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ition is the nam
2250: 65 20 6f 66 20 61 6e 20 65 6d 62 65 64 64 65 64  e of an embedded
2260: 20 77 69 6e 64 6f 77 2e 0a 09 20 2a 2f 0a 0a 09   window... */...
2270: 63 20 3d 20 2a 65 6e 64 4f 66 42 61 73 65 3b 0a  c = *endOfBase;.
2280: 09 2a 65 6e 64 4f 66 42 61 73 65 20 3d 20 30 3b  .*endOfBase = 0;
2290: 0a 09 72 65 73 75 6c 74 20 3d 20 54 6b 54 65 78  ..result = TkTex
22a0: 74 57 69 6e 64 6f 77 49 6e 64 65 78 28 74 65 78  tWindowIndex(tex
22b0: 74 50 74 72 2c 20 73 74 72 69 6e 67 2c 20 69 6e  tPtr, string, in
22c0: 64 65 78 50 74 72 29 3b 0a 09 2a 65 6e 64 4f 66  dexPtr);..*endOf
22d0: 42 61 73 65 20 3d 20 63 3b 0a 09 69 66 20 28 72  Base = c;..if (r
22e0: 65 73 75 6c 74 20 21 3d 20 30 29 20 7b 0a 09 20  esult != 0) {.. 
22f0: 20 20 20 67 6f 74 6f 20 67 6f 74 42 61 73 65 3b     goto gotBase;
2300: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ..}.    }.#endif
2310: 0a 20 20 20 20 69 66 20 28 28 73 74 72 69 6e 67  .    if ((string
2320: 5b 30 5d 20 3d 3d 20 27 65 27 29 0a 09 20 20 20  [0] == 'e')..   
2330: 20 26 26 20 28 73 74 72 6e 63 6d 70 28 73 74 72   && (strncmp(str
2340: 69 6e 67 2c 20 22 65 6e 64 22 2c 20 28 73 69 7a  ing, "end", (siz
2350: 65 5f 74 29 20 28 65 6e 64 4f 66 42 61 73 65 2d  e_t) (endOfBase-
2360: 73 74 72 69 6e 67 29 29 20 3d 3d 20 30 29 29 20  string)) == 0)) 
2370: 7b 0a 09 2f 2a 0a 09 20 2a 20 42 61 73 65 20 70  {../*.. * Base p
2380: 6f 73 69 74 69 6f 6e 20 69 73 20 65 6e 64 20 6f  osition is end o
2390: 66 20 74 65 78 74 2e 0a 09 20 2a 2f 0a 0a 09 54  f text... */...T
23a0: 6b 54 65 78 74 4d 61 6b 65 49 6e 64 65 78 28 74  kTextMakeIndex(t
23b0: 65 78 74 50 74 72 2d 3e 74 72 65 65 2c 20 54 6b  extPtr->tree, Tk
23c0: 42 54 72 65 65 4e 75 6d 4c 69 6e 65 73 28 74 65  BTreeNumLines(te
23d0: 78 74 50 74 72 2d 3e 74 72 65 65 29 2c 0a 09 09  xtPtr->tree),...
23e0: 30 2c 20 69 6e 64 65 78 50 74 72 29 3b 0a 09 67  0, indexPtr);..g
23f0: 6f 74 6f 20 67 6f 74 42 61 73 65 3b 0a 20 20 20  oto gotBase;.   
2400: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20   } else {../*.. 
2410: 2a 20 53 65 65 20 69 66 20 74 68 65 20 62 61 73  * See if the bas
2420: 65 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 74 68  e position is th
2430: 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 72 6b  e name of a mark
2440: 2e 0a 09 20 2a 2f 0a 0a 09 63 20 3d 20 2a 65 6e  ... */...c = *en
2450: 64 4f 66 42 61 73 65 3b 0a 09 2a 65 6e 64 4f 66  dOfBase;..*endOf
2460: 42 61 73 65 20 3d 20 30 3b 0a 09 72 65 73 75 6c  Base = 0;..resul
2470: 74 20 3d 20 54 6b 54 65 78 74 4d 61 72 6b 4e 61  t = TkTextMarkNa
2480: 6d 65 54 6f 49 6e 64 65 78 28 74 65 78 74 50 74  meToIndex(textPt
2490: 72 2c 20 73 74 72 69 6e 67 2c 20 69 6e 64 65 78  r, string, index
24a0: 50 74 72 29 3b 0a 09 2a 65 6e 64 4f 66 42 61 73  Ptr);..*endOfBas
24b0: 65 20 3d 20 63 3b 0a 09 69 66 20 28 72 65 73 75  e = c;..if (resu
24c0: 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  lt == TCL_OK) {.
24d0: 09 20 20 20 20 67 6f 74 6f 20 67 6f 74 42 61 73  .    goto gotBas
24e0: 65 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20  e;..}.    }.    
24f0: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 0a 20 20 20  goto error;..   
2500: 20 2f 2a 0a 20 20 20 20 20 2a 2d 2d 2d 2d 2d 2d   /*.     *------
2510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20  -------------.  
2550: 20 20 20 2a 20 53 74 61 67 65 20 33 3a 20 70 72     * Stage 3: pr
2560: 6f 63 65 73 73 20 7a 65 72 6f 20 6f 72 20 6d 6f  ocess zero or mo
2570: 72 65 20 6d 6f 64 69 66 69 65 72 73 2e 20 20 45  re modifiers.  E
2580: 61 63 68 20 6d 6f 64 69 66 69 65 72 20 69 73 20  ach modifier is 
2590: 65 69 74 68 65 72 0a 20 20 20 20 20 2a 20 61 20  either.     * a 
25a0: 6b 65 79 77 6f 72 64 20 6c 69 6b 65 20 22 77 6f  keyword like "wo
25b0: 72 64 65 6e 64 22 20 6f 72 20 22 6c 69 6e 65 73  rdend" or "lines
25c0: 74 61 72 74 22 2c 20 6f 72 20 69 74 20 68 61 73  tart", or it has
25d0: 20 74 68 65 20 66 6f 72 6d 0a 20 20 20 20 20 2a   the form.     *
25e0: 20 22 6f 70 20 63 6f 75 6e 74 20 75 6e 69 74 73   "op count units
25f0: 22 20 77 68 65 72 65 20 6f 70 20 69 73 20 2b 20  " where op is + 
2600: 6f 72 20 2d 2c 20 63 6f 75 6e 74 20 69 73 20 61  or -, count is a
2610: 20 6e 75 6d 62 65 72 2c 20 61 6e 64 20 75 6e 69   number, and uni
2620: 74 73 0a 20 20 20 20 20 2a 20 69 73 20 22 63 68  ts.     * is "ch
2630: 61 72 73 22 20 6f 72 20 22 6c 69 6e 65 73 22 2e  ars" or "lines".
2640: 0a 20 20 20 20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .     *---------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 20 20 20  ----------.     
2690: 2a 2f 0a 0a 20 20 20 20 67 6f 74 42 61 73 65 3a  */..    gotBase:
26a0: 0a 20 20 20 20 70 20 3d 20 65 6e 64 4f 66 42 61  .    p = endOfBa
26b0: 73 65 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 31  se;.    while (1
26c0: 29 20 7b 0a 09 77 68 69 6c 65 20 28 69 73 73 70  ) {..while (issp
26d0: 61 63 65 28 55 43 48 41 52 28 2a 70 29 29 29 20  ace(UCHAR(*p))) 
26e0: 7b 0a 09 20 20 20 20 70 2b 2b 3b 0a 09 7d 0a 09  {..    p++;..}..
26f0: 69 66 20 28 2a 70 20 3d 3d 20 30 29 20 7b 0a 09  if (*p == 0) {..
2700: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20      break;..}.  
2710: 20 20 0a 09 69 66 20 28 28 2a 70 20 3d 3d 20 27    ..if ((*p == '
2720: 2b 27 29 20 7c 7c 20 28 2a 70 20 3d 3d 20 27 2d  +') || (*p == '-
2730: 27 29 29 20 7b 0a 09 20 20 20 20 70 20 3d 20 46  ')) {..    p = F
2740: 6f 72 77 42 61 63 6b 28 70 2c 20 69 6e 64 65 78  orwBack(p, index
2750: 50 74 72 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  Ptr);..} else {.
2760: 09 20 20 20 20 70 20 3d 20 53 74 61 72 74 45 6e  .    p = StartEn
2770: 64 28 70 2c 20 69 6e 64 65 78 50 74 72 29 3b 0a  d(p, indexPtr);.
2780: 09 7d 0a 09 69 66 20 28 70 20 3d 3d 20 4e 55 4c  .}..if (p == NUL
2790: 4c 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 65  L) {..    goto e
27a0: 72 72 6f 72 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  rror;..}.    }. 
27b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
27c0: 3b 0a 0a 20 20 20 20 65 72 72 6f 72 3a 0a 20 20  ;..    error:.  
27d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
27e0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
27f0: 74 65 78 74 20 69 6e 64 65 78 20 5c 22 22 2c 20  text index \"", 
2800: 73 74 72 69 6e 67 2c 20 22 5c 22 22 2c 0a 09 20  string, "\"",.. 
2810: 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c     (char *) NULL
2820: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2830: 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0c 0a 2f 2a 0a  L_ERROR;.}.../*.
2840: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
2890: 6b 54 65 78 74 50 72 69 6e 74 49 6e 64 65 78 20  kTextPrintIndex 
28a0: 2d 2d 0a 20 2a 0a 20 2a 09 0a 20 2a 09 54 68 69  --. *. *.. *.Thi
28b0: 73 20 70 72 6f 63 65 64 75 72 65 20 67 65 6e 65  s procedure gene
28c0: 72 61 74 65 73 20 61 20 73 74 72 69 6e 67 20 64  rates a string d
28d0: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 6e  escription of an
28e0: 20 69 6e 64 65 78 2c 0a 20 2a 09 73 75 69 74 61   index,. *.suita
28f0: 62 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  ble for reading 
2900: 69 6e 20 61 67 61 69 6e 20 6c 61 74 65 72 2e 0a  in again later..
2910: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
2920: 2a 09 54 68 65 20 63 68 61 72 61 63 74 65 72 73  *.The characters
2930: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 73   pointed to by s
2940: 74 72 69 6e 67 20 61 72 65 20 6d 6f 64 69 66 69  tring are modifi
2950: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ed.. *. * Side e
2960: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
2970: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
29b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
29c0: 0a 0a 76 6f 69 64 0a 54 6b 54 65 78 74 50 72 69  ..void.TkTextPri
29d0: 6e 74 49 6e 64 65 78 28 69 6e 64 65 78 50 74 72  ntIndex(indexPtr
29e0: 2c 20 73 74 72 69 6e 67 29 0a 20 20 20 20 54 6b  , string).    Tk
29f0: 54 65 78 74 49 6e 64 65 78 20 2a 69 6e 64 65 78  TextIndex *index
2a00: 50 74 72 3b 09 2f 2a 20 50 6f 69 6e 74 65 72 20  Ptr;./* Pointer 
2a10: 74 6f 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20  to index. */.   
2a20: 20 63 68 61 72 20 2a 73 74 72 69 6e 67 3b 09 09   char *string;..
2a30: 2f 2a 20 50 6c 61 63 65 20 74 6f 20 73 74 6f 72  /* Place to stor
2a40: 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2e 20  e the position. 
2a50: 20 4d 75 73 74 20 68 61 76 65 0a 09 09 09 09 20   Must have..... 
2a60: 2a 20 61 74 20 6c 65 61 73 74 20 54 4b 5f 50 4f  * at least TK_PO
2a70: 53 5f 43 48 41 52 53 20 63 68 61 72 61 63 74 65  S_CHARS characte
2a80: 72 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 73 70 72  rs. */.{.    spr
2a90: 69 6e 74 66 28 73 74 72 69 6e 67 2c 20 22 25 64  intf(string, "%d
2aa0: 2e 25 64 22 2c 20 54 6b 42 54 72 65 65 4c 69 6e  .%d", TkBTreeLin
2ab0: 65 49 6e 64 65 78 28 69 6e 64 65 78 50 74 72 2d  eIndex(indexPtr-
2ac0: 3e 6c 69 6e 65 50 74 72 29 20 2b 20 31 2c 0a 09  >linePtr) + 1,..
2ad0: 20 20 20 20 69 6e 64 65 78 50 74 72 2d 3e 63 68      indexPtr->ch
2ae0: 61 72 49 6e 64 65 78 29 3b 0a 7d 0a 0c 0a 2f 2a  arIndex);.}.../*
2af0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b30: 2d 0a 20 2a 0a 20 2a 20 54 6b 54 65 78 74 49 6e  -. *. * TkTextIn
2b40: 64 65 78 43 6d 70 20 2d 2d 0a 20 2a 0a 20 2a 09  dexCmp --. *. *.
2b50: 43 6f 6d 70 61 72 65 20 74 77 6f 20 69 6e 64 69  Compare two indi
2b60: 63 65 73 20 74 6f 20 73 65 65 20 77 68 69 63 68  ces to see which
2b70: 20 6f 6e 65 20 69 73 20 65 61 72 6c 69 65 72 20   one is earlier 
2b80: 69 6e 0a 20 2a 09 74 68 65 20 74 65 78 74 2e 0a  in. *.the text..
2b90: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
2ba0: 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  *.The return val
2bb0: 75 65 20 69 73 20 30 20 69 66 20 69 6e 64 65 78  ue is 0 if index
2bc0: 31 50 74 72 20 61 6e 64 20 69 6e 64 65 78 32 50  1Ptr and index2P
2bd0: 74 72 20 72 65 66 65 72 0a 20 2a 09 74 6f 20 74  tr refer. *.to t
2be0: 68 65 20 73 61 6d 65 20 70 6f 73 69 74 69 6f 6e  he same position
2bf0: 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 2d 31   in the file, -1
2c00: 20 69 66 20 69 6e 64 65 78 31 50 74 72 20 72 65   if index1Ptr re
2c10: 66 65 72 73 0a 20 2a 09 74 6f 20 61 6e 20 65 61  fers. *.to an ea
2c20: 72 6c 69 65 72 20 70 6f 73 69 74 69 6f 6e 20 74  rlier position t
2c30: 68 61 6e 20 69 6e 64 65 78 32 50 74 72 2c 20 61  han index2Ptr, a
2c40: 6e 64 20 31 20 6f 74 68 65 72 77 69 73 65 2e 0a  nd 1 otherwise..
2c50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2c60: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
2c70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 6b 54 65 78 74  . */..int.TkText
2cc0: 49 6e 64 65 78 43 6d 70 28 69 6e 64 65 78 31 50  IndexCmp(index1P
2cd0: 74 72 2c 20 69 6e 64 65 78 32 50 74 72 29 0a 20  tr, index2Ptr). 
2ce0: 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20 2a     TkTextIndex *
2cf0: 69 6e 64 65 78 31 50 74 72 3b 09 09 2f 2a 20 46  index1Ptr;../* F
2d00: 69 72 73 74 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  irst index. */. 
2d10: 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20 2a     TkTextIndex *
2d20: 69 6e 64 65 78 32 50 74 72 3b 09 09 2f 2a 20 53  index2Ptr;../* S
2d30: 65 63 6f 6e 64 20 69 6e 64 65 78 2e 20 2a 2f 0a  econd index. */.
2d40: 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 31 2c  {.    int line1,
2d50: 20 6c 69 6e 65 32 3b 0a 0a 20 20 20 20 69 66 20   line2;..    if 
2d60: 28 69 6e 64 65 78 31 50 74 72 2d 3e 6c 69 6e 65  (index1Ptr->line
2d70: 50 74 72 20 3d 3d 20 69 6e 64 65 78 32 50 74 72  Ptr == index2Ptr
2d80: 2d 3e 6c 69 6e 65 50 74 72 29 20 7b 0a 09 69 66  ->linePtr) {..if
2d90: 20 28 69 6e 64 65 78 31 50 74 72 2d 3e 63 68 61   (index1Ptr->cha
2da0: 72 49 6e 64 65 78 20 3c 20 69 6e 64 65 78 32 50  rIndex < index2P
2db0: 74 72 2d 3e 63 68 61 72 49 6e 64 65 78 29 20 7b  tr->charIndex) {
2dc0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
2dd0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 69 6e 64  ..} else if (ind
2de0: 65 78 31 50 74 72 2d 3e 63 68 61 72 49 6e 64 65  ex1Ptr->charInde
2df0: 78 20 3e 20 69 6e 64 65 78 32 50 74 72 2d 3e 63  x > index2Ptr->c
2e00: 68 61 72 49 6e 64 65 78 29 20 7b 0a 09 20 20 20  harIndex) {..   
2e10: 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 20 65 6c   return 1;..} el
2e20: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  se {..    return
2e30: 20 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20   0;..}.    }.   
2e40: 20 6c 69 6e 65 31 20 3d 20 54 6b 42 54 72 65 65   line1 = TkBTree
2e50: 4c 69 6e 65 49 6e 64 65 78 28 69 6e 64 65 78 31  LineIndex(index1
2e60: 50 74 72 2d 3e 6c 69 6e 65 50 74 72 29 3b 0a 20  Ptr->linePtr);. 
2e70: 20 20 20 6c 69 6e 65 32 20 3d 20 54 6b 42 54 72     line2 = TkBTr
2e80: 65 65 4c 69 6e 65 49 6e 64 65 78 28 69 6e 64 65  eeLineIndex(inde
2e90: 78 32 50 74 72 2d 3e 6c 69 6e 65 50 74 72 29 3b  x2Ptr->linePtr);
2ea0: 0a 20 20 20 20 69 66 20 28 6c 69 6e 65 31 20 3c  .    if (line1 <
2eb0: 20 6c 69 6e 65 32 29 20 7b 0a 09 72 65 74 75 72   line2) {..retur
2ec0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
2ed0: 69 66 20 28 6c 69 6e 65 31 20 3e 20 6c 69 6e 65  if (line1 > line
2ee0: 32 29 20 7b 0a 09 72 65 74 75 72 6e 20 31 3b 0a  2) {..return 1;.
2ef0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2f00: 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d   0;.}.../*. *---
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 46 6f 72 77 42 61  ---. *. * ForwBa
2f60: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ck --. *. *.This
2f70: 20 70 72 6f 63 65 64 75 72 65 20 68 61 6e 64 6c   procedure handl
2f80: 65 73 20 2b 2f 2d 20 6d 6f 64 69 66 69 65 72 73  es +/- modifiers
2f90: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 74 6f 20   for indices to 
2fa0: 61 64 6a 75 73 74 0a 20 2a 09 74 68 65 20 69 6e  adjust. *.the in
2fb0: 64 65 78 20 66 6f 72 77 61 72 64 73 20 6f 72 20  dex forwards or 
2fc0: 62 61 63 6b 77 61 72 64 73 2e 0a 20 2a 0a 20 2a  backwards.. *. *
2fd0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 49 66 20   Results:. *.If 
2fe0: 74 68 65 20 6d 6f 64 69 66 69 65 72 20 69 6e 20  the modifier in 
2ff0: 73 74 72 69 6e 67 20 69 73 20 73 75 63 63 65 73  string is succes
3000: 73 66 75 6c 6c 79 20 70 61 72 73 65 64 20 74 68  sfully parsed th
3010: 65 6e 20 74 68 65 0a 20 2a 09 72 65 74 75 72 6e  en the. *.return
3020: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 61 64   value is the ad
3030: 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72  dress of the fir
3040: 73 74 20 63 68 61 72 61 63 74 65 72 20 61 66 74  st character aft
3050: 65 72 20 74 68 65 0a 20 2a 09 6d 6f 64 69 66 69  er the. *.modifi
3060: 65 72 2c 20 61 6e 64 20 2a 69 6e 64 65 78 50 74  er, and *indexPt
3070: 72 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  r is updated to 
3080: 72 65 66 6c 65 63 74 20 74 68 65 20 6d 6f 64 69  reflect the modi
3090: 66 69 65 72 2e 0a 20 2a 09 49 66 20 74 68 65 72  fier.. *.If ther
30a0: 65 20 69 73 20 61 20 73 79 6e 74 61 78 20 65 72  e is a syntax er
30b0: 72 6f 72 20 69 6e 20 74 68 65 20 6d 6f 64 69 66  ror in the modif
30c0: 69 65 72 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73  ier then NULL is
30d0: 20 72 65 74 75 72 6e 65 64 2e 0a 20 2a 0a 20 2a   returned.. *. *
30e0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
30f0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3140: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
3150: 63 68 61 72 20 2a 0a 46 6f 72 77 42 61 63 6b 28  char *.ForwBack(
3160: 73 74 72 69 6e 67 2c 20 69 6e 64 65 78 50 74 72  string, indexPtr
3170: 29 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 69  ).    char *stri
3180: 6e 67 3b 09 09 2f 2a 20 53 74 72 69 6e 67 20 74  ng;../* String t
3190: 6f 20 70 61 72 73 65 20 66 6f 72 20 61 64 64 69  o parse for addi
31a0: 74 69 6f 6e 61 6c 20 69 6e 66 6f 0a 09 09 09 09  tional info.....
31b0: 20 2a 20 61 62 6f 75 74 20 6d 6f 64 69 66 69 65   * about modifie
31c0: 72 20 28 63 6f 75 6e 74 20 61 6e 64 20 75 6e 69  r (count and uni
31d0: 74 73 29 2e 20 0a 09 09 09 09 20 2a 20 50 6f 69  ts). ..... * Poi
31e0: 6e 74 73 20 74 6f 20 22 2b 22 20 6f 72 20 22 2d  nts to "+" or "-
31f0: 22 20 74 68 61 74 20 73 74 61 72 74 73 0a 09 09  " that starts...
3200: 09 09 20 2a 20 6d 6f 64 69 66 69 65 72 2e 20 2a  .. * modifier. *
3210: 2f 0a 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65  /.    TkTextInde
3220: 78 20 2a 69 6e 64 65 78 50 74 72 3b 09 2f 2a 20  x *indexPtr;./* 
3230: 49 6e 64 65 78 20 74 6f 20 75 70 64 61 74 65 20  Index to update 
3240: 61 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  as specified in 
3250: 73 74 72 69 6e 67 2e 20 2a 2f 0a 7b 0a 20 20 20  string. */.{.   
3260: 20 72 65 67 69 73 74 65 72 20 63 68 61 72 20 2a   register char *
3270: 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 64  p;.    char *end
3280: 2c 20 2a 75 6e 69 74 73 3b 0a 20 20 20 20 69 6e  , *units;.    in
3290: 74 20 63 6f 75 6e 74 2c 20 6c 69 6e 65 49 6e 64  t count, lineInd
32a0: 65 78 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c  ex;.    size_t l
32b0: 65 6e 67 74 68 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ength;..    /*. 
32c0: 20 20 20 20 2a 20 47 65 74 20 74 68 65 20 63 6f      * Get the co
32d0: 75 6e 74 20 28 68 6f 77 20 6d 61 6e 79 20 75 6e  unt (how many un
32e0: 69 74 73 20 66 6f 72 77 61 72 64 20 6f 72 20 62  its forward or b
32f0: 61 63 6b 77 61 72 64 29 2e 0a 20 20 20 20 20 2a  ackward)..     *
3300: 2f 0a 0a 20 20 20 20 70 20 3d 20 73 74 72 69 6e  /..    p = strin
3310: 67 2b 31 3b 0a 20 20 20 20 77 68 69 6c 65 20 28  g+1;.    while (
3320: 69 73 73 70 61 63 65 28 55 43 48 41 52 28 2a 70  isspace(UCHAR(*p
3330: 29 29 29 20 7b 0a 09 70 2b 2b 3b 0a 20 20 20 20  ))) {..p++;.    
3340: 7d 0a 20 20 20 20 63 6f 75 6e 74 20 3d 20 73 74  }.    count = st
3350: 72 74 6f 6c 28 70 2c 20 26 65 6e 64 2c 20 30 29  rtol(p, &end, 0)
3360: 3b 0a 20 20 20 20 69 66 20 28 65 6e 64 20 3d 3d  ;.    if (end ==
3370: 20 70 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55   p) {..return NU
3380: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20  LL;.    }.    p 
3390: 3d 20 65 6e 64 3b 0a 20 20 20 20 77 68 69 6c 65  = end;.    while
33a0: 20 28 69 73 73 70 61 63 65 28 55 43 48 41 52 28   (isspace(UCHAR(
33b0: 2a 70 29 29 29 20 7b 0a 09 70 2b 2b 3b 0a 20 20  *p))) {..p++;.  
33c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
33d0: 20 2a 20 46 69 6e 64 20 74 68 65 20 65 6e 64 20   * Find the end 
33e0: 6f 66 20 74 68 69 73 20 6d 6f 64 69 66 69 65 72  of this modifier
33f0: 20 28 6e 65 78 74 20 73 70 61 63 65 20 6f 72 20   (next space or 
3400: 2b 20 6f 72 20 2d 20 63 68 61 72 61 63 74 65 72  + or - character
3410: 29 2c 0a 20 20 20 20 20 2a 20 74 68 65 6e 20 70  ),.     * then p
3420: 61 72 73 65 20 74 68 65 20 75 6e 69 74 20 73 70  arse the unit sp
3430: 65 63 69 66 69 65 72 20 61 6e 64 20 75 70 64 61  ecifier and upda
3440: 74 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a  te the position.
3450: 20 20 20 20 20 2a 20 61 63 63 6f 72 64 69 6e 67       * according
3460: 6c 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ly..     */..   
3470: 20 75 6e 69 74 73 20 3d 20 70 3b 20 0a 20 20 20   units = p; .   
3480: 20 77 68 69 6c 65 20 28 28 2a 70 20 21 3d 20 30   while ((*p != 0
3490: 29 20 26 26 20 21 69 73 73 70 61 63 65 28 55 43  ) && !isspace(UC
34a0: 48 41 52 28 2a 70 29 29 20 26 26 20 28 2a 70 20  HAR(*p)) && (*p 
34b0: 21 3d 20 27 2b 27 29 20 26 26 20 28 2a 70 20 21  != '+') && (*p !
34c0: 3d 20 27 2d 27 29 29 20 7b 0a 09 70 2b 2b 3b 0a  = '-')) {..p++;.
34d0: 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 67 74 68      }.    length
34e0: 20 3d 20 70 20 2d 20 75 6e 69 74 73 3b 0a 20 20   = p - units;.  
34f0: 20 20 69 66 20 28 28 2a 75 6e 69 74 73 20 3d 3d    if ((*units ==
3500: 20 27 63 27 29 20 26 26 20 28 73 74 72 6e 63 6d   'c') && (strncm
3510: 70 28 75 6e 69 74 73 2c 20 22 63 68 61 72 73 22  p(units, "chars"
3520: 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29 29  , length) == 0))
3530: 20 7b 0a 09 69 66 20 28 2a 73 74 72 69 6e 67 20   {..if (*string 
3540: 3d 3d 20 27 2b 27 29 20 7b 0a 09 20 20 20 20 54  == '+') {..    T
3550: 6b 54 65 78 74 49 6e 64 65 78 46 6f 72 77 43 68  kTextIndexForwCh
3560: 61 72 73 28 69 6e 64 65 78 50 74 72 2c 20 63 6f  ars(indexPtr, co
3570: 75 6e 74 2c 20 69 6e 64 65 78 50 74 72 29 3b 0a  unt, indexPtr);.
3580: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54  .} else {..    T
3590: 6b 54 65 78 74 49 6e 64 65 78 42 61 63 6b 43 68  kTextIndexBackCh
35a0: 61 72 73 28 69 6e 64 65 78 50 74 72 2c 20 63 6f  ars(indexPtr, co
35b0: 75 6e 74 2c 20 69 6e 64 65 78 50 74 72 29 3b 0a  unt, indexPtr);.
35c0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .}.    } else if
35d0: 20 28 28 2a 75 6e 69 74 73 20 3d 3d 20 27 6c 27   ((*units == 'l'
35e0: 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28 75 6e  ) && (strncmp(un
35f0: 69 74 73 2c 20 22 6c 69 6e 65 73 22 2c 20 6c 65  its, "lines", le
3600: 6e 67 74 68 29 20 3d 3d 20 30 29 29 20 7b 0a 09  ngth) == 0)) {..
3610: 6c 69 6e 65 49 6e 64 65 78 20 3d 20 54 6b 42 54  lineIndex = TkBT
3620: 72 65 65 4c 69 6e 65 49 6e 64 65 78 28 69 6e 64  reeLineIndex(ind
3630: 65 78 50 74 72 2d 3e 6c 69 6e 65 50 74 72 29 3b  exPtr->linePtr);
3640: 0a 09 69 66 20 28 2a 73 74 72 69 6e 67 20 3d 3d  ..if (*string ==
3650: 20 27 2b 27 29 20 7b 0a 09 20 20 20 20 6c 69 6e   '+') {..    lin
3660: 65 49 6e 64 65 78 20 2b 3d 20 63 6f 75 6e 74 3b  eIndex += count;
3670: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
3680: 6c 69 6e 65 49 6e 64 65 78 20 2d 3d 20 63 6f 75  lineIndex -= cou
3690: 6e 74 3b 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20  nt;...    /*..  
36a0: 20 20 20 2a 20 54 68 65 20 63 68 65 63 6b 20 62     * The check b
36b0: 65 6c 6f 77 20 72 65 74 61 69 6e 73 20 74 68 65  elow retains the
36c0: 20 63 68 61 72 61 63 74 65 72 20 70 6f 73 69 74   character posit
36d0: 69 6f 6e 2c 20 65 76 65 6e 0a 09 20 20 20 20 20  ion, even..     
36e0: 2a 20 69 66 20 74 68 65 20 6c 69 6e 65 20 72 75  * if the line ru
36f0: 6e 73 20 6f 66 66 20 74 68 65 20 73 74 61 72 74  ns off the start
3700: 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 20 20 57   of the file.  W
3710: 69 74 68 6f 75 74 0a 09 20 20 20 20 20 2a 20 69  ithout..     * i
3720: 74 2c 20 74 68 65 20 63 68 61 72 61 63 74 65 72  t, the character
3730: 20 70 6f 73 69 74 69 6f 6e 20 77 69 6c 6c 20 67   position will g
3740: 65 74 20 72 65 73 65 74 20 74 6f 20 30 20 62 79  et reset to 0 by
3750: 0a 09 20 20 20 20 20 2a 20 54 6b 54 65 78 74 4d  ..     * TkTextM
3760: 61 6b 65 49 6e 64 65 78 2e 0a 09 20 20 20 20 20  akeIndex...     
3770: 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 6c 69 6e  */...    if (lin
3780: 65 49 6e 64 65 78 20 3c 20 30 29 20 7b 0a 09 09  eIndex < 0) {...
3790: 6c 69 6e 65 49 6e 64 65 78 20 3d 20 30 3b 0a 09  lineIndex = 0;..
37a0: 20 20 20 20 7d 0a 09 7d 0a 09 54 6b 54 65 78 74      }..}..TkText
37b0: 4d 61 6b 65 49 6e 64 65 78 28 69 6e 64 65 78 50  MakeIndex(indexP
37c0: 74 72 2d 3e 74 72 65 65 2c 20 6c 69 6e 65 49 6e  tr->tree, lineIn
37d0: 64 65 78 2c 20 69 6e 64 65 78 50 74 72 2d 3e 63  dex, indexPtr->c
37e0: 68 61 72 49 6e 64 65 78 2c 0a 09 09 69 6e 64 65  harIndex,...inde
37f0: 78 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73  xPtr);.    } els
3800: 65 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  e {..return NULL
3810: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
3820: 72 6e 20 70 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  rn p;.}.../*. *-
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3870: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6b 54 65  -----. *. * TkTe
3880: 78 74 49 6e 64 65 78 46 6f 72 77 43 68 61 72 73  xtIndexForwChars
3890: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 69 76 65 6e 20   --. *. *.Given 
38a0: 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 61 20 74  an index for a t
38b0: 65 78 74 20 77 69 64 67 65 74 2c 20 74 68 69 73  ext widget, this
38c0: 20 70 72 6f 63 65 64 75 72 65 20 63 72 65 61 74   procedure creat
38d0: 65 73 20 61 0a 20 2a 09 6e 65 77 20 69 6e 64 65  es a. *.new inde
38e0: 78 20 74 68 61 74 20 70 6f 69 6e 74 73 20 22 63  x that points "c
38f0: 6f 75 6e 74 22 20 63 68 61 72 61 63 74 65 72 73  ount" characters
3900: 20 61 68 65 61 64 20 6f 66 20 74 68 65 20 73 6f   ahead of the so
3910: 75 72 63 65 0a 20 2a 09 69 6e 64 65 78 2e 0a 20  urce. *.index.. 
3920: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
3930: 09 2a 64 73 74 50 74 72 20 69 73 20 6d 6f 64 69  .*dstPtr is modi
3940: 66 69 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f  fied to refer to
3950: 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 22   the character "
3960: 63 6f 75 6e 74 22 20 63 68 61 72 61 63 74 65 72  count" character
3970: 73 0a 20 2a 09 61 66 74 65 72 20 73 72 63 50 74  s. *.after srcPt
3980: 72 2c 20 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  r, or to the las
3990: 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 74  t character in t
39a0: 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 72 65  he file if there
39b0: 20 61 72 65 6e 27 74 0a 20 2a 09 22 63 6f 75 6e   aren't. *."coun
39c0: 74 22 20 63 68 61 72 61 63 74 65 72 73 20 6c 65  t" characters le
39d0: 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a  ft in the file..
39e0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
39f0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
3a00: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 09 2f  --------. */.../
3a50: 2a 20 41 52 47 53 55 53 45 44 20 2a 2f 0a 76 6f  * ARGSUSED */.vo
3a60: 69 64 0a 54 6b 54 65 78 74 49 6e 64 65 78 46 6f  id.TkTextIndexFo
3a70: 72 77 43 68 61 72 73 28 73 72 63 50 74 72 2c 20  rwChars(srcPtr, 
3a80: 63 6f 75 6e 74 2c 20 64 73 74 50 74 72 29 0a 20  count, dstPtr). 
3a90: 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20 2a     TkTextIndex *
3aa0: 73 72 63 50 74 72 3b 09 09 2f 2a 20 53 6f 75 72  srcPtr;../* Sour
3ab0: 63 65 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20  ce index. */.   
3ac0: 20 69 6e 74 20 63 6f 75 6e 74 3b 09 09 09 09 2f   int count;..../
3ad0: 2a 20 48 6f 77 20 6d 61 6e 79 20 63 68 61 72 61  * How many chara
3ae0: 63 74 65 72 73 20 66 6f 72 77 61 72 64 20 74 6f  cters forward to
3af0: 0a 09 09 09 09 09 20 2a 20 6d 6f 76 65 2e 20 20  ...... * move.  
3b00: 4d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e  May be negative.
3b10: 20 2a 2f 0a 20 20 20 20 54 6b 54 65 78 74 49 6e   */.    TkTextIn
3b20: 64 65 78 20 2a 64 73 74 50 74 72 3b 09 09 2f 2a  dex *dstPtr;../*
3b30: 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 69 6e 64   Destination ind
3b40: 65 78 3a 20 67 65 74 73 20 6d 6f 64 69 66 69 65  ex: gets modifie
3b50: 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 6b 54 65  d. */.{.    TkTe
3b60: 78 74 4c 69 6e 65 20 2a 6c 69 6e 65 50 74 72 3b  xtLine *linePtr;
3b70: 0a 20 20 20 20 54 6b 54 65 78 74 53 65 67 6d 65  .    TkTextSegme
3b80: 6e 74 20 2a 73 65 67 50 74 72 3b 0a 20 20 20 20  nt *segPtr;.    
3b90: 69 6e 74 20 6c 69 6e 65 4c 65 6e 67 74 68 3b 0a  int lineLength;.
3ba0: 0a 20 20 20 20 69 66 20 28 63 6f 75 6e 74 20 3c  .    if (count <
3bb0: 20 30 29 20 7b 0a 09 54 6b 54 65 78 74 49 6e 64   0) {..TkTextInd
3bc0: 65 78 42 61 63 6b 43 68 61 72 73 28 73 72 63 50  exBackChars(srcP
3bd0: 74 72 2c 20 2d 63 6f 75 6e 74 2c 20 64 73 74 50  tr, -count, dstP
3be0: 74 72 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  tr);..return;.  
3bf0: 20 20 7d 0a 0a 20 20 20 20 2a 64 73 74 50 74 72    }..    *dstPtr
3c00: 20 3d 20 2a 73 72 63 50 74 72 3b 0a 20 20 20 20   = *srcPtr;.    
3c10: 64 73 74 50 74 72 2d 3e 63 68 61 72 49 6e 64 65  dstPtr->charInde
3c20: 78 20 2b 3d 20 63 6f 75 6e 74 3b 0a 20 20 20 20  x += count;.    
3c30: 77 68 69 6c 65 20 28 31 29 20 7b 0a 09 2f 2a 0a  while (1) {../*.
3c40: 09 20 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  . * Compute the 
3c50: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 63 75  length of the cu
3c60: 72 72 65 6e 74 20 6c 69 6e 65 2e 0a 09 20 2a 2f  rrent line... */
3c70: 0a 0a 09 6c 69 6e 65 4c 65 6e 67 74 68 20 3d 20  ...lineLength = 
3c80: 30 3b 0a 09 66 6f 72 20 28 73 65 67 50 74 72 20  0;..for (segPtr 
3c90: 3d 20 64 73 74 50 74 72 2d 3e 6c 69 6e 65 50 74  = dstPtr->linePt
3ca0: 72 2d 3e 73 65 67 50 74 72 3b 20 73 65 67 50 74  r->segPtr; segPt
3cb0: 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 73 65 67  r != NULL;...seg
3cc0: 50 74 72 20 3d 20 73 65 67 50 74 72 2d 3e 6e 65  Ptr = segPtr->ne
3cd0: 78 74 50 74 72 29 20 7b 0a 09 20 20 20 20 6c 69  xtPtr) {..    li
3ce0: 6e 65 4c 65 6e 67 74 68 20 2b 3d 20 73 65 67 50  neLength += segP
3cf0: 74 72 2d 3e 73 69 7a 65 3b 0a 09 7d 0a 0a 09 2f  tr->size;..}.../
3d00: 2a 0a 09 20 2a 20 49 66 20 74 68 65 20 6e 65 77  *.. * If the new
3d10: 20 69 6e 64 65 78 20 69 73 20 69 6e 20 74 68 65   index is in the
3d20: 20 73 61 6d 65 20 6c 69 6e 65 20 74 68 65 6e 20   same line then 
3d30: 77 65 27 72 65 20 64 6f 6e 65 2e 0a 09 20 2a 20  we're done... * 
3d40: 4f 74 68 65 72 77 69 73 65 20 67 6f 20 6f 6e 20  Otherwise go on 
3d50: 74 6f 20 74 68 65 20 6e 65 78 74 20 6c 69 6e 65  to the next line
3d60: 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 64 73 74  ... */...if (dst
3d70: 50 74 72 2d 3e 63 68 61 72 49 6e 64 65 78 20 3c  Ptr->charIndex <
3d80: 20 6c 69 6e 65 4c 65 6e 67 74 68 29 20 7b 0a 09   lineLength) {..
3d90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 7d 0a 09      return;..}..
3da0: 64 73 74 50 74 72 2d 3e 63 68 61 72 49 6e 64 65  dstPtr->charInde
3db0: 78 20 2d 3d 20 6c 69 6e 65 4c 65 6e 67 74 68 3b  x -= lineLength;
3dc0: 0a 09 6c 69 6e 65 50 74 72 20 3d 20 54 6b 42 54  ..linePtr = TkBT
3dd0: 72 65 65 4e 65 78 74 4c 69 6e 65 28 64 73 74 50  reeNextLine(dstP
3de0: 74 72 2d 3e 6c 69 6e 65 50 74 72 29 3b 0a 09 69  tr->linePtr);..i
3df0: 66 20 28 6c 69 6e 65 50 74 72 20 3d 3d 20 4e 55  f (linePtr == NU
3e00: 4c 4c 29 20 7b 0a 09 20 20 20 20 64 73 74 50 74  LL) {..    dstPt
3e10: 72 2d 3e 63 68 61 72 49 6e 64 65 78 20 3d 20 6c  r->charIndex = l
3e20: 69 6e 65 4c 65 6e 67 74 68 20 2d 20 31 3b 0a 09  ineLength - 1;..
3e30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 09 7d 0a 09      return;..}..
3e40: 64 73 74 50 74 72 2d 3e 6c 69 6e 65 50 74 72 20  dstPtr->linePtr 
3e50: 3d 20 6c 69 6e 65 50 74 72 3b 0a 20 20 20 20 7d  = linePtr;.    }
3e60: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3eb0: 0a 20 2a 0a 20 2a 20 54 6b 54 65 78 74 49 6e 64  . *. * TkTextInd
3ec0: 65 78 42 61 63 6b 43 68 61 72 73 20 2d 2d 0a 20  exBackChars --. 
3ed0: 2a 0a 20 2a 09 47 69 76 65 6e 20 61 6e 20 69 6e  *. *.Given an in
3ee0: 64 65 78 20 66 6f 72 20 61 20 74 65 78 74 20 77  dex for a text w
3ef0: 69 64 67 65 74 2c 20 74 68 69 73 20 70 72 6f 63  idget, this proc
3f00: 65 64 75 72 65 20 63 72 65 61 74 65 73 20 61 0a  edure creates a.
3f10: 20 2a 09 6e 65 77 20 69 6e 64 65 78 20 74 68 61   *.new index tha
3f20: 74 20 70 6f 69 6e 74 73 20 22 63 6f 75 6e 74 22  t points "count"
3f30: 20 63 68 61 72 61 63 74 65 72 73 20 65 61 72 6c   characters earl
3f40: 69 65 72 20 74 68 61 6e 20 74 68 65 0a 20 2a 09  ier than the. *.
3f50: 73 6f 75 72 63 65 20 69 6e 64 65 78 2e 0a 20 2a  source index.. *
3f60: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
3f70: 2a 64 73 74 50 74 72 20 69 73 20 6d 6f 64 69 66  *dstPtr is modif
3f80: 69 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20  ied to refer to 
3f90: 74 68 65 20 63 68 61 72 61 63 74 65 72 20 22 63  the character "c
3fa0: 6f 75 6e 74 22 20 63 68 61 72 61 63 74 65 72 73  ount" characters
3fb0: 0a 20 2a 09 62 65 66 6f 72 65 20 73 72 63 50 74  . *.before srcPt
3fc0: 72 2c 20 6f 72 20 74 6f 20 74 68 65 20 66 69 72  r, or to the fir
3fd0: 73 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  st character in 
3fe0: 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 72  the file if ther
3ff0: 65 20 61 72 65 6e 27 74 0a 20 2a 09 22 63 6f 75  e aren't. *."cou
4000: 6e 74 22 20 63 68 61 72 61 63 74 65 72 73 20 65  nt" characters e
4010: 61 72 6c 69 65 72 20 74 68 61 6e 20 73 72 63 50  arlier than srcP
4020: 74 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  tr.. *. * Side e
4030: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
4040: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
4090: 0a 0a 76 6f 69 64 0a 54 6b 54 65 78 74 49 6e 64  ..void.TkTextInd
40a0: 65 78 42 61 63 6b 43 68 61 72 73 28 73 72 63 50  exBackChars(srcP
40b0: 74 72 2c 20 63 6f 75 6e 74 2c 20 64 73 74 50 74  tr, count, dstPt
40c0: 72 29 0a 20 20 20 20 54 6b 54 65 78 74 49 6e 64  r).    TkTextInd
40d0: 65 78 20 2a 73 72 63 50 74 72 3b 09 09 2f 2a 20  ex *srcPtr;../* 
40e0: 53 6f 75 72 63 65 20 69 6e 64 65 78 2e 20 2a 2f  Source index. */
40f0: 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 3b 09  .    int count;.
4100: 09 09 09 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 63  .../* How many c
4110: 68 61 72 61 63 74 65 72 73 20 62 61 63 6b 77 61  haracters backwa
4120: 72 64 20 74 6f 0a 09 09 09 09 09 20 2a 20 6d 6f  rd to...... * mo
4130: 76 65 2e 20 20 4d 61 79 20 62 65 20 6e 65 67 61  ve.  May be nega
4140: 74 69 76 65 2e 20 2a 2f 0a 20 20 20 20 54 6b 54  tive. */.    TkT
4150: 65 78 74 49 6e 64 65 78 20 2a 64 73 74 50 74 72  extIndex *dstPtr
4160: 3b 09 09 2f 2a 20 44 65 73 74 69 6e 61 74 69 6f  ;../* Destinatio
4170: 6e 20 69 6e 64 65 78 3a 20 67 65 74 73 20 6d 6f  n index: gets mo
4180: 64 69 66 69 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20  dified. */.{.   
4190: 20 54 6b 54 65 78 74 53 65 67 6d 65 6e 74 20 2a   TkTextSegment *
41a0: 73 65 67 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  segPtr;.    int 
41b0: 6c 69 6e 65 49 6e 64 65 78 3b 0a 0a 20 20 20 20  lineIndex;..    
41c0: 69 66 20 28 63 6f 75 6e 74 20 3c 20 30 29 20 7b  if (count < 0) {
41d0: 0a 09 54 6b 54 65 78 74 49 6e 64 65 78 46 6f 72  ..TkTextIndexFor
41e0: 77 43 68 61 72 73 28 73 72 63 50 74 72 2c 20 2d  wChars(srcPtr, -
41f0: 63 6f 75 6e 74 2c 20 64 73 74 50 74 72 29 3b 0a  count, dstPtr);.
4200: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a  .return;.    }..
4210: 20 20 20 20 2a 64 73 74 50 74 72 20 3d 20 2a 73      *dstPtr = *s
4220: 72 63 50 74 72 3b 0a 20 20 20 20 64 73 74 50 74  rcPtr;.    dstPt
4230: 72 2d 3e 63 68 61 72 49 6e 64 65 78 20 2d 3d 20  r->charIndex -= 
4240: 63 6f 75 6e 74 3b 0a 20 20 20 20 6c 69 6e 65 49  count;.    lineI
4250: 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20 20 20 77  ndex = -1;.    w
4260: 68 69 6c 65 20 28 64 73 74 50 74 72 2d 3e 63 68  hile (dstPtr->ch
4270: 61 72 49 6e 64 65 78 20 3c 20 30 29 20 7b 0a 09  arIndex < 0) {..
4280: 2f 2a 0a 09 20 2a 20 4d 6f 76 65 20 62 61 63 6b  /*.. * Move back
4290: 20 6f 6e 65 20 6c 69 6e 65 20 69 6e 20 74 68 65   one line in the
42a0: 20 74 65 78 74 2e 20 20 49 66 20 77 65 20 72 75   text.  If we ru
42b0: 6e 20 6f 66 66 20 74 68 65 20 62 65 67 69 6e 6e  n off the beginn
42c0: 69 6e 67 0a 09 20 2a 20 6f 66 20 74 68 65 20 66  ing.. * of the f
42d0: 69 6c 65 20 74 68 65 6e 20 6a 75 73 74 20 72 65  ile then just re
42e0: 74 75 72 6e 20 74 68 65 20 66 69 72 73 74 20 63  turn the first c
42f0: 68 61 72 61 63 74 65 72 20 69 6e 20 74 68 65 20  haracter in the 
4300: 74 65 78 74 2e 0a 09 20 2a 2f 0a 0a 09 69 66 20  text... */...if 
4310: 28 6c 69 6e 65 49 6e 64 65 78 20 3c 20 30 29 20  (lineIndex < 0) 
4320: 7b 0a 09 20 20 20 20 6c 69 6e 65 49 6e 64 65 78  {..    lineIndex
4330: 20 3d 20 54 6b 42 54 72 65 65 4c 69 6e 65 49 6e   = TkBTreeLineIn
4340: 64 65 78 28 64 73 74 50 74 72 2d 3e 6c 69 6e 65  dex(dstPtr->line
4350: 50 74 72 29 3b 0a 09 7d 0a 09 69 66 20 28 6c 69  Ptr);..}..if (li
4360: 6e 65 49 6e 64 65 78 20 3d 3d 20 30 29 20 7b 0a  neIndex == 0) {.
4370: 09 20 20 20 20 64 73 74 50 74 72 2d 3e 63 68 61  .    dstPtr->cha
4380: 72 49 6e 64 65 78 20 3d 20 30 3b 0a 09 20 20 20  rIndex = 0;..   
4390: 20 72 65 74 75 72 6e 3b 0a 09 7d 0a 09 6c 69 6e   return;..}..lin
43a0: 65 49 6e 64 65 78 2d 2d 3b 0a 09 64 73 74 50 74  eIndex--;..dstPt
43b0: 72 2d 3e 6c 69 6e 65 50 74 72 20 3d 20 54 6b 42  r->linePtr = TkB
43c0: 54 72 65 65 46 69 6e 64 4c 69 6e 65 28 64 73 74  TreeFindLine(dst
43d0: 50 74 72 2d 3e 74 72 65 65 2c 20 6c 69 6e 65 49  Ptr->tree, lineI
43e0: 6e 64 65 78 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20  ndex);.../*.. * 
43f0: 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 65 6e 67  Compute the leng
4400: 74 68 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 61  th of the line a
4410: 6e 64 20 61 64 64 20 74 68 61 74 20 74 6f 20 64  nd add that to d
4420: 73 74 50 74 72 2d 3e 63 68 61 72 49 6e 64 65 78  stPtr->charIndex
4430: 2e 0a 09 20 2a 2f 0a 0a 09 66 6f 72 20 28 73 65  ... */...for (se
4440: 67 50 74 72 20 3d 20 64 73 74 50 74 72 2d 3e 6c  gPtr = dstPtr->l
4450: 69 6e 65 50 74 72 2d 3e 73 65 67 50 74 72 3b 20  inePtr->segPtr; 
4460: 73 65 67 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a  segPtr != NULL;.
4470: 09 09 73 65 67 50 74 72 20 3d 20 73 65 67 50 74  ..segPtr = segPt
4480: 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 20  r->nextPtr) {.. 
4490: 20 20 20 64 73 74 50 74 72 2d 3e 63 68 61 72 49     dstPtr->charI
44a0: 6e 64 65 78 20 2b 3d 20 73 65 67 50 74 72 2d 3e  ndex += segPtr->
44b0: 73 69 7a 65 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d  size;..}.    }.}
44c0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
44d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4510: 2a 0a 20 2a 20 53 74 61 72 74 45 6e 64 20 2d 2d  *. * StartEnd --
4520: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
4530: 65 64 75 72 65 20 68 61 6e 64 6c 65 73 20 6d 6f  edure handles mo
4540: 64 69 66 69 65 72 73 20 6c 69 6b 65 20 22 77 6f  difiers like "wo
4550: 72 64 73 74 61 72 74 22 20 61 6e 64 20 22 6c 69  rdstart" and "li
4560: 6e 65 65 6e 64 22 0a 20 2a 09 74 6f 20 61 64 6a  neend". *.to adj
4570: 75 73 74 20 69 6e 64 69 63 65 73 20 66 6f 72 77  ust indices forw
4580: 61 72 64 73 20 6f 72 20 62 61 63 6b 77 61 72 64  ards or backward
4590: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
45a0: 3a 0a 20 2a 09 49 66 20 74 68 65 20 6d 6f 64 69  :. *.If the modi
45b0: 66 69 65 72 20 69 73 20 73 75 63 63 65 73 73 66  fier is successf
45c0: 75 6c 6c 79 20 70 61 72 73 65 64 20 74 68 65 6e  ully parsed then
45d0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
45e0: 65 0a 20 2a 09 69 73 20 74 68 65 20 61 64 64 72  e. *.is the addr
45f0: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74  ess of the first
4600: 20 63 68 61 72 61 63 74 65 72 20 61 66 74 65 72   character after
4610: 20 74 68 65 20 6d 6f 64 69 66 69 65 72 2c 20 61   the modifier, a
4620: 6e 64 0a 20 2a 09 2a 69 6e 64 65 78 50 74 72 20  nd. *.*indexPtr 
4630: 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 72 65  is updated to re
4640: 66 6c 65 63 74 20 74 68 65 20 6d 6f 64 69 66 69  flect the modifi
4650: 65 72 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  er. If there is 
4660: 61 0a 20 2a 09 73 79 6e 74 61 78 20 65 72 72 6f  a. *.syntax erro
4670: 72 20 69 6e 20 74 68 65 20 6d 6f 64 69 66 69 65  r in the modifie
4680: 72 20 74 68 65 6e 20 4e 55 4c 4c 20 69 73 20 72  r then NULL is r
4690: 65 74 75 72 6e 65 64 2e 0a 20 2a 0a 20 2a 20 53  eturned.. *. * S
46a0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
46b0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4700: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 68  -. */..static ch
4710: 61 72 20 2a 0a 53 74 61 72 74 45 6e 64 28 73 74  ar *.StartEnd(st
4720: 72 69 6e 67 2c 20 69 6e 64 65 78 50 74 72 29 0a  ring, indexPtr).
4730: 20 20 20 20 63 68 61 72 20 2a 73 74 72 69 6e 67      char *string
4740: 3b 09 09 2f 2a 20 53 74 72 69 6e 67 20 74 6f 20  ;../* String to 
4750: 70 61 72 73 65 20 66 6f 72 20 61 64 64 69 74 69  parse for additi
4760: 6f 6e 61 6c 20 69 6e 66 6f 0a 09 09 09 09 20 2a  onal info..... *
4770: 20 61 62 6f 75 74 20 6d 6f 64 69 66 69 65 72 20   about modifier 
4780: 28 63 6f 75 6e 74 20 61 6e 64 20 75 6e 69 74 73  (count and units
4790: 29 2e 20 0a 09 09 09 09 20 2a 20 50 6f 69 6e 74  ). ..... * Point
47a0: 73 20 74 6f 20 66 69 72 73 74 20 63 68 61 72 61  s to first chara
47b0: 63 74 65 72 20 6f 66 20 6d 6f 64 69 66 65 72 0a  cter of modifer.
47c0: 09 09 09 09 20 2a 20 77 6f 72 64 2e 20 2a 2f 0a  .... * word. */.
47d0: 20 20 20 20 54 6b 54 65 78 74 49 6e 64 65 78 20      TkTextIndex 
47e0: 2a 69 6e 64 65 78 50 74 72 3b 09 2f 2a 20 49 6e  *indexPtr;./* In
47f0: 64 65 78 20 74 6f 20 6d 64 6f 69 66 79 20 62 61  dex to mdoify ba
4800: 73 65 64 20 6f 6e 20 73 74 72 69 6e 67 2e 20 2a  sed on string. *
4810: 2f 0a 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 3b  /.{.    char *p;
4820: 0a 20 20 20 20 69 6e 74 20 63 2c 20 6f 66 66 73  .    int c, offs
4830: 65 74 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c  et;.    size_t l
4840: 65 6e 67 74 68 3b 0a 20 20 20 20 72 65 67 69 73  ength;.    regis
4850: 74 65 72 20 54 6b 54 65 78 74 53 65 67 6d 65 6e  ter TkTextSegmen
4860: 74 20 2a 73 65 67 50 74 72 3b 0a 0a 20 20 20 20  t *segPtr;..    
4870: 2f 2a 0a 20 20 20 20 20 2a 20 46 69 6e 64 20 74  /*.     * Find t
4880: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 6f  he end of the mo
4890: 64 69 66 69 65 72 20 77 6f 72 64 2e 0a 20 20 20  difier word..   
48a0: 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 20 28 70    */..    for (p
48b0: 20 3d 20 73 74 72 69 6e 67 3b 20 69 73 61 6c 6e   = string; isaln
48c0: 75 6d 28 55 43 48 41 52 28 2a 70 29 29 3b 20 70  um(UCHAR(*p)); p
48d0: 2b 2b 29 20 7b 0a 09 2f 2a 20 45 6d 70 74 79 20  ++) {../* Empty 
48e0: 6c 6f 6f 70 20 62 6f 64 79 2e 20 2a 2f 0a 20 20  loop body. */.  
48f0: 20 20 7d 0a 20 20 20 20 6c 65 6e 67 74 68 20 3d    }.    length =
4900: 20 70 2d 73 74 72 69 6e 67 3b 0a 20 20 20 20 69   p-string;.    i
4910: 66 20 28 28 2a 73 74 72 69 6e 67 20 3d 3d 20 27  f ((*string == '
4920: 6c 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28  l') && (strncmp(
4930: 73 74 72 69 6e 67 2c 20 22 6c 69 6e 65 65 6e 64  string, "lineend
4940: 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20 30 29  ", length) == 0)
4950: 0a 09 20 20 20 20 26 26 20 28 6c 65 6e 67 74 68  ..    && (length
4960: 20 3e 3d 20 35 29 29 20 7b 0a 09 69 6e 64 65 78   >= 5)) {..index
4970: 50 74 72 2d 3e 63 68 61 72 49 6e 64 65 78 20 3d  Ptr->charIndex =
4980: 20 30 3b 0a 09 66 6f 72 20 28 73 65 67 50 74 72   0;..for (segPtr
4990: 20 3d 20 69 6e 64 65 78 50 74 72 2d 3e 6c 69 6e   = indexPtr->lin
49a0: 65 50 74 72 2d 3e 73 65 67 50 74 72 3b 20 73 65  ePtr->segPtr; se
49b0: 67 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09  gPtr != NULL;...
49c0: 73 65 67 50 74 72 20 3d 20 73 65 67 50 74 72 2d  segPtr = segPtr-
49d0: 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 20 20 20  >nextPtr) {..   
49e0: 20 69 6e 64 65 78 50 74 72 2d 3e 63 68 61 72 49   indexPtr->charI
49f0: 6e 64 65 78 20 2b 3d 20 73 65 67 50 74 72 2d 3e  ndex += segPtr->
4a00: 73 69 7a 65 3b 0a 09 7d 0a 09 69 6e 64 65 78 50  size;..}..indexP
4a10: 74 72 2d 3e 63 68 61 72 49 6e 64 65 78 20 2d 3d  tr->charIndex -=
4a20: 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69   1;.    } else i
4a30: 66 20 28 28 2a 73 74 72 69 6e 67 20 3d 3d 20 27  f ((*string == '
4a40: 6c 27 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28  l') && (strncmp(
4a50: 73 74 72 69 6e 67 2c 20 22 6c 69 6e 65 73 74 61  string, "linesta
4a60: 72 74 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20  rt", length) == 
4a70: 30 29 0a 09 20 20 20 20 26 26 20 28 6c 65 6e 67  0)..    && (leng
4a80: 74 68 20 3e 3d 20 35 29 29 20 7b 0a 09 69 6e 64  th >= 5)) {..ind
4a90: 65 78 50 74 72 2d 3e 63 68 61 72 49 6e 64 65 78  exPtr->charIndex
4aa0: 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65   = 0;.    } else
4ab0: 20 69 66 20 28 28 2a 73 74 72 69 6e 67 20 3d 3d   if ((*string ==
4ac0: 20 27 77 27 29 20 26 26 20 28 73 74 72 6e 63 6d   'w') && (strncm
4ad0: 70 28 73 74 72 69 6e 67 2c 20 22 77 6f 72 64 65  p(string, "worde
4ae0: 6e 64 22 2c 20 6c 65 6e 67 74 68 29 20 3d 3d 20  nd", length) == 
4af0: 30 29 0a 09 20 20 20 20 26 26 20 28 6c 65 6e 67  0)..    && (leng
4b00: 74 68 20 3e 3d 20 35 29 29 20 7b 0a 09 69 6e 74  th >= 5)) {..int
4b10: 20 66 69 72 73 74 43 68 61 72 20 3d 20 31 3b 0a   firstChar = 1;.
4b20: 0a 09 2f 2a 0a 09 20 2a 20 49 66 20 74 68 65 20  ../*.. * If the 
4b30: 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74 65  current characte
4b40: 72 20 69 73 6e 27 74 20 70 61 72 74 20 6f 66 20  r isn't part of 
4b50: 61 20 77 6f 72 64 20 74 68 65 6e 20 6a 75 73 74  a word then just
4b60: 20 6d 6f 76 65 0a 09 20 2a 20 66 6f 72 77 61 72   move.. * forwar
4b70: 64 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e  d one character.
4b80: 20 20 4f 74 68 65 72 77 69 73 65 20 6d 6f 76 65    Otherwise move
4b90: 20 66 6f 72 77 61 72 64 20 75 6e 74 69 6c 20 66   forward until f
4ba0: 69 6e 64 69 6e 67 0a 09 20 2a 20 61 20 63 68 61  inding.. * a cha
4bb0: 72 61 63 74 65 72 20 74 68 61 74 20 69 73 6e 27  racter that isn'
4bc0: 74 20 70 61 72 74 20 6f 66 20 61 20 77 6f 72 64  t part of a word
4bd0: 20 61 6e 64 20 73 74 6f 70 20 74 68 65 72 65 2e   and stop there.
4be0: 0a 09 20 2a 2f 0a 0a 09 73 65 67 50 74 72 20 3d  .. */...segPtr =
4bf0: 20 54 6b 54 65 78 74 49 6e 64 65 78 54 6f 53 65   TkTextIndexToSe
4c00: 67 28 69 6e 64 65 78 50 74 72 2c 20 26 6f 66 66  g(indexPtr, &off
4c10: 73 65 74 29 3b 0a 09 77 68 69 6c 65 20 28 31 29  set);..while (1)
4c20: 20 7b 0a 09 20 20 20 20 69 66 20 28 73 65 67 50   {..    if (segP
4c30: 74 72 2d 3e 74 79 70 65 50 74 72 20 3d 3d 20 26  tr->typePtr == &
4c40: 74 6b 54 65 78 74 43 68 61 72 54 79 70 65 29 20  tkTextCharType) 
4c50: 7b 0a 09 09 63 20 3d 20 73 65 67 50 74 72 2d 3e  {...c = segPtr->
4c60: 62 6f 64 79 2e 63 68 61 72 73 5b 6f 66 66 73 65  body.chars[offse
4c70: 74 5d 3b 0a 09 09 69 66 20 28 21 69 73 61 6c 6e  t];...if (!isaln
4c80: 75 6d 28 55 43 48 41 52 28 63 29 29 20 26 26 20  um(UCHAR(c)) && 
4c90: 28 63 20 21 3d 20 27 5f 27 29 29 20 7b 0a 09 09  (c != '_')) {...
4ca0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 09      break;...}..
4cb0: 09 66 69 72 73 74 43 68 61 72 20 3d 20 30 3b 0a  .firstChar = 0;.
4cc0: 09 20 20 20 20 7d 0a 09 20 20 20 20 6f 66 66 73  .    }..    offs
4cd0: 65 74 20 2b 3d 20 31 3b 0a 09 20 20 20 20 69 6e  et += 1;..    in
4ce0: 64 65 78 50 74 72 2d 3e 63 68 61 72 49 6e 64 65  dexPtr->charInde
4cf0: 78 20 2b 3d 20 31 3b 0a 09 20 20 20 20 69 66 20  x += 1;..    if 
4d00: 28 6f 66 66 73 65 74 20 3e 3d 20 73 65 67 50 74  (offset >= segPt
4d10: 72 2d 3e 73 69 7a 65 29 20 7b 0a 09 09 73 65 67  r->size) {...seg
4d20: 50 74 72 20 3d 20 54 6b 54 65 78 74 49 6e 64 65  Ptr = TkTextInde
4d30: 78 54 6f 53 65 67 28 69 6e 64 65 78 50 74 72 2c  xToSeg(indexPtr,
4d40: 20 26 6f 66 66 73 65 74 29 3b 0a 09 20 20 20 20   &offset);..    
4d50: 7d 0a 09 7d 0a 09 69 66 20 28 66 69 72 73 74 43  }..}..if (firstC
4d60: 68 61 72 29 20 7b 0a 09 20 20 20 20 54 6b 54 65  har) {..    TkTe
4d70: 78 74 49 6e 64 65 78 46 6f 72 77 43 68 61 72 73  xtIndexForwChars
4d80: 28 69 6e 64 65 78 50 74 72 2c 20 31 2c 20 69 6e  (indexPtr, 1, in
4d90: 64 65 78 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20  dexPtr);..}.    
4da0: 7d 20 65 6c 73 65 20 69 66 20 28 28 2a 73 74 72  } else if ((*str
4db0: 69 6e 67 20 3d 3d 20 27 77 27 29 20 26 26 20 28  ing == 'w') && (
4dc0: 73 74 72 6e 63 6d 70 28 73 74 72 69 6e 67 2c 20  strncmp(string, 
4dd0: 22 77 6f 72 64 73 74 61 72 74 22 2c 20 6c 65 6e  "wordstart", len
4de0: 67 74 68 29 20 3d 3d 20 30 29 0a 09 20 20 20 20  gth) == 0)..    
4df0: 26 26 20 28 6c 65 6e 67 74 68 20 3e 3d 20 35 29  && (length >= 5)
4e00: 29 20 7b 0a 09 69 6e 74 20 66 69 72 73 74 43 68  ) {..int firstCh
4e10: 61 72 20 3d 20 31 3b 0a 0a 09 2f 2a 0a 09 20 2a  ar = 1;.../*.. *
4e20: 20 53 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   Starting with t
4e30: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 72 61  he current chara
4e40: 63 74 65 72 2c 20 6c 6f 6f 6b 20 66 6f 72 20 6f  cter, look for o
4e50: 6e 65 20 74 68 61 74 27 73 20 6e 6f 74 0a 09 20  ne that's not.. 
4e60: 2a 20 70 61 72 74 20 6f 66 20 61 20 77 6f 72 64  * part of a word
4e70: 20 61 6e 64 20 6b 65 65 70 20 6d 6f 76 69 6e 67   and keep moving
4e80: 20 62 61 63 6b 77 61 72 64 20 75 6e 74 69 6c 20   backward until 
4e90: 79 6f 75 20 66 69 6e 64 20 6f 6e 65 2e 0a 09 20  you find one... 
4ea0: 2a 20 54 68 65 6e 20 69 66 20 74 68 65 20 63 68  * Then if the ch
4eb0: 61 72 61 63 74 65 72 20 66 6f 75 6e 64 20 77 61  aracter found wa
4ec0: 73 6e 27 74 20 74 68 65 20 66 69 72 73 74 20 6f  sn't the first o
4ed0: 6e 65 2c 20 6d 6f 76 65 20 66 6f 72 77 61 72 64  ne, move forward
4ee0: 0a 09 20 2a 20 61 67 61 69 6e 20 6f 6e 65 20 70  .. * again one p
4ef0: 6f 73 69 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 0a 09  osition... */...
4f00: 73 65 67 50 74 72 20 3d 20 54 6b 54 65 78 74 49  segPtr = TkTextI
4f10: 6e 64 65 78 54 6f 53 65 67 28 69 6e 64 65 78 50  ndexToSeg(indexP
4f20: 74 72 2c 20 26 6f 66 66 73 65 74 29 3b 0a 09 77  tr, &offset);..w
4f30: 68 69 6c 65 20 28 31 29 20 7b 0a 09 20 20 20 20  hile (1) {..    
4f40: 69 66 20 28 73 65 67 50 74 72 2d 3e 74 79 70 65  if (segPtr->type
4f50: 50 74 72 20 3d 3d 20 26 74 6b 54 65 78 74 43 68  Ptr == &tkTextCh
4f60: 61 72 54 79 70 65 29 20 7b 0a 09 09 63 20 3d 20  arType) {...c = 
4f70: 73 65 67 50 74 72 2d 3e 62 6f 64 79 2e 63 68 61  segPtr->body.cha
4f80: 72 73 5b 6f 66 66 73 65 74 5d 3b 0a 09 09 69 66  rs[offset];...if
4f90: 20 28 21 69 73 61 6c 6e 75 6d 28 55 43 48 41 52   (!isalnum(UCHAR
4fa0: 28 63 29 29 20 26 26 20 28 63 20 21 3d 20 27 5f  (c)) && (c != '_
4fb0: 27 29 29 20 7b 0a 09 09 20 20 20 20 62 72 65 61  ')) {...    brea
4fc0: 6b 3b 0a 09 09 7d 0a 09 09 66 69 72 73 74 43 68  k;...}...firstCh
4fd0: 61 72 20 3d 20 30 3b 0a 09 20 20 20 20 7d 0a 09  ar = 0;..    }..
4fe0: 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 31 3b      offset -= 1;
4ff0: 0a 09 20 20 20 20 69 6e 64 65 78 50 74 72 2d 3e  ..    indexPtr->
5000: 63 68 61 72 49 6e 64 65 78 20 2d 3d 20 31 3b 0a  charIndex -= 1;.
5010: 09 20 20 20 20 69 66 20 28 6f 66 66 73 65 74 20  .    if (offset 
5020: 3c 20 30 29 20 7b 0a 09 09 69 66 20 28 69 6e 64  < 0) {...if (ind
5030: 65 78 50 74 72 2d 3e 63 68 61 72 49 6e 64 65 78  exPtr->charIndex
5040: 20 3c 20 30 29 20 7b 0a 09 09 20 20 20 20 69 6e   < 0) {...    in
5050: 64 65 78 50 74 72 2d 3e 63 68 61 72 49 6e 64 65  dexPtr->charInde
5060: 78 20 3d 20 30 3b 0a 09 09 20 20 20 20 67 6f 74  x = 0;...    got
5070: 6f 20 64 6f 6e 65 3b 0a 09 09 7d 0a 09 09 73 65  o done;...}...se
5080: 67 50 74 72 20 3d 20 54 6b 54 65 78 74 49 6e 64  gPtr = TkTextInd
5090: 65 78 54 6f 53 65 67 28 69 6e 64 65 78 50 74 72  exToSeg(indexPtr
50a0: 2c 20 26 6f 66 66 73 65 74 29 3b 0a 09 20 20 20  , &offset);..   
50b0: 20 7d 0a 09 7d 0a 09 69 66 20 28 21 66 69 72 73   }..}..if (!firs
50c0: 74 43 68 61 72 29 20 7b 0a 09 20 20 20 20 54 6b  tChar) {..    Tk
50d0: 54 65 78 74 49 6e 64 65 78 46 6f 72 77 43 68 61  TextIndexForwCha
50e0: 72 73 28 69 6e 64 65 78 50 74 72 2c 20 31 2c 20  rs(indexPtr, 1, 
50f0: 69 6e 64 65 78 50 74 72 29 3b 0a 09 7d 0a 20 20  indexPtr);..}.  
5100: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74 75    } else {..retu
5110: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  rn NULL;.    }. 
5120: 20 20 20 64 6f 6e 65 3a 0a 20 20 20 20 72 65 74     done:.    ret
5130: 75 72 6e 20 70 3b 0a 7d 0a                       urn p;.}.