github.com/jflude/taocp@v0.0.0-20240210234939-99f2a91af3c2/mix/charset.go (about)

     1  package mix
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  )
     7  
     8  var ErrInvalidChar = errors.New("mix: invalid character")
     9  
    10  var mix2utf = []rune(` ABCDEFGHIΔJKLMNOPQRΣΠSTUVWXYZ0123456789.,()+-*/=$<>@;:'`)
    11  var utf2mix = make(map[rune]int)
    12  
    13  func init() {
    14  	for i, v := range mix2utf {
    15  		utf2mix[v] = i
    16  	}
    17  }
    18  
    19  func ConvertToUTF8(w []Word) string {
    20  	var r []rune
    21  	for _, v := range w {
    22  		for f := 1; f <= 5; f++ {
    23  			r = append(r, mix2utf[v.Field(Spec(f, f))])
    24  		}
    25  	}
    26  	return string(r)
    27  }
    28  
    29  func ConvertToMIX(s string) ([]Word, error) {
    30  	var w []Word
    31  	f := 0
    32  	for _, r := range s {
    33  		if f = f%5 + 1; f == 1 {
    34  			w = append(w, 0)
    35  		}
    36  		c, ok := utf2mix[r]
    37  		if !ok {
    38  			return nil, charError(r)
    39  		}
    40  		w[len(w)-1].SetField(Spec(f, f), NewWord(c))
    41  	}
    42  	return w, nil
    43  }
    44  
    45  func charError(r rune) error {
    46  	return fmt.Errorf("%w: %#U", ErrInvalidChar, r)
    47  }
    48  
    49  func IsChar(r rune) bool {
    50  	_, ok := utf2mix[r]
    51  	return ok
    52  }
    53  
    54  func IsDigit(r rune) bool {
    55  	return r >= '0' && r <= '9'
    56  }
    57  
    58  func IsLetter(r rune) bool {
    59  	return (r >= 'A' && r <= 'Z') || r == 'Δ' || r == 'Σ' || r == 'Π'
    60  }
    61  
    62  func IsSpace(r rune) bool {
    63  	return r == ' '
    64  }