56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package lz4
 | |
| 
 | |
| // #cgo CFLAGS: -O3
 | |
| // #include "src/lz4.h"
 | |
| // #include "src/lz4.c"
 | |
| import "C"
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"fmt"
 | |
| 	"unsafe"
 | |
| )
 | |
| 
 | |
| // p gets a char pointer to the first byte of a []byte slice
 | |
| func p(in []byte) *C.char {
 | |
| 	if len(in) == 0 {
 | |
| 		return (*C.char)(unsafe.Pointer(nil))
 | |
| 	}
 | |
| 	return (*C.char)(unsafe.Pointer(&in[0]))
 | |
| }
 | |
| 
 | |
| // clen gets the length of a []byte slice as a char *
 | |
| func clen(s []byte) C.int {
 | |
| 	return C.int(len(s))
 | |
| }
 | |
| 
 | |
| // Uncompress with a known output size. len(out) should be equal to
 | |
| // the length of the uncompressed out.
 | |
| func Uncompress(in, out []byte) (error) {
 | |
| 	if int(C.LZ4_decompress_safe(p(in), p(out), clen(in), clen(out))) < 0 {
 | |
| 		return errors.New("Malformed compression stream")
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // CompressBound calculates the size of the output buffer needed by
 | |
| // Compress. This is based on the following macro:
 | |
| //
 | |
| // #define LZ4_COMPRESSBOUND(isize)
 | |
| //      ((unsigned int)(isize) > (unsigned int)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16)
 | |
| func CompressBound(in []byte) int {
 | |
| 	return len(in) + ((len(in) / 255) + 16)
 | |
| }
 | |
| 
 | |
| // Compress compresses in and puts the content in out. len(out)
 | |
| // should have enough space for the compressed data (use CompressBound
 | |
| // to calculate). Returns the number of bytes in the out slice.
 | |
| func Compress(in, out []byte) (outSize int, err error) {
 | |
| 	outSize = int(C.LZ4_compress_limitedOutput(p(in), p(out), clen(in), clen(out)))
 | |
| 	if outSize == 0 {
 | |
| 		err = fmt.Errorf("insufficient space for compression")
 | |
| 	}
 | |
| 	return
 | |
| }
 |