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  }