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