trieval.go

  1// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
  2
  3package 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.
 40type info uint16
 41
 42const (
 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.
 62type category uint16
 63
 64const (
 65	unknown              category = 0 // not currently defined in unicode.
 66	mapped               category = 1
 67	disallowedSTD3Mapped category = 2
 68	deviation            category = 3
 69)
 70
 71const (
 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
 81const (
 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
 94func (c info) isMapped() bool {
 95	return c&0x3 != 0
 96}
 97
 98func (c info) category() category {
 99	small := c & catSmallMask
100	if small != 0 {
101		return category(small)
102	}
103	return category(c & catBigMask)
104}
105
106func (c info) joinType() info {
107	if c.isMapped() {
108		return 0
109	}
110	return (c >> joinShift) & joinMask
111}
112
113func (c info) isModifier() bool {
114	return c&(modifier|catSmallMask) == modifier
115}
116
117func (c info) isViramaModifier() bool {
118	return c&(attributesMask|catSmallMask) == viramaModifier
119}