| // 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 |
| |
| // Package runenames provides rune names from the Unicode Character Database. |
| // For example, the name for '\u0100' is "LATIN CAPITAL LETTER A WITH MACRON". |
| // |
| // See https://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(entries), func(j int) bool { |
| return entries[j].startRune() > r |
| }) |
| if i == 0 { |
| return "" |
| } |
| e := entries[i-1] |
| |
| offset := int(r - e.startRune()) |
| if offset >= e.numRunes() { |
| return "" |
| } |
| |
| if e.direct() { |
| o := e.index() |
| n := e.len() |
| return directData[o : o+n] |
| } |
| |
| start := int(index[e.index()+offset]) |
| end := int(index[e.index()+offset+1]) |
| base1 := e.base() << 16 |
| base2 := base1 |
| if start > end { |
| base2 += 1 << 16 |
| } |
| return singleData[start+base1 : end+base2] |
| } |
| |
| func (e entry) len() int { return e.base() } |