9fans.net/go@v0.0.7/cmd/devdraw/latin1.go (about)

     1  package main
     2  
     3  import "unicode/utf8"
     4  
     5  /*
     6   * The code makes two assumptions: strlen(ld) is 1 or 2; latintab[i].ld can be a
     7   * prefix of latintab[j].ld only when j<i.
     8   */
     9  type cvlist struct {
    10  	ld string /* must be seen before using this conversion */
    11  	si string /* options for last input characters */
    12  	so []rune /* the corresponding Rune for each si entry */
    13  }
    14  
    15  /*
    16   * Given 5 characters k[0]..k[n], find the rune or return -1 for failure.
    17   */
    18  func toUnicode(k []rune) rune {
    19  	c := rune(0)
    20  	for ; len(k) > 0; k = k[1:] {
    21  		r := k[0]
    22  		c <<= 4
    23  		if '0' <= r && r <= '9' {
    24  			c += rune(r) - '0'
    25  		} else if 'a' <= r && r <= 'f' {
    26  			c += 10 + r - 'a'
    27  		} else if 'A' <= r && r <= 'F' {
    28  			c += 10 + r - 'A'
    29  		} else {
    30  			return -1
    31  		}
    32  		if c > utf8.MaxRune {
    33  			return -1
    34  		}
    35  	}
    36  	return c
    37  }
    38  
    39  /*
    40   * Given n characters k[0]..k[n-1], find the corresponding rune or return -1 for
    41   * failure, or something < -1 if n is too small.  In the latter case, the result
    42   * is minus the required n.
    43   */
    44  func toLatin1(k []rune) rune {
    45  	n := len(k)
    46  	if k[0] == 'X' {
    47  		if n < 2 {
    48  			return -2
    49  		}
    50  		if k[1] == 'X' {
    51  			if n < 3 {
    52  				return -3
    53  			}
    54  			if k[2] == 'X' {
    55  				if n < 9 {
    56  					if toUnicode(k[3:]) < 0 {
    57  						return -1
    58  					}
    59  					return rune(-(n + 1))
    60  				}
    61  				return toUnicode(k[3:9])
    62  			}
    63  			if n < 7 {
    64  				if toUnicode(k[2:]) < 0 {
    65  					return -1
    66  				}
    67  				return rune(-(n + 1))
    68  			}
    69  			return toUnicode(k[2:7])
    70  		}
    71  		if n < 5 {
    72  			if toUnicode(k[1:]) < 0 {
    73  				return -1
    74  			}
    75  			return rune(-(n + 1))
    76  		}
    77  		return toUnicode(k[1:4])
    78  	}
    79  
    80  	for i := 0; i < len(latintab); i++ {
    81  		l := &latintab[i]
    82  		if k[0] == rune(l.ld[0]) {
    83  			if n == 1 {
    84  				return -2
    85  			}
    86  			var c rune
    87  			if len(l.ld) == 1 {
    88  				c = k[1]
    89  			} else if rune(l.ld[1]) != k[1] {
    90  				continue
    91  			} else if n == 2 {
    92  				return -3
    93  			} else {
    94  				c = k[2]
    95  			}
    96  			for i := range l.si {
    97  				if rune(l.si[i]) == c {
    98  					return l.so[i]
    99  				}
   100  			}
   101  			return -1
   102  		}
   103  	}
   104  	return -1
   105  }