fork of go-gitdiff with jj support
1package gitdiff
2
3import (
4 "fmt"
5)
6
7var (
8 b85Table map[byte]byte
9 b85Alpha = []byte(
10 "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz" + "!#$%&()*+-;<=>?@^_`{|}~",
11 )
12)
13
14func init() {
15 b85Table = make(map[byte]byte)
16 for i, c := range b85Alpha {
17 b85Table[c] = byte(i)
18 }
19}
20
21// base85Decode decodes Base85-encoded data from src into dst. It uses the
22// alphabet defined by base85.c in the Git source tree, which appears to be
23// unique. src must contain at least len(dst) bytes of encoded data.
24func base85Decode(dst, src []byte) error {
25 var v uint32
26 var n, ndst int
27 for i, b := range src {
28 if b, ok := b85Table[b]; ok {
29 v = 85*v + uint32(b)
30 n++
31 } else {
32 return fmt.Errorf("invalid base85 byte at index %d: 0x%X", i, src[i])
33 }
34 if n == 5 {
35 rem := len(dst) - ndst
36 for j := 0; j < 4 && j < rem; j++ {
37 dst[ndst] = byte(v >> 24)
38 ndst++
39 v <<= 8
40 }
41 v = 0
42 n = 0
43 }
44 }
45 if n > 0 {
46 return fmt.Errorf("base85 data terminated by underpadded sequence")
47 }
48 if ndst < len(dst) {
49 return fmt.Errorf("base85 data underrun: %d < %d", ndst, len(dst))
50 }
51 return nil
52}