System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 3ad9139367d5d1c480d6f55dd4821410f6a481b9:


0000: 23 20 77 6f 72 64 2e 74 63 6c 20 2d 2d 0a 23 0a  # word.tcl --.#.
0010: 23 20 54 68 69 73 20 66 69 6c 65 20 64 65 66 69  # This file defi
0020: 6e 65 73 20 76 61 72 69 6f 75 73 20 70 72 6f 63  nes various proc
0030: 65 64 75 72 65 73 20 66 6f 72 20 63 6f 6d 70 75  edures for compu
0040: 74 69 6e 67 20 77 6f 72 64 20 62 6f 75 6e 64 61  ting word bounda
0050: 72 69 65 73 0a 23 20 69 6e 20 73 74 72 69 6e 67  ries.# in string
0060: 73 2e 20 20 54 68 69 73 20 66 69 6c 65 20 69 73  s.  This file is
0070: 20 70 72 69 6d 61 72 69 6c 79 20 6e 65 65 64 65   primarily neede
0080: 64 20 73 6f 20 54 6b 20 74 65 78 74 20 61 6e 64  d so Tk text and
0090: 20 65 6e 74 72 79 0a 23 20 77 69 64 67 65 74 73   entry.# widgets
00a0: 20 62 65 68 61 76 65 20 70 72 6f 70 65 72 6c 79   behave properly
00b0: 20 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20 70   for different p
00c0: 6c 61 74 66 6f 72 6d 73 2e 0a 23 0a 23 20 43 6f  latforms..#.# Co
00d0: 70 79 72 69 67 68 74 20 28 63 29 20 31 39 39 36  pyright (c) 1996
00e0: 20 62 79 20 53 75 6e 20 4d 69 63 72 6f 73 79 73   by Sun Microsys
00f0: 74 65 6d 73 2c 20 49 6e 63 2e 0a 23 20 43 6f 70  tems, Inc..# Cop
0100: 79 72 69 67 68 74 20 28 63 29 20 31 39 39 38 20  yright (c) 1998 
0110: 62 79 20 53 63 72 69 74 70 69 63 73 20 43 6f 72  by Scritpics Cor
0120: 70 6f 72 61 74 69 6f 6e 2e 0a 23 0a 23 20 53 65  poration..#.# Se
0130: 65 20 74 68 65 20 66 69 6c 65 20 22 6c 69 63 65  e the file "lice
0140: 6e 73 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 69  nse.terms" for i
0150: 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73  nformation on us
0160: 61 67 65 20 61 6e 64 20 72 65 64 69 73 74 72 69  age and redistri
0170: 62 75 74 69 6f 6e 0a 23 20 6f 66 20 74 68 69 73  bution.# of this
0180: 20 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61   file, and for a
0190: 20 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41   DISCLAIMER OF A
01a0: 4c 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0a 0a  LL WARRANTIES...
01b0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
01c0: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 75 73  variables are us
01d0: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
01e0: 77 68 69 63 68 20 63 68 61 72 61 63 74 65 72 73  which characters
01f0: 20 61 72 65 0a 23 20 69 6e 74 65 72 70 72 65 74   are.# interpret
0200: 65 64 20 61 73 20 77 68 69 74 65 20 73 70 61 63  ed as white spac
0210: 65 2e 20 20 0a 0a 69 66 20 7b 24 3a 3a 74 63 6c  e.  ..if {$::tcl
0220: 5f 70 6c 61 74 66 6f 72 6d 28 70 6c 61 74 66 6f  _platform(platfo
0230: 72 6d 29 20 65 71 20 22 77 69 6e 64 6f 77 73 22  rm) eq "windows"
0240: 7d 20 7b 0a 20 20 20 20 23 20 57 69 6e 64 6f 77  } {.    # Window
0250: 73 20 73 74 79 6c 65 20 2d 20 61 6e 79 20 62 75  s style - any bu
0260: 74 20 61 20 75 6e 69 63 6f 64 65 20 73 70 61 63  t a unicode spac
0270: 65 20 63 68 61 72 0a 20 20 20 20 73 65 74 20 74  e char.    set t
0280: 63 6c 5f 77 6f 72 64 63 68 61 72 73 20 22 5c 5c  cl_wordchars "\\
0290: 53 22 0a 20 20 20 20 73 65 74 20 74 63 6c 5f 6e  S".    set tcl_n
02a0: 6f 6e 77 6f 72 64 63 68 61 72 73 20 22 5c 5c 73  onwordchars "\\s
02b0: 22 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 23  ".} else {.    #
02c0: 20 4d 6f 74 69 66 20 73 74 79 6c 65 20 2d 20 61   Motif style - a
02d0: 6e 79 20 75 6e 69 63 6f 64 65 20 77 6f 72 64 20  ny unicode word 
02e0: 63 68 61 72 20 28 6e 75 6d 62 65 72 2c 20 6c 65  char (number, le
02f0: 74 74 65 72 2c 20 6f 72 20 75 6e 64 65 72 73 63  tter, or undersc
0300: 6f 72 65 29 0a 20 20 20 20 73 65 74 20 74 63 6c  ore).    set tcl
0310: 5f 77 6f 72 64 63 68 61 72 73 20 22 5c 5c 77 22  _wordchars "\\w"
0320: 0a 20 20 20 20 73 65 74 20 74 63 6c 5f 6e 6f 6e  .    set tcl_non
0330: 77 6f 72 64 63 68 61 72 73 20 22 5c 5c 57 22 0a  wordchars "\\W".
0340: 7d 0a 0a 23 20 74 63 6c 5f 77 6f 72 64 42 72 65  }..# tcl_wordBre
0350: 61 6b 41 66 74 65 72 20 2d 2d 0a 23 0a 23 20 54  akAfter --.#.# T
0360: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 72 65  his procedure re
0370: 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78 20  turns the index 
0380: 6f 66 20 74 68 65 20 66 69 72 73 74 20 77 6f 72  of the first wor
0390: 64 20 62 6f 75 6e 64 61 72 79 0a 23 20 61 66 74  d boundary.# aft
03a0: 65 72 20 74 68 65 20 73 74 61 72 74 69 6e 67 20  er the starting 
03b0: 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 67 69 76  point in the giv
03c0: 65 6e 20 73 74 72 69 6e 67 2c 20 6f 72 20 2d 31  en string, or -1
03d0: 20 69 66 20 74 68 65 72 65 0a 23 20 61 72 65 20   if there.# are 
03e0: 6e 6f 20 6d 6f 72 65 20 62 6f 75 6e 64 61 72 69  no more boundari
03f0: 65 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20  es in the given 
0400: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 69 6e 64  string.  The ind
0410: 65 78 20 72 65 74 75 72 6e 65 64 20 72 65 66 65  ex returned refe
0420: 72 73 0a 23 20 74 6f 20 74 68 65 20 66 69 72 73  rs.# to the firs
0430: 74 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  t character of t
0440: 68 65 20 70 61 69 72 20 74 68 61 74 20 63 6f 6d  he pair that com
0450: 70 72 69 73 65 73 20 61 20 62 6f 75 6e 64 61 72  prises a boundar
0460: 79 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 73  y..#.# Arguments
0470: 3a 0a 23 20 73 74 72 20 2d 09 09 53 74 72 69 6e  :.# str -..Strin
0480: 67 20 74 6f 20 73 65 61 72 63 68 2e 0a 23 20 73  g to search..# s
0490: 74 61 72 74 20 2d 09 49 6e 64 65 78 20 69 6e 74  tart -.Index int
04a0: 6f 20 73 74 72 69 6e 67 20 73 70 65 63 69 66 79  o string specify
04b0: 69 6e 67 20 73 74 61 72 74 69 6e 67 20 70 6f 69  ing starting poi
04c0: 6e 74 2e 0a 0a 70 72 6f 63 20 74 63 6c 5f 77 6f  nt...proc tcl_wo
04d0: 72 64 42 72 65 61 6b 41 66 74 65 72 20 7b 73 74  rdBreakAfter {st
04e0: 72 20 73 74 61 72 74 7d 20 7b 0a 20 20 20 20 67  r start} {.    g
04f0: 6c 6f 62 61 6c 20 74 63 6c 5f 6e 6f 6e 77 6f 72  lobal tcl_nonwor
0500: 64 63 68 61 72 73 20 74 63 6c 5f 77 6f 72 64 63  dchars tcl_wordc
0510: 68 61 72 73 0a 20 20 20 20 73 65 74 20 73 74 72  hars.    set str
0520: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
0530: 73 74 72 20 24 73 74 61 72 74 20 65 6e 64 5d 0a  str $start end].
0540: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
0550: 2d 69 6e 64 69 63 65 73 20 22 24 74 63 6c 5f 77  -indices "$tcl_w
0560: 6f 72 64 63 68 61 72 73 24 74 63 6c 5f 6e 6f 6e  ordchars$tcl_non
0570: 77 6f 72 64 63 68 61 72 73 7c 24 74 63 6c 5f 6e  wordchars|$tcl_n
0580: 6f 6e 77 6f 72 64 63 68 61 72 73 24 74 63 6c 5f  onwordchars$tcl_
0590: 77 6f 72 64 63 68 61 72 73 22 20 24 73 74 72 20  wordchars" $str 
05a0: 72 65 73 75 6c 74 5d 7d 20 7b 0a 09 72 65 74 75  result]} {..retu
05b0: 72 6e 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65  rn [expr {[linde
05c0: 78 20 24 72 65 73 75 6c 74 20 31 5d 20 2b 20 24  x $result 1] + $
05d0: 73 74 61 72 74 7d 5d 0a 20 20 20 20 7d 0a 20 20  start}].    }.  
05e0: 20 20 72 65 74 75 72 6e 20 2d 31 0a 7d 0a 0a 23    return -1.}..#
05f0: 20 74 63 6c 5f 77 6f 72 64 42 72 65 61 6b 42 65   tcl_wordBreakBe
0600: 66 6f 72 65 20 2d 2d 0a 23 0a 23 20 54 68 69 73  fore --.#.# This
0610: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
0620: 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ns the index of 
0630: 74 68 65 20 66 69 72 73 74 20 77 6f 72 64 20 62  the first word b
0640: 6f 75 6e 64 61 72 79 0a 23 20 62 65 66 6f 72 65  oundary.# before
0650: 20 74 68 65 20 73 74 61 72 74 69 6e 67 20 70 6f   the starting po
0660: 69 6e 74 20 69 6e 20 74 68 65 20 67 69 76 65 6e  int in the given
0670: 20 73 74 72 69 6e 67 2c 20 6f 72 20 2d 31 20 69   string, or -1 i
0680: 66 20 74 68 65 72 65 0a 23 20 61 72 65 20 6e 6f  f there.# are no
0690: 20 6d 6f 72 65 20 62 6f 75 6e 64 61 72 69 65 73   more boundaries
06a0: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74   in the given st
06b0: 72 69 6e 67 2e 20 20 54 68 65 20 69 6e 64 65 78  ring.  The index
06c0: 20 72 65 74 75 72 6e 65 64 0a 23 20 72 65 66 65   returned.# refe
06d0: 72 73 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64  rs to the second
06e0: 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
06f0: 65 20 70 61 69 72 20 74 68 61 74 20 63 6f 6d 70  e pair that comp
0700: 72 69 73 65 73 20 61 20 62 6f 75 6e 64 61 72 79  rises a boundary
0710: 2e 0a 23 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a  ..#.# Arguments:
0720: 0a 23 20 73 74 72 20 2d 09 09 53 74 72 69 6e 67  .# str -..String
0730: 20 74 6f 20 73 65 61 72 63 68 2e 0a 23 20 73 74   to search..# st
0740: 61 72 74 20 2d 09 49 6e 64 65 78 20 69 6e 74 6f  art -.Index into
0750: 20 73 74 72 69 6e 67 20 73 70 65 63 69 66 79 69   string specifyi
0760: 6e 67 20 73 74 61 72 74 69 6e 67 20 70 6f 69 6e  ng starting poin
0770: 74 2e 0a 0a 70 72 6f 63 20 74 63 6c 5f 77 6f 72  t...proc tcl_wor
0780: 64 42 72 65 61 6b 42 65 66 6f 72 65 20 7b 73 74  dBreakBefore {st
0790: 72 20 73 74 61 72 74 7d 20 7b 0a 20 20 20 20 67  r start} {.    g
07a0: 6c 6f 62 61 6c 20 74 63 6c 5f 6e 6f 6e 77 6f 72  lobal tcl_nonwor
07b0: 64 63 68 61 72 73 20 74 63 6c 5f 77 6f 72 64 63  dchars tcl_wordc
07c0: 68 61 72 73 0a 20 20 20 20 69 66 20 7b 24 73 74  hars.    if {$st
07d0: 61 72 74 20 65 71 20 22 65 6e 64 22 7d 20 7b 0a  art eq "end"} {.
07e0: 09 73 65 74 20 73 74 61 72 74 20 5b 73 74 72 69  .set start [stri
07f0: 6e 67 20 6c 65 6e 67 74 68 20 24 73 74 72 5d 0a  ng length $str].
0800: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 7b 5b 72      }.    if {[r
0810: 65 67 65 78 70 20 2d 69 6e 64 69 63 65 73 20 22  egexp -indices "
0820: 5e 2e 2a 28 24 74 63 6c 5f 77 6f 72 64 63 68 61  ^.*($tcl_wordcha
0830: 72 73 24 74 63 6c 5f 6e 6f 6e 77 6f 72 64 63 68  rs$tcl_nonwordch
0840: 61 72 73 7c 24 74 63 6c 5f 6e 6f 6e 77 6f 72 64  ars|$tcl_nonword
0850: 63 68 61 72 73 24 74 63 6c 5f 77 6f 72 64 63 68  chars$tcl_wordch
0860: 61 72 73 29 22 20 5b 73 74 72 69 6e 67 20 72 61  ars)" [string ra
0870: 6e 67 65 20 24 73 74 72 20 30 20 24 73 74 61 72  nge $str 0 $star
0880: 74 5d 20 72 65 73 75 6c 74 5d 7d 20 7b 0a 09 72  t] result]} {..r
0890: 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 72  eturn [lindex $r
08a0: 65 73 75 6c 74 20 31 5d 0a 20 20 20 20 7d 0a 20  esult 1].    }. 
08b0: 20 20 20 72 65 74 75 72 6e 20 2d 31 0a 7d 0a 0a     return -1.}..
08c0: 23 20 74 63 6c 5f 65 6e 64 4f 66 57 6f 72 64 20  # tcl_endOfWord 
08d0: 2d 2d 0a 23 0a 23 20 54 68 69 73 20 70 72 6f 63  --.#.# This proc
08e0: 65 64 75 72 65 20 72 65 74 75 72 6e 73 20 74 68  edure returns th
08f0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66  e index of the f
0900: 69 72 73 74 20 65 6e 64 2d 6f 66 2d 77 6f 72 64  irst end-of-word
0910: 20 6c 6f 63 61 74 69 6f 6e 0a 23 20 61 66 74 65   location.# afte
0920: 72 20 61 20 73 74 61 72 74 69 6e 67 20 69 6e 64  r a starting ind
0930: 65 78 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20  ex in the given 
0940: 73 74 72 69 6e 67 2e 20 20 41 6e 20 65 6e 64 2d  string.  An end-
0950: 6f 66 2d 77 6f 72 64 20 6c 6f 63 61 74 69 6f 6e  of-word location
0960: 0a 23 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  .# is defined to
0970: 20 62 65 20 74 68 65 20 66 69 72 73 74 20 77 68   be the first wh
0980: 69 74 65 73 70 61 63 65 20 63 68 61 72 61 63 74  itespace charact
0990: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
09a0: 20 66 69 72 73 74 0a 23 20 6e 6f 6e 2d 77 68 69   first.# non-whi
09b0: 74 65 73 70 61 63 65 20 63 68 61 72 61 63 74 65  tespace characte
09c0: 72 20 61 66 74 65 72 20 74 68 65 20 73 74 61 72  r after the star
09d0: 74 69 6e 67 20 70 6f 69 6e 74 2e 20 20 52 65 74  ting point.  Ret
09e0: 75 72 6e 73 20 2d 31 20 69 66 0a 23 20 74 68 65  urns -1 if.# the
09f0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 77  re are no more w
0a00: 6f 72 64 73 20 61 66 74 65 72 20 74 68 65 20 73  ords after the s
0a10: 74 61 72 74 69 6e 67 20 70 6f 69 6e 74 2e 0a 23  tarting point..#
0a20: 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23 20  .# Arguments:.# 
0a30: 73 74 72 20 2d 09 09 53 74 72 69 6e 67 20 74 6f  str -..String to
0a40: 20 73 65 61 72 63 68 2e 0a 23 20 73 74 61 72 74   search..# start
0a50: 20 2d 09 49 6e 64 65 78 20 69 6e 74 6f 20 73 74   -.Index into st
0a60: 72 69 6e 67 20 73 70 65 63 69 66 79 69 6e 67 20  ring specifying 
0a70: 73 74 61 72 74 69 6e 67 20 70 6f 69 6e 74 2e 0a  starting point..
0a80: 0a 70 72 6f 63 20 74 63 6c 5f 65 6e 64 4f 66 57  .proc tcl_endOfW
0a90: 6f 72 64 20 7b 73 74 72 20 73 74 61 72 74 7d 20  ord {str start} 
0aa0: 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 20 74 63 6c  {.    global tcl
0ab0: 5f 6e 6f 6e 77 6f 72 64 63 68 61 72 73 20 74 63  _nonwordchars tc
0ac0: 6c 5f 77 6f 72 64 63 68 61 72 73 0a 20 20 20 20  l_wordchars.    
0ad0: 69 66 20 7b 5b 72 65 67 65 78 70 20 2d 69 6e 64  if {[regexp -ind
0ae0: 69 63 65 73 20 22 24 74 63 6c 5f 6e 6f 6e 77 6f  ices "$tcl_nonwo
0af0: 72 64 63 68 61 72 73 2a 24 74 63 6c 5f 77 6f 72  rdchars*$tcl_wor
0b00: 64 63 68 61 72 73 2b 24 74 63 6c 5f 6e 6f 6e 77  dchars+$tcl_nonw
0b10: 6f 72 64 63 68 61 72 73 22 20 5c 0a 09 20 20 20  ordchars" \..   
0b20: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
0b30: 73 74 72 20 24 73 74 61 72 74 20 65 6e 64 5d 20  str $start end] 
0b40: 72 65 73 75 6c 74 5d 7d 20 7b 0a 09 72 65 74 75  result]} {..retu
0b50: 72 6e 20 5b 65 78 70 72 20 7b 5b 6c 69 6e 64 65  rn [expr {[linde
0b60: 78 20 24 72 65 73 75 6c 74 20 31 5d 20 2b 20 24  x $result 1] + $
0b70: 73 74 61 72 74 7d 5d 0a 20 20 20 20 7d 0a 20 20  start}].    }.  
0b80: 20 20 72 65 74 75 72 6e 20 2d 31 0a 7d 0a 0a 23    return -1.}..#
0b90: 20 74 63 6c 5f 73 74 61 72 74 4f 66 4e 65 78 74   tcl_startOfNext
0ba0: 57 6f 72 64 20 2d 2d 0a 23 0a 23 20 54 68 69 73  Word --.#.# This
0bb0: 20 70 72 6f 63 65 64 75 72 65 20 72 65 74 75 72   procedure retur
0bc0: 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ns the index of 
0bd0: 74 68 65 20 66 69 72 73 74 20 73 74 61 72 74 2d  the first start-
0be0: 6f 66 2d 77 6f 72 64 20 6c 6f 63 61 74 69 6f 6e  of-word location
0bf0: 0a 23 20 61 66 74 65 72 20 61 20 73 74 61 72 74  .# after a start
0c00: 69 6e 67 20 69 6e 64 65 78 20 69 6e 20 74 68 65  ing index in the
0c10: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e 20 20   given string.  
0c20: 41 20 73 74 61 72 74 2d 6f 66 2d 77 6f 72 64 0a  A start-of-word.
0c30: 23 20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 64 65  # location is de
0c40: 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 6e 6f  fined to be a no
0c50: 6e 2d 77 68 69 74 65 73 70 61 63 65 20 63 68 61  n-whitespace cha
0c60: 72 61 63 74 65 72 20 66 6f 6c 6c 6f 77 69 6e 67  racter following
0c70: 20 61 0a 23 20 77 68 69 74 65 73 70 61 63 65 20   a.# whitespace 
0c80: 63 68 61 72 61 63 74 65 72 2e 20 20 52 65 74 75  character.  Retu
0c90: 72 6e 73 20 2d 31 20 69 66 20 74 68 65 72 65 20  rns -1 if there 
0ca0: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 73 74 61 72  are no more star
0cb0: 74 2d 6f 66 2d 77 6f 72 64 0a 23 20 6c 6f 63 61  t-of-word.# loca
0cc0: 74 69 6f 6e 73 20 61 66 74 65 72 20 74 68 65 20  tions after the 
0cd0: 73 74 61 72 74 69 6e 67 20 70 6f 69 6e 74 2e 0a  starting point..
0ce0: 23 0a 23 20 41 72 67 75 6d 65 6e 74 73 3a 0a 23  #.# Arguments:.#
0cf0: 20 73 74 72 20 2d 09 09 53 74 72 69 6e 67 20 74   str -..String t
0d00: 6f 20 73 65 61 72 63 68 2e 0a 23 20 73 74 61 72  o search..# star
0d10: 74 20 2d 09 49 6e 64 65 78 20 69 6e 74 6f 20 73  t -.Index into s
0d20: 74 72 69 6e 67 20 73 70 65 63 69 66 79 69 6e 67  tring specifying
0d30: 20 73 74 61 72 74 69 6e 67 20 70 6f 69 6e 74 2e   starting point.
0d40: 0a 0a 70 72 6f 63 20 74 63 6c 5f 73 74 61 72 74  ..proc tcl_start
0d50: 4f 66 4e 65 78 74 57 6f 72 64 20 7b 73 74 72 20  OfNextWord {str 
0d60: 73 74 61 72 74 7d 20 7b 0a 20 20 20 20 67 6c 6f  start} {.    glo
0d70: 62 61 6c 20 74 63 6c 5f 6e 6f 6e 77 6f 72 64 63  bal tcl_nonwordc
0d80: 68 61 72 73 20 74 63 6c 5f 77 6f 72 64 63 68 61  hars tcl_wordcha
0d90: 72 73 0a 20 20 20 20 69 66 20 7b 5b 72 65 67 65  rs.    if {[rege
0da0: 78 70 20 2d 69 6e 64 69 63 65 73 20 22 24 74 63  xp -indices "$tc
0db0: 6c 5f 77 6f 72 64 63 68 61 72 73 2a 24 74 63 6c  l_wordchars*$tcl
0dc0: 5f 6e 6f 6e 77 6f 72 64 63 68 61 72 73 2b 24 74  _nonwordchars+$t
0dd0: 63 6c 5f 77 6f 72 64 63 68 61 72 73 22 20 5c 0a  cl_wordchars" \.
0de0: 09 20 20 20 20 5b 73 74 72 69 6e 67 20 72 61 6e  .    [string ran
0df0: 67 65 20 24 73 74 72 20 24 73 74 61 72 74 20 65  ge $str $start e
0e00: 6e 64 5d 20 72 65 73 75 6c 74 5d 7d 20 7b 0a 09  nd] result]} {..
0e10: 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 5b 6c  return [expr {[l
0e20: 69 6e 64 65 78 20 24 72 65 73 75 6c 74 20 31 5d  index $result 1]
0e30: 20 2b 20 24 73 74 61 72 74 7d 5d 0a 20 20 20 20   + $start}].    
0e40: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 0a  }.    return -1.
0e50: 7d 0a 0a 23 20 74 63 6c 5f 73 74 61 72 74 4f 66  }..# tcl_startOf
0e60: 50 72 65 76 69 6f 75 73 57 6f 72 64 20 2d 2d 0a  PreviousWord --.
0e70: 23 0a 23 20 54 68 69 73 20 70 72 6f 63 65 64 75  #.# This procedu
0e80: 72 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  re returns the i
0e90: 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73  ndex of the firs
0ea0: 74 20 73 74 61 72 74 2d 6f 66 2d 77 6f 72 64 20  t start-of-word 
0eb0: 6c 6f 63 61 74 69 6f 6e 0a 23 20 62 65 66 6f 72  location.# befor
0ec0: 65 20 61 20 73 74 61 72 74 69 6e 67 20 69 6e 64  e a starting ind
0ed0: 65 78 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20  ex in the given 
0ee0: 73 74 72 69 6e 67 2e 0a 23 0a 23 20 41 72 67 75  string..#.# Argu
0ef0: 6d 65 6e 74 73 3a 0a 23 20 73 74 72 20 2d 09 09  ments:.# str -..
0f00: 53 74 72 69 6e 67 20 74 6f 20 73 65 61 72 63 68  String to search
0f10: 2e 0a 23 20 73 74 61 72 74 20 2d 09 49 6e 64 65  ..# start -.Inde
0f20: 78 20 69 6e 74 6f 20 73 74 72 69 6e 67 20 73 70  x into string sp
0f30: 65 63 69 66 79 69 6e 67 20 73 74 61 72 74 69 6e  ecifying startin
0f40: 67 20 70 6f 69 6e 74 2e 0a 0a 70 72 6f 63 20 74  g point...proc t
0f50: 63 6c 5f 73 74 61 72 74 4f 66 50 72 65 76 69 6f  cl_startOfPrevio
0f60: 75 73 57 6f 72 64 20 7b 73 74 72 20 73 74 61 72  usWord {str star
0f70: 74 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 20  t} {.    global 
0f80: 74 63 6c 5f 6e 6f 6e 77 6f 72 64 63 68 61 72 73  tcl_nonwordchars
0f90: 20 74 63 6c 5f 77 6f 72 64 63 68 61 72 73 0a 20   tcl_wordchars. 
0fa0: 20 20 20 69 66 20 7b 24 73 74 61 72 74 20 65 71     if {$start eq
0fb0: 20 22 65 6e 64 22 7d 20 7b 0a 09 73 65 74 20 73   "end"} {..set s
0fc0: 74 61 72 74 20 5b 73 74 72 69 6e 67 20 6c 65 6e  tart [string len
0fd0: 67 74 68 20 24 73 74 72 5d 0a 20 20 20 20 7d 0a  gth $str].    }.
0fe0: 20 20 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20      if {[regexp 
0ff0: 2d 69 6e 64 69 63 65 73 20 5c 0a 09 20 20 20 20  -indices \..    
1000: 22 24 74 63 6c 5f 6e 6f 6e 77 6f 72 64 63 68 61  "$tcl_nonwordcha
1010: 72 73 2a 28 24 74 63 6c 5f 77 6f 72 64 63 68 61  rs*($tcl_wordcha
1020: 72 73 2b 29 24 74 63 6c 5f 6e 6f 6e 77 6f 72 64  rs+)$tcl_nonword
1030: 63 68 61 72 73 2a 5c 24 22 20 5c 0a 09 20 20 20  chars*\$" \..   
1040: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
1050: 73 74 72 20 30 20 5b 65 78 70 72 20 7b 24 73 74  str 0 [expr {$st
1060: 61 72 74 20 2d 20 31 7d 5d 5d 20 72 65 73 75 6c  art - 1}]] resul
1070: 74 20 77 6f 72 64 5d 7d 20 7b 0a 09 72 65 74 75  t word]} {..retu
1080: 72 6e 20 5b 6c 69 6e 64 65 78 20 24 77 6f 72 64  rn [lindex $word
1090: 20 30 5d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   0].    }.    re
10a0: 74 75 72 6e 20 2d 31 0a 7d 0a                    turn -1.}.