| // Copyright 2016 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| //go:generate go run gen.go gen_bits.go |
| |
| // Package runenames provides rune names from the Unicode Character Database. |
| // For example, the name for '\u0100' is "LATIN CAPITAL LETTER A WITH MACRON". |
| // |
| // See http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt |
| package runenames |
| |
| import ( |
| "sort" |
| ) |
| |
| // Name returns the name for r. |
| func Name(r rune) string { |
| i := sort.Search(len(table0), func(j int) bool { |
| e := table0[j] |
| rOffset := rune(e >> shiftRuneOffset) |
| return r < rOffset |
| }) |
| if i == 0 { |
| return "" |
| } |
| |
| e := table0[i-1] |
| rOffset := rune(e >> shiftRuneOffset) |
| rLength := rune(e>>shiftRuneLength) & maskRuneLength |
| if r >= rOffset+rLength { |
| return "" |
| } |
| |
| if (e>>shiftDirect)&maskDirect != 0 { |
| o := int(e>>shiftDataOffset) & maskDataOffset |
| n := int(e>>shiftDataLength) & maskDataLength |
| return data[o : o+n] |
| } |
| |
| base := uint32(e>>shiftDataBase) & maskDataBase |
| base <<= dataBaseUnit |
| j := rune(e>>shiftTable1Offset) & maskTable1Offset |
| j += r - rOffset |
| d0 := base + uint32(table1[j-1]) // dataOffset |
| d1 := base + uint32(table1[j-0]) // dataOffset + dataLength |
| return data[d0:d1] |
| } |