trieval.mx raw

   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  }
 120