github.com/arduino/arduino-cloud-cli@v0.0.0-20240517070944-e7a449561083/internal/lzss/decoder.go (about) 1 // This code is a go port of LZSS encoder-decoder (Haruhiko Okumura; public domain) 2 3 package lzss 4 5 import ( 6 "bytes" 7 8 "github.com/icza/bitio" 9 ) 10 11 func Decompress(data []byte) []byte { 12 input := bitio.NewReader(bytes.NewBuffer(data)) 13 output := make([]byte, 0) 14 15 buffer := make([]byte, bufsz*2) 16 for i := 0; i < bufsz-looksz; i++ { 17 buffer[i] = ' ' 18 } 19 20 r := bufsz - looksz 21 var char byte 22 var isChar bool 23 var err error 24 for { 25 isChar, err = input.ReadBool() 26 if err != nil { 27 break 28 } 29 30 if isChar { 31 char, err = input.ReadByte() 32 if err != nil { 33 break 34 } 35 output = append(output, char) 36 buffer[r] = char 37 r++ 38 r &= bufsz - 1 39 } else { 40 var i, j uint64 41 i, err = input.ReadBits(idxsz) 42 if err != nil { 43 break 44 } 45 j, err = input.ReadBits(lensz) 46 if err != nil { 47 break 48 } 49 50 for k := 0; k <= int(j)+1; k++ { 51 char = buffer[(int(i)+k)&(bufsz-1)] 52 output = append(output, char) 53 buffer[r] = char 54 r++ 55 r &= bufsz - 1 56 } 57 } 58 } 59 60 return output 61 }