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