Index: third_party/brotli/dec/streams.c |
diff --git a/third_party/brotli/dec/streams.c b/third_party/brotli/dec/streams.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6147252535f3e31ee07400c3038abffedc6908fe |
--- /dev/null |
+++ b/third_party/brotli/dec/streams.c |
@@ -0,0 +1,128 @@ |
+/* Copyright 2013 Google Inc. All Rights Reserved. |
+ |
+ Licensed under the Apache License, Version 2.0 (the "License"); |
+ you may not use this file except in compliance with the License. |
+ You may obtain a copy of the License at |
+ |
+ http://www.apache.org/licenses/LICENSE-2.0 |
+ |
+ Unless required by applicable law or agreed to in writing, software |
+ distributed under the License is distributed on an "AS IS" BASIS, |
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+ See the License for the specific language governing permissions and |
+ limitations under the License. |
+ |
+ Functions for streaming input and output. |
+*/ |
+ |
+#include <string.h> |
+#ifndef _WIN32 |
+#include <unistd.h> |
+#endif |
+#include "./streams.h" |
+ |
+#if defined(__cplusplus) || defined(c_plusplus) |
+extern "C" { |
+#endif |
+ |
+int BrotliMemInputFunction(void* data, uint8_t* buf, size_t count) { |
+ BrotliMemInput* input = (BrotliMemInput*)data; |
+ if (input->pos > input->length) { |
+ return -1; |
+ } |
+ if (input->pos + count > input->length) { |
+ count = input->length - input->pos; |
+ } |
+ memcpy(buf, input->buffer + input->pos, count); |
+ input->pos += count; |
+ return (int)count; |
+} |
+ |
+BrotliInput BrotliInitMemInput(const uint8_t* buffer, size_t length, |
+ BrotliMemInput* mem_input) { |
+ BrotliInput input; |
+ mem_input->buffer = buffer; |
+ mem_input->length = length; |
+ mem_input->pos = 0; |
+ input.cb_ = &BrotliMemInputFunction; |
+ input.data_ = mem_input; |
+ return input; |
+} |
+ |
+int BrotliMemOutputFunction(void* data, const uint8_t* buf, size_t count) { |
+ BrotliMemOutput* output = (BrotliMemOutput*)data; |
+ if (output->pos + count > output->length) { |
+ return -1; |
+ } |
+ memcpy(output->buffer + output->pos, buf, count); |
+ output->pos += count; |
+ return (int)count; |
+} |
+ |
+BrotliOutput BrotliInitMemOutput(uint8_t* buffer, size_t length, |
+ BrotliMemOutput* mem_output) { |
+ BrotliOutput output; |
+ mem_output->buffer = buffer; |
+ mem_output->length = length; |
+ mem_output->pos = 0; |
+ output.cb_ = &BrotliMemOutputFunction; |
+ output.data_ = mem_output; |
+ return output; |
+} |
+ |
+int BrotliStdinInputFunction(void* data, uint8_t* buf, size_t count) { |
+#ifndef _WIN32 |
+ return (int)read(STDIN_FILENO, buf, count); |
+#else |
+ return -1; |
+#endif |
+} |
+ |
+BrotliInput BrotliStdinInput() { |
+ BrotliInput in; |
+ in.cb_ = BrotliStdinInputFunction; |
+ in.data_ = NULL; |
+ return in; |
+} |
+ |
+int BrotliStdoutOutputFunction(void* data, const uint8_t* buf, size_t count) { |
+#ifndef _WIN32 |
+ return (int)write(STDOUT_FILENO, buf, count); |
+#else |
+ return -1; |
+#endif |
+} |
+ |
+BrotliOutput BrotliStdoutOutput() { |
+ BrotliOutput out; |
+ out.cb_ = BrotliStdoutOutputFunction; |
+ out.data_ = NULL; |
+ return out; |
+} |
+ |
+int BrotliFileInputFunction(void* data, uint8_t* buf, size_t count) { |
+ return (int)fread(buf, 1, count, (FILE*)data); |
+} |
+ |
+BrotliInput BrotliFileInput(FILE* f) { |
+ BrotliInput in; |
+ in.cb_ = BrotliFileInputFunction; |
+ in.data_ = f; |
+ return in; |
+} |
+ |
+int BrotliFileOutputFunction(void* data, const uint8_t* buf, size_t count) { |
+ return (int)fwrite(buf, 1, count, (FILE*)data); |
+} |
+ |
+BrotliOutput BrotliFileOutput(FILE* f) { |
+ BrotliOutput out; |
+ out.cb_ = BrotliFileOutputFunction; |
+ out.data_ = f; |
+ return out; |
+} |
+ |
+ |
+#if defined(__cplusplus) || defined(c_plusplus) |
+} /* extern "C" */ |
+#endif |