github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/leveldb.chai2010/src/snappy-c.cc (about)

     1  // Copyright 2011 Martin Gieseking <martin.gieseking@uos.de>.
     2  //
     3  // Redistribution and use in source and binary forms, with or without
     4  // modification, are permitted provided that the following conditions are
     5  // met:
     6  //
     7  //     * Redistributions of source code must retain the above copyright
     8  // notice, this list of conditions and the following disclaimer.
     9  //     * Redistributions in binary form must reproduce the above
    10  // copyright notice, this list of conditions and the following disclaimer
    11  // in the documentation and/or other materials provided with the
    12  // distribution.
    13  //     * Neither the name of Google Inc. nor the names of its
    14  // contributors may be used to endorse or promote products derived from
    15  // this software without specific prior written permission.
    16  //
    17  // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    18  // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    19  // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    20  // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    21  // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    22  // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    23  // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    24  // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    25  // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    26  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    27  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    28  
    29  #include "snappy.h"
    30  #include "snappy-c.h"
    31  
    32  extern "C" {
    33  
    34  snappy_status snappy_compress(const char* input,
    35                                size_t input_length,
    36                                char* compressed,
    37                                size_t *compressed_length) {
    38    if (*compressed_length < snappy_max_compressed_length(input_length)) {
    39      return SNAPPY_BUFFER_TOO_SMALL;
    40    }
    41    snappy::RawCompress(input, input_length, compressed, compressed_length);
    42    return SNAPPY_OK;
    43  }
    44  
    45  snappy_status snappy_uncompress(const char* compressed,
    46                                  size_t compressed_length,
    47                                  char* uncompressed,
    48                                  size_t* uncompressed_length) {
    49    size_t real_uncompressed_length;
    50    if (!snappy::GetUncompressedLength(compressed,
    51                                       compressed_length,
    52                                       &real_uncompressed_length)) {
    53      return SNAPPY_INVALID_INPUT;
    54    }
    55    if (*uncompressed_length < real_uncompressed_length) {
    56      return SNAPPY_BUFFER_TOO_SMALL;
    57    }
    58    if (!snappy::RawUncompress(compressed, compressed_length, uncompressed)) {
    59      return SNAPPY_INVALID_INPUT;
    60    }
    61    *uncompressed_length = real_uncompressed_length;
    62    return SNAPPY_OK;
    63  }
    64  
    65  size_t snappy_max_compressed_length(size_t source_length) {
    66    return snappy::MaxCompressedLength(source_length);
    67  }
    68  
    69  snappy_status snappy_uncompressed_length(const char *compressed,
    70                                           size_t compressed_length,
    71                                           size_t *result) {
    72    if (snappy::GetUncompressedLength(compressed,
    73                                      compressed_length,
    74                                      result)) {
    75      return SNAPPY_OK;
    76    } else {
    77      return SNAPPY_INVALID_INPUT;
    78    }
    79  }
    80  
    81  snappy_status snappy_validate_compressed_buffer(const char *compressed,
    82                                                  size_t compressed_length) {
    83    if (snappy::IsValidCompressedBuffer(compressed, compressed_length)) {
    84      return SNAPPY_OK;
    85    } else {
    86      return SNAPPY_INVALID_INPUT;
    87    }
    88  }
    89  
    90  }  // extern "C"