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 }