/ Hex Artifact Content
Login

Artifact da577d1384810fb4e2b209bf3313074353193e95:


0000: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 50  ------------.# P
0050: 61 72 61 6d 65 74 65 72 20 24 7a 4e 61 6d 65 20  arameter $zName 
0060: 6d 75 73 74 20 62 65 20 61 20 70 61 74 68 20 74  must be a path t
0070: 6f 20 74 68 65 20 66 69 6c 65 20 55 6e 69 63 6f  o the file Unico
0080: 64 65 44 61 74 61 2e 74 78 74 2e 20 54 68 69 73  deData.txt. This
0090: 20 63 6f 6d 6d 61 6e 64 0a 23 20 72 65 61 64 73   command.# reads
00a0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
00b0: 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20  turns a list of 
00c0: 6d 61 70 70 69 6e 67 73 20 72 65 71 75 69 72 65  mappings require
00d0: 64 20 74 6f 20 72 65 6d 6f 76 65 20 61 6c 6c 0a  d to remove all.
00e0: 23 20 64 69 61 63 72 69 74 69 63 61 6c 20 6d 61  # diacritical ma
00f0: 72 6b 73 20 66 72 6f 6d 20 61 20 75 6e 69 63 6f  rks from a unico
0100: 64 65 20 73 74 72 69 6e 67 2e 20 45 61 63 68 20  de string. Each 
0110: 6d 61 70 70 69 6e 67 20 69 73 20 69 74 73 65 6c  mapping is itsel
0120: 66 20 61 20 6c 69 73 74 0a 23 20 63 6f 6e 73 69  f a list.# consi
0130: 73 74 69 6e 67 20 6f 66 20 74 77 6f 20 65 6c 65  sting of two ele
0140: 6d 65 6e 74 73 20 2d 20 74 68 65 20 75 6e 69 63  ments - the unic
0150: 6f 64 65 20 63 6f 64 65 70 6f 69 6e 74 20 61 6e  ode codepoint an
0160: 64 20 74 68 65 20 73 69 6e 67 6c 65 20 41 53 43  d the single ASC
0170: 49 49 0a 23 20 63 68 61 72 61 63 74 65 72 20 74  II.# character t
0180: 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65  hat it should be
0190: 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 2c 20   replaced with, 
01a0: 6f 72 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  or an empty stri
01b0: 6e 67 20 69 66 20 74 68 65 20 0a 23 20 63 6f 64  ng if the .# cod
01c0: 65 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 73 69  epoint should si
01d0: 6d 70 6c 79 20 62 65 20 72 65 6d 6f 76 65 64 20  mply be removed 
01e0: 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 2e 20  from the input. 
01f0: 45 78 61 6d 70 6c 65 73 3a 0a 23 0a 23 20 20 20  Examples:.#.#   
0200: 7b 20 32 32 34 20 61 20 20 7d 20 20 20 20 20 28  { 224 a  }     (
0210: 72 65 70 6c 61 63 65 20 63 6f 64 65 70 6f 69 6e  replace codepoin
0220: 74 20 32 32 34 20 74 6f 20 22 61 22 29 0a 23 20  t 224 to "a").# 
0230: 20 20 7b 20 37 36 39 20 22 22 20 7d 20 20 20 20    { 769 "" }    
0240: 20 28 72 65 6d 6f 76 65 20 63 6f 64 65 70 6f 69   (remove codepoi
0250: 6e 74 20 37 36 39 20 66 72 6f 6d 20 69 6e 70 75  nt 769 from inpu
0260: 74 29 0a 23 0a 23 20 4d 61 70 70 69 6e 67 73 20  t).#.# Mappings 
0270: 61 72 65 20 6f 6e 6c 79 20 72 65 74 75 72 6e 65  are only returne
0280: 64 20 66 6f 72 20 6e 6f 6e 2d 75 70 70 65 72 20  d for non-upper 
0290: 63 61 73 65 20 63 6f 64 65 70 6f 69 6e 74 73 2e  case codepoints.
02a0: 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 0a 23   It is assumed.#
02b0: 20 74 68 61 74 20 74 68 65 20 69 6e 70 75 74 20   that the input 
02c0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
02d0: 20 66 6f 6c 64 65 64 20 74 6f 20 6c 6f 77 65 72   folded to lower
02e0: 20 63 61 73 65 2e 0a 23 0a 70 72 6f 63 20 72 64   case..#.proc rd
02f0: 5f 6c 6f 61 64 5f 75 6e 69 63 6f 64 65 64 61 74  _load_unicodedat
0300: 61 5f 74 65 78 74 20 7b 7a 4e 61 6d 65 7d 20 7b  a_text {zName} {
0310: 0a 20 20 67 6c 6f 62 61 6c 20 74 6c 5f 6c 6f 6f  .  global tl_loo
0320: 6b 75 70 5f 74 61 62 6c 65 0a 0a 20 20 73 65 74  kup_table..  set
0330: 20 66 64 20 5b 6f 70 65 6e 20 24 7a 4e 61 6d 65   fd [open $zName
0340: 5d 0a 20 20 73 65 74 20 6c 46 69 65 6c 64 20 7b  ].  set lField {
0350: 0a 20 20 20 20 63 6f 64 65 0a 20 20 20 20 63 68  .    code.    ch
0360: 61 72 61 63 74 65 72 5f 6e 61 6d 65 0a 20 20 20  aracter_name.   
0370: 20 67 65 6e 65 72 61 6c 5f 63 61 74 65 67 6f 72   general_categor
0380: 79 0a 20 20 20 20 63 61 6e 6f 6e 69 63 61 6c 5f  y.    canonical_
0390: 63 6f 6d 62 69 6e 69 6e 67 5f 63 6c 61 73 73 65  combining_classe
03a0: 73 0a 20 20 20 20 62 69 64 69 72 65 63 74 69 6f  s.    bidirectio
03b0: 6e 61 6c 5f 63 61 74 65 67 6f 72 79 0a 20 20 20  nal_category.   
03c0: 20 63 68 61 72 61 63 74 65 72 5f 64 65 63 6f 6d   character_decom
03d0: 70 6f 73 69 74 69 6f 6e 5f 6d 61 70 70 69 6e 67  position_mapping
03e0: 0a 20 20 20 20 64 65 63 69 6d 61 6c 5f 64 69 67  .    decimal_dig
03f0: 69 74 5f 76 61 6c 75 65 0a 20 20 20 20 64 69 67  it_value.    dig
0400: 69 74 5f 76 61 6c 75 65 0a 20 20 20 20 6e 75 6d  it_value.    num
0410: 65 72 69 63 5f 76 61 6c 75 65 0a 20 20 20 20 6d  eric_value.    m
0420: 69 72 72 6f 72 65 64 0a 20 20 20 20 75 6e 69 63  irrored.    unic
0430: 6f 64 65 5f 31 5f 6e 61 6d 65 0a 20 20 20 20 69  ode_1_name.    i
0440: 73 6f 31 30 36 34 36 5f 63 6f 6d 6d 65 6e 74 5f  so10646_comment_
0450: 66 69 65 6c 64 0a 20 20 20 20 75 70 70 65 72 63  field.    upperc
0460: 61 73 65 5f 6d 61 70 70 69 6e 67 0a 20 20 20 20  ase_mapping.    
0470: 6c 6f 77 65 72 63 61 73 65 5f 6d 61 70 70 69 6e  lowercase_mappin
0480: 67 0a 20 20 20 20 74 69 74 6c 65 63 61 73 65 5f  g.    titlecase_
0490: 6d 61 70 70 69 6e 67 0a 20 20 7d 0a 20 20 73 65  mapping.  }.  se
04a0: 74 20 6c 52 65 74 20 5b 6c 69 73 74 5d 0a 0a 20  t lRet [list].. 
04b0: 20 77 68 69 6c 65 20 7b 20 21 5b 65 6f 66 20 24   while { ![eof $
04c0: 66 64 5d 20 7d 20 7b 0a 20 20 20 20 73 65 74 20  fd] } {.    set 
04d0: 6c 69 6e 65 20 5b 67 65 74 73 20 24 66 64 5d 0a  line [gets $fd].
04e0: 20 20 20 20 69 66 20 7b 24 6c 69 6e 65 20 3d 3d      if {$line ==
04f0: 20 22 22 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 20   ""} continue.. 
0500: 20 20 20 73 65 74 20 66 69 65 6c 64 73 20 5b 73     set fields [s
0510: 70 6c 69 74 20 24 6c 69 6e 65 20 22 3b 22 5d 0a  plit $line ";"].
0520: 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68      if {[llength
0530: 20 24 66 69 65 6c 64 73 5d 20 21 3d 20 5b 6c 6c   $fields] != [ll
0540: 65 6e 67 74 68 20 24 6c 46 69 65 6c 64 5d 7d 20  ength $lField]} 
0550: 7b 20 65 72 72 6f 72 20 22 70 61 72 73 65 20 65  { error "parse e
0560: 72 72 6f 72 3a 20 24 6c 69 6e 65 22 20 7d 0a 20  rror: $line" }. 
0570: 20 20 20 66 6f 72 65 61 63 68 20 24 6c 46 69 65     foreach $lFie
0580: 6c 64 20 24 66 69 65 6c 64 73 20 7b 7d 0a 20 20  ld $fields {}.  
0590: 20 20 69 66 20 7b 20 5b 6c 6c 65 6e 67 74 68 20    if { [llength 
05a0: 24 63 68 61 72 61 63 74 65 72 5f 64 65 63 6f 6d  $character_decom
05b0: 70 6f 73 69 74 69 6f 6e 5f 6d 61 70 70 69 6e 67  position_mapping
05c0: 5d 21 3d 32 0a 20 20 20 20 20 20 7c 7c 20 5b 73  ]!=2.      || [s
05d0: 74 72 69 6e 67 20 69 73 20 78 64 69 67 69 74 20  tring is xdigit 
05e0: 5b 6c 69 6e 64 65 78 20 24 63 68 61 72 61 63 74  [lindex $charact
05f0: 65 72 5f 64 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  er_decomposition
0600: 5f 6d 61 70 70 69 6e 67 20 30 5d 5d 3d 3d 30 0a  _mapping 0]]==0.
0610: 20 20 20 20 7d 20 7b 0a 20 20 20 20 20 20 63 6f      } {.      co
0620: 6e 74 69 6e 75 65 0a 20 20 20 20 7d 0a 0a 20 20  ntinue.    }..  
0630: 20 20 73 65 74 20 69 43 6f 64 65 20 20 5b 65 78    set iCode  [ex
0640: 70 72 20 22 30 78 24 63 6f 64 65 22 5d 0a 20 20  pr "0x$code"].  
0650: 20 20 73 65 74 20 69 41 73 63 69 69 20 5b 65 78    set iAscii [ex
0660: 70 72 20 22 30 78 5b 6c 69 6e 64 65 78 20 24 63  pr "0x[lindex $c
0670: 68 61 72 61 63 74 65 72 5f 64 65 63 6f 6d 70 6f  haracter_decompo
0680: 73 69 74 69 6f 6e 5f 6d 61 70 70 69 6e 67 20 30  sition_mapping 0
0690: 5d 22 5d 0a 20 20 20 20 73 65 74 20 69 44 69 61  ]"].    set iDia
06a0: 20 20 20 5b 65 78 70 72 20 22 30 78 5b 6c 69 6e     [expr "0x[lin
06b0: 64 65 78 20 24 63 68 61 72 61 63 74 65 72 5f 64  dex $character_d
06c0: 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 5f 6d 61 70  ecomposition_map
06d0: 70 69 6e 67 20 31 5d 22 5d 0a 0a 20 20 20 20 69  ping 1]"]..    i
06e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
06f0: 74 6c 5f 6c 6f 6f 6b 75 70 5f 74 61 62 6c 65 28  tl_lookup_table(
0700: 24 69 43 6f 64 65 29 5d 7d 20 63 6f 6e 74 69 6e  $iCode)]} contin
0710: 75 65 0a 0a 20 20 20 20 69 66 20 7b 20 28 24 69  ue..    if { ($i
0720: 41 73 63 69 69 20 3e 3d 20 39 37 20 26 26 20 24  Ascii >= 97 && $
0730: 69 41 73 63 69 69 20 3c 3d 20 31 32 32 29 0a 20  iAscii <= 122). 
0740: 20 20 20 20 20 7c 7c 20 28 24 69 41 73 63 69 69       || ($iAscii
0750: 20 3e 3d 20 36 35 20 26 26 20 24 69 41 73 63 69   >= 65 && $iAsci
0760: 69 20 3c 3d 20 39 30 29 0a 20 20 20 20 7d 20 7b  i <= 90).    } {
0770: 0a 20 20 20 20 20 20 6c 61 70 70 65 6e 64 20 6c  .      lappend l
0780: 52 65 74 20 5b 6c 69 73 74 20 24 69 43 6f 64 65  Ret [list $iCode
0790: 20 5b 73 74 72 69 6e 67 20 74 6f 6c 6f 77 65 72   [string tolower
07a0: 20 5b 66 6f 72 6d 61 74 20 25 63 20 24 69 41 73   [format %c $iAs
07b0: 63 69 69 5d 5d 5d 0a 20 20 20 20 20 20 73 65 74  cii]]].      set
07c0: 20 64 69 61 28 24 69 44 69 61 29 20 31 0a 20 20   dia($iDia) 1.  
07d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 6f 72 65 61    }.  }..  forea
07e0: 63 68 20 64 20 5b 61 72 72 61 79 20 6e 61 6d 65  ch d [array name
07f0: 73 20 64 69 61 5d 20 7b 0a 20 20 20 20 6c 61 70  s dia] {.    lap
0800: 70 65 6e 64 20 6c 52 65 74 20 5b 6c 69 73 74 20  pend lRet [list 
0810: 24 64 20 22 22 5d 0a 20 20 7d 0a 20 20 73 65 74  $d ""].  }.  set
0820: 20 6c 52 65 74 20 5b 6c 73 6f 72 74 20 2d 69 6e   lRet [lsort -in
0830: 74 65 67 65 72 20 2d 69 6e 64 65 78 20 30 20 24  teger -index 0 $
0840: 6c 52 65 74 5d 0a 0a 20 20 63 6c 6f 73 65 20 24  lRet]..  close $
0850: 66 64 0a 20 20 73 65 74 20 6c 52 65 74 0a 7d 0a  fd.  set lRet.}.
0860: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 50 61  -----------.# Pa
08b0: 72 61 6d 65 74 65 72 20 24 7a 4e 61 6d 65 20 6d  rameter $zName m
08c0: 75 73 74 20 62 65 20 61 20 70 61 74 68 20 74 6f  ust be a path to
08d0: 20 74 68 65 20 66 69 6c 65 20 55 6e 69 63 6f 64   the file Unicod
08e0: 65 44 61 74 61 2e 74 78 74 2e 20 54 68 69 73 20  eData.txt. This 
08f0: 63 6f 6d 6d 61 6e 64 0a 23 20 72 65 61 64 73 20  command.# reads 
0900: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65 74  the file and ret
0910: 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 63  urns a list of c
0920: 6f 64 65 70 6f 69 6e 74 73 20 28 69 6e 74 65 67  odepoints (integ
0930: 65 72 73 29 2e 20 54 68 65 20 6c 69 73 74 0a 23  ers). The list.#
0940: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 63 6f   contains all co
0950: 64 65 70 6f 69 6e 74 73 20 69 6e 20 74 68 65 20  depoints in the 
0960: 55 6e 69 63 6f 64 65 44 61 74 61 2e 74 78 74 20  UnicodeData.txt 
0970: 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6e 79 20  assigned to any 
0980: 22 47 65 6e 65 72 61 6c 0a 23 20 43 61 74 65 67  "General.# Categ
0990: 6f 72 79 22 20 74 68 61 74 20 69 73 20 6e 6f 74  ory" that is not
09a0: 20 61 20 22 4c 65 74 74 65 72 22 20 6f 72 20 22   a "Letter" or "
09b0: 4e 75 6d 62 65 72 22 2e 0a 23 0a 70 72 6f 63 20  Number"..#.proc 
09c0: 61 6e 5f 6c 6f 61 64 5f 75 6e 69 63 6f 64 65 64  an_load_unicoded
09d0: 61 74 61 5f 74 65 78 74 20 7b 7a 4e 61 6d 65 7d  ata_text {zName}
09e0: 20 7b 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65   {.  set fd [ope
09f0: 6e 20 24 7a 4e 61 6d 65 5d 0a 20 20 73 65 74 20  n $zName].  set 
0a00: 6c 46 69 65 6c 64 20 7b 0a 20 20 20 20 63 6f 64  lField {.    cod
0a10: 65 0a 20 20 20 20 63 68 61 72 61 63 74 65 72 5f  e.    character_
0a20: 6e 61 6d 65 0a 20 20 20 20 67 65 6e 65 72 61 6c  name.    general
0a30: 5f 63 61 74 65 67 6f 72 79 0a 20 20 20 20 63 61  _category.    ca
0a40: 6e 6f 6e 69 63 61 6c 5f 63 6f 6d 62 69 6e 69 6e  nonical_combinin
0a50: 67 5f 63 6c 61 73 73 65 73 0a 20 20 20 20 62 69  g_classes.    bi
0a60: 64 69 72 65 63 74 69 6f 6e 61 6c 5f 63 61 74 65  directional_cate
0a70: 67 6f 72 79 0a 20 20 20 20 63 68 61 72 61 63 74  gory.    charact
0a80: 65 72 5f 64 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  er_decomposition
0a90: 5f 6d 61 70 70 69 6e 67 0a 20 20 20 20 64 65 63  _mapping.    dec
0aa0: 69 6d 61 6c 5f 64 69 67 69 74 5f 76 61 6c 75 65  imal_digit_value
0ab0: 0a 20 20 20 20 64 69 67 69 74 5f 76 61 6c 75 65  .    digit_value
0ac0: 0a 20 20 20 20 6e 75 6d 65 72 69 63 5f 76 61 6c  .    numeric_val
0ad0: 75 65 0a 20 20 20 20 6d 69 72 72 6f 72 65 64 0a  ue.    mirrored.
0ae0: 20 20 20 20 75 6e 69 63 6f 64 65 5f 31 5f 6e 61      unicode_1_na
0af0: 6d 65 0a 20 20 20 20 69 73 6f 31 30 36 34 36 5f  me.    iso10646_
0b00: 63 6f 6d 6d 65 6e 74 5f 66 69 65 6c 64 0a 20 20  comment_field.  
0b10: 20 20 75 70 70 65 72 63 61 73 65 5f 6d 61 70 70    uppercase_mapp
0b20: 69 6e 67 0a 20 20 20 20 6c 6f 77 65 72 63 61 73  ing.    lowercas
0b30: 65 5f 6d 61 70 70 69 6e 67 0a 20 20 20 20 74 69  e_mapping.    ti
0b40: 74 6c 65 63 61 73 65 5f 6d 61 70 70 69 6e 67 0a  tlecase_mapping.
0b50: 20 20 7d 0a 20 20 73 65 74 20 6c 52 65 74 20 5b    }.  set lRet [
0b60: 6c 69 73 74 5d 0a 0a 20 20 77 68 69 6c 65 20 7b  list]..  while {
0b70: 20 21 5b 65 6f 66 20 24 66 64 5d 20 7d 20 7b 0a   ![eof $fd] } {.
0b80: 20 20 20 20 73 65 74 20 6c 69 6e 65 20 5b 67 65      set line [ge
0b90: 74 73 20 24 66 64 5d 0a 20 20 20 20 69 66 20 7b  ts $fd].    if {
0ba0: 24 6c 69 6e 65 20 3d 3d 20 22 22 7d 20 63 6f 6e  $line == ""} con
0bb0: 74 69 6e 75 65 0a 0a 20 20 20 20 73 65 74 20 66  tinue..    set f
0bc0: 69 65 6c 64 73 20 5b 73 70 6c 69 74 20 24 6c 69  ields [split $li
0bd0: 6e 65 20 22 3b 22 5d 0a 20 20 20 20 69 66 20 7b  ne ";"].    if {
0be0: 5b 6c 6c 65 6e 67 74 68 20 24 66 69 65 6c 64 73  [llength $fields
0bf0: 5d 20 21 3d 20 5b 6c 6c 65 6e 67 74 68 20 24 6c  ] != [llength $l
0c00: 46 69 65 6c 64 5d 7d 20 7b 20 65 72 72 6f 72 20  Field]} { error 
0c10: 22 70 61 72 73 65 20 65 72 72 6f 72 3a 20 24 6c  "parse error: $l
0c20: 69 6e 65 22 20 7d 0a 20 20 20 20 66 6f 72 65 61  ine" }.    forea
0c30: 63 68 20 24 6c 46 69 65 6c 64 20 24 66 69 65 6c  ch $lField $fiel
0c40: 64 73 20 7b 7d 0a 0a 20 20 20 20 73 65 74 20 69  ds {}..    set i
0c50: 43 6f 64 65 20 5b 65 78 70 72 20 22 30 78 24 63  Code [expr "0x$c
0c60: 6f 64 65 22 5d 0a 20 20 20 20 73 65 74 20 62 41  ode"].    set bA
0c70: 6c 6e 75 6d 20 5b 65 78 70 72 20 7b 0a 20 20 20  lnum [expr {.   
0c80: 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 7b        [lsearch {
0c90: 4c 20 4e 7d 20 5b 73 74 72 69 6e 67 20 72 61 6e  L N} [string ran
0ca0: 67 65 20 24 67 65 6e 65 72 61 6c 5f 63 61 74 65  ge $general_cate
0cb0: 67 6f 72 79 20 30 20 30 5d 5d 20 3e 3d 20 30 0a  gory 0 0]] >= 0.
0cc0: 20 20 20 20 20 20 7c 7c 20 24 67 65 6e 65 72 61        || $genera
0cd0: 6c 5f 63 61 74 65 67 6f 72 79 3d 3d 22 43 6f 22  l_category=="Co"
0ce0: 0a 20 20 20 20 7d 5d 0a 0a 20 20 20 20 69 66 20  .    }]..    if 
0cf0: 7b 20 21 24 62 41 6c 6e 75 6d 20 7d 20 7b 20 6c  { !$bAlnum } { l
0d00: 61 70 70 65 6e 64 20 6c 52 65 74 20 24 69 43 6f  append lRet $iCo
0d10: 64 65 20 7d 0a 20 20 7d 0a 0a 20 20 63 6c 6f 73  de }.  }..  clos
0d20: 65 20 24 66 64 0a 20 20 73 65 74 20 6c 52 65 74  e $fd.  set lRet
0d30: 0a 7d 0a 0a 70 72 6f 63 20 74 6c 5f 6c 6f 61 64  .}..proc tl_load
0d40: 5f 63 61 73 65 66 6f 6c 64 69 6e 67 5f 74 78 74  _casefolding_txt
0d50: 20 7b 7a 4e 61 6d 65 7d 20 7b 0a 20 20 67 6c 6f   {zName} {.  glo
0d60: 62 61 6c 20 74 6c 5f 6c 6f 6f 6b 75 70 5f 74 61  bal tl_lookup_ta
0d70: 62 6c 65 0a 0a 20 20 73 65 74 20 66 64 20 5b 6f  ble..  set fd [o
0d80: 70 65 6e 20 24 7a 4e 61 6d 65 5d 0a 20 20 77 68  pen $zName].  wh
0d90: 69 6c 65 20 7b 20 21 5b 65 6f 66 20 24 66 64 5d  ile { ![eof $fd]
0da0: 20 7d 20 7b 0a 20 20 20 20 73 65 74 20 6c 69 6e   } {.    set lin
0db0: 65 20 5b 67 65 74 73 20 24 66 64 5d 0a 20 20 20  e [gets $fd].   
0dc0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 72 61 6e   if {[string ran
0dd0: 67 65 20 24 6c 69 6e 65 20 30 20 30 5d 20 3d 3d  ge $line 0 0] ==
0de0: 20 22 23 22 7d 20 63 6f 6e 74 69 6e 75 65 0a 20   "#"} continue. 
0df0: 20 20 20 69 66 20 7b 24 6c 69 6e 65 20 3d 3d 20     if {$line == 
0e00: 22 22 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 20 20  ""} continue..  
0e10: 20 20 66 6f 72 65 61 63 68 20 78 20 7b 61 20 62    foreach x {a b
0e20: 20 63 20 64 7d 20 7b 75 6e 73 65 74 20 2d 6e 6f   c d} {unset -no
0e30: 63 6f 6d 70 6c 61 69 6e 20 24 78 7d 0a 20 20 20  complain $x}.   
0e40: 20 66 6f 72 65 61 63 68 20 7b 61 20 62 20 63 20   foreach {a b c 
0e50: 64 7d 20 5b 73 70 6c 69 74 20 24 6c 69 6e 65 20  d} [split $line 
0e60: 22 3b 22 5d 20 7b 7d 0a 0a 20 20 20 20 73 65 74  ";"] {}..    set
0e70: 20 61 32 20 5b 6c 69 73 74 5d 0a 20 20 20 20 73   a2 [list].    s
0e80: 65 74 20 63 32 20 5b 6c 69 73 74 5d 0a 20 20 20  et c2 [list].   
0e90: 20 66 6f 72 65 61 63 68 20 65 6c 65 6d 20 24 61   foreach elem $a
0ea0: 20 7b 20 6c 61 70 70 65 6e 64 20 61 32 20 5b 65   { lappend a2 [e
0eb0: 78 70 72 20 22 30 78 5b 73 74 72 69 6e 67 20 74  xpr "0x[string t
0ec0: 72 69 6d 20 24 65 6c 65 6d 5d 22 5d 20 7d 0a 20  rim $elem]"] }. 
0ed0: 20 20 20 66 6f 72 65 61 63 68 20 65 6c 65 6d 20     foreach elem 
0ee0: 24 63 20 7b 20 6c 61 70 70 65 6e 64 20 63 32 20  $c { lappend c2 
0ef0: 5b 65 78 70 72 20 22 30 78 5b 73 74 72 69 6e 67  [expr "0x[string
0f00: 20 74 72 69 6d 20 24 65 6c 65 6d 5d 22 5d 20 7d   trim $elem]"] }
0f10: 0a 20 20 20 20 73 65 74 20 62 20 5b 73 74 72 69  .    set b [stri
0f20: 6e 67 20 74 72 69 6d 20 24 62 5d 0a 20 20 20 20  ng trim $b].    
0f30: 73 65 74 20 64 20 5b 73 74 72 69 6e 67 20 74 72  set d [string tr
0f40: 69 6d 20 24 64 5d 0a 0a 20 20 20 20 69 66 20 7b  im $d]..    if {
0f50: 24 62 3d 3d 22 43 22 20 7c 7c 20 24 62 3d 3d 22  $b=="C" || $b=="
0f60: 53 22 7d 20 7b 20 73 65 74 20 74 6c 5f 6c 6f 6f  S"} { set tl_loo
0f70: 6b 75 70 5f 74 61 62 6c 65 28 24 61 32 29 20 24  kup_table($a2) $
0f80: 63 32 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a           c2 }.  }.}...