You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2011/05/02 19:51:29 UTC

svn commit: r1098691 - in /couchdb/trunk/src/snappy: snappy.erl snappy_nif.cc

Author: davisp
Date: Mon May  2 17:51:28 2011
New Revision: 1098691

URL: http://svn.apache.org/viewvc?rev=1098691&view=rev
Log:
Refactored snappy NIF.


Modified:
    couchdb/trunk/src/snappy/snappy.erl
    couchdb/trunk/src/snappy/snappy_nif.cc

Modified: couchdb/trunk/src/snappy/snappy.erl
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/snappy/snappy.erl?rev=1098691&r1=1098690&r2=1098691&view=diff
==============================================================================
--- couchdb/trunk/src/snappy/snappy.erl (original)
+++ couchdb/trunk/src/snappy/snappy.erl Mon May  2 17:51:28 2011
@@ -16,8 +16,7 @@
 -module(snappy).
 
 -export([compress/1, decompress/1]).
--export([get_uncompressed_length/1]).
--export([is_valid_compressed_buffer/1]).
+-export([uncompressed_length/1, is_valid/1]).
 
 -on_load(init/0).
 
@@ -49,9 +48,9 @@ decompress(_IoList) ->
     exit(snappy_nif_not_loaded).
 
 
-get_uncompressed_length(_IoList) ->
+uncompressed_length(_IoList) ->
     exit(snappy_nif_not_loaded).
 
 
-is_valid_compressed_buffer(_IoList) ->
+is_valid(_IoList) ->
     exit(snappy_nif_not_loaded).

Modified: couchdb/trunk/src/snappy/snappy_nif.cc
URL: http://svn.apache.org/viewvc/couchdb/trunk/src/snappy/snappy_nif.cc?rev=1098691&r1=1098690&r2=1098691&view=diff
==============================================================================
--- couchdb/trunk/src/snappy/snappy_nif.cc (original)
+++ couchdb/trunk/src/snappy/snappy_nif.cc Mon May  2 17:51:28 2011
@@ -26,206 +26,240 @@
 #error OTP R13B03 not supported. Upgrade to R13B04 or later.
 #endif
 
+#ifdef __cplusplus
+#define BEGIN_C extern "C" {
+#define END_C }
+#else
+#define BEGIN_C
+#define END_C
+#endif
 
