git-gui: Optimize encoding name resolution using a lookup table.

Encoding menu construction does almost a hundred of encoding
resolutions, which with the old implementation led to a
small but noticeable delay.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Tested-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Alexander Gavrilov
2008-09-18 01:07:35 +04:00
committed by Shawn O. Pearce
parent 3fe0162362
commit a1c3feb7fa

View File

@ -286,40 +286,64 @@ set encoding_groups {
{"Symbol" Symbol Dingbats MacDingbats MacCentEuro}} {"Symbol" Symbol Dingbats MacDingbats MacCentEuro}}
} }
proc tcl_encoding {enc} { proc build_encoding_table {} {
global encoding_aliases global encoding_aliases encoding_lookup_table
set names [encoding names]
set lcnames [string tolower $names] # Prepare the lookup list; cannot use lsort -nocase because
set enc [string tolower $enc] # of compatibility issues with older Tcl (e.g. in msysgit)
set i [lsearch -exact $lcnames $enc] set names [list]
if {$i < 0} { foreach item [encoding names] {
# look for "isonnn" instead of "iso-nnn" or "iso_nnn" lappend names [list [string tolower $item] $item]
if {[regsub {^(iso|cp|ibm|jis)[-_]} $enc {\1} encx]} {
set i [lsearch -exact $lcnames $encx]
} }
set names [lsort -ascii -index 0 $names]
# neither can we use lsearch -index
set lnames [list]
foreach item $names {
lappend lnames [lindex $item 0]
} }
if {$i < 0} {
foreach l $encoding_aliases { foreach grp $encoding_aliases {
set ll [string tolower $l] set target {}
if {[lsearch -exact $ll $enc] < 0} continue foreach item $grp {
# look through the aliases for one that tcl knows about set i [lsearch -sorted -ascii $lnames \
foreach e $ll { [string tolower $item]]
set i [lsearch -exact $lcnames $e] if {$i >= 0} {
if {$i < 0} { set target [lindex $names $i 1]
if {[regsub {^(iso|cp|ibm|jis)[-_]} $e {\1} ex]} {
set i [lsearch -exact $lcnames $ex]
}
}
if {$i >= 0} break
}
break break
} }
} }
if {$i >= 0} { if {$target eq {}} continue
return [lindex $names $i] foreach item $grp {
set encoding_lookup_table([string tolower $item]) $target
} }
}
foreach item $names {
set encoding_lookup_table([lindex $item 0]) [lindex $item 1]
}
}
proc tcl_encoding {enc} {
global encoding_lookup_table
if {$enc eq {}} {
return {} return {}
} }
if {![info exists encoding_lookup_table]} {
build_encoding_table
}
set enc [string tolower $enc]
if {![info exists encoding_lookup_table($enc)]} {
# look for "isonnn" instead of "iso-nnn" or "iso_nnn"
if {[regsub {^(iso|cp|ibm|jis)[-_]} $enc {\1} encx]} {
set enc $encx
}
}
if {[info exists encoding_lookup_table($enc)]} {
return $encoding_lookup_table($enc)
} else {
return {}
}
}
proc force_path_encoding {path enc} { proc force_path_encoding {path enc} {
global path_encoding_overrides last_encoding_override global path_encoding_overrides last_encoding_override