1 | // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
|
---|
2 |
|
---|
3 | package idna
|
---|
4 |
|
---|
5 | // This file contains definitions for interpreting the trie value of the idna
|
---|
6 | // trie generated by "go run gen*.go". It is shared by both the generator
|
---|
7 | // program and the resultant package. Sharing is achieved by the generator
|
---|
8 | // copying gen_trieval.go to trieval.go and changing what's above this comment.
|
---|
9 |
|
---|
10 | // info holds information from the IDNA mapping table for a single rune. It is
|
---|
11 | // the value returned by a trie lookup. In most cases, all information fits in
|
---|
12 | // a 16-bit value. For mappings, this value may contain an index into a slice
|
---|
13 | // with the mapped string. Such mappings can consist of the actual mapped value
|
---|
14 | // or an XOR pattern to be applied to the bytes of the UTF8 encoding of the
|
---|
15 | // input rune. This technique is used by the cases packages and reduces the
|
---|
16 | // table size significantly.
|
---|
17 | //
|
---|
18 | // The per-rune values have the following format:
|
---|
19 | //
|
---|
20 | // if mapped {
|
---|
21 | // if inlinedXOR {
|
---|
22 | // 15..13 inline XOR marker
|
---|
23 | // 12..11 unused
|
---|
24 | // 10..3 inline XOR mask
|
---|
25 | // } else {
|
---|
26 | // 15..3 index into xor or mapping table
|
---|
27 | // }
|
---|
28 | // } else {
|
---|
29 | // 15..14 unused
|
---|
30 | // 13 mayNeedNorm
|
---|
31 | // 12..11 attributes
|
---|
32 | // 10..8 joining type
|
---|
33 | // 7..3 category type
|
---|
34 | // }
|
---|
35 | // 2 use xor pattern
|
---|
36 | // 1..0 mapped category
|
---|
37 | //
|
---|
38 | // See the definitions below for a more detailed description of the various
|
---|
39 | // bits.
|
---|
40 | type info uint16
|
---|
41 |
|
---|
42 | const (
|
---|
43 | catSmallMask = 0x3
|
---|
44 | catBigMask = 0xF8
|
---|
45 | indexShift = 3
|
---|
46 | xorBit = 0x4 // interpret the index as an xor pattern
|
---|
47 | inlineXOR = 0xE000 // These bits are set if the XOR pattern is inlined.
|
---|
48 |
|
---|
49 | joinShift = 8
|
---|
50 | joinMask = 0x07
|
---|
51 |
|
---|
52 | // Attributes
|
---|
53 | attributesMask = 0x1800
|
---|
54 | viramaModifier = 0x1800
|
---|
55 | modifier = 0x1000
|
---|
56 | rtl = 0x0800
|
---|
57 |
|
---|
58 | mayNeedNorm = 0x2000
|
---|
59 | )
|
---|
60 |
|
---|
61 | // A category corresponds to a category defined in the IDNA mapping table.
|
---|
62 | type category uint16
|
---|
63 |
|
---|
64 | const (
|
---|
65 | unknown category = 0 // not currently defined in unicode.
|
---|
66 | mapped category = 1
|
---|
67 | disallowedSTD3Mapped category = 2
|
---|
68 | deviation category = 3
|
---|
69 | )
|
---|
70 |
|
---|
71 | const (
|
---|
72 | valid category = 0x08
|
---|
73 | validNV8 category = 0x18
|
---|
74 | validXV8 category = 0x28
|
---|
75 | disallowed category = 0x40
|
---|
76 | disallowedSTD3Valid category = 0x80
|
---|
77 | ignored category = 0xC0
|
---|
78 | )
|
---|
79 |
|
---|
80 | // join types and additional rune information
|
---|
81 | const (
|
---|
82 | joiningL = (iota + 1)
|
---|
83 | joiningD
|
---|
84 | joiningT
|
---|
85 | joiningR
|
---|
86 |
|
---|
87 | //the following types are derived during processing
|
---|
88 | joinZWJ
|
---|
89 | joinZWNJ
|
---|
90 | joinVirama
|
---|
91 | numJoinTypes
|
---|
92 | )
|
---|
93 |
|
---|
94 | func (c info) isMapped() bool {
|
---|
95 | return c&0x3 != 0
|
---|
96 | }
|
---|
97 |
|
---|
98 | func (c info) category() category {
|
---|
99 | small := c & catSmallMask
|
---|
100 | if small != 0 {
|
---|
101 | return category(small)
|
---|
102 | }
|
---|
103 | return category(c & catBigMask)
|
---|
104 | }
|
---|
105 |
|
---|
106 | func (c info) joinType() info {
|
---|
107 | if c.isMapped() {
|
---|
108 | return 0
|
---|
109 | }
|
---|
110 | return (c >> joinShift) & joinMask
|
---|
111 | }
|
---|
112 |
|
---|
113 | func (c info) isModifier() bool {
|
---|
114 | return c&(modifier|catSmallMask) == modifier
|
---|
115 | }
|
---|
116 |
|
---|
117 | func (c info) isViramaModifier() bool {
|
---|
118 | return c&(attributesMask|catSmallMask) == viramaModifier
|
---|
119 | }
|
---|