github.com/go-xe2/third@v1.0.3/golang.org/x/text/internal/export/idna/gen_trieval.go (about)

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