print.mx raw

   1  // Copyright 2021 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  package ascii
   6  
   7  import (
   8  	"bytes"
   9  	"unicode"
  10  )
  11  
  12  // EqualFold is [bytes.EqualFold], ASCII only. It reports whether s and t
  13  // are equal, ASCII-case-insensitively.
  14  func EqualFold(s, t []byte) bool {
  15  	if len(s) != len(t) {
  16  		return false
  17  	}
  18  	for i := 0; i < len(s); i++ {
  19  		if lower(s[i]) != lower(t[i]) {
  20  			return false
  21  		}
  22  	}
  23  	return true
  24  }
  25  
  26  // lower returns the ASCII lowercase version of b.
  27  func lower(b byte) byte {
  28  	if 'A' <= b && b <= 'Z' {
  29  		return b + ('a' - 'A')
  30  	}
  31  	return b
  32  }
  33  
  34  // IsPrint returns whether s is ASCII and printable according to
  35  // https://tools.ietf.org/html/rfc20#section-4.2.
  36  func IsPrint(s []byte) bool {
  37  	for i := 0; i < len(s); i++ {
  38  		if s[i] < ' ' || s[i] > '~' {
  39  			return false
  40  		}
  41  	}
  42  	return true
  43  }
  44  
  45  // Is returns whether s is ASCII.
  46  func Is(s []byte) bool {
  47  	for i := 0; i < len(s); i++ {
  48  		if s[i] > unicode.MaxASCII {
  49  			return false
  50  		}
  51  	}
  52  	return true
  53  }
  54  
  55  // ToLower returns the lowercase version of s if s is ASCII and printable.
  56  func ToLower(s []byte) (lower []byte, ok bool) {
  57  	if !IsPrint(s) {
  58  		return "", false
  59  	}
  60  	return bytes.ToLower(s), true
  61  }
  62