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
37extern "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 */
46typedef 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 */
71snappy_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 */
103snappy_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 */
112size_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 */
120snappy_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 */
131snappy_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