func Decompress(output []byte, input []byte) (out []byte, err os.Error) { var size C.size_t if C.snappy_uncompressed_length(c_pchar(&input[0]), C.size_t(len(input)), &size) != C.SNAPPY_OK { return nil, os.NewError("Invalid Input") } if C.size_t(cap(output)) < size { output = make([]byte, size) } if C.snappy_uncompress(c_pchar(&input[0]), C.size_t(len(input)), c_pchar(&output[0]), &size) != C.SNAPPY_OK { return nil, os.NewError("Invalid Input") } return output[:size], nil }
// Decode returns the decoded form of src. The returned slice may be a sub- // slice of dst if dst was large enough to hold the entire decoded block. // Otherwise, a newly allocated slice will be returned. // It is valid to pass a nil dst. func Decode(dst, src []byte) ([]byte, error) { dLen, _, err := decodedLen(src) if err != nil { return nil, err } if len(dst) < dLen { dst = make([]byte, dLen) } if dLen == 0 { return dst[:0], nil } tLen := C.size_t(dLen) status := C.snappy_uncompress((*C.char)(unsafe.Pointer(&src[0])), C.size_t(len(src)), (*C.char)(unsafe.Pointer(&dst[0])), &tLen) if status != C.SNAPPY_OK { return nil, ErrCorrupt } return dst[:tLen], nil }