// Copyright 2009 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. // // Convience routines to make Brotli I/O classes from some memory containers and // files. #include "./streams.h" #include #include namespace brotli { BrotliMemOut::BrotliMemOut(void* buf, int len) : buf_(buf), len_(len), pos_(0) {} void BrotliMemOut::Reset(void* buf, int len) { buf_ = buf; len_ = len; pos_ = 0; } // Brotli output routine: copy n bytes to the output buffer. bool BrotliMemOut::Write(const void *buf, size_t n) { if (n + pos_ > len_) return false; char* p = reinterpret_cast(buf_) + pos_; memcpy(p, buf, n); pos_ += n; return true; } BrotliStringOut::BrotliStringOut(std::string* buf, int max_size) : buf_(buf), max_size_(max_size) { assert(buf->empty()); } void BrotliStringOut::Reset(std::string* buf, int max_size) { buf_ = buf; max_size_ = max_size; } // Brotli output routine: add n bytes to a string. bool BrotliStringOut::Write(const void *buf, size_t n) { if (buf_->size() + n > max_size_) return false; buf_->append(static_cast(buf), n); return true; } BrotliMemIn::BrotliMemIn(const void* buf, int len) : buf_(buf), len_(len), pos_(0) {} void BrotliMemIn::Reset(const void* buf, int len) { buf_ = buf; len_ = len; pos_ = 0; } // Brotli input routine: read the next chunk of memory. const void* BrotliMemIn::Read(size_t n, size_t* output) { if (pos_ == len_) { return NULL; } if (n > len_ - pos_) n = len_ - pos_; const char* p = reinterpret_cast(buf_) + pos_; pos_ += n; *output = n; return p; } BrotliFileIn::BrotliFileIn(FILE* f, size_t max_read_size) : f_(f), buf_(malloc(max_read_size)), buf_size_(max_read_size) {} BrotliFileIn::~BrotliFileIn() { if (buf_) free(buf_); } const void* BrotliFileIn::Read(size_t n, size_t* bytes_read) { if (buf_ == NULL) { *bytes_read = 0; return NULL; } if (n > buf_size_) { n = buf_size_; } else if (n == 0) { return feof(f_) ? NULL : buf_; } *bytes_read = fread(buf_, 1, n, f_); if (*bytes_read == 0) { return NULL; } else { return buf_; } } BrotliFileOut::BrotliFileOut(FILE* f) : f_(f) {} bool BrotliFileOut::Write(const void* buf, size_t n) { if (fwrite(buf, n, 1, f_) != 1) { return false; } return true; } } // namespace brotli