diff options
author | Unknwon <joe2010xtmf@163.com> | 2014-09-07 19:58:01 -0400 |
---|---|---|
committer | Unknwon <joe2010xtmf@163.com> | 2014-09-07 19:58:01 -0400 |
commit | 25d6ae69d1cb392922b9d9dc0da1c17aef9a9db2 (patch) | |
tree | 4bc49d5520c52bf1ea6367cc0b80bf0065b920bc /modules/mahonia/euc-jp.go | |
parent | f8977f4847b8df9feec1bb5913f75401d79db876 (diff) | |
download | gitea-25d6ae69d1cb392922b9d9dc0da1c17aef9a9db2.tar.gz gitea-25d6ae69d1cb392922b9d9dc0da1c17aef9a9db2.zip |
Remove hg dep
Diffstat (limited to 'modules/mahonia/euc-jp.go')
-rw-r--r-- | modules/mahonia/euc-jp.go | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/modules/mahonia/euc-jp.go b/modules/mahonia/euc-jp.go new file mode 100644 index 0000000000..810c3ec7c3 --- /dev/null +++ b/modules/mahonia/euc-jp.go @@ -0,0 +1,102 @@ +package mahonia + +import ( + "unicode/utf8" +) + +// Converters for the EUC-JP encoding + +func init() { + RegisterCharset(&Charset{ + Name: "EUC-JP", + Aliases: []string{"extended_unix_code_packed_format_for_japanese", "cseucpkdfmtjapanese"}, + NewDecoder: func() Decoder { + return decodeEucJP + }, + NewEncoder: func() Encoder { + jis0208Table.Reverse() + jis0212Table.Reverse() + return encodeEucJP + }, + }) +} + +func decodeEucJP(p []byte) (c rune, size int, status Status) { + if len(p) == 0 { + return 0, 0, NO_ROOM + } + + b := p[0] + switch { + case b < 0x80: + return rune(b), 1, SUCCESS + + case b == 0x8e: + if len(p) < 2 { + return 0, 0, NO_ROOM + } + b2 := p[1] + if b2 < 0xa1 || b2 > 0xdf { + return utf8.RuneError, 1, INVALID_CHAR + } + return rune(b2) + (0xff61 - 0xa1), 2, SUCCESS + + case b == 0x8f: + if len(p) < 3 { + return 0, 0, NO_ROOM + } + c, size, status = jis0212Table.DecodeHigh(p[1:3]) + if status == SUCCESS { + size = 3 + } + return + + case 0xa1 <= b && b <= 0xfe: + return jis0208Table.DecodeHigh(p) + } + + return utf8.RuneError, 1, INVALID_CHAR +} + +func encodeEucJP(p []byte, c rune) (size int, status Status) { + if len(p) == 0 { + return 0, NO_ROOM + } + + if c < 0x80 { + p[0] = byte(c) + return 1, SUCCESS + } + + if len(p) < 2 { + return 0, NO_ROOM + } + + if c > 0xffff { + p[0] = '?' + return 1, INVALID_CHAR + } + + if 0xff61 <= c && c <= 0xff9f { + p[0] = 0x8e + p[1] = byte(c - (0xff61 - 0xa1)) + return 2, SUCCESS + } + + size, status = jis0208Table.EncodeHigh(p, c) + if status == SUCCESS { + return size, status + } + + size, status = jis0212Table.EncodeHigh(p[1:], c) + switch status { + case SUCCESS: + p[0] = 0x8f + return size + 1, SUCCESS + + case INVALID_CHAR: + p[0] = '?' + return 1, INVALID_CHAR + } + return size, status +} |