summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/paulrosania/go-charset/charset/big5.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/paulrosania/go-charset/charset/big5.go')
-rw-r--r--vendor/github.com/paulrosania/go-charset/charset/big5.go88
1 files changed, 88 insertions, 0 deletions
diff --git a/vendor/github.com/paulrosania/go-charset/charset/big5.go b/vendor/github.com/paulrosania/go-charset/charset/big5.go
new file mode 100644
index 00000000..e01fa1af
--- /dev/null
+++ b/vendor/github.com/paulrosania/go-charset/charset/big5.go
@@ -0,0 +1,88 @@
+package charset
+
+import (
+ "fmt"
+ "unicode/utf8"
+)
+
+func init() {
+ registerClass("big5", fromBig5, nil)
+}
+
+// Big5 consists of 89 fonts of 157 chars each
+const (
+ big5Max = 13973
+ big5Font = 157
+ big5Data = "big5.dat"
+)
+
+type translateFromBig5 struct {
+ font int
+ scratch []byte
+ big5map []rune
+}
+
+func (p *translateFromBig5) Translate(data []byte, eof bool) (int, []byte, error) {
+ p.scratch = p.scratch[:0]
+ n := 0
+ for len(data) > 0 {
+ c := int(data[0])
+ data = data[1:]
+ n++
+ if p.font == -1 {
+ // idle state
+ if c >= 0xa1 {
+ p.font = c
+ continue
+ }
+ if c == 26 {
+ c = '\n'
+ }
+ continue
+ }
+ f := p.font
+ p.font = -1
+ r := utf8.RuneError
+ switch {
+ case c >= 64 && c <= 126:
+ c -= 64
+ case c >= 161 && c <= 254:
+ c = c - 161 + 63
+ default:
+ // bad big5 char
+ f = 255
+ }
+ if f <= 254 {
+ f -= 161
+ ix := f*big5Font + c
+ if ix < len(p.big5map) {
+ r = p.big5map[ix]
+ }
+ if r == -1 {
+ r = utf8.RuneError
+ }
+ }
+ p.scratch = appendRune(p.scratch, r)
+ }
+ return n, p.scratch, nil
+}
+
+type big5Key bool
+
+func fromBig5(arg string) (Translator, error) {
+ big5map, err := cache(big5Key(false), func() (interface{}, error) {
+ data, err := readFile(big5Data)
+ if err != nil {
+ return nil, fmt.Errorf("charset: cannot open big5 data file: %v", err)
+ }
+ big5map := []rune(string(data))
+ if len(big5map) != big5Max {
+ return nil, fmt.Errorf("charset: corrupt big5 data")
+ }
+ return big5map, nil
+ })
+ if err != nil {
+ return nil, err
+ }
+ return &translateFromBig5{big5map: big5map.([]rune), font: -1}, nil
+}