github.com/lianghucheng/zrddz@v0.0.0-20200923083010-c71f680932e2/src/golang.org/x/net/idna/trieval.go (about)

     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  }