fork of go-gitdiff with jj support
at v0.2.1 1.1 kB view raw
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}