1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

Change the format of the tables used by sqlite3FtsUnicodeTolower() to make them a little smaller.

FossilOrigin-Name: b89d3834f6690073fca0fc22c18afa1fb280ea7d
This commit is contained in:
dan
2012-05-26 17:57:02 +00:00
parent 7a796731db
commit 501c74d3e1
4 changed files with 134 additions and 84 deletions

View File

@ -303,11 +303,14 @@ proc tl_print_table_header {} {
** of codepoints to lower case. The rule applies to a range of nRange
** codepoints starting at codepoint iCode.
**
** If bFlag is clear, then all the codepoints in the range are upper
** case and require folding. Or, if bFlag is set, then only every second
** codepoint in the range, starting with iCode, requires folding. If a
** specific codepoint C does require folding, then the lower-case version
** is ((C + iOff)&0xFFFF).
** If the least significant bit in flags is clear, then the rule applies
** to all nRange codepoints (i.e. all nRange codepoints are upper case and
** need to be folded). Or, if it is set, then the rule only applies to
** every second codepoint in the range, starting with codepoint C.
**
** The 7 most significant bits in flags are an index into the aiOff[]
** array. If a specific codepoint C does require folding, then its lower
** case equivalent is ((C + aiOff[flags>>1]) & 0xFFFF).
**
** The contents of this array are generated by parsing the CaseFolding.txt
** file distributed as part of the "Unicode Character Database". See
@ -316,13 +319,12 @@ proc tl_print_table_header {} {
}]
puts " static const struct TableEntry \{"
puts " unsigned short iCode;"
puts " unsigned char bFlag;"
puts " unsigned char flags;"
puts " unsigned char nRange;"
puts " unsigned short iOff;"
puts " \} aEntry\[\] = \{"
}
proc tl_print_table_entry {togglevar entry} {
proc tl_print_table_entry {togglevar entry liOff} {
upvar $togglevar t
foreach {iFirst nIncr nRange nOff} $entry {}
@ -335,7 +337,11 @@ proc tl_print_table_entry {togglevar entry} {
if {$nIncr==2} { set flags 1 ; set nRange [expr $nRange * 2]}
if {$nOff<0} { incr nOff [expr (1<<16)] }
set txt "{$iFirst, $flags, $nRange, $nOff},"
set idx [lsearch $liOff $nOff]
if {$idx<0} {error "malfunction generating aiOff"}
set flags [expr $flags + $idx*2]
set txt "{$iFirst, $flags, $nRange},"
if {$t==2} {
puts $txt
} else {
@ -361,6 +367,32 @@ proc tl_print_if_entry {entry} {
puts " \}"
}
proc tl_generate_ioff_table {lRecord} {
foreach entry $lRecord {
foreach {iFirst nIncr nRange iOff} $entry {}
if {$iOff<0} { incr iOff [expr (1<<16)] }
if {[info exists a($iOff)]} continue
set a($iOff) 1
}
set liOff [lsort -integer [array names a]]
if {[llength $liOff]>128} { error "Too many distinct ioffs" }
return $liOff
}
proc tl_print_ioff_table {liOff} {
puts -nonewline " static const unsigned short aiOff\[\] = \{"
set i 0
foreach off $liOff {
if {($i % 8)==0} {puts "" ; puts -nonewline " "}
puts -nonewline [format "% -7s" "$off,"]
incr i
}
puts ""
puts " \};"
}
proc print_tolower {zFunc} {
set lRecord [tl_create_records]
@ -376,13 +408,17 @@ proc print_tolower {zFunc} {
puts "** is less than zero."
puts "*/"
puts "int ${zFunc}\(int c)\{"
set liOff [tl_generate_ioff_table $lRecord]
tl_print_table_header
foreach entry $lRecord {
if {[tl_print_table_entry toggle $entry]} {
if {[tl_print_table_entry toggle $entry $liOff]} {
lappend lHigh $entry
}
}
tl_print_table_footer toggle
tl_print_ioff_table $liOff
puts {
int ret = c;
@ -410,8 +446,8 @@ proc print_tolower {zFunc} {
if( iRes>=0 ){
const struct TableEntry *p = &aEntry[iRes];
if( c<(p->iCode + p->nRange) && 0==(p->bFlag & (p->iCode ^ c)) ){
ret = (c + p->iOff) & 0x0000FFFF;
if( c<(p->iCode + p->nRange) && 0==(0x01 & p->flags & (p->iCode ^ c)) ){
ret = (c + (aiOff[p->flags>>1])) & 0x0000FFFF;
assert( ret>0 );
}
}