/ Hex Artifact Content
Login

Artifact ab0543a3b2399092ea2dd75df1bef333405b0d7f6b8c4951a0fbb60e780cb69f:


0000: 0a 73 6f 75 72 63 65 20 5b 66 69 6c 65 20 6a 6f  .source [file jo
0010: 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65  in [file dirname
0020: 20 5b 69 6e 66 6f 20 73 63 72 69 70 74 5d 5d 20   [info script]] 
0030: 70 61 72 73 65 75 6e 69 63 6f 64 65 2e 74 63 6c  parseunicode.tcl
0040: 5d 0a 0a 70 72 6f 63 20 70 72 69 6e 74 5f 72 64  ]..proc print_rd
0050: 20 7b 6d 61 70 7d 20 7b 0a 20 20 67 6c 6f 62 61   {map} {.  globa
0060: 6c 20 74 6c 5f 6c 6f 6f 6b 75 70 5f 74 61 62 6c  l tl_lookup_tabl
0070: 65 0a 20 20 73 65 74 20 61 43 68 61 72 20 5b 6c  e.  set aChar [l
0080: 69 73 74 5d 0a 20 20 73 65 74 20 6c 52 61 6e 67  ist].  set lRang
0090: 65 20 5b 6c 69 73 74 5d 0a 0a 20 20 73 65 74 20  e [list]..  set 
00a0: 6e 52 61 6e 67 65 20 31 0a 20 20 73 65 74 20 69  nRange 1.  set i
00b0: 46 69 72 73 74 20 20 5b 6c 69 6e 64 65 78 20 24  First  [lindex $
00c0: 6d 61 70 20 30 20 30 5d 0a 20 20 73 65 74 20 63  map 0 0].  set c
00d0: 50 72 65 76 20 20 20 5b 6c 69 6e 64 65 78 20 24  Prev   [lindex $
00e0: 6d 61 70 20 30 20 31 5d 0a 0a 20 20 66 6f 72 65  map 0 1]..  fore
00f0: 61 63 68 20 6d 20 5b 6c 72 61 6e 67 65 20 24 6d  ach m [lrange $m
0100: 61 70 20 31 20 65 6e 64 5d 20 7b 0a 20 20 20 20  ap 1 end] {.    
0110: 66 6f 72 65 61 63 68 20 7b 69 20 63 7d 20 24 6d  foreach {i c} $m
0120: 20 7b 7d 0a 0a 20 20 20 20 69 66 20 7b 24 63 50   {}..    if {$cP
0130: 72 65 76 20 3d 3d 20 24 63 7d 20 7b 0a 20 20 20  rev == $c} {.   
0140: 20 20 20 66 6f 72 20 7b 73 65 74 20 6a 20 5b 65     for {set j [e
0150: 78 70 72 20 24 69 46 69 72 73 74 2b 24 6e 52 61  xpr $iFirst+$nRa
0160: 6e 67 65 5d 7d 20 7b 24 6a 3c 24 69 7d 20 7b 69  nge]} {$j<$i} {i
0170: 6e 63 72 20 6a 7d 20 7b 0a 20 20 20 20 20 20 20  ncr j} {.       
0180: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
0190: 73 20 74 6c 5f 6c 6f 6f 6b 75 70 5f 74 61 62 6c  s tl_lookup_tabl
01a0: 65 28 24 6a 29 5d 3d 3d 30 7d 20 62 72 65 61 6b  e($j)]==0} break
01b0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
01c0: 69 66 20 7b 24 6a 3d 3d 24 69 7d 20 7b 0a 20 20  if {$j==$i} {.  
01d0: 20 20 20 20 20 20 73 65 74 20 6e 4e 65 77 20 5b        set nNew [
01e0: 65 78 70 72 20 7b 28 31 20 2b 20 24 69 20 2d 20  expr {(1 + $i - 
01f0: 24 69 46 69 72 73 74 29 7d 5d 0a 20 20 20 20 20  $iFirst)}].     
0200: 20 20 20 69 66 20 7b 24 6e 4e 65 77 3c 3d 38 7d     if {$nNew<=8}
0210: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 74   {.          set
0220: 20 6e 52 61 6e 67 65 20 24 6e 4e 65 77 0a 20 20   nRange $nNew.  
0230: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
0240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
0250: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 61   }.    }..    la
0260: 70 70 65 6e 64 20 6c 52 61 6e 67 65 20 5b 6c 69  ppend lRange [li
0270: 73 74 20 24 69 46 69 72 73 74 20 24 6e 52 61 6e  st $iFirst $nRan
0280: 67 65 5d 0a 20 20 20 20 6c 61 70 70 65 6e 64 20  ge].    lappend 
0290: 61 43 68 61 72 20 20 24 63 50 72 65 76 0a 0a 20  aChar  $cPrev.. 
02a0: 20 20 20 73 65 74 20 69 46 69 72 73 74 20 24 69     set iFirst $i
02b0: 0a 20 20 20 20 73 65 74 20 63 50 72 65 76 20 20  .    set cPrev  
02c0: 24 63 0a 20 20 20 20 73 65 74 20 6e 52 61 6e 67  $c.    set nRang
02d0: 65 20 31 0a 20 20 7d 0a 20 20 6c 61 70 70 65 6e  e 1.  }.  lappen
02e0: 64 20 6c 52 61 6e 67 65 20 5b 6c 69 73 74 20 24  d lRange [list $
02f0: 69 46 69 72 73 74 20 24 6e 52 61 6e 67 65 5d 0a  iFirst $nRange].
0300: 20 20 6c 61 70 70 65 6e 64 20 61 43 68 61 72 20    lappend aChar 
0310: 24 63 50 72 65 76 0a 0a 20 20 70 75 74 73 20 22  $cPrev..  puts "
0320: 2f 2a 22 0a 20 20 70 75 74 73 20 22 2a 2a 20 49  /*".  puts "** I
0330: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
0340: 73 20 61 20 63 6f 64 65 70 6f 69 6e 74 20 63 6f  s a codepoint co
0350: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 61  rresponding to a
0360: 20 6c 6f 77 65 72 63 61 73 65 20 6c 65 74 74 65   lowercase lette
0370: 72 22 0a 20 20 70 75 74 73 20 22 2a 2a 20 69 6e  r".  puts "** in
0380: 20 74 68 65 20 41 53 43 49 49 20 72 61 6e 67 65   the ASCII range
0390: 20 77 69 74 68 20 61 20 64 69 61 63 72 69 74 69   with a diacriti
03a0: 63 20 61 64 64 65 64 2c 20 72 65 74 75 72 6e 20  c added, return 
03b0: 74 68 65 20 63 6f 64 65 70 6f 69 6e 74 22 0a 20  the codepoint". 
03c0: 20 70 75 74 73 20 22 2a 2a 20 6f 66 20 74 68 65   puts "** of the
03d0: 20 41 53 43 49 49 20 6c 65 74 74 65 72 20 6f 6e   ASCII letter on
03e0: 6c 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ly. For example,
03f0: 20 69 66 20 70 61 73 73 65 64 20 32 33 35 20 2d   if passed 235 -
0400: 20 5c 22 4c 41 54 49 4e 22 0a 20 20 70 75 74 73   \"LATIN".  puts
0410: 20 22 2a 2a 20 53 4d 41 4c 4c 20 4c 45 54 54 45   "** SMALL LETTE
0420: 52 20 45 20 57 49 54 48 20 44 49 41 45 52 45 53  R E WITH DIAERES
0430: 49 53 5c 22 20 2d 20 72 65 74 75 72 6e 20 36 35  IS\" - return 65
0440: 20 28 5c 22 4c 41 54 49 4e 20 53 4d 41 4c 4c 20   (\"LATIN SMALL 
0450: 4c 45 54 54 45 52 22 0a 20 20 70 75 74 73 20 22  LETTER".  puts "
0460: 2a 2a 20 45 5c 22 29 2e 20 54 68 65 20 72 65 73  ** E\"). The res
0470: 75 6c 73 20 6f 66 20 70 61 73 73 69 6e 67 20 61  uls of passing a
0480: 20 63 6f 64 65 70 6f 69 6e 74 20 74 68 61 74 20   codepoint that 
0490: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
04a0: 6e 22 0a 20 20 70 75 74 73 20 22 2a 2a 20 75 70  n".  puts "** up
04b0: 70 65 72 63 61 73 65 20 6c 65 74 74 65 72 20 61  percase letter a
04c0: 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 22 0a 20  re undefined.". 
04d0: 20 70 75 74 73 20 22 2a 2f 22 0a 20 20 70 75 74   puts "*/".  put
04e0: 73 20 22 73 74 61 74 69 63 20 69 6e 74 20 24 7b  s "static int ${
04f0: 3a 3a 72 65 6d 6f 76 65 5f 64 69 61 63 72 69 74  ::remove_diacrit
0500: 69 63 7d 28 69 6e 74 20 63 29 5c 7b 22 0a 20 20  ic}(int c)\{".  
0510: 70 75 74 73 20 22 20 20 75 6e 73 69 67 6e 65 64  puts "  unsigned
0520: 20 73 68 6f 72 74 20 61 44 69 61 5c 5b 5c 5d 20   short aDia\[\] 
0530: 3d 20 5c 7b 22 0a 20 20 70 75 74 73 20 2d 6e 6f  = \{".  puts -no
0540: 6e 65 77 6c 69 6e 65 20 22 20 20 20 20 20 20 20  newline "       
0550: 20 30 2c 20 22 0a 20 20 73 65 74 20 69 20 31 0a   0, ".  set i 1.
0560: 20 20 66 6f 72 65 61 63 68 20 72 20 24 6c 52 61    foreach r $lRa
0570: 6e 67 65 20 7b 0a 20 20 20 20 66 6f 72 65 61 63  nge {.    foreac
0580: 68 20 7b 69 43 6f 64 65 20 6e 52 61 6e 67 65 7d  h {iCode nRange}
0590: 20 24 72 20 7b 7d 0a 20 20 20 20 69 66 20 7b 28   $r {}.    if {(
05a0: 24 69 20 25 20 38 29 3d 3d 30 7d 20 7b 70 75 74  $i % 8)==0} {put
05b0: 73 20 22 22 20 3b 20 70 75 74 73 20 2d 6e 6f 6e  s "" ; puts -non
05c0: 65 77 6c 69 6e 65 20 22 20 20 20 20 22 20 7d 0a  ewline "    " }.
05d0: 20 20 20 20 69 6e 63 72 20 69 0a 0a 20 20 20 20      incr i..    
05e0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
05f0: 5b 66 6f 72 6d 61 74 20 22 25 35 64 22 20 5b 65  [format "%5d" [e
0600: 78 70 72 20 28 24 69 43 6f 64 65 3c 3c 33 29 20  xpr ($iCode<<3) 
0610: 2b 20 24 6e 52 61 6e 67 65 2d 31 5d 5d 0a 20 20  + $nRange-1]].  
0620: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
0630: 65 20 22 2c 20 22 0a 20 20 7d 0a 20 20 70 75 74  e ", ".  }.  put
0640: 73 20 22 22 0a 20 20 70 75 74 73 20 22 20 20 5c  s "".  puts "  \
0650: 7d 3b 22 0a 20 20 70 75 74 73 20 22 20 20 63 68  };".  puts "  ch
0660: 61 72 20 61 43 68 61 72 5c 5b 5c 5d 20 3d 20 5c  ar aChar\[\] = \
0670: 7b 22 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77  {".  puts -nonew
0680: 6c 69 6e 65 20 22 20 20 20 20 27 5c 5c 30 27 2c  line "    '\\0',
0690: 20 22 0a 20 20 73 65 74 20 69 20 31 0a 20 20 66   ".  set i 1.  f
06a0: 6f 72 65 61 63 68 20 63 20 24 61 43 68 61 72 20  oreach c $aChar 
06b0: 7b 0a 20 20 20 20 73 65 74 20 73 74 72 20 22 27  {.    set str "'
06c0: 24 63 27 2c 20 20 22 0a 20 20 20 20 69 66 20 7b  $c',  ".    if {
06d0: 24 63 20 3d 3d 20 22 22 7d 20 7b 20 73 65 74 20  $c == ""} { set 
06e0: 73 74 72 20 22 27 5c 5c 30 27 2c 20 22 20 7d 0a  str "'\\0', " }.
06f0: 0a 20 20 20 20 69 66 20 7b 28 24 69 20 25 20 31  .    if {($i % 1
0700: 32 29 3d 3d 30 7d 20 7b 70 75 74 73 20 22 22 20  2)==0} {puts "" 
0710: 3b 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e  ; puts -nonewlin
0720: 65 20 22 20 20 20 20 22 20 7d 0a 20 20 20 20 69  e "    " }.    i
0730: 6e 63 72 20 69 0a 20 20 20 20 70 75 74 73 20 2d  ncr i.    puts -
0740: 6e 6f 6e 65 77 6c 69 6e 65 20 22 24 73 74 72 22  nonewline "$str"
0750: 0a 20 20 7d 0a 20 20 70 75 74 73 20 22 22 0a 20  .  }.  puts "". 
0760: 20 70 75 74 73 20 22 20 20 5c 7d 3b 22 0a 20 20   puts "  \};".  
0770: 70 75 74 73 20 7b 0a 20 20 75 6e 73 69 67 6e 65  puts {.  unsigne
0780: 64 20 69 6e 74 20 6b 65 79 20 3d 20 28 28 28 75  d int key = (((u
0790: 6e 73 69 67 6e 65 64 20 69 6e 74 29 63 29 3c 3c  nsigned int)c)<<
07a0: 33 29 20 7c 20 30 78 30 30 30 30 30 30 30 37 3b  3) | 0x00000007;
07b0: 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20 30 3b  .  int iRes = 0;
07c0: 0a 20 20 69 6e 74 20 69 48 69 20 3d 20 73 69 7a  .  int iHi = siz
07d0: 65 6f 66 28 61 44 69 61 29 2f 73 69 7a 65 6f 66  eof(aDia)/sizeof
07e0: 28 61 44 69 61 5b 30 5d 29 20 2d 20 31 3b 0a 20  (aDia[0]) - 1;. 
07f0: 20 69 6e 74 20 69 4c 6f 20 3d 20 30 3b 0a 20 20   int iLo = 0;.  
0800: 77 68 69 6c 65 28 20 69 48 69 3e 3d 69 4c 6f 20  while( iHi>=iLo 
0810: 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 73 74  ){.    int iTest
0820: 20 3d 20 28 69 48 69 20 2b 20 69 4c 6f 29 20 2f   = (iHi + iLo) /
0830: 20 32 3b 0a 20 20 20 20 69 66 28 20 6b 65 79 20   2;.    if( key 
0840: 3e 3d 20 61 44 69 61 5b 69 54 65 73 74 5d 20 29  >= aDia[iTest] )
0850: 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
0860: 54 65 73 74 3b 0a 20 20 20 20 20 20 69 4c 6f 20  Test;.      iLo 
0870: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d  = iTest+1;.    }
0880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 48 69 20  else{.      iHi 
0890: 3d 20 69 54 65 73 74 2d 31 3b 0a 20 20 20 20 7d  = iTest-1;.    }
08a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6b  .  }.  assert( k
08b0: 65 79 3e 3d 61 44 69 61 5b 69 52 65 73 5d 20 29  ey>=aDia[iRes] )
08c0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 63 20 3e  ;.  return ((c >
08d0: 20 28 61 44 69 61 5b 69 52 65 73 5d 3e 3e 33 29   (aDia[iRes]>>3)
08e0: 20 2b 20 28 61 44 69 61 5b 69 52 65 73 5d 26 30   + (aDia[iRes]&0
08f0: 78 30 37 29 29 20 3f 20 63 20 3a 20 28 69 6e 74  x07)) ? c : (int
0900: 29 61 43 68 61 72 5b 69 52 65 73 5d 29 3b 7d 0a  )aChar[iRes]);}.
0910: 20 20 70 75 74 73 20 22 5c 7d 22 0a 7d 0a 0a 70    puts "\}".}..p
0920: 72 6f 63 20 70 72 69 6e 74 5f 69 73 64 69 61 63  roc print_isdiac
0930: 72 69 74 69 63 20 7b 7a 46 75 6e 63 20 6d 61 70  ritic {zFunc map
0940: 7d 20 7b 0a 0a 20 20 73 65 74 20 6c 43 6f 64 65  } {..  set lCode
0950: 20 5b 6c 69 73 74 5d 0a 20 20 66 6f 72 65 61 63   [list].  foreac
0960: 68 20 6d 20 24 6d 61 70 20 7b 0a 20 20 20 20 66  h m $map {.    f
0970: 6f 72 65 61 63 68 20 7b 63 6f 64 65 20 63 68 61  oreach {code cha
0980: 72 7d 20 24 6d 20 7b 7d 0a 20 20 20 20 69 66 20  r} $m {}.    if 
0990: 7b 24 63 6f 64 65 20 26 26 20 24 63 68 61 72 20  {$code && $char 
09a0: 3d 3d 20 22 22 7d 20 7b 20 6c 61 70 70 65 6e 64  == ""} { lappend
09b0: 20 6c 43 6f 64 65 20 24 63 6f 64 65 20 7d 0a 20   lCode $code }. 
09c0: 20 7d 0a 20 20 73 65 74 20 6c 43 6f 64 65 20 5b   }.  set lCode [
09d0: 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 24  lsort -integer $
09e0: 6c 43 6f 64 65 5d 0a 20 20 73 65 74 20 69 46 69  lCode].  set iFi
09f0: 72 73 74 20 5b 6c 69 6e 64 65 78 20 24 6c 43 6f  rst [lindex $lCo
0a00: 64 65 20 30 5d 0a 20 20 73 65 74 20 69 4c 61 73  de 0].  set iLas
0a10: 74 20 5b 6c 69 6e 64 65 78 20 24 6c 43 6f 64 65  t [lindex $lCode
0a20: 20 65 6e 64 5d 0a 0a 20 20 73 65 74 20 69 31 20   end]..  set i1 
0a30: 30 0a 20 20 73 65 74 20 69 32 20 30 0a 0a 20 20  0.  set i2 0..  
0a40: 66 6f 72 65 61 63 68 20 63 20 24 6c 43 6f 64 65  foreach c $lCode
0a50: 20 7b 0a 20 20 20 20 73 65 74 20 69 20 5b 65 78   {.    set i [ex
0a60: 70 72 20 24 63 20 2d 20 24 69 46 69 72 73 74 5d  pr $c - $iFirst]
0a70: 0a 20 20 20 20 69 66 20 7b 24 69 20 3c 20 33 32  .    if {$i < 32
0a80: 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 69 31  } {.      set i1
0a90: 20 5b 65 78 70 72 20 7b 24 69 31 20 7c 20 28 31   [expr {$i1 | (1
0aa0: 3c 3c 24 69 29 7d 5d 0a 20 20 20 20 7d 20 65 6c  <<$i)}].    } el
0ab0: 73 65 20 7b 0a 20 20 20 20 20 20 73 65 74 20 69  se {.      set i
0ac0: 32 20 5b 65 78 70 72 20 7b 24 69 32 20 7c 20 28  2 [expr {$i2 | (
0ad0: 31 3c 3c 28 24 69 2d 33 32 29 29 7d 5d 0a 20 20  1<<($i-32))}].  
0ae0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 75 74 73 20    }.  }..  puts 
0af0: 22 2f 2a 22 0a 20 20 70 75 74 73 20 22 2a 2a 20  "/*".  puts "** 
0b00: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
0b10: 68 65 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 65  he argument inte
0b20: 72 70 72 65 74 65 64 20 61 73 20 61 20 75 6e 69  rpreted as a uni
0b30: 63 6f 64 65 20 63 6f 64 65 70 6f 69 6e 74 22 20  code codepoint" 
0b40: 0a 20 20 70 75 74 73 20 22 2a 2a 20 69 73 20 61  .  puts "** is a
0b50: 20 64 69 61 63 72 69 74 69 63 61 6c 20 6d 6f 64   diacritical mod
0b60: 69 66 69 65 72 20 63 68 61 72 61 63 74 65 72 2e  ifier character.
0b70: 22 0a 20 20 70 75 74 73 20 22 2a 2f 22 0a 20 20  ".  puts "*/".  
0b80: 70 75 74 73 20 22 69 6e 74 20 24 7b 7a 46 75 6e  puts "int ${zFun
0b90: 63 7d 5c 28 69 6e 74 20 63 29 5c 7b 22 0a 20 20  c}\(int c)\{".  
0ba0: 70 75 74 73 20 22 20 20 75 6e 73 69 67 6e 65 64  puts "  unsigned
0bb0: 20 69 6e 74 20 6d 61 73 6b 30 20 3d 20 5b 66 6f   int mask0 = [fo
0bc0: 72 6d 61 74 20 22 30 78 25 30 38 58 22 20 24 69  rmat "0x%08X" $i
0bd0: 31 5d 3b 22 0a 20 20 70 75 74 73 20 22 20 20 75  1];".  puts "  u
0be0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d 61 73 6b  nsigned int mask
0bf0: 31 20 3d 20 5b 66 6f 72 6d 61 74 20 22 30 78 25  1 = [format "0x%
0c00: 30 38 58 22 20 24 69 32 5d 3b 22 0a 0a 20 20 70  08X" $i2];"..  p
0c10: 75 74 73 20 22 20 20 69 66 28 20 63 3c 24 69 46  uts "  if( c<$iF
0c20: 69 72 73 74 20 7c 7c 20 63 3e 24 69 4c 61 73 74  irst || c>$iLast
0c30: 20 29 20 72 65 74 75 72 6e 20 30 3b 22 0a 20 20   ) return 0;".  
0c40: 70 75 74 73 20 22 20 20 72 65 74 75 72 6e 20 28  puts "  return (
0c50: 63 20 3c 20 24 69 46 69 72 73 74 2b 33 32 29 20  c < $iFirst+32) 
0c60: 3f 22 0a 20 20 70 75 74 73 20 22 20 20 20 20 20  ?".  puts "     
0c70: 20 28 6d 61 73 6b 30 20 26 20 28 31 20 3c 3c 20   (mask0 & (1 << 
0c80: 28 63 2d 24 69 46 69 72 73 74 29 29 29 20 3a 22  (c-$iFirst))) :"
0c90: 0a 20 20 70 75 74 73 20 22 20 20 20 20 20 20 28  .  puts "      (
0ca0: 6d 61 73 6b 31 20 26 20 28 31 20 3c 3c 20 28 63  mask1 & (1 << (c
0cb0: 2d 24 69 46 69 72 73 74 2d 33 32 29 29 29 3b 22  -$iFirst-32)));"
0cc0: 0a 20 20 70 75 74 73 20 22 5c 7d 22 0a 7d 0a 0a  .  puts "\}".}..
0cd0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 70 72 6f  -----------..pro
0d20: 63 20 61 6e 5f 6c 6f 61 64 5f 73 65 70 61 72 61  c an_load_separa
0d30: 74 6f 72 5f 72 61 6e 67 65 73 20 7b 7d 20 7b 0a  tor_ranges {} {.
0d40: 20 20 67 6c 6f 62 61 6c 20 75 6e 69 63 6f 64 65    global unicode
0d50: 64 61 74 61 2e 74 78 74 0a 20 20 73 65 74 20 6c  data.txt.  set l
0d60: 53 65 70 20 5b 61 6e 5f 6c 6f 61 64 5f 75 6e 69  Sep [an_load_uni
0d70: 63 6f 64 65 64 61 74 61 5f 74 65 78 74 20 24 7b  codedata_text ${
0d80: 75 6e 69 63 6f 64 65 64 61 74 61 2e 74 78 74 7d  unicodedata.txt}
0d90: 5d 0a 20 20 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  ].  unset -nocom
0da0: 70 6c 61 69 6e 20 69 46 69 72 73 74 20 0a 20 20  plain iFirst .  
0db0: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
0dc0: 6e 20 6e 52 61 6e 67 65 20 0a 20 20 73 65 74 20  n nRange .  set 
0dd0: 6c 52 61 6e 67 65 20 5b 6c 69 73 74 5d 0a 20 20  lRange [list].  
0de0: 66 6f 72 65 61 63 68 20 73 65 70 20 24 6c 53 65  foreach sep $lSe
0df0: 70 20 7b 0a 20 20 20 20 69 66 20 7b 30 3d 3d 5b  p {.    if {0==[
0e00: 69 6e 66 6f 20 65 78 69 73 74 73 20 69 46 69 72  info exists iFir
0e10: 73 74 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  st]} {.      set
0e20: 20 69 46 69 72 73 74 20 24 73 65 70 0a 20 20 20   iFirst $sep.   
0e30: 20 20 20 73 65 74 20 6e 52 61 6e 67 65 20 31 0a     set nRange 1.
0e40: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 20 24      } elseif { $
0e50: 73 65 70 20 3d 3d 20 28 24 69 46 69 72 73 74 2b  sep == ($iFirst+
0e60: 24 6e 52 61 6e 67 65 29 20 7d 20 7b 0a 20 20 20  $nRange) } {.   
0e70: 20 20 20 69 6e 63 72 20 6e 52 61 6e 67 65 0a 20     incr nRange. 
0e80: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
0e90: 20 20 6c 61 70 70 65 6e 64 20 6c 52 61 6e 67 65    lappend lRange
0ea0: 20 5b 6c 69 73 74 20 24 69 46 69 72 73 74 20 24   [list $iFirst $
0eb0: 6e 52 61 6e 67 65 5d 0a 20 20 20 20 20 20 73 65  nRange].      se
0ec0: 74 20 69 46 69 72 73 74 20 24 73 65 70 0a 20 20  t iFirst $sep.  
0ed0: 20 20 20 20 73 65 74 20 6e 52 61 6e 67 65 20 31      set nRange 1
0ee0: 0a 20 20 20 20 7d 0a 20 20 7d 20 0a 20 20 6c 61  .    }.  } .  la
0ef0: 70 70 65 6e 64 20 6c 52 61 6e 67 65 20 5b 6c 69  ppend lRange [li
0f00: 73 74 20 24 69 46 69 72 73 74 20 24 6e 52 61 6e  st $iFirst $nRan
0f10: 67 65 5d 0a 20 20 73 65 74 20 6c 52 61 6e 67 65  ge].  set lRange
0f20: 0a 7d 0a 0a 70 72 6f 63 20 61 6e 5f 70 72 69 6e  .}..proc an_prin
0f30: 74 5f 72 61 6e 67 65 5f 61 72 72 61 79 20 7b 6c  t_range_array {l
0f40: 52 61 6e 67 65 7d 20 7b 0a 20 20 73 65 74 20 69  Range} {.  set i
0f50: 46 69 72 73 74 4d 61 78 20 30 0a 20 20 73 65 74  FirstMax 0.  set
0f60: 20 6e 52 61 6e 67 65 4d 61 78 20 30 0a 20 20 66   nRangeMax 0.  f
0f70: 6f 72 65 61 63 68 20 72 61 6e 67 65 20 24 6c 52  oreach range $lR
0f80: 61 6e 67 65 20 7b 0a 20 20 20 20 66 6f 72 65 61  ange {.    forea
0f90: 63 68 20 7b 69 46 69 72 73 74 20 6e 52 61 6e 67  ch {iFirst nRang
0fa0: 65 7d 20 24 72 61 6e 67 65 20 7b 7d 0a 20 20 20  e} $range {}.   
0fb0: 20 69 66 20 7b 24 69 46 69 72 73 74 20 3e 20 24   if {$iFirst > $
0fc0: 69 46 69 72 73 74 4d 61 78 7d 20 7b 73 65 74 20  iFirstMax} {set 
0fd0: 69 46 69 72 73 74 4d 61 78 20 24 69 46 69 72 73  iFirstMax $iFirs
0fe0: 74 7d 0a 20 20 20 20 69 66 20 7b 24 6e 52 61 6e  t}.    if {$nRan
0ff0: 67 65 20 3e 20 24 6e 52 61 6e 67 65 4d 61 78 7d  ge > $nRangeMax}
1000: 20 7b 73 65 74 20 6e 52 61 6e 67 65 4d 61 78 20   {set nRangeMax 
1010: 24 6e 52 61 6e 67 65 7d 0a 20 20 7d 0a 20 20 69  $nRange}.  }.  i
1020: 66 20 7b 24 69 46 69 72 73 74 4d 61 78 20 3e 3d  f {$iFirstMax >=
1030: 20 28 31 3c 3c 32 32 29 7d 20 7b 65 72 72 6f 72   (1<<22)} {error
1040: 20 22 66 69 72 73 74 2d 6d 61 78 20 69 73 20 74   "first-max is t
1050: 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 66 6f 72  oo large for for
1060: 6d 61 74 22 7d 0a 20 20 69 66 20 7b 24 6e 52 61  mat"}.  if {$nRa
1070: 6e 67 65 4d 61 78 20 3e 3d 20 28 31 3c 3c 31 30  ngeMax >= (1<<10
1080: 29 7d 20 7b 65 72 72 6f 72 20 22 72 61 6e 67 65  )} {error "range
1090: 2d 6d 61 78 20 69 73 20 74 6f 6f 20 6c 61 72 67  -max is too larg
10a0: 65 20 66 6f 72 20 66 6f 72 6d 61 74 22 7d 0a 0a  e for format"}..
10b0: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
10c0: 65 20 22 20 20 22 0a 20 20 70 75 74 73 20 5b 73  e "  ".  puts [s
10d0: 74 72 69 6e 67 20 74 72 69 6d 20 7b 0a 20 20 2f  tring trim {.  /
10e0: 2a 20 45 61 63 68 20 75 6e 73 69 67 6e 65 64 20  * Each unsigned 
10f0: 69 6e 74 65 67 65 72 20 69 6e 20 74 68 65 20 66  integer in the f
1100: 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 63  ollowing array c
1110: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 20  orresponds to a 
1120: 63 6f 6e 74 69 67 75 6f 75 73 0a 20 20 2a 2a 20  contiguous.  ** 
1130: 72 61 6e 67 65 20 6f 66 20 75 6e 69 63 6f 64 65  range of unicode
1140: 20 63 6f 64 65 70 6f 69 6e 74 73 20 74 68 61 74   codepoints that
1150: 20 61 72 65 20 6e 6f 74 20 65 69 74 68 65 72 20   are not either 
1160: 6c 65 74 74 65 72 73 20 6f 72 20 6e 75 6d 62 65  letters or numbe
1170: 72 73 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 63 6f  rs (i.e..  ** co
1180: 64 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68 69  depoints for whi
1190: 63 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ch this function
11a0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 30   should return 0
11b0: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  )..  **.  ** The
11c0: 20 6d 6f 73 74 20 73 69 67 6e 69 66 69 63 61 6e   most significan
11d0: 74 20 32 32 20 62 69 74 73 20 69 6e 20 65 61 63  t 22 bits in eac
11e0: 68 20 33 32 2d 62 69 74 20 76 61 6c 75 65 20 63  h 32-bit value c
11f0: 6f 6e 74 61 69 6e 20 74 68 65 20 66 69 72 73 74  ontain the first
1200: 20 0a 20 20 2a 2a 20 63 6f 64 65 70 6f 69 6e 74   .  ** codepoint
1210: 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 54   in the range. T
1220: 68 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69  he least signifi
1230: 63 61 6e 74 20 31 30 20 62 69 74 73 20 61 72 65  cant 10 bits are
1240: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
1250: 20 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20   ** the size of 
1260: 74 68 65 20 72 61 6e 67 65 20 28 61 6c 77 61 79  the range (alway
1270: 73 20 61 74 20 6c 65 61 73 74 20 31 29 2e 20 49  s at least 1). I
1280: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1290: 68 65 20 76 61 6c 75 65 20 0a 20 20 2a 2a 20 28  he value .  ** (
12a0: 28 43 3c 3c 32 32 29 20 2b 20 4e 29 20 72 65 70  (C<<22) + N) rep
12b0: 72 65 73 65 6e 74 73 20 61 20 72 61 6e 67 65 20  resents a range 
12c0: 6f 66 20 4e 20 63 6f 64 65 70 6f 69 6e 74 73 20  of N codepoints 
12d0: 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 63 6f  starting with co
12e0: 64 65 70 6f 69 6e 74 20 0a 20 20 2a 2a 20 43 2e  depoint .  ** C.
12f0: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
1300: 62 6c 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74  ble to represent
1310: 20 61 20 72 61 6e 67 65 20 6c 61 72 67 65 72 20   a range larger 
1320: 74 68 61 6e 20 31 30 32 33 20 63 6f 64 65 70 6f  than 1023 codepo
1330: 69 6e 74 73 20 0a 20 20 2a 2a 20 75 73 69 6e 67  ints .  ** using
1340: 20 74 68 69 73 20 66 6f 72 6d 61 74 2e 0a 20 20   this format..  
1350: 2a 2f 0a 20 20 7d 5d 0a 20 20 70 75 74 73 20 2d  */.  }].  puts -
1360: 6e 6f 6e 65 77 6c 69 6e 65 20 22 20 20 73 74 61  nonewline "  sta
1370: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
1380: 65 64 20 69 6e 74 20 61 45 6e 74 72 79 5c 5b 5c  ed int aEntry\[\
1390: 5d 20 3d 20 5c 7b 22 0a 20 20 73 65 74 20 69 20  ] = \{".  set i 
13a0: 30 0a 20 20 66 6f 72 65 61 63 68 20 72 61 6e 67  0.  foreach rang
13b0: 65 20 24 6c 52 61 6e 67 65 20 7b 0a 20 20 20 20  e $lRange {.    
13c0: 66 6f 72 65 61 63 68 20 7b 69 46 69 72 73 74 20  foreach {iFirst 
13d0: 6e 52 61 6e 67 65 7d 20 24 72 61 6e 67 65 20 7b  nRange} $range {
13e0: 7d 0a 20 20 20 20 73 65 74 20 75 33 32 20 5b 66  }.    set u32 [f
13f0: 6f 72 6d 61 74 20 22 30 78 25 30 38 58 22 20 5b  ormat "0x%08X" [
1400: 65 78 70 72 20 28 24 69 46 69 72 73 74 3c 3c 31  expr ($iFirst<<1
1410: 30 29 20 2b 20 24 6e 52 61 6e 67 65 5d 5d 0a 0a  0) + $nRange]]..
1420: 20 20 20 20 69 66 20 7b 28 24 69 20 25 20 35 29      if {($i % 5)
1430: 3d 3d 30 7d 20 7b 70 75 74 73 20 22 22 20 3b 20  ==0} {puts "" ; 
1440: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1450: 22 20 20 20 22 7d 0a 20 20 20 20 70 75 74 73 20  "   "}.    puts 
1460: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 20 24 75 33  -nonewline " $u3
1470: 32 2c 22 0a 20 20 20 20 69 6e 63 72 20 69 0a 20  2,".    incr i. 
1480: 20 7d 0a 20 20 70 75 74 73 20 22 22 0a 20 20 70   }.  puts "".  p
1490: 75 74 73 20 22 20 20 5c 7d 3b 22 0a 7d 0a 0a 70  uts "  \};".}..p
14a0: 72 6f 63 20 61 6e 5f 70 72 69 6e 74 5f 61 73 63  roc an_print_asc
14b0: 69 69 5f 62 69 74 6d 61 70 20 7b 6c 52 61 6e 67  ii_bitmap {lRang
14c0: 65 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 72  e} {.  foreach r
14d0: 61 6e 67 65 20 24 6c 52 61 6e 67 65 20 7b 0a 20  ange $lRange {. 
14e0: 20 20 20 66 6f 72 65 61 63 68 20 7b 69 46 69 72     foreach {iFir
14f0: 73 74 20 6e 52 61 6e 67 65 7d 20 24 72 61 6e 67  st nRange} $rang
1500: 65 20 7b 7d 0a 20 20 20 20 66 6f 72 20 7b 73 65  e {}.    for {se
1510: 74 20 69 20 24 69 46 69 72 73 74 7d 20 7b 24 69  t i $iFirst} {$i
1520: 20 3c 20 28 24 69 46 69 72 73 74 2b 24 6e 52 61   < ($iFirst+$nRa
1530: 6e 67 65 29 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  nge)} {incr i} {
1540: 0a 20 20 20 20 20 20 69 66 20 7b 24 69 3c 3d 31  .      if {$i<=1
1550: 32 37 7d 20 7b 20 73 65 74 20 61 28 24 69 29 20  27} { set a($i) 
1560: 31 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  1 }.    }.  }.. 
1570: 20 73 65 74 20 61 41 73 63 69 69 20 5b 6c 69 73   set aAscii [lis
1580: 74 20 30 20 30 20 30 20 30 5d 0a 20 20 66 6f 72  t 0 0 0 0].  for
1590: 65 61 63 68 20 6b 65 79 20 5b 61 72 72 61 79 20  each key [array 
15a0: 6e 61 6d 65 73 20 61 5d 20 7b 0a 20 20 20 20 73  names a] {.    s
15b0: 65 74 20 69 64 78 20 5b 65 78 70 72 20 24 6b 65  et idx [expr $ke
15c0: 79 20 3e 3e 20 35 5d 0a 20 20 20 20 6c 73 65 74  y >> 5].    lset
15d0: 20 61 41 73 63 69 69 20 24 69 64 78 20 5b 65 78   aAscii $idx [ex
15e0: 70 72 20 5b 6c 69 6e 64 65 78 20 24 61 41 73 63  pr [lindex $aAsc
15f0: 69 69 20 24 69 64 78 5d 20 7c 20 28 31 20 3c 3c  ii $idx] | (1 <<
1600: 20 28 24 6b 65 79 26 30 78 30 30 31 46 29 29 5d   ($key&0x001F))]
1610: 0a 20 20 7d 0a 0a 20 20 70 75 74 73 20 22 20 20  .  }..  puts "  
1620: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
1630: 69 67 6e 65 64 20 69 6e 74 20 61 41 73 63 69 69  igned int aAscii
1640: 5c 5b 34 5c 5d 20 3d 20 5c 7b 22 0a 20 20 70 75  \[4\] = \{".  pu
1650: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 20  ts -nonewline " 
1660: 20 20 22 0a 20 20 66 6f 72 65 61 63 68 20 76 20    ".  foreach v 
1670: 24 61 41 73 63 69 69 20 7b 20 70 75 74 73 20 2d  $aAscii { puts -
1680: 6e 6f 6e 65 77 6c 69 6e 65 20 5b 66 6f 72 6d 61  nonewline [forma
1690: 74 20 22 20 30 78 25 30 38 58 2c 22 20 24 76 5d  t " 0x%08X," $v]
16a0: 20 7d 0a 20 20 70 75 74 73 20 22 22 0a 20 20 70   }.  puts "".  p
16b0: 75 74 73 20 22 20 20 5c 7d 3b 22 0a 7d 0a 0a 70  uts "  \};".}..p
16c0: 72 6f 63 20 70 72 69 6e 74 5f 69 73 61 6c 6e 75  roc print_isalnu
16d0: 6d 20 7b 7a 46 75 6e 63 20 6c 52 61 6e 67 65 7d  m {zFunc lRange}
16e0: 20 7b 0a 20 20 70 75 74 73 20 22 2f 2a 22 0a 20   {.  puts "/*". 
16f0: 20 70 75 74 73 20 22 2a 2a 20 52 65 74 75 72 6e   puts "** Return
1700: 20 74 72 75 65 20 69 66 20 74 68 65 20 61 72 67   true if the arg
1710: 75 6d 65 6e 74 20 63 6f 72 72 65 73 70 6f 6e 64  ument correspond
1720: 73 20 74 6f 20 61 20 75 6e 69 63 6f 64 65 20 63  s to a unicode c
1730: 6f 64 65 70 6f 69 6e 74 22 0a 20 20 70 75 74 73  odepoint".  puts
1740: 20 22 2a 2a 20 63 6c 61 73 73 69 66 69 65 64 20   "** classified 
1750: 61 73 20 65 69 74 68 65 72 20 61 20 6c 65 74 74  as either a lett
1760: 65 72 20 6f 72 20 61 20 6e 75 6d 62 65 72 2e 20  er or a number. 
1770: 4f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e  Otherwise false.
1780: 22 0a 20 20 70 75 74 73 20 22 2a 2a 22 0a 20 20  ".  puts "**".  
1790: 70 75 74 73 20 22 2a 2a 20 54 68 65 20 72 65 73  puts "** The res
17a0: 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e  ults are undefin
17b0: 65 64 20 69 66 20 74 68 65 20 76 61 6c 75 65 20  ed if the value 
17c0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
17d0: 75 6e 63 74 69 6f 6e 22 0a 20 20 70 75 74 73 20  unction".  puts 
17e0: 22 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e  "** is less than
17f0: 20 7a 65 72 6f 2e 22 0a 20 20 70 75 74 73 20 22   zero.".  puts "
1800: 2a 2f 22 0a 20 20 70 75 74 73 20 22 69 6e 74 20  */".  puts "int 
1810: 24 7b 7a 46 75 6e 63 7d 5c 28 69 6e 74 20 63 29  ${zFunc}\(int c)
1820: 5c 7b 22 0a 20 20 61 6e 5f 70 72 69 6e 74 5f 72  \{".  an_print_r
1830: 61 6e 67 65 5f 61 72 72 61 79 20 24 6c 52 61 6e  ange_array $lRan
1840: 67 65 0a 20 20 61 6e 5f 70 72 69 6e 74 5f 61 73  ge.  an_print_as
1850: 63 69 69 5f 62 69 74 6d 61 70 20 24 6c 52 61 6e  cii_bitmap $lRan
1860: 67 65 0a 20 20 70 75 74 73 20 7b 0a 20 20 69 66  ge.  puts {.  if
1870: 28 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  ( (unsigned int)
1880: 63 3c 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74  c<128 ){.    ret
1890: 75 72 6e 20 28 20 28 61 41 73 63 69 69 5b 63 20  urn ( (aAscii[c 
18a0: 3e 3e 20 35 5d 20 26 20 28 28 75 6e 73 69 67 6e  >> 5] & ((unsign
18b0: 65 64 20 69 6e 74 29 31 20 3c 3c 20 28 63 20 26  ed int)1 << (c &
18c0: 20 30 78 30 30 31 46 29 29 29 3d 3d 30 20 29 3b   0x001F)))==0 );
18d0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 75 6e  .  }else if( (un
18e0: 73 69 67 6e 65 64 20 69 6e 74 29 63 3c 28 31 3c  signed int)c<(1<
18f0: 3c 32 32 29 20 29 7b 0a 20 20 20 20 75 6e 73 69  <22) ){.    unsi
1900: 67 6e 65 64 20 69 6e 74 20 6b 65 79 20 3d 20 28  gned int key = (
1910: 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 63  ((unsigned int)c
1920: 29 3c 3c 31 30 29 20 7c 20 30 78 30 30 30 30 30  )<<10) | 0x00000
1930: 33 46 46 3b 0a 20 20 20 20 69 6e 74 20 69 52 65  3FF;.    int iRe
1940: 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  s = 0;.    int i
1950: 48 69 20 3d 20 73 69 7a 65 6f 66 28 61 45 6e 74  Hi = sizeof(aEnt
1960: 72 79 29 2f 73 69 7a 65 6f 66 28 61 45 6e 74 72  ry)/sizeof(aEntr
1970: 79 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 20 20 69  y[0]) - 1;.    i
1980: 6e 74 20 69 4c 6f 20 3d 20 30 3b 0a 20 20 20 20  nt iLo = 0;.    
1990: 77 68 69 6c 65 28 20 69 48 69 3e 3d 69 4c 6f 20  while( iHi>=iLo 
19a0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 65  ){.      int iTe
19b0: 73 74 20 3d 20 28 69 48 69 20 2b 20 69 4c 6f 29  st = (iHi + iLo)
19c0: 20 2f 20 32 3b 0a 20 20 20 20 20 20 69 66 28 20   / 2;.      if( 
19d0: 6b 65 79 20 3e 3d 20 61 45 6e 74 72 79 5b 69 54  key >= aEntry[iT
19e0: 65 73 74 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  est] ){.        
19f0: 69 52 65 73 20 3d 20 69 54 65 73 74 3b 0a 20 20  iRes = iTest;.  
1a00: 20 20 20 20 20 20 69 4c 6f 20 3d 20 69 54 65 73        iLo = iTes
1a10: 74 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  t+1;.      }else
1a20: 7b 0a 20 20 20 20 20 20 20 20 69 48 69 20 3d 20  {.        iHi = 
1a30: 69 54 65 73 74 2d 31 3b 0a 20 20 20 20 20 20 7d  iTest-1;.      }
1a40: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1a50: 74 28 20 61 45 6e 74 72 79 5b 30 5d 3c 6b 65 79  t( aEntry[0]<key
1a60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a70: 6b 65 79 3e 3d 61 45 6e 74 72 79 5b 69 52 65 73  key>=aEntry[iRes
1a80: 5d 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ] );.    return 
1a90: 28 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  (((unsigned int)
1aa0: 63 29 20 3e 3d 20 28 28 61 45 6e 74 72 79 5b 69  c) >= ((aEntry[i
1ab0: 52 65 73 5d 3e 3e 31 30 29 20 2b 20 28 61 45 6e  Res]>>10) + (aEn
1ac0: 74 72 79 5b 69 52 65 73 5d 26 30 78 33 46 46 29  try[iRes]&0x3FF)
1ad0: 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ));.  }.  return
1ae0: 20 31 3b 7d 0a 20 20 70 75 74 73 20 22 5c 7d 22   1;}.  puts "\}"
1af0: 0a 7d 0a 0a 70 72 6f 63 20 70 72 69 6e 74 5f 74  .}..proc print_t
1b00: 65 73 74 5f 69 73 61 6c 6e 75 6d 20 7b 7a 46 75  est_isalnum {zFu
1b10: 6e 63 20 6c 52 61 6e 67 65 7d 20 7b 0a 20 20 66  nc lRange} {.  f
1b20: 6f 72 65 61 63 68 20 72 61 6e 67 65 20 24 6c 52  oreach range $lR
1b30: 61 6e 67 65 20 7b 0a 20 20 20 20 66 6f 72 65 61  ange {.    forea
1b40: 63 68 20 7b 69 46 69 72 73 74 20 6e 52 61 6e 67  ch {iFirst nRang
1b50: 65 7d 20 24 72 61 6e 67 65 20 7b 7d 0a 20 20 20  e} $range {}.   
1b60: 20 66 6f 72 20 7b 73 65 74 20 69 20 24 69 46 69   for {set i $iFi
1b70: 72 73 74 7d 20 7b 24 69 20 3c 20 28 24 69 46 69  rst} {$i < ($iFi
1b80: 72 73 74 2b 24 6e 52 61 6e 67 65 29 7d 20 7b 69  rst+$nRange)} {i
1b90: 6e 63 72 20 69 7d 20 7b 20 73 65 74 20 61 28 24  ncr i} { set a($
1ba0: 69 29 20 31 20 7d 0a 20 20 7d 0a 0a 20 20 70 75  i) 1 }.  }..  pu
1bb0: 74 73 20 22 73 74 61 74 69 63 20 69 6e 74 20 69  ts "static int i
1bc0: 73 61 6c 6e 75 6d 5f 74 65 73 74 28 69 6e 74 20  salnum_test(int 
1bd0: 2a 70 69 43 6f 64 65 29 5c 7b 22 0a 20 20 70 75  *piCode)\{".  pu
1be0: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 20  ts -nonewline " 
1bf0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
1c00: 41 6c 6e 75 6d 5c 5b 5c 5d 20 3d 20 5c 7b 22 0a  Alnum\[\] = \{".
1c10: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
1c20: 7b 24 69 20 3c 20 37 30 30 30 30 7d 20 7b 69 6e  {$i < 70000} {in
1c30: 63 72 20 69 7d 20 7b 0a 20 20 20 20 69 66 20 7b  cr i} {.    if {
1c40: 28 24 69 20 25 20 33 32 29 3d 3d 30 7d 20 7b 20  ($i % 32)==0} { 
1c50: 70 75 74 73 20 22 22 20 3b 20 70 75 74 73 20 2d  puts "" ; puts -
1c60: 6e 6f 6e 65 77 6c 69 6e 65 20 22 20 20 20 20 22  nonewline "    "
1c70: 20 7d 0a 20 20 20 20 73 65 74 20 62 46 6c 61 67   }.    set bFlag
1c80: 20 5b 65 78 70 72 20 21 5b 69 6e 66 6f 20 65 78   [expr ![info ex
1c90: 69 73 74 73 20 61 28 24 69 29 5d 5d 0a 20 20 20  ists a($i)]].   
1ca0: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
1cb0: 20 22 24 7b 62 46 6c 61 67 7d 2c 22 0a 20 20 7d   "${bFlag},".  }
1cc0: 0a 20 20 70 75 74 73 20 22 22 0a 20 20 70 75 74  .  puts "".  put
1cd0: 73 20 22 20 20 5c 7d 3b 22 0a 0a 20 20 70 75 74  s "  \};"..  put
1ce0: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 20 20  s -nonewline "  
1cf0: 69 6e 74 20 61 4c 61 72 67 65 53 65 70 5c 5b 5c  int aLargeSep\[\
1d00: 5d 20 3d 20 5c 7b 22 0a 20 20 73 65 74 20 69 20  ] = \{".  set i 
1d10: 30 0a 20 20 66 6f 72 65 61 63 68 20 69 53 65 70  0.  foreach iSep
1d20: 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72   [lsort -integer
1d30: 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 61 5d   [array names a]
1d40: 5d 20 7b 0a 20 20 20 20 69 66 20 7b 24 69 53 65  ] {.    if {$iSe
1d50: 70 3c 37 30 30 30 30 7d 20 63 6f 6e 74 69 6e 75  p<70000} continu
1d60: 65 0a 20 20 20 20 69 66 20 7b 28 24 69 20 25 20  e.    if {($i % 
1d70: 38 29 3d 3d 30 7d 20 7b 20 70 75 74 73 20 22 22  8)==0} { puts ""
1d80: 20 3b 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69   ; puts -nonewli
1d90: 6e 65 20 22 20 20 20 22 20 7d 0a 20 20 20 20 70  ne "   " }.    p
1da0: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22  uts -nonewline "
1db0: 20 24 69 53 65 70 2c 22 0a 20 20 20 20 69 6e 63   $iSep,".    inc
1dc0: 72 20 69 0a 20 20 7d 0a 20 20 70 75 74 73 20 22  r i.  }.  puts "
1dd0: 22 0a 20 20 70 75 74 73 20 22 20 20 5c 7d 3b 22  ".  puts "  \};"
1de0: 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69  .  puts -nonewli
1df0: 6e 65 20 22 20 20 69 6e 74 20 61 4c 61 72 67 65  ne "  int aLarge
1e00: 4f 74 68 65 72 5c 5b 5c 5d 20 3d 20 5c 7b 22 0a  Other\[\] = \{".
1e10: 20 20 73 65 74 20 69 20 30 0a 20 20 66 6f 72 65    set i 0.  fore
1e20: 61 63 68 20 69 53 65 70 20 5b 6c 73 6f 72 74 20  ach iSep [lsort 
1e30: 2d 69 6e 74 65 67 65 72 20 5b 61 72 72 61 79 20  -integer [array 
1e40: 6e 61 6d 65 73 20 61 5d 5d 20 7b 0a 20 20 20 20  names a]] {.    
1e50: 69 66 20 7b 24 69 53 65 70 3c 37 30 30 30 30 7d  if {$iSep<70000}
1e60: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 69 66   continue.    if
1e70: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 61   {[info exists a
1e80: 28 5b 65 78 70 72 20 24 69 53 65 70 2d 31 5d 29  ([expr $iSep-1])
1e90: 5d 3d 3d 30 7d 20 7b 0a 20 20 20 20 20 20 69 66  ]==0} {.      if
1ea0: 20 7b 28 24 69 20 25 20 38 29 3d 3d 30 7d 20 7b   {($i % 8)==0} {
1eb0: 20 70 75 74 73 20 22 22 20 3b 20 70 75 74 73 20   puts "" ; puts 
1ec0: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 20 20 20 22  -nonewline "   "
1ed0: 20 7d 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e   }.      puts -n
1ee0: 6f 6e 65 77 6c 69 6e 65 20 22 20 5b 65 78 70 72  onewline " [expr
1ef0: 20 24 69 53 65 70 2d 31 5d 2c 22 0a 20 20 20 20   $iSep-1],".    
1f00: 20 20 69 6e 63 72 20 69 0a 20 20 20 20 7d 0a 20    incr i.    }. 
1f10: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
1f20: 73 74 73 20 61 28 5b 65 78 70 72 20 24 69 53 65  sts a([expr $iSe
1f30: 70 2b 31 5d 29 5d 3d 3d 30 7d 20 7b 0a 20 20 20  p+1])]==0} {.   
1f40: 20 20 20 69 66 20 7b 28 24 69 20 25 20 38 29 3d     if {($i % 8)=
1f50: 3d 30 7d 20 7b 20 70 75 74 73 20 22 22 20 3b 20  =0} { puts "" ; 
1f60: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1f70: 22 20 20 20 22 20 7d 0a 20 20 20 20 20 20 70 75  "   " }.      pu
1f80: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 20  ts -nonewline " 
1f90: 5b 65 78 70 72 20 24 69 53 65 70 2b 31 5d 2c 22  [expr $iSep+1],"
1fa0: 0a 20 20 20 20 20 20 69 6e 63 72 20 69 0a 20 20  .      incr i.  
1fb0: 20 20 7d 0a 20 20 7d 0a 20 20 70 75 74 73 20 22    }.  }.  puts "
1fc0: 22 0a 20 20 70 75 74 73 20 22 20 20 5c 7d 3b 22  ".  puts "  \};"
1fd0: 0a 0a 20 20 70 75 74 73 20 5b 73 75 62 73 74 20  ..  puts [subst 
1fe0: 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 7b 0a 20 20  -nocommands {.  
1ff0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
2000: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 41 6c 6e 75  ; i<sizeof(aAlnu
2010: 6d 29 2f 73 69 7a 65 6f 66 28 61 41 6c 6e 75 6d  m)/sizeof(aAlnum
2020: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
2030: 69 66 28 20 24 7b 7a 46 75 6e 63 7d 28 69 29 21  if( ${zFunc}(i)!
2040: 3d 61 41 6c 6e 75 6d 5b 69 5d 20 29 7b 0a 20 20  =aAlnum[i] ){.  
2050: 20 20 20 20 2a 70 69 43 6f 64 65 20 3d 20 69 3b      *piCode = i;
2060: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2070: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
2080: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
2090: 4c 61 72 67 65 53 65 70 29 2f 73 69 7a 65 6f 66  LargeSep)/sizeof
20a0: 28 61 4c 61 72 67 65 53 65 70 5b 30 5d 29 3b 20  (aLargeSep[0]); 
20b0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 24 7b  i++){.    if( ${
20c0: 7a 46 75 6e 63 7d 28 61 4c 61 72 67 65 53 65 70  zFunc}(aLargeSep
20d0: 5b 69 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  [i])!=0 ){.     
20e0: 20 2a 70 69 43 6f 64 65 20 3d 20 61 4c 61 72 67   *piCode = aLarg
20f0: 65 53 65 70 5b 69 5d 3b 0a 20 20 20 20 20 20 72  eSep[i];.      r
2100: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2110: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
2120: 73 69 7a 65 6f 66 28 61 4c 61 72 67 65 4f 74 68  sizeof(aLargeOth
2130: 65 72 29 2f 73 69 7a 65 6f 66 28 61 4c 61 72 67  er)/sizeof(aLarg
2140: 65 4f 74 68 65 72 5b 30 5d 29 3b 20 69 2b 2b 29  eOther[0]); i++)
2150: 7b 0a 20 20 20 20 69 66 28 20 24 7b 7a 46 75 6e  {.    if( ${zFun
2160: 63 7d 28 61 4c 61 72 67 65 4f 74 68 65 72 5b 69  c}(aLargeOther[i
2170: 5d 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2a  ])!=1 ){.      *
2180: 70 69 43 6f 64 65 20 3d 20 61 4c 61 72 67 65 4f  piCode = aLargeO
2190: 74 68 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 72  ther[i];.      r
21a0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
21b0: 20 7d 0a 20 20 7d 5d 0a 20 20 70 75 74 73 20 22   }.  }].  puts "
21c0: 20 20 72 65 74 75 72 6e 20 30 3b 22 0a 20 20 70    return 0;".  p
21d0: 75 74 73 20 22 5c 7d 22 0a 7d 0a 0a 23 2d 2d 2d  uts "\}".}..#---
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2220: 2d 2d 2d 2d 2d 2d 0a 0a 70 72 6f 63 20 74 6c 5f  ------..proc tl_
2230: 63 72 65 61 74 65 5f 72 65 63 6f 72 64 73 20 7b  create_records {
2240: 7d 20 7b 0a 20 20 67 6c 6f 62 61 6c 20 74 6c 5f  } {.  global tl_
2250: 6c 6f 6f 6b 75 70 5f 74 61 62 6c 65 0a 0a 20 20  lookup_table..  
2260: 73 65 74 20 69 46 69 72 73 74 20 22 22 0a 20 20  set iFirst "".  
2270: 73 65 74 20 6e 4f 66 66 20 30 0a 20 20 73 65 74  set nOff 0.  set
2280: 20 6e 52 61 6e 67 65 20 30 0a 20 20 73 65 74 20   nRange 0.  set 
2290: 6e 49 6e 63 72 20 30 0a 0a 20 20 73 65 74 20 6c  nIncr 0..  set l
22a0: 52 65 63 6f 72 64 20 5b 6c 69 73 74 5d 0a 20 20  Record [list].  
22b0: 66 6f 72 65 61 63 68 20 63 6f 64 65 20 5b 6c 73  foreach code [ls
22c0: 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 5b 61 72  ort -integer [ar
22d0: 72 61 79 20 6e 61 6d 65 73 20 74 6c 5f 6c 6f 6f  ray names tl_loo
22e0: 6b 75 70 5f 74 61 62 6c 65 5d 5d 20 7b 0a 20 20  kup_table]] {.  
22f0: 20 20 73 65 74 20 6d 61 70 70 69 6e 67 20 24 74    set mapping $t
2300: 6c 5f 6c 6f 6f 6b 75 70 5f 74 61 62 6c 65 28 24  l_lookup_table($
2310: 63 6f 64 65 29 0a 20 20 20 20 69 66 20 7b 24 69  code).    if {$i
2320: 46 69 72 73 74 20 3d 3d 20 22 22 7d 20 7b 0a 20  First == ""} {. 
2330: 20 20 20 20 20 73 65 74 20 69 46 69 72 73 74 20       set iFirst 
2340: 24 63 6f 64 65 0a 20 20 20 20 20 20 73 65 74 20  $code.      set 
2350: 6e 4f 66 66 20 20 20 5b 65 78 70 72 20 24 6d 61  nOff   [expr $ma
2360: 70 70 69 6e 67 20 2d 20 24 63 6f 64 65 5d 0a 20  pping - $code]. 
2370: 20 20 20 20 20 73 65 74 20 6e 52 61 6e 67 65 20       set nRange 
2380: 31 0a 20 20 20 20 20 20 73 65 74 20 6e 49 6e 63  1.      set nInc
2390: 72 20 31 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  r 1.    } else {
23a0: 0a 20 20 20 20 20 20 73 65 74 20 64 69 66 66 20  .      set diff 
23b0: 5b 65 78 70 72 20 24 63 6f 64 65 20 2d 20 28 24  [expr $code - ($
23c0: 69 46 69 72 73 74 20 2b 20 28 24 6e 49 6e 63 72  iFirst + ($nIncr
23d0: 20 2a 20 28 24 6e 52 61 6e 67 65 20 2d 20 31 29   * ($nRange - 1)
23e0: 29 29 5d 0a 20 20 20 20 20 20 69 66 20 7b 20 24  ))].      if { $
23f0: 6e 52 61 6e 67 65 3d 3d 31 20 26 26 20 28 24 64  nRange==1 && ($d
2400: 69 66 66 3d 3d 31 20 7c 7c 20 24 64 69 66 66 3d  iff==1 || $diff=
2410: 3d 32 29 20 7d 20 7b 0a 20 20 20 20 20 20 20 20  =2) } {.        
2420: 73 65 74 20 6e 49 6e 63 72 20 24 64 69 66 66 0a  set nIncr $diff.
2430: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
2440: 66 20 7b 24 64 69 66 66 20 21 3d 20 24 6e 49 6e  f {$diff != $nIn
2450: 63 72 20 7c 7c 20 28 24 6d 61 70 70 69 6e 67 20  cr || ($mapping 
2460: 2d 20 24 63 6f 64 65 29 21 3d 24 6e 4f 66 66 7d  - $code)!=$nOff}
2470: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 7b 20   {.        if { 
2480: 24 6e 52 61 6e 67 65 3d 3d 31 20 7d 20 7b 73 65  $nRange==1 } {se
2490: 74 20 6e 49 6e 63 72 20 31 7d 0a 20 20 20 20 20  t nIncr 1}.     
24a0: 20 20 20 6c 61 70 70 65 6e 64 20 6c 52 65 63 6f     lappend lReco
24b0: 72 64 20 5b 6c 69 73 74 20 24 69 46 69 72 73 74  rd [list $iFirst
24c0: 20 24 6e 49 6e 63 72 20 24 6e 52 61 6e 67 65 20   $nIncr $nRange 
24d0: 24 6e 4f 66 66 5d 0a 20 20 20 20 20 20 20 20 73  $nOff].        s
24e0: 65 74 20 69 46 69 72 73 74 20 24 63 6f 64 65 0a  et iFirst $code.
24f0: 20 20 20 20 20 20 20 20 73 65 74 20 6e 4f 66 66          set nOff
2500: 20 20 20 5b 65 78 70 72 20 24 6d 61 70 70 69 6e     [expr $mappin
2510: 67 20 2d 20 24 63 6f 64 65 5d 0a 20 20 20 20 20  g - $code].     
2520: 20 20 20 73 65 74 20 6e 52 61 6e 67 65 20 31 0a     set nRange 1.
2530: 20 20 20 20 20 20 20 20 73 65 74 20 6e 49 6e 63          set nInc
2540: 72 20 31 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  r 1.      } else
2550: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20   {.        incr 
2560: 6e 52 61 6e 67 65 0a 20 20 20 20 20 20 7d 0a 20  nRange.      }. 
2570: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6c 61 70 70     }.  }..  lapp
2580: 65 6e 64 20 6c 52 65 63 6f 72 64 20 5b 6c 69 73  end lRecord [lis
2590: 74 20 24 69 46 69 72 73 74 20 24 6e 49 6e 63 72  t $iFirst $nIncr
25a0: 20 24 6e 52 61 6e 67 65 20 24 6e 4f 66 66 5d 0a   $nRange $nOff].
25b0: 0a 20 20 73 65 74 20 6c 52 65 63 6f 72 64 0a 7d  .  set lRecord.}
25c0: 0a 0a 70 72 6f 63 20 74 6c 5f 70 72 69 6e 74 5f  ..proc tl_print_
25d0: 74 61 62 6c 65 5f 68 65 61 64 65 72 20 7b 7d 20  table_header {} 
25e0: 7b 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c  {.  puts -nonewl
25f0: 69 6e 65 20 22 20 20 22 0a 20 20 70 75 74 73 20  ine "  ".  puts 
2600: 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 7b 0a 20  [string trim {. 
2610: 20 2f 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69   /* Each entry i
2620: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
2630: 61 72 72 61 79 20 64 65 66 69 6e 65 73 20 61 20  array defines a 
2640: 72 75 6c 65 20 66 6f 72 20 66 6f 6c 64 69 6e 67  rule for folding
2650: 20 61 20 72 61 6e 67 65 0a 20 20 2a 2a 20 6f 66   a range.  ** of
2660: 20 63 6f 64 65 70 6f 69 6e 74 73 20 74 6f 20 6c   codepoints to l
2670: 6f 77 65 72 20 63 61 73 65 2e 20 54 68 65 20 72  ower case. The r
2680: 75 6c 65 20 61 70 70 6c 69 65 73 20 74 6f 20 61  ule applies to a
2690: 20 72 61 6e 67 65 20 6f 66 20 6e 52 61 6e 67 65   range of nRange
26a0: 0a 20 20 2a 2a 20 63 6f 64 65 70 6f 69 6e 74 73  .  ** codepoints
26b0: 20 73 74 61 72 74 69 6e 67 20 61 74 20 63 6f 64   starting at cod
26c0: 65 70 6f 69 6e 74 20 69 43 6f 64 65 2e 0a 20 20  epoint iCode..  
26d0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 6c  **.  ** If the l
26e0: 65 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74  east significant
26f0: 20 62 69 74 20 69 6e 20 66 6c 61 67 73 20 69 73   bit in flags is
2700: 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65   clear, then the
2710: 20 72 75 6c 65 20 61 70 70 6c 69 65 73 0a 20 20   rule applies.  
2720: 2a 2a 20 74 6f 20 61 6c 6c 20 6e 52 61 6e 67 65  ** to all nRange
2730: 20 63 6f 64 65 70 6f 69 6e 74 73 20 28 69 2e 65   codepoints (i.e
2740: 2e 20 61 6c 6c 20 6e 52 61 6e 67 65 20 63 6f 64  . all nRange cod
2750: 65 70 6f 69 6e 74 73 20 61 72 65 20 75 70 70 65  epoints are uppe
2760: 72 20 63 61 73 65 20 61 6e 64 0a 20 20 2a 2a 20  r case and.  ** 
2770: 6e 65 65 64 20 74 6f 20 62 65 20 66 6f 6c 64 65  need to be folde
2780: 64 29 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73  d). Or, if it is
2790: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 72   set, then the r
27a0: 75 6c 65 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  ule only applies
27b0: 20 74 6f 0a 20 20 2a 2a 20 65 76 65 72 79 20 73   to.  ** every s
27c0: 65 63 6f 6e 64 20 63 6f 64 65 70 6f 69 6e 74 20  econd codepoint 
27d0: 69 6e 20 74 68 65 20 72 61 6e 67 65 2c 20 73 74  in the range, st
27e0: 61 72 74 69 6e 67 20 77 69 74 68 20 63 6f 64 65  arting with code
27f0: 70 6f 69 6e 74 20 43 2e 0a 20 20 2a 2a 0a 20 20  point C..  **.  
2800: 2a 2a 20 54 68 65 20 37 20 6d 6f 73 74 20 73 69  ** The 7 most si
2810: 67 6e 69 66 69 63 61 6e 74 20 62 69 74 73 20 69  gnificant bits i
2820: 6e 20 66 6c 61 67 73 20 61 72 65 20 61 6e 20 69  n flags are an i
2830: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 61 69  ndex into the ai
2840: 4f 66 66 5b 5d 0a 20 20 2a 2a 20 61 72 72 61 79  Off[].  ** array
2850: 2e 20 49 66 20 61 20 73 70 65 63 69 66 69 63 20  . If a specific 
2860: 63 6f 64 65 70 6f 69 6e 74 20 43 20 64 6f 65 73  codepoint C does
2870: 20 72 65 71 75 69 72 65 20 66 6f 6c 64 69 6e 67   require folding
2880: 2c 20 74 68 65 6e 20 69 74 73 20 6c 6f 77 65 72  , then its lower
2890: 0a 20 20 2a 2a 20 63 61 73 65 20 65 71 75 69 76  .  ** case equiv
28a0: 61 6c 65 6e 74 20 69 73 20 28 28 43 20 2b 20 61  alent is ((C + a
28b0: 69 4f 66 66 5b 66 6c 61 67 73 3e 3e 31 5d 29 20  iOff[flags>>1]) 
28c0: 26 20 30 78 46 46 46 46 29 2e 0a 20 20 2a 2a 0a  & 0xFFFF)..  **.
28d0: 20 20 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    ** The content
28e0: 73 20 6f 66 20 74 68 69 73 20 61 72 72 61 79 20  s of this array 
28f0: 61 72 65 20 67 65 6e 65 72 61 74 65 64 20 62 79  are generated by
2900: 20 70 61 72 73 69 6e 67 20 74 68 65 20 43 61 73   parsing the Cas
2910: 65 46 6f 6c 64 69 6e 67 2e 74 78 74 0a 20 20 2a  eFolding.txt.  *
2920: 2a 20 66 69 6c 65 20 64 69 73 74 72 69 62 75 74  * file distribut
2930: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
2940: 65 20 22 55 6e 69 63 6f 64 65 20 43 68 61 72 61  e "Unicode Chara
2950: 63 74 65 72 20 44 61 74 61 62 61 73 65 22 2e 20  cter Database". 
2960: 53 65 65 0a 20 20 2a 2a 20 68 74 74 70 3a 2f 2f  See.  ** http://
2970: 77 77 77 2e 75 6e 69 63 6f 64 65 2e 6f 72 67 20  www.unicode.org 
2980: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 20 20 2a  for details..  *
2990: 2f 0a 20 20 7d 5d 0a 20 20 70 75 74 73 20 22 20  /.  }].  puts " 
29a0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
29b0: 72 75 63 74 20 54 61 62 6c 65 45 6e 74 72 79 20  ruct TableEntry 
29c0: 5c 7b 22 0a 20 20 70 75 74 73 20 22 20 20 20 20  \{".  puts "    
29d0: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69  unsigned short i
29e0: 43 6f 64 65 3b 22 0a 20 20 70 75 74 73 20 22 20  Code;".  puts " 
29f0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2a00: 20 66 6c 61 67 73 3b 22 0a 20 20 70 75 74 73 20   flags;".  puts 
2a10: 22 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  "    unsigned ch
2a20: 61 72 20 6e 52 61 6e 67 65 3b 22 0a 20 20 70 75  ar nRange;".  pu
2a30: 74 73 20 22 20 20 5c 7d 20 61 45 6e 74 72 79 5c  ts "  \} aEntry\
2a40: 5b 5c 5d 20 3d 20 5c 7b 22 0a 7d 0a 0a 70 72 6f  [\] = \{".}..pro
2a50: 63 20 74 6c 5f 70 72 69 6e 74 5f 74 61 62 6c 65  c tl_print_table
2a60: 5f 65 6e 74 72 79 20 7b 74 6f 67 67 6c 65 76 61  _entry {toggleva
2a70: 72 20 65 6e 74 72 79 20 6c 69 4f 66 66 7d 20 7b  r entry liOff} {
2a80: 0a 20 20 75 70 76 61 72 20 24 74 6f 67 67 6c 65  .  upvar $toggle
2a90: 76 61 72 20 74 0a 20 20 66 6f 72 65 61 63 68 20  var t.  foreach 
2aa0: 7b 69 46 69 72 73 74 20 6e 49 6e 63 72 20 6e 52  {iFirst nIncr nR
2ab0: 61 6e 67 65 20 6e 4f 66 66 7d 20 24 65 6e 74 72  ange nOff} $entr
2ac0: 79 20 7b 7d 0a 0a 20 20 69 66 20 7b 24 69 46 69  y {}..  if {$iFi
2ad0: 72 73 74 20 3e 20 28 31 3c 3c 31 36 29 7d 20 7b  rst > (1<<16)} {
2ae0: 20 72 65 74 75 72 6e 20 31 20 7d 0a 0a 20 20 69   return 1 }..  i
2af0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2b00: 74 5d 3d 3d 30 7d 20 7b 73 65 74 20 74 20 30 7d  t]==0} {set t 0}
2b10: 0a 20 20 69 66 20 7b 24 74 3d 3d 30 7d 20 7b 20  .  if {$t==0} { 
2b20: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
2b30: 22 20 20 20 20 22 20 7d 0a 0a 20 20 73 65 74 20  "    " }..  set 
2b40: 66 6c 61 67 73 20 30 0a 20 20 69 66 20 7b 24 6e  flags 0.  if {$n
2b50: 49 6e 63 72 3d 3d 32 7d 20 7b 20 73 65 74 20 66  Incr==2} { set f
2b60: 6c 61 67 73 20 31 20 3b 20 73 65 74 20 6e 52 61  lags 1 ; set nRa
2b70: 6e 67 65 20 5b 65 78 70 72 20 24 6e 52 61 6e 67  nge [expr $nRang
2b80: 65 20 2a 20 32 5d 7d 0a 20 20 69 66 20 7b 24 6e  e * 2]}.  if {$n
2b90: 4f 66 66 3c 30 7d 20 20 20 7b 20 69 6e 63 72 20  Off<0}   { incr 
2ba0: 6e 4f 66 66 20 5b 65 78 70 72 20 28 31 3c 3c 31  nOff [expr (1<<1
2bb0: 36 29 5d 20 7d 0a 0a 20 20 73 65 74 20 69 64 78  6)] }..  set idx
2bc0: 20 5b 6c 73 65 61 72 63 68 20 24 6c 69 4f 66 66   [lsearch $liOff
2bd0: 20 24 6e 4f 66 66 5d 0a 20 20 69 66 20 7b 24 69   $nOff].  if {$i
2be0: 64 78 3c 30 7d 20 7b 65 72 72 6f 72 20 22 6d 61  dx<0} {error "ma
2bf0: 6c 66 75 6e 63 74 69 6f 6e 20 67 65 6e 65 72 61  lfunction genera
2c00: 74 69 6e 67 20 61 69 4f 66 66 22 7d 0a 20 20 73  ting aiOff"}.  s
2c10: 65 74 20 66 6c 61 67 73 20 5b 65 78 70 72 20 24  et flags [expr $
2c20: 66 6c 61 67 73 20 2b 20 24 69 64 78 2a 32 5d 0a  flags + $idx*2].
2c30: 0a 20 20 73 65 74 20 74 78 74 20 22 7b 24 69 46  .  set txt "{$iF
2c40: 69 72 73 74 2c 20 24 66 6c 61 67 73 2c 20 24 6e  irst, $flags, $n
2c50: 52 61 6e 67 65 7d 2c 22 0a 20 20 69 66 20 7b 24  Range},".  if {$
2c60: 74 3d 3d 32 7d 20 7b 0a 20 20 20 20 70 75 74 73  t==2} {.    puts
2c70: 20 24 74 78 74 0a 20 20 7d 20 65 6c 73 65 20 7b   $txt.  } else {
2c80: 0a 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77  .    puts -nonew
2c90: 6c 69 6e 65 20 5b 66 6f 72 6d 61 74 20 22 25 20  line [format "% 
2ca0: 2d 32 33 73 22 20 24 74 78 74 5d 0a 20 20 7d 0a  -23s" $txt].  }.
2cb0: 20 20 73 65 74 20 74 20 5b 65 78 70 72 20 28 24    set t [expr ($
2cc0: 74 2b 31 29 25 33 5d 0a 0a 20 20 72 65 74 75 72  t+1)%3]..  retur
2cd0: 6e 20 30 0a 7d 0a 0a 70 72 6f 63 20 74 6c 5f 70  n 0.}..proc tl_p
2ce0: 72 69 6e 74 5f 74 61 62 6c 65 5f 66 6f 6f 74 65  rint_table_foote
2cf0: 72 20 7b 74 6f 67 67 6c 65 76 61 72 7d 20 7b 0a  r {togglevar} {.
2d00: 20 20 75 70 76 61 72 20 24 74 6f 67 67 6c 65 76    upvar $togglev
2d10: 61 72 20 74 0a 20 20 69 66 20 7b 24 74 21 3d 30  ar t.  if {$t!=0
2d20: 7d 20 7b 70 75 74 73 20 22 22 7d 0a 20 20 70 75  } {puts ""}.  pu
2d30: 74 73 20 22 20 20 5c 7d 3b 22 0a 7d 0a 0a 70 72  ts "  \};".}..pr
2d40: 6f 63 20 74 6c 5f 70 72 69 6e 74 5f 69 66 5f 65  oc tl_print_if_e
2d50: 6e 74 72 79 20 7b 65 6e 74 72 79 7d 20 7b 0a 20  ntry {entry} {. 
2d60: 20 66 6f 72 65 61 63 68 20 7b 69 46 69 72 73 74   foreach {iFirst
2d70: 20 6e 49 6e 63 72 20 6e 52 61 6e 67 65 20 6e 4f   nIncr nRange nO
2d80: 66 66 7d 20 24 65 6e 74 72 79 20 7b 7d 0a 20 20  ff} $entry {}.  
2d90: 69 66 20 7b 24 6e 49 6e 63 72 3d 3d 32 7d 20 7b  if {$nIncr==2} {
2da0: 65 72 72 6f 72 20 22 74 6c 5f 70 72 69 6e 74 5f  error "tl_print_
2db0: 69 66 5f 65 6e 74 72 79 20 6e 65 65 64 73 20 69  if_entry needs i
2dc0: 6d 70 72 6f 76 65 6d 65 6e 74 21 22 7d 0a 0a 20  mprovement!"}.. 
2dd0: 20 70 75 74 73 20 22 20 20 65 6c 73 65 20 69 66   puts "  else if
2de0: 28 20 63 3e 3d 24 69 46 69 72 73 74 20 26 26 20  ( c>=$iFirst && 
2df0: 63 3c 5b 65 78 70 72 20 24 69 46 69 72 73 74 2b  c<[expr $iFirst+
2e00: 24 6e 52 61 6e 67 65 5d 20 29 5c 7b 22 0a 20 20  $nRange] )\{".  
2e10: 70 75 74 73 20 22 20 20 20 20 72 65 74 20 3d 20  puts "    ret = 
2e20: 63 20 2b 20 24 6e 4f 66 66 3b 22 0a 20 20 70 75  c + $nOff;".  pu
2e30: 74 73 20 22 20 20 5c 7d 22 0a 7d 0a 0a 70 72 6f  ts "  \}".}..pro
2e40: 63 20 74 6c 5f 67 65 6e 65 72 61 74 65 5f 69 6f  c tl_generate_io
2e50: 66 66 5f 74 61 62 6c 65 20 7b 6c 52 65 63 6f 72  ff_table {lRecor
2e60: 64 7d 20 7b 0a 20 20 66 6f 72 65 61 63 68 20 65  d} {.  foreach e
2e70: 6e 74 72 79 20 24 6c 52 65 63 6f 72 64 20 7b 0a  ntry $lRecord {.
2e80: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 69 46 69      foreach {iFi
2e90: 72 73 74 20 6e 49 6e 63 72 20 6e 52 61 6e 67 65  rst nIncr nRange
2ea0: 20 69 4f 66 66 7d 20 24 65 6e 74 72 79 20 7b 7d   iOff} $entry {}
2eb0: 0a 20 20 20 20 69 66 20 7b 24 69 4f 66 66 3c 30  .    if {$iOff<0
2ec0: 7d 20 20 20 7b 20 69 6e 63 72 20 69 4f 66 66 20  }   { incr iOff 
2ed0: 5b 65 78 70 72 20 28 31 3c 3c 31 36 29 5d 20 7d  [expr (1<<16)] }
2ee0: 0a 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
2ef0: 78 69 73 74 73 20 61 28 24 69 4f 66 66 29 5d 7d  xists a($iOff)]}
2f00: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 73 65   continue.    se
2f10: 74 20 61 28 24 69 4f 66 66 29 20 31 0a 20 20 7d  t a($iOff) 1.  }
2f20: 0a 0a 20 20 73 65 74 20 6c 69 4f 66 66 20 5b 6c  ..  set liOff [l
2f30: 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 5b 61  sort -integer [a
2f40: 72 72 61 79 20 6e 61 6d 65 73 20 61 5d 5d 0a 20  rray names a]]. 
2f50: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6c   if {[llength $l
2f60: 69 4f 66 66 5d 3e 31 32 38 7d 20 7b 20 65 72 72  iOff]>128} { err
2f70: 6f 72 20 22 54 6f 6f 20 6d 61 6e 79 20 64 69 73  or "Too many dis
2f80: 74 69 6e 63 74 20 69 6f 66 66 73 22 20 7d 0a 20  tinct ioffs" }. 
2f90: 20 72 65 74 75 72 6e 20 24 6c 69 4f 66 66 0a 7d   return $liOff.}
2fa0: 0a 0a 70 72 6f 63 20 74 6c 5f 70 72 69 6e 74 5f  ..proc tl_print_
2fb0: 69 6f 66 66 5f 74 61 62 6c 65 20 7b 6c 69 4f 66  ioff_table {liOf
2fc0: 66 7d 20 7b 0a 20 20 70 75 74 73 20 2d 6e 6f 6e  f} {.  puts -non
2fd0: 65 77 6c 69 6e 65 20 22 20 20 73 74 61 74 69 63  ewline "  static
2fe0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
2ff0: 73 68 6f 72 74 20 61 69 4f 66 66 5c 5b 5c 5d 20  short aiOff\[\] 
3000: 3d 20 5c 7b 22 0a 20 20 73 65 74 20 69 20 30 0a  = \{".  set i 0.
3010: 20 20 66 6f 72 65 61 63 68 20 6f 66 66 20 24 6c    foreach off $l
3020: 69 4f 66 66 20 7b 0a 20 20 20 20 69 66 20 7b 28  iOff {.    if {(
3030: 24 69 20 25 20 38 29 3d 3d 30 7d 20 7b 70 75 74  $i % 8)==0} {put
3040: 73 20 22 22 20 3b 20 70 75 74 73 20 2d 6e 6f 6e  s "" ; puts -non
3050: 65 77 6c 69 6e 65 20 22 20 20 20 22 7d 0a 20 20  ewline "   "}.  
3060: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
3070: 65 20 5b 66 6f 72 6d 61 74 20 22 25 20 2d 37 73  e [format "% -7s
3080: 22 20 22 24 6f 66 66 2c 22 5d 0a 20 20 20 20 69  " "$off,"].    i
3090: 6e 63 72 20 69 0a 20 20 7d 0a 20 20 70 75 74 73  ncr i.  }.  puts
30a0: 20 22 22 0a 20 20 70 75 74 73 20 22 20 20 5c 7d   "".  puts "  \}
30b0: 3b 22 0a 0a 7d 0a 0a 70 72 6f 63 20 70 72 69 6e  ;"..}..proc prin
30c0: 74 5f 66 6f 6c 64 20 7b 7a 46 75 6e 63 7d 20 7b  t_fold {zFunc} {
30d0: 0a 0a 20 20 73 65 74 20 6c 52 65 63 6f 72 64 20  ..  set lRecord 
30e0: 5b 74 6c 5f 63 72 65 61 74 65 5f 72 65 63 6f 72  [tl_create_recor
30f0: 64 73 5d 0a 0a 20 20 73 65 74 20 6c 48 69 67 68  ds]..  set lHigh
3100: 20 5b 6c 69 73 74 5d 0a 20 20 70 75 74 73 20 22   [list].  puts "
3110: 2f 2a 22 0a 20 20 70 75 74 73 20 22 2a 2a 20 49  /*".  puts "** I
3120: 6e 74 65 72 70 72 65 74 20 74 68 65 20 61 72 67  nterpret the arg
3130: 75 6d 65 6e 74 20 61 73 20 61 20 75 6e 69 63 6f  ument as a unico
3140: 64 65 20 63 6f 64 65 70 6f 69 6e 74 2e 20 49 66  de codepoint. If
3150: 20 74 68 65 20 63 6f 64 65 70 6f 69 6e 74 22 0a   the codepoint".
3160: 20 20 70 75 74 73 20 22 2a 2a 20 69 73 20 61 6e    puts "** is an
3170: 20 75 70 70 65 72 20 63 61 73 65 20 63 68 61 72   upper case char
3180: 61 63 74 65 72 20 74 68 61 74 20 68 61 73 20 61  acter that has a
3190: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
31a0: 76 61 6c 65 6e 74 2c 22 0a 20 20 70 75 74 73 20  valent,".  puts 
31b0: 22 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 63  "** return the c
31c0: 6f 64 65 70 6f 69 6e 74 20 63 6f 72 72 65 73 70  odepoint corresp
31d0: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6c 6f  onding to the lo
31e0: 77 65 72 20 63 61 73 65 20 76 65 72 73 69 6f 6e  wer case version
31f0: 2e 22 0a 20 20 70 75 74 73 20 22 2a 2a 20 4f 74  .".  puts "** Ot
3200: 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
3210: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 61 72  a copy of the ar
3220: 67 75 6d 65 6e 74 2e 22 0a 20 20 70 75 74 73 20  gument.".  puts 
3230: 22 2a 2a 22 0a 20 20 70 75 74 73 20 22 2a 2a 20  "**".  puts "** 
3240: 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
3250: 75 6e 64 65 66 69 6e 65 64 20 69 66 20 74 68 65  undefined if the
3260: 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   value passed to
3270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 22 0a   this function".
3280: 20 20 70 75 74 73 20 22 2a 2a 20 69 73 20 6c 65    puts "** is le
3290: 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 22 0a 20  ss than zero.". 
32a0: 20 70 75 74 73 20 22 2a 2f 22 0a 20 20 70 75 74   puts "*/".  put
32b0: 73 20 22 69 6e 74 20 24 7b 7a 46 75 6e 63 7d 5c  s "int ${zFunc}\
32c0: 28 69 6e 74 20 63 2c 20 69 6e 74 20 62 52 65 6d  (int c, int bRem
32d0: 6f 76 65 44 69 61 63 72 69 74 69 63 29 5c 7b 22  oveDiacritic)\{"
32e0: 0a 0a 20 20 73 65 74 20 6c 69 4f 66 66 20 5b 74  ..  set liOff [t
32f0: 6c 5f 67 65 6e 65 72 61 74 65 5f 69 6f 66 66 5f  l_generate_ioff_
3300: 74 61 62 6c 65 20 24 6c 52 65 63 6f 72 64 5d 0a  table $lRecord].
3310: 20 20 74 6c 5f 70 72 69 6e 74 5f 74 61 62 6c 65    tl_print_table
3320: 5f 68 65 61 64 65 72 0a 20 20 66 6f 72 65 61 63  _header.  foreac
3330: 68 20 65 6e 74 72 79 20 24 6c 52 65 63 6f 72 64  h entry $lRecord
3340: 20 7b 20 0a 20 20 20 20 69 66 20 7b 5b 74 6c 5f   { .    if {[tl_
3350: 70 72 69 6e 74 5f 74 61 62 6c 65 5f 65 6e 74 72  print_table_entr
3360: 79 20 74 6f 67 67 6c 65 20 24 65 6e 74 72 79 20  y toggle $entry 
3370: 24 6c 69 4f 66 66 5d 7d 20 7b 20 0a 20 20 20 20  $liOff]} { .    
3380: 20 20 6c 61 70 70 65 6e 64 20 6c 48 69 67 68 20    lappend lHigh 
3390: 24 65 6e 74 72 79 20 0a 20 20 20 20 7d 20 0a 20  $entry .    } . 
33a0: 20 7d 0a 20 20 74 6c 5f 70 72 69 6e 74 5f 74 61   }.  tl_print_ta
33b0: 62 6c 65 5f 66 6f 6f 74 65 72 20 74 6f 67 67 6c  ble_footer toggl
33c0: 65 0a 20 20 74 6c 5f 70 72 69 6e 74 5f 69 6f 66  e.  tl_print_iof
33d0: 66 5f 74 61 62 6c 65 20 24 6c 69 4f 66 66 0a 0a  f_table $liOff..
33e0: 20 20 70 75 74 73 20 5b 73 75 62 73 74 20 2d 6e    puts [subst -n
33f0: 6f 63 6f 6d 6d 61 6e 64 73 20 7b 0a 20 20 69 6e  ocommands {.  in
3400: 74 20 72 65 74 20 3d 20 63 3b 0a 0a 20 20 61 73  t ret = c;..  as
3410: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 6e 73  sert( sizeof(uns
3420: 69 67 6e 65 64 20 73 68 6f 72 74 29 3d 3d 32 20  igned short)==2 
3430: 26 26 20 73 69 7a 65 6f 66 28 75 6e 73 69 67 6e  && sizeof(unsign
3440: 65 64 20 63 68 61 72 29 3d 3d 31 20 29 3b 0a 0a  ed char)==1 );..
3450: 20 20 69 66 28 20 63 3c 31 32 38 20 29 7b 0a 20    if( c<128 ){. 
3460: 20 20 20 69 66 28 20 63 3e 3d 27 41 27 20 26 26     if( c>='A' &&
3470: 20 63 3c 3d 27 5a 27 20 29 20 72 65 74 20 3d 20   c<='Z' ) ret = 
3480: 63 20 2b 20 28 27 61 27 20 2d 20 27 41 27 29 3b  c + ('a' - 'A');
3490: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3c 36  .  }else if( c<6
34a0: 35 35 33 36 20 29 7b 0a 20 20 20 20 63 6f 6e 73  5536 ){.    cons
34b0: 74 20 73 74 72 75 63 74 20 54 61 62 6c 65 45 6e  t struct TableEn
34c0: 74 72 79 20 2a 70 3b 0a 20 20 20 20 69 6e 74 20  try *p;.    int 
34d0: 69 48 69 20 3d 20 73 69 7a 65 6f 66 28 61 45 6e  iHi = sizeof(aEn
34e0: 74 72 79 29 2f 73 69 7a 65 6f 66 28 61 45 6e 74  try)/sizeof(aEnt
34f0: 72 79 5b 30 5d 29 20 2d 20 31 3b 0a 20 20 20 20  ry[0]) - 1;.    
3500: 69 6e 74 20 69 4c 6f 20 3d 20 30 3b 0a 20 20 20  int iLo = 0;.   
3510: 20 69 6e 74 20 69 52 65 73 20 3d 20 2d 31 3b 0a   int iRes = -1;.
3520: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 3e 61  .    assert( c>a
3530: 45 6e 74 72 79 5b 30 5d 2e 69 43 6f 64 65 20 29  Entry[0].iCode )
3540: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 48 69  ;.    while( iHi
3550: 3e 3d 69 4c 6f 20 29 7b 0a 20 20 20 20 20 20 69  >=iLo ){.      i
3560: 6e 74 20 69 54 65 73 74 20 3d 20 28 69 48 69 20  nt iTest = (iHi 
3570: 2b 20 69 4c 6f 29 20 2f 20 32 3b 0a 20 20 20 20  + iLo) / 2;.    
3580: 20 20 69 6e 74 20 63 6d 70 20 3d 20 28 63 20 2d    int cmp = (c -
3590: 20 61 45 6e 74 72 79 5b 69 54 65 73 74 5d 2e 69   aEntry[iTest].i
35a0: 43 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Code);.      if(
35b0: 20 63 6d 70 3e 3d 30 20 29 7b 0a 20 20 20 20 20   cmp>=0 ){.     
35c0: 20 20 20 69 52 65 73 20 3d 20 69 54 65 73 74 3b     iRes = iTest;
35d0: 0a 20 20 20 20 20 20 20 20 69 4c 6f 20 3d 20 69  .        iLo = i
35e0: 54 65 73 74 2b 31 3b 0a 20 20 20 20 20 20 7d 65  Test+1;.      }e
35f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 48 69  lse{.        iHi
3600: 20 3d 20 69 54 65 73 74 2d 31 3b 0a 20 20 20 20   = iTest-1;.    
3610: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61    }.    }..    a
3620: 73 73 65 72 74 28 20 69 52 65 73 3e 3d 30 20 26  ssert( iRes>=0 &
3630: 26 20 63 3e 3d 61 45 6e 74 72 79 5b 69 52 65 73  & c>=aEntry[iRes
3640: 5d 2e 69 43 6f 64 65 20 29 3b 0a 20 20 20 20 70  ].iCode );.    p
3650: 20 3d 20 26 61 45 6e 74 72 79 5b 69 52 65 73 5d   = &aEntry[iRes]
3660: 3b 0a 20 20 20 20 69 66 28 20 63 3c 28 70 2d 3e  ;.    if( c<(p->
3670: 69 43 6f 64 65 20 2b 20 70 2d 3e 6e 52 61 6e 67  iCode + p->nRang
3680: 65 29 20 26 26 20 30 3d 3d 28 30 78 30 31 20 26  e) && 0==(0x01 &
3690: 20 70 2d 3e 66 6c 61 67 73 20 26 20 28 70 2d 3e   p->flags & (p->
36a0: 69 43 6f 64 65 20 5e 20 63 29 29 20 29 7b 0a 20  iCode ^ c)) ){. 
36b0: 20 20 20 20 20 72 65 74 20 3d 20 28 63 20 2b 20       ret = (c + 
36c0: 28 61 69 4f 66 66 5b 70 2d 3e 66 6c 61 67 73 3e  (aiOff[p->flags>
36d0: 3e 31 5d 29 29 20 26 20 30 78 30 30 30 30 46 46  >1])) & 0x0000FF
36e0: 46 46 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  FF;.      assert
36f0: 28 20 72 65 74 3e 30 20 29 3b 0a 20 20 20 20 7d  ( ret>0 );.    }
3700: 0a 0a 20 20 20 20 69 66 28 20 62 52 65 6d 6f 76  ..    if( bRemov
3710: 65 44 69 61 63 72 69 74 69 63 20 29 20 72 65 74  eDiacritic ) ret
3720: 20 3d 20 24 7b 3a 3a 72 65 6d 6f 76 65 5f 64 69   = ${::remove_di
3730: 61 63 72 69 74 69 63 7d 28 72 65 74 29 3b 0a 20  acritic}(ret);. 
3740: 20 7d 0a 20 20 7d 5d 0a 0a 20 20 66 6f 72 65 61   }.  }]..  forea
3750: 63 68 20 65 6e 74 72 79 20 24 6c 48 69 67 68 20  ch entry $lHigh 
3760: 7b 0a 20 20 20 20 74 6c 5f 70 72 69 6e 74 5f 69  {.    tl_print_i
3770: 66 5f 65 6e 74 72 79 20 24 65 6e 74 72 79 0a 20  f_entry $entry. 
3780: 20 7d 0a 0a 20 20 70 75 74 73 20 22 22 0a 20 20   }..  puts "".  
3790: 70 75 74 73 20 22 20 20 72 65 74 75 72 6e 20 72  puts "  return r
37a0: 65 74 3b 22 0a 20 20 70 75 74 73 20 22 5c 7d 22  et;".  puts "\}"
37b0: 0a 7d 0a 0a 70 72 6f 63 20 70 72 69 6e 74 5f 66  .}..proc print_f
37c0: 6f 6c 64 5f 74 65 73 74 20 7b 7a 46 75 6e 63 20  old_test {zFunc 
37d0: 6d 61 70 70 69 6e 67 73 7d 20 7b 0a 20 20 67 6c  mappings} {.  gl
37e0: 6f 62 61 6c 20 74 6c 5f 6c 6f 6f 6b 75 70 5f 74  obal tl_lookup_t
37f0: 61 62 6c 65 0a 0a 20 20 66 6f 72 65 61 63 68 20  able..  foreach 
3800: 6d 20 24 6d 61 70 70 69 6e 67 73 20 7b 0a 20 20  m $mappings {.  
3810: 20 20 73 65 74 20 63 20 5b 6c 69 6e 64 65 78 20    set c [lindex 
3820: 24 6d 20 31 5d 0a 20 20 20 20 69 66 20 7b 24 63  $m 1].    if {$c
3830: 20 3d 3d 20 22 22 7d 20 7b 0a 20 20 20 20 20 20   == ""} {.      
3840: 73 65 74 20 65 78 74 72 61 28 5b 6c 69 6e 64 65  set extra([linde
3850: 78 20 24 6d 20 30 5d 29 20 30 0a 20 20 20 20 7d  x $m 0]) 0.    }
3860: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 63   else {.      sc
3870: 61 6e 20 24 63 20 25 63 20 69 0a 20 20 20 20 20  an $c %c i.     
3880: 20 73 65 74 20 65 78 74 72 61 28 5b 6c 69 6e 64   set extra([lind
3890: 65 78 20 24 6d 20 30 5d 29 20 24 69 0a 20 20 20  ex $m 0]) $i.   
38a0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 75 74 73 20 22   }.  }..  puts "
38b0: 73 74 61 74 69 63 20 69 6e 74 20 66 6f 6c 64 5f  static int fold_
38c0: 74 65 73 74 28 69 6e 74 20 2a 70 69 43 6f 64 65  test(int *piCode
38d0: 29 5c 7b 22 0a 20 20 70 75 74 73 20 2d 6e 6f 6e  )\{".  puts -non
38e0: 65 77 6c 69 6e 65 20 22 20 20 73 74 61 74 69 63  ewline "  static
38f0: 20 69 6e 74 20 61 4c 6f 6f 6b 75 70 5c 5b 5c 5d   int aLookup\[\]
3900: 20 3d 20 5c 7b 22 0a 20 20 66 6f 72 20 7b 73 65   = \{".  for {se
3910: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 37 30 30  t i 0} {$i < 700
3920: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 0a  00} {incr i} {..
3930: 20 20 20 20 73 65 74 20 65 78 70 65 63 74 65 64      set expected
3940: 20 24 69 0a 20 20 20 20 63 61 74 63 68 20 7b 20   $i.    catch { 
3950: 73 65 74 20 65 78 70 65 63 74 65 64 20 24 74 6c  set expected $tl
3960: 5f 6c 6f 6f 6b 75 70 5f 74 61 62 6c 65 28 24 69  _lookup_table($i
3970: 29 20 7d 0a 20 20 20 20 73 65 74 20 65 78 70 65  ) }.    set expe
3980: 63 74 65 64 32 20 24 65 78 70 65 63 74 65 64 0a  cted2 $expected.
3990: 20 20 20 20 63 61 74 63 68 20 7b 20 73 65 74 20      catch { set 
39a0: 65 78 70 65 63 74 65 64 32 20 24 65 78 74 72 61  expected2 $extra
39b0: 28 24 65 78 70 65 63 74 65 64 32 29 20 7d 0a 0a  ($expected2) }..
39c0: 20 20 20 20 69 66 20 7b 28 24 69 20 25 20 34 29      if {($i % 4)
39d0: 3d 3d 30 7d 20 20 7b 20 70 75 74 73 20 22 22 20  ==0}  { puts "" 
39e0: 3b 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e  ; puts -nonewlin
39f0: 65 20 22 20 20 20 20 22 20 7d 0a 20 20 20 20 70  e "    " }.    p
3a00: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22  uts -nonewline "
3a10: 24 65 78 70 65 63 74 65 64 2c 20 24 65 78 70 65  $expected, $expe
3a20: 63 74 65 64 32 2c 20 22 0a 20 20 7d 0a 20 20 70  cted2, ".  }.  p
3a30: 75 74 73 20 22 20 20 5c 7d 3b 22 0a 20 20 70 75  uts "  \};".  pu
3a40: 74 73 20 22 20 20 69 6e 74 20 69 3b 22 0a 20 20  ts "  int i;".  
3a50: 70 75 74 73 20 22 20 20 66 6f 72 28 69 3d 30 3b  puts "  for(i=0;
3a60: 20 69 3c 73 69 7a 65 6f 66 28 61 4c 6f 6f 6b 75   i<sizeof(aLooku
3a70: 70 29 2f 73 69 7a 65 6f 66 28 61 4c 6f 6f 6b 75  p)/sizeof(aLooku
3a80: 70 5c 5b 30 5c 5d 29 3b 20 69 2b 2b 29 5c 7b 22  p\[0\]); i++)\{"
3a90: 0a 20 20 70 75 74 73 20 22 20 20 20 20 69 6e 74  .  puts "    int
3aa0: 20 69 43 6f 64 65 20 3d 20 28 69 2f 32 29 3b 22   iCode = (i/2);"
3ab0: 0a 20 20 70 75 74 73 20 22 20 20 20 20 69 6e 74  .  puts "    int
3ac0: 20 62 46 6c 61 67 20 3d 20 69 20 26 20 30 78 30   bFlag = i & 0x0
3ad0: 30 30 31 3b 22 0a 20 20 70 75 74 73 20 22 20 20  001;".  puts "  
3ae0: 20 20 69 66 28 20 24 7b 7a 46 75 6e 63 7d 5c 28    if( ${zFunc}\(
3af0: 69 43 6f 64 65 2c 20 62 46 6c 61 67 29 21 3d 61  iCode, bFlag)!=a
3b00: 4c 6f 6f 6b 75 70 5c 5b 69 5c 5d 20 29 5c 7b 22  Lookup\[i\] )\{"
3b10: 0a 20 20 70 75 74 73 20 22 20 20 20 20 20 20 2a  .  puts "      *
3b20: 70 69 43 6f 64 65 20 3d 20 69 43 6f 64 65 3b 22  piCode = iCode;"
3b30: 0a 20 20 70 75 74 73 20 22 20 20 20 20 20 20 72  .  puts "      r
3b40: 65 74 75 72 6e 20 31 3b 22 0a 20 20 70 75 74 73  eturn 1;".  puts
3b50: 20 22 20 20 20 20 5c 7d 22 0a 20 20 70 75 74 73   "    \}".  puts
3b60: 20 22 20 20 5c 7d 22 0a 20 20 70 75 74 73 20 22   "  \}".  puts "
3b70: 20 20 72 65 74 75 72 6e 20 30 3b 22 0a 20 20 70    return 0;".  p
3b80: 75 74 73 20 22 5c 7d 22 0a 7d 0a 0a 0a 70 72 6f  uts "\}".}...pro
3b90: 63 20 70 72 69 6e 74 5f 66 69 6c 65 68 65 61 64  c print_filehead
3ba0: 65 72 20 7b 7d 20 7b 0a 20 20 70 75 74 73 20 5b  er {} {.  puts [
3bb0: 73 74 72 69 6e 67 20 74 72 69 6d 20 7b 0a 2f 2a  string trim {./*
3bc0: 0a 2a 2a 20 32 30 31 32 20 4d 61 79 20 32 35 0a  .** 2012 May 25.
3bd0: 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f 72  **.** The author
3be0: 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72   disclaims copyr
3bf0: 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75  ight to this sou
3c00: 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c  rce code.  In pl
3c10: 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67 61  ace of.** a lega
3c20: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
3c30: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a 2a  s a blessing:.**
3c40: 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20 64  .**    May you d
3c50: 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65  o good and not e
3c60: 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79  vil..**    May y
3c70: 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65 6e  ou find forgiven
3c80: 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c 66  ess for yourself
3c90: 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74 68   and forgive oth
3ca0: 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20 79  ers..**    May y
3cb0: 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79 2c  ou share freely,
3cc0: 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d 6f   never taking mo
3cd0: 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76 65  re than you give
3ce0: 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
3cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3d30: 2a 2a 2a 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 4f  ***.*/../*.** DO
3d40: 20 4e 4f 54 20 45 44 49 54 20 54 48 49 53 20 4d   NOT EDIT THIS M
3d50: 41 43 48 49 4e 45 20 47 45 4e 45 52 41 54 45 44  ACHINE GENERATED
3d60: 20 46 49 4c 45 2e 0a 2a 2f 0a 20 20 7d 5d 0a 20   FILE..*/.  }]. 
3d70: 20 70 75 74 73 20 22 22 0a 20 20 69 66 20 7b 24   puts "".  if {$
3d80: 3a 3a 67 65 6e 65 72 61 74 65 5f 66 74 73 35 5f  ::generate_fts5_
3d90: 63 6f 64 65 7d 20 7b 0a 20 20 20 20 23 20 6e 6f  code} {.    # no
3da0: 2d 6f 70 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  -op.  } else {. 
3db0: 20 20 20 70 75 74 73 20 22 23 69 66 6e 64 65 66     puts "#ifndef
3dc0: 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f   SQLITE_DISABLE_
3dd0: 46 54 53 33 5f 55 4e 49 43 4f 44 45 22 0a 20 20  FTS3_UNICODE".  
3de0: 20 20 70 75 74 73 20 22 23 69 66 20 64 65 66 69    puts "#if defi
3df0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
3e00: 45 5f 46 54 53 33 29 20 7c 7c 20 64 65 66 69 6e  E_FTS3) || defin
3e10: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
3e20: 5f 46 54 53 34 29 22 0a 20 20 7d 0a 20 20 70 75  _FTS4)".  }.  pu
3e30: 74 73 20 22 22 0a 20 20 70 75 74 73 20 22 23 69  ts "".  puts "#i
3e40: 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68  nclude <assert.h
3e50: 3e 22 0a 20 20 70 75 74 73 20 22 22 0a 7d 0a 0a  >".  puts "".}..
3e60: 70 72 6f 63 20 70 72 69 6e 74 5f 74 65 73 74 5f  proc print_test_
3e70: 6d 61 69 6e 20 7b 7d 20 7b 0a 20 20 70 75 74 73  main {} {.  puts
3e80: 20 22 22 0a 20 20 70 75 74 73 20 22 23 69 6e 63   "".  puts "#inc
3e90: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 22 0a  lude <stdio.h>".
3ea0: 20 20 70 75 74 73 20 22 22 0a 20 20 70 75 74 73    puts "".  puts
3eb0: 20 22 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61   "int main(int a
3ec0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
3ed0: 29 5c 7b 22 0a 20 20 70 75 74 73 20 22 20 20 69  )\{".  puts "  i
3ee0: 6e 74 20 72 31 2c 20 72 32 3b 22 0a 20 20 70 75  nt r1, r2;".  pu
3ef0: 74 73 20 22 20 20 69 6e 74 20 63 6f 64 65 3b 22  ts "  int code;"
3f00: 0a 20 20 70 75 74 73 20 22 20 20 72 31 20 3d 20  .  puts "  r1 = 
3f10: 69 73 61 6c 6e 75 6d 5f 74 65 73 74 28 26 63 6f  isalnum_test(&co
3f20: 64 65 29 3b 22 0a 20 20 70 75 74 73 20 22 20 20  de);".  puts "  
3f30: 69 66 28 20 72 31 20 29 20 70 72 69 6e 74 66 28  if( r1 ) printf(
3f40: 5c 22 69 73 61 6c 6e 75 6d 28 29 3a 20 50 72 6f  \"isalnum(): Pro
3f50: 62 6c 65 6d 20 77 69 74 68 20 63 6f 64 65 20 25  blem with code %
3f60: 64 5c 5c 6e 5c 22 2c 63 6f 64 65 29 3b 22 0a 20  d\\n\",code);". 
3f70: 20 70 75 74 73 20 22 20 20 65 6c 73 65 20 70 72   puts "  else pr
3f80: 69 6e 74 66 28 5c 22 69 73 61 6c 6e 75 6d 28 29  intf(\"isalnum()
3f90: 3a 20 74 65 73 74 20 70 61 73 73 65 64 5c 5c 6e  : test passed\\n
3fa0: 5c 22 29 3b 22 0a 20 20 70 75 74 73 20 22 20 20  \");".  puts "  
3fb0: 72 32 20 3d 20 66 6f 6c 64 5f 74 65 73 74 28 26  r2 = fold_test(&
3fc0: 63 6f 64 65 29 3b 22 0a 20 20 70 75 74 73 20 22  code);".  puts "
3fd0: 20 20 69 66 28 20 72 32 20 29 20 70 72 69 6e 74    if( r2 ) print
3fe0: 66 28 5c 22 66 6f 6c 64 28 29 3a 20 50 72 6f 62  f(\"fold(): Prob
3ff0: 6c 65 6d 20 77 69 74 68 20 63 6f 64 65 20 25 64  lem with code %d
4000: 5c 5c 6e 5c 22 2c 63 6f 64 65 29 3b 22 0a 20 20  \\n\",code);".  
4010: 70 75 74 73 20 22 20 20 65 6c 73 65 20 70 72 69  puts "  else pri
4020: 6e 74 66 28 5c 22 66 6f 6c 64 28 29 3a 20 74 65  ntf(\"fold(): te
4030: 73 74 20 70 61 73 73 65 64 5c 5c 6e 5c 22 29 3b  st passed\\n\");
4040: 22 0a 20 20 70 75 74 73 20 22 20 20 72 65 74 75  ".  puts "  retu
4050: 72 6e 20 28 72 31 20 7c 7c 20 72 32 29 3b 22 0a  rn (r1 || r2);".
4060: 20 20 70 75 74 73 20 22 5c 7d 22 0a 7d 0a 0a 23    puts "\}".}..#
4070: 20 50 72 6f 63 65 73 20 74 68 65 20 63 6f 6d 6d   Proces the comm
4080: 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and line argumen
4090: 74 73 2e 20 45 78 69 74 20 65 61 72 6c 79 20 69  ts. Exit early i
40a0: 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 74  f they are not t
40b0: 6f 0a 23 20 6f 75 72 20 6c 69 6b 69 6e 67 2e 0a  o.# our liking..
40c0: 23 0a 70 72 6f 63 20 75 73 61 67 65 20 7b 7d 20  #.proc usage {} 
40d0: 7b 0a 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c  {.  puts -nonewl
40e0: 69 6e 65 20 73 74 64 65 72 72 20 22 55 73 61 67  ine stderr "Usag
40f0: 65 3a 20 24 3a 3a 61 72 67 76 30 20 3f 2d 74 65  e: $::argv0 ?-te
4100: 73 74 3f 20 3f 2d 66 74 73 35 3f 20 22 0a 20 20  st? ?-fts5? ".  
4110: 70 75 74 73 20 20 20 20 20 20 20 20 20 20 20 20  puts            
4120: 73 74 64 65 72 72 20 22 3c 43 61 73 65 46 6f 6c  stderr "<CaseFol
4130: 64 69 6e 67 2e 74 78 74 20 66 69 6c 65 3e 20 3c  ding.txt file> <
4140: 55 6e 69 63 6f 64 65 44 61 74 61 2e 74 78 74 20  UnicodeData.txt 
4150: 66 69 6c 65 3e 22 0a 20 20 65 78 69 74 20 31 0a  file>".  exit 1.
4160: 7d 0a 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  }.if {[llength $
4170: 61 72 67 76 5d 3c 32 7d 20 75 73 61 67 65 0a 73  argv]<2} usage.s
4180: 65 74 20 75 6e 69 63 6f 64 65 64 61 74 61 2e 74  et unicodedata.t
4190: 78 74 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 76  xt [lindex $argv
41a0: 20 65 6e 64 5d 0a 73 65 74 20 63 61 73 65 66 6f   end].set casefo
41b0: 6c 64 69 6e 67 2e 74 78 74 20 5b 6c 69 6e 64 65  lding.txt [linde
41c0: 78 20 24 61 72 67 76 20 65 6e 64 2d 31 5d 0a 0a  x $argv end-1]..
41d0: 73 65 74 20 72 65 6d 6f 76 65 5f 64 69 61 63 72  set remove_diacr
41e0: 69 74 69 63 20 72 65 6d 6f 76 65 5f 64 69 61 63  itic remove_diac
41f0: 72 69 74 69 63 0a 73 65 74 20 67 65 6e 65 72 61  ritic.set genera
4200: 74 65 5f 74 65 73 74 5f 63 6f 64 65 20 30 0a 73  te_test_code 0.s
4210: 65 74 20 67 65 6e 65 72 61 74 65 5f 66 74 73 35  et generate_fts5
4220: 5f 63 6f 64 65 20 30 0a 73 65 74 20 66 75 6e 63  _code 0.set func
4230: 74 69 6f 6e 5f 70 72 65 66 69 78 20 22 73 71 6c  tion_prefix "sql
4240: 69 74 65 33 46 74 73 22 0a 66 6f 72 20 7b 73 65  ite3Fts".for {se
4250: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 5b 6c 6c  t i 0} {$i < [ll
4260: 65 6e 67 74 68 20 24 61 72 67 76 5d 2d 32 7d 20  ength $argv]-2} 
4270: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 73 77 69  {incr i} {.  swi
4280: 74 63 68 20 2d 2d 20 5b 6c 69 6e 64 65 78 20 24  tch -- [lindex $
4290: 61 72 67 76 20 24 69 5d 20 7b 0a 20 20 20 20 2d  argv $i] {.    -
42a0: 74 65 73 74 20 7b 0a 20 20 20 20 20 20 73 65 74  test {.      set
42b0: 20 67 65 6e 65 72 61 74 65 5f 74 65 73 74 5f 63   generate_test_c
42c0: 6f 64 65 20 31 0a 20 20 20 20 7d 0a 20 20 20 20  ode 1.    }.    
42d0: 2d 66 74 73 35 20 7b 0a 20 20 20 20 20 20 73 65  -fts5 {.      se
42e0: 74 20 66 75 6e 63 74 69 6f 6e 5f 70 72 65 66 69  t function_prefi
42f0: 78 20 73 71 6c 69 74 65 33 46 74 73 35 0a 20 20  x sqlite3Fts5.  
4300: 20 20 20 20 73 65 74 20 67 65 6e 65 72 61 74 65      set generate
4310: 5f 66 74 73 35 5f 63 6f 64 65 20 31 0a 20 20 20  _fts5_code 1.   
4320: 20 20 20 73 65 74 20 72 65 6d 6f 76 65 5f 64 69     set remove_di
4330: 61 63 72 69 74 69 63 20 66 74 73 35 5f 72 65 6d  acritic fts5_rem
4340: 6f 76 65 5f 64 69 61 63 72 69 74 69 63 0a 20 20  ove_diacritic.  
4350: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 20    }.    default 
4360: 7b 0a 20 20 20 20 20 20 75 73 61 67 65 0a 20 20  {.      usage.  
4370: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 70 72 69 6e 74    }.  }.}..print
4380: 5f 66 69 6c 65 68 65 61 64 65 72 0a 0a 23 20 50  _fileheader..# P
4390: 72 69 6e 74 20 74 68 65 20 69 73 61 6c 6e 75 6d  rint the isalnum
43a0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73  () function to s
43b0: 74 64 6f 75 74 2e 0a 23 0a 73 65 74 20 6c 52 61  tdout..#.set lRa
43c0: 6e 67 65 20 5b 61 6e 5f 6c 6f 61 64 5f 73 65 70  nge [an_load_sep
43d0: 61 72 61 74 6f 72 5f 72 61 6e 67 65 73 5d 0a 70  arator_ranges].p
43e0: 72 69 6e 74 5f 69 73 61 6c 6e 75 6d 20 24 7b 66  rint_isalnum ${f
43f0: 75 6e 63 74 69 6f 6e 5f 70 72 65 66 69 78 7d 55  unction_prefix}U
4400: 6e 69 63 6f 64 65 49 73 61 6c 6e 75 6d 20 24 6c  nicodeIsalnum $l
4410: 52 61 6e 67 65 0a 0a 23 20 4c 65 61 76 65 20 61  Range..# Leave a
4420: 20 67 61 70 20 62 65 74 77 65 65 6e 20 74 68 65   gap between the
4430: 20 74 77 6f 20 67 65 6e 65 72 61 74 65 64 20 43   two generated C
4440: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 23 0a 70 75   functions..#.pu
4450: 74 73 20 22 22 0a 70 75 74 73 20 22 22 0a 0a 23  ts "".puts ""..#
4460: 20 4c 6f 61 64 20 74 68 65 20 66 6f 6c 64 20 64   Load the fold d
4470: 61 74 61 2e 20 54 68 69 73 20 69 73 20 75 73 65  ata. This is use
4480: 64 20 62 79 20 74 68 65 20 5b 72 64 5f 58 58 58  d by the [rd_XXX
4490: 5d 20 63 6f 6d 6d 61 6e 64 73 0a 23 20 61 73 20  ] commands.# as 
44a0: 77 65 6c 6c 20 61 73 20 5b 70 72 69 6e 74 5f 66  well as [print_f
44b0: 6f 6c 64 5d 2e 0a 74 6c 5f 6c 6f 61 64 5f 63 61  old]..tl_load_ca
44c0: 73 65 66 6f 6c 64 69 6e 67 5f 74 78 74 20 24 7b  sefolding_txt ${
44d0: 63 61 73 65 66 6f 6c 64 69 6e 67 2e 74 78 74 7d  casefolding.txt}
44e0: 0a 0a 73 65 74 20 6d 61 70 70 69 6e 67 73 20 5b  ..set mappings [
44f0: 72 64 5f 6c 6f 61 64 5f 75 6e 69 63 6f 64 65 64  rd_load_unicoded
4500: 61 74 61 5f 74 65 78 74 20 24 7b 75 6e 69 63 6f  ata_text ${unico
4510: 64 65 64 61 74 61 2e 74 78 74 7d 5d 0a 70 72 69  dedata.txt}].pri
4520: 6e 74 5f 72 64 20 24 6d 61 70 70 69 6e 67 73 0a  nt_rd $mappings.
4530: 70 75 74 73 20 22 22 0a 70 75 74 73 20 22 22 0a  puts "".puts "".
4540: 70 72 69 6e 74 5f 69 73 64 69 61 63 72 69 74 69  print_isdiacriti
4550: 63 20 24 7b 66 75 6e 63 74 69 6f 6e 5f 70 72 65  c ${function_pre
4560: 66 69 78 7d 55 6e 69 63 6f 64 65 49 73 64 69 61  fix}UnicodeIsdia
4570: 63 72 69 74 69 63 20 24 6d 61 70 70 69 6e 67 73  critic $mappings
4580: 0a 70 75 74 73 20 22 22 0a 70 75 74 73 20 22 22  .puts "".puts ""
4590: 0a 0a 23 20 50 72 69 6e 74 20 74 68 65 20 66 6f  ..# Print the fo
45a0: 6c 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  ld() function to
45b0: 20 73 74 64 6f 75 74 2e 0a 23 0a 70 72 69 6e 74   stdout..#.print
45c0: 5f 66 6f 6c 64 20 24 7b 66 75 6e 63 74 69 6f 6e  _fold ${function
45d0: 5f 70 72 65 66 69 78 7d 55 6e 69 63 6f 64 65 46  _prefix}UnicodeF
45e0: 6f 6c 64 0a 0a 23 20 50 72 69 6e 74 20 74 68 65  old..# Print the
45f0: 20 74 65 73 74 20 72 6f 75 74 69 6e 65 73 20 61   test routines a
4600: 6e 64 20 6d 61 69 6e 28 29 20 66 75 6e 63 74 69  nd main() functi
4610: 6f 6e 20 74 6f 20 73 74 64 6f 75 74 2c 20 69 66  on to stdout, if
4620: 20 2d 74 65 73 74 20 0a 23 20 77 61 73 20 73 70   -test .# was sp
4630: 65 63 69 66 69 65 64 2e 0a 23 0a 69 66 20 7b 24  ecified..#.if {$
4640: 3a 3a 67 65 6e 65 72 61 74 65 5f 74 65 73 74 5f  ::generate_test_
4650: 63 6f 64 65 7d 20 7b 0a 20 20 70 72 69 6e 74 5f  code} {.  print_
4660: 74 65 73 74 5f 69 73 61 6c 6e 75 6d 20 24 7b 66  test_isalnum ${f
4670: 75 6e 63 74 69 6f 6e 5f 70 72 65 66 69 78 7d 55  unction_prefix}U
4680: 6e 69 63 6f 64 65 49 73 61 6c 6e 75 6d 20 24 6c  nicodeIsalnum $l
4690: 52 61 6e 67 65 0a 20 20 70 72 69 6e 74 5f 66 6f  Range.  print_fo
46a0: 6c 64 5f 74 65 73 74 20 24 7b 66 75 6e 63 74 69  ld_test ${functi
46b0: 6f 6e 5f 70 72 65 66 69 78 7d 55 6e 69 63 6f 64  on_prefix}Unicod
46c0: 65 46 6f 6c 64 20 24 6d 61 70 70 69 6e 67 73 0a  eFold $mappings.
46d0: 20 20 70 72 69 6e 74 5f 74 65 73 74 5f 6d 61 69    print_test_mai
46e0: 6e 20 0a 7d 0a 0a 69 66 20 7b 24 67 65 6e 65 72  n .}..if {$gener
46f0: 61 74 65 5f 66 74 73 35 5f 63 6f 64 65 7d 20 7b  ate_fts5_code} {
4700: 0a 20 20 23 20 6e 6f 2d 6f 70 0a 7d 20 65 6c 73  .  # no-op.} els
4710: 65 20 7b 0a 20 20 70 75 74 73 20 22 23 65 6e 64  e {.  puts "#end
4720: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
4730: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
4740: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
4750: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 34 29  ITE_ENABLE_FTS4)
4760: 20 2a 2f 22 0a 20 20 70 75 74 73 20 22 23 65 6e   */".  puts "#en
4770: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
4780: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 46  SQLITE_DISABLE_F
4790: 54 53 33 5f 55 4e 49 43 4f 44 45 29 20 2a 2f 22  TS3_UNICODE) */"
47a0: 0a 7d 0a                                         .}.