--- /dev/null
+Doug Coleman
--- /dev/null
+Doug Coleman
--- /dev/null
+! Copyright (C) 2014 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien alien.c-types alien.libraries
+alien.libraries.finder alien.syntax classes.struct ;
+USE: nested-comments
+IN: compression.snappy.ffi
+
+<< "snappy" "snappy" find-library cdecl add-library >>
+
+LIBRARY: snappy
+
+ENUM: snappy_status SNAPPY_OK SNAPPY_INVALID_INPUT SNAPPY_BUFFER_TOO_SMALL ;
+
+FUNCTION: snappy_status snappy_compress ( char* input,
+ size_t input_length,
+ char* compressed,
+ size_t* compressed_length ) ;
+
+FUNCTION: snappy_status snappy_uncompress ( char* compressed,
+ size_t compressed_length,
+ char* uncompressed,
+ size_t* uncompressed_length ) ;
+
+FUNCTION: size_t snappy_max_compressed_length ( size_t source_length ) ;
+
+FUNCTION: snappy_status snappy_uncompressed_length ( char* compressed,
+ size_t compressed_length,
+ size_t* result ) ;
+
+FUNCTION: snappy_status snappy_validate_compressed_buffer ( char* compressed,
+ size_t compressed_length ) ;
+
--- /dev/null
+! Copyright (C) 2014 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: arrays byte-arrays compression.snappy kernel tools.test ;
+IN: compression.snappy.tests
+
+[ t ] [
+ 1000 2 <array> >byte-array [ snappy-compress snappy-uncompress ] keep =
+] unit-test
+
+[ t ] [
+ B{ } [ snappy-compress snappy-uncompress ] keep =
+] unit-test
+
+[ t ] [
+ B{ 1 } [ snappy-compress snappy-uncompress ] keep =
+] unit-test
+
+[ t ] [
+ B{ 1 2 } [ snappy-compress snappy-uncompress ] keep =
+] unit-test
+
+[ t ] [
+ B{ 1 2 3 } [ snappy-compress snappy-uncompress ] keep =
+] unit-test
--- /dev/null
+! Copyright (C) 2014 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien.c-types alien.data byte-arrays compression.snappy.ffi
+kernel sequences ;
+IN: compression.snappy
+
+ERROR: snappy-error error ;
+
+<PRIVATE
+
+: check-snappy ( ret -- )
+ dup SNAPPY_OK = [ drop ] [ snappy-error ] if ;
+
+: n>outs ( n -- byte-array size_t* )
+ [ <byte-array> ] [ size_t <ref> ] bi ;
+
+PRIVATE>
+
+: snappy-compress ( byte-array -- compressed )
+ dup length
+ dup snappy_max_compressed_length
+ n>outs
+ [ snappy_compress check-snappy ] 2keep size_t deref head ;
+
+: snappy-uncompress ( compressed -- byte-array )
+ dup length
+ over
+ dup length 0 size_t <ref>
+ [ snappy_uncompressed_length check-snappy ] keep
+ size_t deref
+ n>outs
+ [ snappy_uncompress check-snappy ] 2keep drop >byte-array ;
+