/src/woff2/src/woff2_out.cc
Line | Count | Source (jump to first uncovered line) |
1 | | /* Copyright 2014 Google Inc. All Rights Reserved. |
2 | | |
3 | | Distributed under MIT license. |
4 | | See file LICENSE for detail or copy at https://opensource.org/licenses/MIT |
5 | | */ |
6 | | |
7 | | /* Output buffer for WOFF2 decompression. */ |
8 | | |
9 | | #include <woff2/output.h> |
10 | | |
11 | | namespace woff2 { |
12 | | |
13 | | WOFF2StringOut::WOFF2StringOut(std::string *buf) |
14 | 15.1k | : buf_(buf), max_size_(kDefaultMaxSize), offset_(0) {} |
15 | | |
16 | 303k | bool WOFF2StringOut::Write(const void *buf, size_t n) { |
17 | 303k | return Write(buf, offset_, n); |
18 | 303k | } |
19 | | |
20 | 321k | bool WOFF2StringOut::Write(const void *buf, size_t offset, size_t n) { |
21 | 321k | if (offset > max_size_ || n > max_size_ - offset) { |
22 | 0 | return false; |
23 | 0 | } |
24 | 321k | if (offset == buf_->size()) { |
25 | 149k | buf_->append(static_cast<const char*>(buf), n); |
26 | 171k | } else { |
27 | 171k | if (offset + n > buf_->size()) { |
28 | 507 | buf_->append(offset + n - buf_->size(), 0); |
29 | 507 | } |
30 | 171k | buf_->replace(offset, n, static_cast<const char*>(buf), n); |
31 | 171k | } |
32 | 321k | offset_ = std::max(offset_, offset + n); |
33 | | |
34 | 321k | return true; |
35 | 321k | } |
36 | | |
37 | 7.82k | void WOFF2StringOut::SetMaxSize(size_t max_size) { |
38 | 7.82k | max_size_ = max_size; |
39 | 7.82k | if (offset_ > max_size_) { |
40 | 0 | offset_ = max_size_; |
41 | 0 | } |
42 | 7.82k | } |
43 | | |
44 | | WOFF2MemoryOut::WOFF2MemoryOut(uint8_t* buf, size_t buf_size) |
45 | 0 | : buf_(buf), |
46 | 0 | buf_size_(buf_size), |
47 | 0 | offset_(0) {} |
48 | | |
49 | 0 | bool WOFF2MemoryOut::Write(const void *buf, size_t n) { |
50 | 0 | return Write(buf, offset_, n); |
51 | 0 | } |
52 | | |
53 | 0 | bool WOFF2MemoryOut::Write(const void *buf, size_t offset, size_t n) { |
54 | 0 | if (offset > buf_size_ || n > buf_size_ - offset) { |
55 | 0 | return false; |
56 | 0 | } |
57 | 0 | std::memcpy(buf_ + offset, buf, n); |
58 | 0 | offset_ = std::max(offset_, offset + n); |
59 | |
|
60 | 0 | return true; |
61 | 0 | } |
62 | | |
63 | | } // namespace woff2 |