-class SnappyNifSink : public snappy::Sink {
-public:
-    SnappyNifSink(ErlNifEnv* e) : env(e), length(0)  {
-        if (!enif_alloc_binary_compat(env, 0, &bin)) {
-            enif_release_binary_compat(env, &bin);
-            throw std::bad_alloc();
-        }
+#define SC_PTR(c) reinterpret_cast<char *>(c)
+
+class SnappyNifSink : public snappy::Sink
+{
+    public:
+        SnappyNifSink(ErlNifEnv* e);
+        ~SnappyNifSink();
+        
+        void Append(const char* data, size_t n);
+        char* GetAppendBuffer(size_t len, char* scratch);
+        ErlNifBinary& getBin();
+
+    private:
+        ErlNifEnv* env;
+        ErlNifBinary bin;
+        size_t length;
+};
+
+SnappyNifSink::SnappyNifSink(ErlNifEnv* e) : env(e), length(0)
+{
+    if(!enif_alloc_binary_compat(env, 0, &bin)) {
+        env = NULL;
+        throw std::bad_alloc();
     }
+}
 
-    void Append(const char *data, size_t n) {
-        if (data != reinterpret_cast<const char *>(bin.data + length)) {
-            memcpy(bin.data + length, data, n);
-        }
-        length += n;
+SnappyNifSink::~SnappyNifSink()
+{
+    if(env != NULL) {
+        enif_release_binary_compat(env, &bin);
     }
+}
 
-    char* GetAppendBuffer(size_t len, char* scratch) {
-        if ((length + len) > bin.size) {
-            size_t sz = (len * 4) < 8192 ? 8192 : (len * 4);
+void
+SnappyNifSink::Append(const char *data, size_t n)
+{
+    if(data != (SC_PTR(bin.data) + length)) {
+        memcpy(bin.data + length, data, n);
+    }
+    length += n;
+}
 
-            if (!enif_realloc_binary_compat(env, &bin, bin.size + sz)) {
-                enif_release_binary_compat(env, &bin);
-                throw std::bad_alloc();
-            }
-        }
+char*
+SnappyNifSink::GetAppendBuffer(size_t len, char* scratch)
+{
+    size_t sz;
+    
+    if((length + len) > bin.size) {
+        sz = (len * 4) < 8192 ? 8192 : (len * 4);
 
-        return reinterpret_cast<char *>(bin.data + length);
+        if(!enif_realloc_binary_compat(env, &bin, bin.size + sz)) {
+            throw std::bad_alloc();
+        }
     }
 
-    ErlNifBinary& getBin() {
-        if (bin.size > length) {
-            if (!enif_realloc_binary_compat(env, &bin, length)) {
-                // shouldn't happen
-                enif_release_binary_compat(env, &bin);
-                throw std::bad_alloc();
-            }
+    return SC_PTR(bin.data) + length;
+}
+
+ErlNifBinary&
+SnappyNifSink::getBin()
+{
+    if(bin.size > length) {
+        if(!enif_realloc_binary_compat(env, &bin, length)) {
+            throw std::bad_alloc();
         }
-        return bin;
     }
+    return bin;
+}
+
+
+BEGIN_C
 
-private:
-    ErlNifEnv* env;
-    ErlNifBinary bin;
-    size_t length;
-};
 
+ERL_NIF_TERM
+make_atom(ErlNifEnv* env, const char* name)
+{
+    ERL_NIF_TERM ret;
+    if(enif_make_existing_atom(env, name, &ret, ERL_NIF_LATIN1)) {
+        return ret;
+    }
+    return enif_make_atom(env, name);
+}
 
-extern "C" {
 
-    ERL_NIF_TERM snappy_compress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
-        ErlNifBinary input;
+ERL_NIF_TERM
+make_ok(ErlNifEnv* env, ERL_NIF_TERM mesg)
+{
+    ERL_NIF_TERM ok = make_atom(env, "ok");
+    return enif_make_tuple2(env, ok, mesg);   
+}
 
-        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
-            return enif_make_badarg(env);
-        }
 
-        try {
-            snappy::ByteArraySource source(reinterpret_cast<const char *>(input.data),
-                                           input.size);
-            SnappyNifSink sink(env);
+ERL_NIF_TERM
+make_error(ErlNifEnv* env, const char* mesg)
+{
+    ERL_NIF_TERM error = make_atom(env, "error");
+    return enif_make_tuple2(env, error, make_atom(env, mesg));
+}
 
-            snappy::Compress(&source, &sink);
 
-            return enif_make_tuple(env, 2,
-                                   enif_make_atom(env, "ok"),
-                                   enif_make_binary(env, &sink.getBin()));
-        } catch(std::bad_alloc e) {
-            return enif_make_tuple(env, 2,
-                                   enif_make_atom(env, "error"),
-                                   enif_make_atom(env, "insufficient_memory"));
-        } catch(...) {
-            return enif_make_tuple(env, 2,
-                                   enif_make_atom(env, "error"),
-                                   enif_make_atom(env, "unknown"));
-        }
+ERL_NIF_TERM
+snappy_compress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+    ErlNifBinary input;
+
+    if(!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
+        return enif_make_badarg(env);
+    }
+
+    try {
+        snappy::ByteArraySource source(SC_PTR(input.data), input.size);
+        SnappyNifSink sink(env);
+        snappy::Compress(&source, &sink);
+        return make_ok(env, enif_make_binary(env, &sink.getBin()));
+    } catch(std::bad_alloc e) {
+        return make_error(env, "insufficient_memory");
+    } catch(...) {
+        return make_error(env, "unknown");
     }
+}
 
 
-    ERL_NIF_TERM snappy_decompress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
-        ErlNifBinary input;
+ERL_NIF_TERM
+snappy_decompress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+    ErlNifBinary bin;
+    ErlNifBinary ret;
+    size_t len;
+
+    if(!enif_inspect_iolist_as_binary(env, argv[0], &bin)) {
+        return enif_make_badarg(env);
+    }
 
-        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
-            return enif_make_badarg(env);
+    try {
+        if(!snappy::GetUncompressedLength(SC_PTR(bin.data), bin.size, &len)) {
+            return make_error(env, "data_not_compressed");
         }
 
-        try {
-            size_t len = -1;
-            bool isCompressed = snappy::GetUncompressedLength(
-                reinterpret_cast<const char *>(input.data), input.size, &len);
+        if(!enif_alloc_binary_compat(env, len, &ret)) {
+            return make_error(env, "insufficient_memory");
+        }
 
-            if (!isCompressed) {
-                return enif_make_tuple(env, 2,
-                                       enif_make_atom(env, "error"),
-                                       enif_make_atom(env, "not_compressed_data"));
-            }
+        if(!snappy::RawUncompress(SC_PTR(bin.data), bin.size,
+                                            SC_PTR(ret.data))) {
+            return make_error(env, "corrupted_data");
+        }
 
-            ErlNifBinary retBin;
+        return make_ok(env, enif_make_binary(env, &ret));
+    } catch(...) {
+        return make_error(env, "unknown");
+    }
+}
 
-            if (!enif_alloc_binary_compat(env, len, &retBin)) {
-                return enif_make_tuple(env, 2,
-                                       enif_make_atom(env, "error"),
-                                       enif_make_atom(env, "insufficient_memory"));
-            }
 
-            bool valid = snappy::RawUncompress(reinterpret_cast<const char *>(input.data),
-                                               input.size,
-                                               reinterpret_cast<char *>(retBin.data));
+ERL_NIF_TERM
+snappy_uncompressed_length(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+    ErlNifBinary bin;
+    size_t len;
 
-            if (!valid) {
-                return enif_make_tuple(env, 2,
-                                       enif_make_atom(env, "error"),
-                                       enif_make_atom(env, "corrupted_data"));
-            }
+    if(!enif_inspect_iolist_as_binary(env, argv[0], &bin)) {
+        return enif_make_badarg(env);
+    }
 
-            return enif_make_tuple(env, 2,
-                                   enif_make_atom(env, "ok"),
-                                   enif_make_binary(env, &retBin));
-        } catch(...) {
-            return enif_make_tuple(env, 2,
-                                   enif_make_atom(env, "error"),
-                                   enif_make_atom(env, "unknown"));
+    try {
+        if(!snappy::GetUncompressedLength(SC_PTR(bin.data), bin.size, &len)) {
+            return make_error(env, "data_not_compressed");
         }
+        return make_ok(env, enif_make_ulong(env, len));
+    } catch(...) {
+        return make_error(env, "unknown");
     }
+}
 
 
-    ERL_NIF_TERM snappy_get_uncompressed_length(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
-        ErlNifBinary input;
-
-        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
-            return enif_make_badarg(env);
-        }
+ERL_NIF_TERM
+snappy_is_valid(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
+{
+    ErlNifBinary bin;
 
-        try {
-            size_t len = -1;
-            bool isCompressed = snappy::GetUncompressedLength(
-                reinterpret_cast<const char *>(input.data), input.size, &len);
+    if (!enif_inspect_iolist_as_binary(env, argv[0], &bin)) {
+        return enif_make_badarg(env);
+    }
 
-            if (isCompressed) {
-                return enif_make_tuple(env, 2,
-                                       enif_make_atom(env, "ok"),
-                                       enif_make_ulong(env, len));
-            } else {
-                return enif_make_tuple(env, 2,
-                                       enif_make_atom(env, "error"),
-                                       enif_make_atom(env, "not_compressed_data"));
-            }
-        } catch(...) {
-            return enif_make_tuple(env, 2,
-                                   enif_make_atom(env, "error"),
-                                   enif_make_atom(env, "unknown"));
+    try {
+        if(snappy::IsValidCompressedBuffer(SC_PTR(bin.data), bin.size)) {
+            return make_atom(env, "true");
+        } else {
+            return make_atom(env, "false");
         }
+    } catch(...) {
+        return make_error(env, "unknown");
     }
+}
 
 
-    ERL_NIF_TERM snappy_is_valid_compressed_buffer(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
-        ErlNifBinary input;
-
-        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
-            return enif_make_badarg(env);
-        }
-
-        try {
-            bool valid = snappy::IsValidCompressedBuffer(
-                reinterpret_cast<const char *>(input.data), input.size);
+int
+on_load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
+{
+    return 0;
+}
 
-            if (valid) {
-                return enif_make_atom(env, "true");
-            } else {
-                return enif_make_atom(env, "false");
-            }
-        } catch(...) {
-            return enif_make_tuple(env, 2,
-                                   enif_make_atom(env, "error"),
-                                   enif_make_atom(env, "unknown"));
-        }
-    }
 
+int
+on_reload(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
+{
+    return 0;
+}
 
 
-    int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM info) {
-        return 0;
-    }
+int
+on_upgrade(ErlNifEnv* env, void** priv, void** old_priv, ERL_NIF_TERM info)
+{
+    return 0;
+}
 
 
-    int on_reload(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM info) {
-        return 0;
-    }
+static ErlNifFunc nif_functions[] = {
+    {"compress", 1, snappy_compress},
+    {"decompress", 1, snappy_decompress},
+    {"uncompressed_length", 1, snappy_uncompressed_length},
+    {"is_valid", 1, snappy_is_valid}
+};
 
-    int on_upgrade(ErlNifEnv* env, void** priv_data, void** old_data, ERL_NIF_TERM info) {
-        return 0;
-    }
 
+ERL_NIF_INIT(snappy, nif_functions, &on_load, &on_reload, &on_upgrade, NULL);
 
-    static ErlNifFunc nif_functions[] = {
-        {"compress", 1, snappy_compress},
-        {"decompress", 1, snappy_decompress},
-        {"get_uncompressed_length", 1, snappy_get_uncompressed_length},
-        {"is_valid_compressed_buffer", 1, snappy_is_valid_compressed_buffer}
-    };
 
-    ERL_NIF_INIT(snappy, nif_functions, &on_load, &on_reload, &on_upgrade, NULL);
-}
+END_C
\ No newline at end of file



Re: svn commit: r1098691 - in /couchdb/trunk/src/snappy: snappy.erl snappy_nif.cc

Posted by Paul Davis <pa...@gmail.com>.
On Mon, May 2, 2011 at 2:07 PM, Filipe David Manana <fd...@apache.org> wrote:
> Paul, this breaks compilation with R13B04:
>
> make[3]: Entering directory `/home/fdmanana/git/hub/couchdb/src/snappy'
> /bin/bash ../../libtool --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H
> -I. -I../.. -I../../src/snappy/google-snappy   -D_XOPEN_SOURCE
> -L/usr/lib/xulrunner-devel-1.9.2.17/lib/ -L/usr/local/lib
> -L/opt/local/lib -I/opt/r13b04/lib/erlang/usr/include
> -I/usr/lib/xulrunner-devel-1.9.2.17/include/ -DXP_UNIX    -g -O2 -MT
> snappy_nif.lo -MD -MP -MF .deps/snappy_nif.Tpo -c -o snappy_nif.lo
> snappy_nif.cc
> libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I../..
> -I../../src/snappy/google-snappy -D_XOPEN_SOURCE
> -L/usr/lib/xulrunner-devel-1.9.2.17/lib/ -L/usr/local/lib
> -L/opt/local/lib -I/opt/r13b04/lib/erlang/usr/include
> -I/usr/lib/xulrunner-devel-1.9.2.17/include/ -DXP_UNIX -g -O2 -MT
> snappy_nif.lo -MD -MP -MF .deps/snappy_nif.Tpo -c snappy_nif.cc  -fPIC
> -DPIC -o .libs/snappy_nif.o
> /opt/r13b04/lib/erlang/usr/include/erl_nif_api_funcs.h: In function
> ‘ERL_NIF_TERM make_atom(ErlNifEnv*, const char*)’:
> /opt/r13b04/lib/erlang/usr/include/erl_nif_api_funcs.h:48: error: too
> many arguments to function ‘int enif_make_existing_atom(ErlNifEnv*,
> const char*, ERL_NIF_TERM*)’
> snappy_nif.cc:114: error: at this point in file
> make[3]: *** [snappy_nif.lo] Error 1
> make[3]: Leaving directory `/home/fdmanana/git/hub/couchdb/src/snappy'
> make[2]: *** [all-recursive] Error 1
> make[2]: Leaving directory `/home/fdmanana/git/hub/couchdb/src'
> make[1]: *** [all-recursive] Error 1
> make[1]: Leaving directory `/home/fdmanana/git/hub/couchdb'
> make: *** [all] Error 2
>
>
> Can you fix it?
> Thanks
>

Should be fixed. Odd there wasn't anything in erl_nif_compat.h for
that function.

> On Mon, May 2, 2011 at 6:51 PM,  <da...@apache.org> wrote:
>> Author: davisp
>> Date: Mon May  2 17:51:28 2011
>> New Revision: 1098691
>>
>> URL: http://svn.apache.org/viewvc?rev=1098691&view=rev
>> Log:
>> Refactored snappy NIF.
>>
>>
>> Modified:
>>    couchdb/trunk/src/snappy/snappy.erl
>>    couchdb/trunk/src/snappy/snappy_nif.cc
>>
>> Modified: couchdb/trunk/src/snappy/snappy.erl
>> URL: http://svn.apache.org/viewvc/couchdb/trunk/src/snappy/snappy.erl?rev=1098691&r1=1098690&r2=1098691&view=diff
>> ==============================================================================
>> --- couchdb/trunk/src/snappy/snappy.erl (original)
>> +++ couchdb/trunk/src/snappy/snappy.erl Mon May  2 17:51:28 2011
>> @@ -16,8 +16,7 @@
>>  -module(snappy).
>>
>>  -export([compress/1, decompress/1]).
>> --export([get_uncompressed_length/1]).
>> --export([is_valid_compressed_buffer/1]).
>> +-export([uncompressed_length/1, is_valid/1]).
>>
>>  -on_load(init/0).
>>
>> @@ -49,9 +48,9 @@ decompress(_IoList) ->
>>     exit(snappy_nif_not_loaded).
>>
>>
>> -get_uncompressed_length(_IoList) ->
>> +uncompressed_length(_IoList) ->
>>     exit(snappy_nif_not_loaded).
>>
>>
>> -is_valid_compressed_buffer(_IoList) ->
>> +is_valid(_IoList) ->
>>     exit(snappy_nif_not_loaded).
>>
>> Modified: couchdb/trunk/src/snappy/snappy_nif.cc
>> URL: http://svn.apache.org/viewvc/couchdb/trunk/src/snappy/snappy_nif.cc?rev=1098691&r1=1098690&r2=1098691&view=diff
>> ==============================================================================
>> --- couchdb/trunk/src/snappy/snappy_nif.cc (original)
>> +++ couchdb/trunk/src/snappy/snappy_nif.cc Mon May  2 17:51:28 2011
>> @@ -26,206 +26,240 @@
>>  #error OTP R13B03 not supported. Upgrade to R13B04 or later.
>>  #endif
>>
>> +#ifdef __cplusplus
>> +#define BEGIN_C extern "C" {
>> +#define END_C }
>> +#else
>> +#define BEGIN_C
>> +#define END_C
>> +#endif
>>
>> -class SnappyNifSink : public snappy::Sink {
>> -public:
>> -    SnappyNifSink(ErlNifEnv* e) : env(e), length(0)  {
>> -        if (!enif_alloc_binary_compat(env, 0, &bin)) {
>> -            enif_release_binary_compat(env, &bin);
>> -            throw std::bad_alloc();
>> -        }
>> +#define SC_PTR(c) reinterpret_cast<char *>(c)
>> +
>> +class SnappyNifSink : public snappy::Sink
>> +{
>> +    public:
>> +        SnappyNifSink(ErlNifEnv* e);
>> +        ~SnappyNifSink();
>> +
>> +        void Append(const char* data, size_t n);
>> +        char* GetAppendBuffer(size_t len, char* scratch);
>> +        ErlNifBinary& getBin();
>> +
>> +    private:
>> +        ErlNifEnv* env;
>> +        ErlNifBinary bin;
>> +        size_t length;
>> +};
>> +
>> +SnappyNifSink::SnappyNifSink(ErlNifEnv* e) : env(e), length(0)
>> +{
>> +    if(!enif_alloc_binary_compat(env, 0, &bin)) {
>> +        env = NULL;
>> +        throw std::bad_alloc();
>>     }
>> +}
>>
>> -    void Append(const char *data, size_t n) {
>> -        if (data != reinterpret_cast<const char *>(bin.data + length)) {
>> -            memcpy(bin.data + length, data, n);
>> -        }
>> -        length += n;
>> +SnappyNifSink::~SnappyNifSink()
>> +{
>> +    if(env != NULL) {
>> +        enif_release_binary_compat(env, &bin);
>>     }
>> +}
>>
>> -    char* GetAppendBuffer(size_t len, char* scratch) {
>> -        if ((length + len) > bin.size) {
>> -            size_t sz = (len * 4) < 8192 ? 8192 : (len * 4);
>> +void
>> +SnappyNifSink::Append(const char *data, size_t n)
>> +{
>> +    if(data != (SC_PTR(bin.data) + length)) {
>> +        memcpy(bin.data + length, data, n);
>> +    }
>> +    length += n;
>> +}
>>
>> -            if (!enif_realloc_binary_compat(env, &bin, bin.size + sz)) {
>> -                enif_release_binary_compat(env, &bin);
>> -                throw std::bad_alloc();
>> -            }
>> -        }
>> +char*
>> +SnappyNifSink::GetAppendBuffer(size_t len, char* scratch)
>> +{
>> +    size_t sz;
>> +
>> +    if((length + len) > bin.size) {
>> +        sz = (len * 4) < 8192 ? 8192 : (len * 4);
>>
>> -        return reinterpret_cast<char *>(bin.data + length);
>> +        if(!enif_realloc_binary_compat(env, &bin, bin.size + sz)) {
>> +            throw std::bad_alloc();
>> +        }
>>     }
>>
>> -    ErlNifBinary& getBin() {
>> -        if (bin.size > length) {
>> -            if (!enif_realloc_binary_compat(env, &bin, length)) {
>> -                // shouldn't happen
>> -                enif_release_binary_compat(env, &bin);
>> -                throw std::bad_alloc();
>> -            }
>> +    return SC_PTR(bin.data) + length;
>> +}
>> +
>> +ErlNifBinary&
>> +SnappyNifSink::getBin()
>> +{
>> +    if(bin.size > length) {
>> +        if(!enif_realloc_binary_compat(env, &bin, length)) {
>> +            throw std::bad_alloc();
>>         }
>> -        return bin;
>>     }
>> +    return bin;
>> +}
>> +
>> +
>> +BEGIN_C
>>
>> -private:
>> -    ErlNifEnv* env;
>> -    ErlNifBinary bin;
>> -    size_t length;
>> -};
>>
>> +ERL_NIF_TERM
>> +make_atom(ErlNifEnv* env, const char* name)
>> +{
>> +    ERL_NIF_TERM ret;
>> +    if(enif_make_existing_atom(env, name, &ret, ERL_NIF_LATIN1)) {
>> +        return ret;
>> +    }
>> +    return enif_make_atom(env, name);
>> +}
>>
>> -extern "C" {
>>
>> -    ERL_NIF_TERM snappy_compress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
>> -        ErlNifBinary input;
>> +ERL_NIF_TERM
>> +make_ok(ErlNifEnv* env, ERL_NIF_TERM mesg)
>> +{
>> +    ERL_NIF_TERM ok = make_atom(env, "ok");
>> +    return enif_make_tuple2(env, ok, mesg);
>> +}
>>
>> -        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
>> -            return enif_make_badarg(env);
>> -        }
>>
>> -        try {
>> -            snappy::ByteArraySource source(reinterpret_cast<const char *>(input.data),
>> -                                           input.size);
>> -            SnappyNifSink sink(env);
>> +ERL_NIF_TERM
>> +make_error(ErlNifEnv* env, const char* mesg)
>> +{
>> +    ERL_NIF_TERM error = make_atom(env, "error");
>> +    return enif_make_tuple2(env, error, make_atom(env, mesg));
>> +}
>>
>> -            snappy::Compress(&source, &sink);
>>
>> -            return enif_make_tuple(env, 2,
>> -                                   enif_make_atom(env, "ok"),
>> -                                   enif_make_binary(env, &sink.getBin()));
>> -        } catch(std::bad_alloc e) {
>> -            return enif_make_tuple(env, 2,
>> -                                   enif_make_atom(env, "error"),
>> -                                   enif_make_atom(env, "insufficient_memory"));
>> -        } catch(...) {
>> -            return enif_make_tuple(env, 2,
>> -                                   enif_make_atom(env, "error"),
>> -                                   enif_make_atom(env, "unknown"));
>> -        }
>> +ERL_NIF_TERM
>> +snappy_compress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
>> +{
>> +    ErlNifBinary input;
>> +
>> +    if(!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
>> +        return enif_make_badarg(env);
>> +    }
>> +
>> +    try {
>> +        snappy::ByteArraySource source(SC_PTR(input.data), input.size);
>> +        SnappyNifSink sink(env);
>> +        snappy::Compress(&source, &sink);
>> +        return make_ok(env, enif_make_binary(env, &sink.getBin()));
>> +    } catch(std::bad_alloc e) {
>> +        return make_error(env, "insufficient_memory");
>> +    } catch(...) {
>> +        return make_error(env, "unknown");
>>     }
>> +}
>>
>>
>> -    ERL_NIF_TERM snappy_decompress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
>> -        ErlNifBinary input;
>> +ERL_NIF_TERM
>> +snappy_decompress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
>> +{
>> +    ErlNifBinary bin;
>> +    ErlNifBinary ret;
>> +    size_t len;
>> +
>> +    if(!enif_inspect_iolist_as_binary(env, argv[0], &bin)) {
>> +        return enif_make_badarg(env);
>> +    }
>>
>> -        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
>> -            return enif_make_badarg(env);
>> +    try {
>> +        if(!snappy::GetUncompressedLength(SC_PTR(bin.data), bin.size, &len)) {
>> +            return make_error(env, "data_not_compressed");
>>         }
>>
>> -        try {
>> -            size_t len = -1;
>> -            bool isCompressed = snappy::GetUncompressedLength(
>> -                reinterpret_cast<const char *>(input.data), input.size, &len);
>> +        if(!enif_alloc_binary_compat(env, len, &ret)) {
>> +            return make_error(env, "insufficient_memory");
>> +        }
>>
>> -            if (!isCompressed) {
>> -                return enif_make_tuple(env, 2,
>> -                                       enif_make_atom(env, "error"),
>> -                                       enif_make_atom(env, "not_compressed_data"));
>> -            }
>> +        if(!snappy::RawUncompress(SC_PTR(bin.data), bin.size,
>> +                                            SC_PTR(ret.data))) {
>> +            return make_error(env, "corrupted_data");
>> +        }
>>
>> -            ErlNifBinary retBin;
>> +        return make_ok(env, enif_make_binary(env, &ret));
>> +    } catch(...) {
>> +        return make_error(env, "unknown");
>> +    }
>> +}
>>
>> -            if (!enif_alloc_binary_compat(env, len, &retBin)) {
>> -                return enif_make_tuple(env, 2,
>> -                                       enif_make_atom(env, "error"),
>> -                                       enif_make_atom(env, "insufficient_memory"));
>> -            }
>>
>> -            bool valid = snappy::RawUncompress(reinterpret_cast<const char *>(input.data),
>> -                                               input.size,
>> -                                               reinterpret_cast<char *>(retBin.data));
>> +ERL_NIF_TERM
>> +snappy_uncompressed_length(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
>> +{
>> +    ErlNifBinary bin;
>> +    size_t len;
>>
>> -            if (!valid) {
>> -                return enif_make_tuple(env, 2,
>> -                                       enif_make_atom(env, "error"),
>> -                                       enif_make_atom(env, "corrupted_data"));
>> -            }
>> +    if(!enif_inspect_iolist_as_binary(env, argv[0], &bin)) {
>> +        return enif_make_badarg(env);
>> +    }
>>
>> -            return enif_make_tuple(env, 2,
>> -                                   enif_make_atom(env, "ok"),
>> -                                   enif_make_binary(env, &retBin));
>> -        } catch(...) {
>> -            return enif_make_tuple(env, 2,
>> -                                   enif_make_atom(env, "error"),
>> -                                   enif_make_atom(env, "unknown"));
>> +    try {
>> +        if(!snappy::GetUncompressedLength(SC_PTR(bin.data), bin.size, &len)) {
>> +            return make_error(env, "data_not_compressed");
>>         }
>> +        return make_ok(env, enif_make_ulong(env, len));
>> +    } catch(...) {
>> +        return make_error(env, "unknown");
>>     }
>> +}
>>
>>
>> -    ERL_NIF_TERM snappy_get_uncompressed_length(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
>> -        ErlNifBinary input;
>> -
>> -        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
>> -            return enif_make_badarg(env);
>> -        }
>> +ERL_NIF_TERM
>> +snappy_is_valid(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
>> +{
>> +    ErlNifBinary bin;
>>
>> -        try {
>> -            size_t len = -1;
>> -            bool isCompressed = snappy::GetUncompressedLength(
>> -                reinterpret_cast<const char *>(input.data), input.size, &len);
>> +    if (!enif_inspect_iolist_as_binary(env, argv[0], &bin)) {
>> +        return enif_make_badarg(env);
>> +    }
>>
>> -            if (isCompressed) {
>> -                return enif_make_tuple(env, 2,
>> -                                       enif_make_atom(env, "ok"),
>> -                                       enif_make_ulong(env, len));
>> -            } else {
>> -                return enif_make_tuple(env, 2,
>> -                                       enif_make_atom(env, "error"),
>> -                                       enif_make_atom(env, "not_compressed_data"));
>> -            }
>> -        } catch(...) {
>> -            return enif_make_tuple(env, 2,
>> -                                   enif_make_atom(env, "error"),
>> -                                   enif_make_atom(env, "unknown"));
>> +    try {
>> +        if(snappy::IsValidCompressedBuffer(SC_PTR(bin.data), bin.size)) {
>> +            return make_atom(env, "true");
>> +        } else {
>> +            return make_atom(env, "false");
>>         }
>> +    } catch(...) {
>> +        return make_error(env, "unknown");
>>     }
>> +}
>>
>>
>> -    ERL_NIF_TERM snappy_is_valid_compressed_buffer(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
>> -        ErlNifBinary input;
>> -
>> -        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
>> -            return enif_make_badarg(env);
>> -        }
>> -
>> -        try {
>> -            bool valid = snappy::IsValidCompressedBuffer(
>> -                reinterpret_cast<const char *>(input.data), input.size);
>> +int
>> +on_load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
>> +{
>> +    return 0;
>> +}
>>
>> -            if (valid) {
>> -                return enif_make_atom(env, "true");
>> -            } else {
>> -                return enif_make_atom(env, "false");
>> -            }
>> -        } catch(...) {
>> -            return enif_make_tuple(env, 2,
>> -                                   enif_make_atom(env, "error"),
>> -                                   enif_make_atom(env, "unknown"));
>> -        }
>> -    }
>>
>> +int
>> +on_reload(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
>> +{
>> +    return 0;
>> +}
>>
>>
>> -    int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM info) {
>> -        return 0;
>> -    }
>> +int
>> +on_upgrade(ErlNifEnv* env, void** priv, void** old_priv, ERL_NIF_TERM info)
>> +{
>> +    return 0;
>> +}
>>
>>
>> -    int on_reload(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM info) {
>> -        return 0;
>> -    }
>> +static ErlNifFunc nif_functions[] = {
>> +    {"compress", 1, snappy_compress},
>> +    {"decompress", 1, snappy_decompress},
>> +    {"uncompressed_length", 1, snappy_uncompressed_length},
>> +    {"is_valid", 1, snappy_is_valid}
>> +};
>>
>> -    int on_upgrade(ErlNifEnv* env, void** priv_data, void** old_data, ERL_NIF_TERM info) {
>> -        return 0;
>> -    }
>>
>> +ERL_NIF_INIT(snappy, nif_functions, &on_load, &on_reload, &on_upgrade, NULL);
>>
>> -    static ErlNifFunc nif_functions[] = {
>> -        {"compress", 1, snappy_compress},
>> -        {"decompress", 1, snappy_decompress},
>> -        {"get_uncompressed_length", 1, snappy_get_uncompressed_length},
>> -        {"is_valid_compressed_buffer", 1, snappy_is_valid_compressed_buffer}
>> -    };
>>
>> -    ERL_NIF_INIT(snappy, nif_functions, &on_load, &on_reload, &on_upgrade, NULL);
>> -}
>> +END_C
>> \ No newline at end of file
>>
>>
>>
>
>
>
> --
> Filipe David Manana,
> fdmanana@gmail.com, fdmanana@apache.org
>
> "Reasonable men adapt themselves to the world.
>  Unreasonable men adapt the world to themselves.
>  That's why all progress depends on unreasonable men."
>

Re: svn commit: r1098691 - in /couchdb/trunk/src/snappy: snappy.erl snappy_nif.cc

Posted by Filipe David Manana <fd...@apache.org>.
Paul, this breaks compilation with R13B04:

make[3]: Entering directory `/home/fdmanana/git/hub/couchdb/src/snappy'
/bin/bash ../../libtool --tag=CXX   --mode=compile g++ -DHAVE_CONFIG_H
-I. -I../.. -I../../src/snappy/google-snappy   -D_XOPEN_SOURCE
-L/usr/lib/xulrunner-devel-1.9.2.17/lib/ -L/usr/local/lib
-L/opt/local/lib -I/opt/r13b04/lib/erlang/usr/include
-I/usr/lib/xulrunner-devel-1.9.2.17/include/ -DXP_UNIX    -g -O2 -MT
snappy_nif.lo -MD -MP -MF .deps/snappy_nif.Tpo -c -o snappy_nif.lo
snappy_nif.cc
libtool: compile:  g++ -DHAVE_CONFIG_H -I. -I../..
-I../../src/snappy/google-snappy -D_XOPEN_SOURCE
-L/usr/lib/xulrunner-devel-1.9.2.17/lib/ -L/usr/local/lib
-L/opt/local/lib -I/opt/r13b04/lib/erlang/usr/include
-I/usr/lib/xulrunner-devel-1.9.2.17/include/ -DXP_UNIX -g -O2 -MT
snappy_nif.lo -MD -MP -MF .deps/snappy_nif.Tpo -c snappy_nif.cc  -fPIC
-DPIC -o .libs/snappy_nif.o
/opt/r13b04/lib/erlang/usr/include/erl_nif_api_funcs.h: In function
‘ERL_NIF_TERM make_atom(ErlNifEnv*, const char*)’:
/opt/r13b04/lib/erlang/usr/include/erl_nif_api_funcs.h:48: error: too
many arguments to function ‘int enif_make_existing_atom(ErlNifEnv*,
const char*, ERL_NIF_TERM*)’
snappy_nif.cc:114: error: at this point in file
make[3]: *** [snappy_nif.lo] Error 1
make[3]: Leaving directory `/home/fdmanana/git/hub/couchdb/src/snappy'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/home/fdmanana/git/hub/couchdb/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/fdmanana/git/hub/couchdb'
make: *** [all] Error 2


Can you fix it?
Thanks

On Mon, May 2, 2011 at 6:51 PM,  <da...@apache.org> wrote:
> Author: davisp
> Date: Mon May  2 17:51:28 2011
> New Revision: 1098691
>
> URL: http://svn.apache.org/viewvc?rev=1098691&view=rev
> Log:
> Refactored snappy NIF.
>
>
> Modified:
>    couchdb/trunk/src/snappy/snappy.erl
>    couchdb/trunk/src/snappy/snappy_nif.cc
>
> Modified: couchdb/trunk/src/snappy/snappy.erl
> URL: http://svn.apache.org/viewvc/couchdb/trunk/src/snappy/snappy.erl?rev=1098691&r1=1098690&r2=1098691&view=diff
> ==============================================================================
> --- couchdb/trunk/src/snappy/snappy.erl (original)
> +++ couchdb/trunk/src/snappy/snappy.erl Mon May  2 17:51:28 2011
> @@ -16,8 +16,7 @@
>  -module(snappy).
>
>  -export([compress/1, decompress/1]).
> --export([get_uncompressed_length/1]).
> --export([is_valid_compressed_buffer/1]).
> +-export([uncompressed_length/1, is_valid/1]).
>
>  -on_load(init/0).
>
> @@ -49,9 +48,9 @@ decompress(_IoList) ->
>     exit(snappy_nif_not_loaded).
>
>
> -get_uncompressed_length(_IoList) ->
> +uncompressed_length(_IoList) ->
>     exit(snappy_nif_not_loaded).
>
>
> -is_valid_compressed_buffer(_IoList) ->
> +is_valid(_IoList) ->
>     exit(snappy_nif_not_loaded).
>
> Modified: couchdb/trunk/src/snappy/snappy_nif.cc
> URL: http://svn.apache.org/viewvc/couchdb/trunk/src/snappy/snappy_nif.cc?rev=1098691&r1=1098690&r2=1098691&view=diff
> ==============================================================================
> --- couchdb/trunk/src/snappy/snappy_nif.cc (original)
> +++ couchdb/trunk/src/snappy/snappy_nif.cc Mon May  2 17:51:28 2011
> @@ -26,206 +26,240 @@
>  #error OTP R13B03 not supported. Upgrade to R13B04 or later.
>  #endif
>
> +#ifdef __cplusplus
> +#define BEGIN_C extern "C" {
> +#define END_C }
> +#else
> +#define BEGIN_C
> +#define END_C
> +#endif
>
> -class SnappyNifSink : public snappy::Sink {
> -public:
> -    SnappyNifSink(ErlNifEnv* e) : env(e), length(0)  {
> -        if (!enif_alloc_binary_compat(env, 0, &bin)) {
> -            enif_release_binary_compat(env, &bin);
> -            throw std::bad_alloc();
> -        }
> +#define SC_PTR(c) reinterpret_cast<char *>(c)
> +
> +class SnappyNifSink : public snappy::Sink
> +{
> +    public:
> +        SnappyNifSink(ErlNifEnv* e);
> +        ~SnappyNifSink();
> +
> +        void Append(const char* data, size_t n);
> +        char* GetAppendBuffer(size_t len, char* scratch);
> +        ErlNifBinary& getBin();
> +
> +    private:
> +        ErlNifEnv* env;
> +        ErlNifBinary bin;
> +        size_t length;
> +};
> +
> +SnappyNifSink::SnappyNifSink(ErlNifEnv* e) : env(e), length(0)
> +{
> +    if(!enif_alloc_binary_compat(env, 0, &bin)) {
> +        env = NULL;
> +        throw std::bad_alloc();
>     }
> +}
>
> -    void Append(const char *data, size_t n) {
> -        if (data != reinterpret_cast<const char *>(bin.data + length)) {
> -            memcpy(bin.data + length, data, n);
> -        }
> -        length += n;
> +SnappyNifSink::~SnappyNifSink()
> +{
> +    if(env != NULL) {
> +        enif_release_binary_compat(env, &bin);
>     }
> +}
>
> -    char* GetAppendBuffer(size_t len, char* scratch) {
> -        if ((length + len) > bin.size) {
> -            size_t sz = (len * 4) < 8192 ? 8192 : (len * 4);
> +void
> +SnappyNifSink::Append(const char *data, size_t n)
> +{
> +    if(data != (SC_PTR(bin.data) + length)) {
> +        memcpy(bin.data + length, data, n);
> +    }
> +    length += n;
> +}
>
> -            if (!enif_realloc_binary_compat(env, &bin, bin.size + sz)) {
> -                enif_release_binary_compat(env, &bin);
> -                throw std::bad_alloc();
> -            }
> -        }
> +char*
> +SnappyNifSink::GetAppendBuffer(size_t len, char* scratch)
> +{
> +    size_t sz;
> +
> +    if((length + len) > bin.size) {
> +        sz = (len * 4) < 8192 ? 8192 : (len * 4);
>
> -        return reinterpret_cast<char *>(bin.data + length);
> +        if(!enif_realloc_binary_compat(env, &bin, bin.size + sz)) {
> +            throw std::bad_alloc();
> +        }
>     }
>
> -    ErlNifBinary& getBin() {
> -        if (bin.size > length) {
> -            if (!enif_realloc_binary_compat(env, &bin, length)) {
> -                // shouldn't happen
> -                enif_release_binary_compat(env, &bin);
> -                throw std::bad_alloc();
> -            }
> +    return SC_PTR(bin.data) + length;
> +}
> +
> +ErlNifBinary&
> +SnappyNifSink::getBin()
> +{
> +    if(bin.size > length) {
> +        if(!enif_realloc_binary_compat(env, &bin, length)) {
> +            throw std::bad_alloc();
>         }
> -        return bin;
>     }
> +    return bin;
> +}
> +
> +
> +BEGIN_C
>
> -private:
> -    ErlNifEnv* env;
> -    ErlNifBinary bin;
> -    size_t length;
> -};
>
> +ERL_NIF_TERM
> +make_atom(ErlNifEnv* env, const char* name)
> +{
> +    ERL_NIF_TERM ret;
> +    if(enif_make_existing_atom(env, name, &ret, ERL_NIF_LATIN1)) {
> +        return ret;
> +    }
> +    return enif_make_atom(env, name);
> +}
>
> -extern "C" {
>
> -    ERL_NIF_TERM snappy_compress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
> -        ErlNifBinary input;
> +ERL_NIF_TERM
> +make_ok(ErlNifEnv* env, ERL_NIF_TERM mesg)
> +{
> +    ERL_NIF_TERM ok = make_atom(env, "ok");
> +    return enif_make_tuple2(env, ok, mesg);
> +}
>
> -        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
> -            return enif_make_badarg(env);
> -        }
>
> -        try {
> -            snappy::ByteArraySource source(reinterpret_cast<const char *>(input.data),
> -                                           input.size);
> -            SnappyNifSink sink(env);
> +ERL_NIF_TERM
> +make_error(ErlNifEnv* env, const char* mesg)
> +{
> +    ERL_NIF_TERM error = make_atom(env, "error");
> +    return enif_make_tuple2(env, error, make_atom(env, mesg));
> +}
>
> -            snappy::Compress(&source, &sink);
>
> -            return enif_make_tuple(env, 2,
> -                                   enif_make_atom(env, "ok"),
> -                                   enif_make_binary(env, &sink.getBin()));
> -        } catch(std::bad_alloc e) {
> -            return enif_make_tuple(env, 2,
> -                                   enif_make_atom(env, "error"),
> -                                   enif_make_atom(env, "insufficient_memory"));
> -        } catch(...) {
> -            return enif_make_tuple(env, 2,
> -                                   enif_make_atom(env, "error"),
> -                                   enif_make_atom(env, "unknown"));
> -        }
> +ERL_NIF_TERM
> +snappy_compress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
> +{
> +    ErlNifBinary input;
> +
> +    if(!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
> +        return enif_make_badarg(env);
> +    }
> +
> +    try {
> +        snappy::ByteArraySource source(SC_PTR(input.data), input.size);
> +        SnappyNifSink sink(env);
> +        snappy::Compress(&source, &sink);
> +        return make_ok(env, enif_make_binary(env, &sink.getBin()));
> +    } catch(std::bad_alloc e) {
> +        return make_error(env, "insufficient_memory");
> +    } catch(...) {
> +        return make_error(env, "unknown");
>     }
> +}
>
>
> -    ERL_NIF_TERM snappy_decompress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
> -        ErlNifBinary input;
> +ERL_NIF_TERM
> +snappy_decompress(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
> +{
> +    ErlNifBinary bin;
> +    ErlNifBinary ret;
> +    size_t len;
> +
> +    if(!enif_inspect_iolist_as_binary(env, argv[0], &bin)) {
> +        return enif_make_badarg(env);
> +    }
>
> -        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
> -            return enif_make_badarg(env);
> +    try {
> +        if(!snappy::GetUncompressedLength(SC_PTR(bin.data), bin.size, &len)) {
> +            return make_error(env, "data_not_compressed");
>         }
>
> -        try {
> -            size_t len = -1;
> -            bool isCompressed = snappy::GetUncompressedLength(
> -                reinterpret_cast<const char *>(input.data), input.size, &len);
> +        if(!enif_alloc_binary_compat(env, len, &ret)) {
> +            return make_error(env, "insufficient_memory");
> +        }
>
> -            if (!isCompressed) {
> -                return enif_make_tuple(env, 2,
> -                                       enif_make_atom(env, "error"),
> -                                       enif_make_atom(env, "not_compressed_data"));
> -            }
> +        if(!snappy::RawUncompress(SC_PTR(bin.data), bin.size,
> +                                            SC_PTR(ret.data))) {
> +            return make_error(env, "corrupted_data");
> +        }
>
> -            ErlNifBinary retBin;
> +        return make_ok(env, enif_make_binary(env, &ret));
> +    } catch(...) {
> +        return make_error(env, "unknown");
> +    }
> +}
>
> -            if (!enif_alloc_binary_compat(env, len, &retBin)) {
> -                return enif_make_tuple(env, 2,
> -                                       enif_make_atom(env, "error"),
> -                                       enif_make_atom(env, "insufficient_memory"));
> -            }
>
> -            bool valid = snappy::RawUncompress(reinterpret_cast<const char *>(input.data),
> -                                               input.size,
> -                                               reinterpret_cast<char *>(retBin.data));
> +ERL_NIF_TERM
> +snappy_uncompressed_length(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
> +{
> +    ErlNifBinary bin;
> +    size_t len;
>
> -            if (!valid) {
> -                return enif_make_tuple(env, 2,
> -                                       enif_make_atom(env, "error"),
> -                                       enif_make_atom(env, "corrupted_data"));
> -            }
> +    if(!enif_inspect_iolist_as_binary(env, argv[0], &bin)) {
> +        return enif_make_badarg(env);
> +    }
>
> -            return enif_make_tuple(env, 2,
> -                                   enif_make_atom(env, "ok"),
> -                                   enif_make_binary(env, &retBin));
> -        } catch(...) {
> -            return enif_make_tuple(env, 2,
> -                                   enif_make_atom(env, "error"),
> -                                   enif_make_atom(env, "unknown"));
> +    try {
> +        if(!snappy::GetUncompressedLength(SC_PTR(bin.data), bin.size, &len)) {
> +            return make_error(env, "data_not_compressed");
>         }
> +        return make_ok(env, enif_make_ulong(env, len));
> +    } catch(...) {
> +        return make_error(env, "unknown");
>     }
> +}
>
>
> -    ERL_NIF_TERM snappy_get_uncompressed_length(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
> -        ErlNifBinary input;
> -
> -        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
> -            return enif_make_badarg(env);
> -        }
> +ERL_NIF_TERM
> +snappy_is_valid(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
> +{
> +    ErlNifBinary bin;
>
> -        try {
> -            size_t len = -1;
> -            bool isCompressed = snappy::GetUncompressedLength(
> -                reinterpret_cast<const char *>(input.data), input.size, &len);
> +    if (!enif_inspect_iolist_as_binary(env, argv[0], &bin)) {
> +        return enif_make_badarg(env);
> +    }
>
> -            if (isCompressed) {
> -                return enif_make_tuple(env, 2,
> -                                       enif_make_atom(env, "ok"),
> -                                       enif_make_ulong(env, len));
> -            } else {
> -                return enif_make_tuple(env, 2,
> -                                       enif_make_atom(env, "error"),
> -                                       enif_make_atom(env, "not_compressed_data"));
> -            }
> -        } catch(...) {
> -            return enif_make_tuple(env, 2,
> -                                   enif_make_atom(env, "error"),
> -                                   enif_make_atom(env, "unknown"));
> +    try {
> +        if(snappy::IsValidCompressedBuffer(SC_PTR(bin.data), bin.size)) {
> +            return make_atom(env, "true");
> +        } else {
> +            return make_atom(env, "false");
>         }
> +    } catch(...) {
> +        return make_error(env, "unknown");
>     }
> +}
>
>
> -    ERL_NIF_TERM snappy_is_valid_compressed_buffer(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) {
> -        ErlNifBinary input;
> -
> -        if (!enif_inspect_iolist_as_binary(env, argv[0], &input)) {
> -            return enif_make_badarg(env);
> -        }
> -
> -        try {
> -            bool valid = snappy::IsValidCompressedBuffer(
> -                reinterpret_cast<const char *>(input.data), input.size);
> +int
> +on_load(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
> +{
> +    return 0;
> +}
>
> -            if (valid) {
> -                return enif_make_atom(env, "true");
> -            } else {
> -                return enif_make_atom(env, "false");
> -            }
> -        } catch(...) {
> -            return enif_make_tuple(env, 2,
> -                                   enif_make_atom(env, "error"),
> -                                   enif_make_atom(env, "unknown"));
> -        }
> -    }
>
> +int
> +on_reload(ErlNifEnv* env, void** priv, ERL_NIF_TERM info)
> +{
> +    return 0;
> +}
>
>
> -    int on_load(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM info) {
> -        return 0;
> -    }
> +int
> +on_upgrade(ErlNifEnv* env, void** priv, void** old_priv, ERL_NIF_TERM info)
> +{
> +    return 0;
> +}
>
>
> -    int on_reload(ErlNifEnv* env, void** priv_data, ERL_NIF_TERM info) {
> -        return 0;
> -    }
> +static ErlNifFunc nif_functions[] = {
> +    {"compress", 1, snappy_compress},
> +    {"decompress", 1, snappy_decompress},
> +    {"uncompressed_length", 1, snappy_uncompressed_length},
> +    {"is_valid", 1, snappy_is_valid}
> +};
>
> -    int on_upgrade(ErlNifEnv* env, void** priv_data, void** old_data, ERL_NIF_TERM info) {
> -        return 0;
> -    }
>
> +ERL_NIF_INIT(snappy, nif_functions, &on_load, &on_reload, &on_upgrade, NULL);
>
> -    static ErlNifFunc nif_functions[] = {
> -        {"compress", 1, snappy_compress},
> -        {"decompress", 1, snappy_decompress},
> -        {"get_uncompressed_length", 1, snappy_get_uncompressed_length},
> -        {"is_valid_compressed_buffer", 1, snappy_is_valid_compressed_buffer}
> -    };
>
> -    ERL_NIF_INIT(snappy, nif_functions, &on_load, &on_reload, &on_upgrade, NULL);
> -}
> +END_C
> \ No newline at end of file
>
>
>



-- 
Filipe David Manana,
fdmanana@gmail.com, fdmanana@apache.org

"Reasonable men adapt themselves to the world.
 Unreasonable men adapt the world to themselves.
 That's why all progress depends on unreasonable men."