You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.9 KiB
114 lines
2.9 KiB
// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. |
|
|
|
package idna |
|
|
|
// This file contains definitions for interpreting the trie value of the idna |
|
// trie generated by "go run gen*.go". It is shared by both the generator |
|
// program and the resultant package. Sharing is achieved by the generator |
|
// copying gen_trieval.go to trieval.go and changing what's above this comment. |
|
|
|
// info holds information from the IDNA mapping table for a single rune. It is |
|
// the value returned by a trie lookup. In most cases, all information fits in |
|
// a 16-bit value. For mappings, this value may contain an index into a slice |
|
// with the mapped string. Such mappings can consist of the actual mapped value |
|
// or an XOR pattern to be applied to the bytes of the UTF8 encoding of the |
|
// input rune. This technique is used by the cases packages and reduces the |
|
// table size significantly. |
|
// |
|
// The per-rune values have the following format: |
|
// |
|
// if mapped { |
|
// if inlinedXOR { |
|
// 15..13 inline XOR marker |
|
// 12..11 unused |
|
// 10..3 inline XOR mask |
|
// } else { |
|
// 15..3 index into xor or mapping table |
|
// } |
|
// } else { |
|
// 15..13 unused |
|
// 12 modifier (including virama) |
|
// 11 virama modifier |
|
// 10..8 joining type |
|
// 7..3 category type |
|
// } |
|
// 2 use xor pattern |
|
// 1..0 mapped category |
|
// |
|
// See the definitions below for a more detailed description of the various |
|
// bits. |
|
type info uint16 |
|
|
|
const ( |
|
catSmallMask = 0x3 |
|
catBigMask = 0xF8 |
|
indexShift = 3 |
|
xorBit = 0x4 // interpret the index as an xor pattern |
|
inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined. |
|
|
|
joinShift = 8 |
|
joinMask = 0x07 |
|
|
|
viramaModifier = 0x0800 |
|
modifier = 0x1000 |
|
) |
|
|
|
// A category corresponds to a category defined in the IDNA mapping table. |
|
type category uint16 |
|
|
|
const ( |
|
unknown category = 0 // not defined currently in unicode. |
|
mapped category = 1 |
|
disallowedSTD3Mapped category = 2 |
|
deviation category = 3 |
|
) |
|
|
|
const ( |
|
valid category = 0x08 |
|
validNV8 category = 0x18 |
|
validXV8 category = 0x28 |
|
disallowed category = 0x40 |
|
disallowedSTD3Valid category = 0x80 |
|
ignored category = 0xC0 |
|
) |
|
|
|
// join types and additional rune information |
|
const ( |
|
joiningL = (iota + 1) |
|
joiningD |
|
joiningT |
|
joiningR |
|
|
|
//the following types are derived during processing |
|
joinZWJ |
|
joinZWNJ |
|
joinVirama |
|
numJoinTypes |
|
) |
|
|
|
func (c info) isMapped() bool { |
|
return c&0x3 != 0 |
|
} |
|
|
|
func (c info) category() category { |
|
small := c & catSmallMask |
|
if small != 0 { |
|
return category(small) |
|
} |
|
return category(c & catBigMask) |
|
} |
|
|
|
func (c info) joinType() info { |
|
if c.isMapped() { |
|
return 0 |
|
} |
|
return (c >> joinShift) & joinMask |
|
} |
|
|
|
func (c info) isModifier() bool { |
|
return c&(modifier|catSmallMask) == modifier |
|
} |
|
|
|
func (c info) isViramaModifier() bool { |
|
return c&(viramaModifier|catSmallMask) == viramaModifier |
|
}
|
|
|