1 /* 2 * Copyright 2011 Martin Gieseking <martin.gieseking@uos.de>. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 * Plain C interface (a wrapper around the C++ implementation). 31 */ 32 33 #ifndef THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_C_H_ 34 #define THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_C_H_ 35 36 #ifdef __cplusplus 37 extern "C" { 38 #endif 39 40 #include <stddef.h> 41 42 /* 43 * Return values; see the documentation for each function to know 44 * what each can return. 45 */ 46 typedef enum { 47 SNAPPY_OK = 0, 48 SNAPPY_INVALID_INPUT = 1, 49 SNAPPY_BUFFER_TOO_SMALL = 2 50 } snappy_status; 51 52 /* 53 * Takes the data stored in "input[0..input_length-1]" and stores 54 * it in the array pointed to by "compressed". 55 * 56 * <compressed_length> signals the space available in "compressed". 57 * If it is not at least equal to "snappy_max_compressed_length(input_length)", 58 * SNAPPY_BUFFER_TOO_SMALL is returned. After successful compression, 59 * <compressed_length> contains the true length of the compressed output, 60 * and SNAPPY_OK is returned. 61 * 62 * Example: 63 * size_t output_length = snappy_max_compressed_length(input_length); 64 * char* output = (char*)malloc(output_length); 65 * if (snappy_compress(input, input_length, output, &output_length) 66 * == SNAPPY_OK) { 67 * ... Process(output, output_length) ... 68 * } 69 * free(output); 70 */ 71 snappy_status snappy_compress(const char* input, 72 size_t input_length, 73 char* compressed, 74 size_t* compressed_length); 75 76 /* 77 * Given data in "compressed[0..compressed_length-1]" generated by 78 * calling the snappy_compress routine, this routine stores 79 * the uncompressed data to 80 * uncompressed[0..uncompressed_length-1]. 81 * Returns failure (a value not equal to SNAPPY_OK) if the message 82 * is corrupted and could not be decrypted. 83 * 84 * <uncompressed_length> signals the space available in "uncompressed". 85 * If it is not at least equal to the value returned by 86 * snappy_uncompressed_length for this stream, SNAPPY_BUFFER_TOO_SMALL 87 * is returned. After successful decompression, <uncompressed_length> 88 * contains the true length of the decompressed output. 89 * 90 * Example: 91 * size_t output_length; 92 * if (snappy_uncompressed_length(input, input_length, &output_length) 93 * != SNAPPY_OK) { 94 * ... fail ... 95 * } 96 * char* output = (char*)malloc(output_length); 97 * if (snappy_uncompress(input, input_length, output, &output_length) 98 * == SNAPPY_OK) { 99 * ... Process(output, output_length) ... 100 * } 101 * free(output); 102 */ 103 snappy_status snappy_uncompress(const char* compressed, 104 size_t compressed_length, 105 char* uncompressed, 106 size_t* uncompressed_length); 107 108 /* 109 * Returns the maximal size of the compressed representation of 110 * input data that is "source_length" bytes in length. 111 */ 112 size_t snappy_max_compressed_length(size_t source_length); 113 114 /* 115 * REQUIRES: "compressed[]" was produced by snappy_compress() 116 * Returns SNAPPY_OK and stores the length of the uncompressed data in 117 * *result normally. Returns SNAPPY_INVALID_INPUT on parsing error. 118 * This operation takes O(1) time. 119 */ 120 snappy_status snappy_uncompressed_length(const char* compressed, 121 size_t compressed_length, 122 size_t* result); 123 124 /* 125 * Check if the contents of "compressed[]" can be uncompressed successfully. 126 * Does not return the uncompressed data; if so, returns SNAPPY_OK, 127 * or if not, returns SNAPPY_INVALID_INPUT. 128 * Takes time proportional to compressed_length, but is usually at least a 129 * factor of four faster than actual decompression. 130 */ 131 snappy_status snappy_validate_compressed_buffer(const char* compressed, 132 size_t compressed_length); 133 134 #ifdef __cplusplus 135 } // extern "C" 136 #endif 137 138 #endif /* THIRD_PARTY_SNAPPY_OPENSOURCE_SNAPPY_C_H_ */ 139