1 /* 2 * Copyright 2011 Google Inc. All Rights Reserved. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "sfntly/data/memory_byte_array.h" 18 19 #include <string.h> 20 21 namespace sfntly { 22 23 MemoryByteArray::MemoryByteArray(int32_t length) 24 : ByteArray(0, length), b_(NULL), allocated_(true) { 25 } 26 27 MemoryByteArray::MemoryByteArray(byte_t* b, int32_t filled_length) 28 : ByteArray(filled_length, filled_length), b_(b), allocated_(false) { 29 assert(b); 30 } 31 32 MemoryByteArray::~MemoryByteArray() { 33 Close(); 34 } 35 36 int32_t MemoryByteArray::CopyTo(OutputStream* os, 37 int32_t offset, 38 int32_t length) { 39 assert(os); 40 os->Write(b_, offset, length); 41 return length; 42 } 43 44 void MemoryByteArray::Init() { 45 if (allocated_ && b_ == NULL) { 46 b_ = new byte_t[Size()]; 47 memset(b_, 0, Size()); 48 } 49 } 50 51 void MemoryByteArray::InternalPut(int32_t index, byte_t b) { 52 Init(); 53 b_[index] = b; 54 } 55 56 int32_t MemoryByteArray::InternalPut(int32_t index, 57 byte_t* b, 58 int32_t offset, 59 int32_t length) { 60 assert(b); 61 Init(); 62 memcpy(b_ + index, b + offset, length); 63 return length; 64 } 65 66 byte_t MemoryByteArray::InternalGet(int32_t index) { 67 Init(); 68 return b_[index]; 69 } 70 71 int32_t MemoryByteArray::InternalGet(int32_t index, 72 byte_t* b, 73 int32_t offset, 74 int32_t length) { 75 assert(b); 76 Init(); 77 memcpy(b + offset, b_ + index, length); 78 return length; 79 } 80 81 void MemoryByteArray::Close() { 82 if (allocated_ && b_) { 83 delete[] b_; 84 } 85 b_ = NULL; 86 } 87 88 byte_t* MemoryByteArray::Begin() { 89 Init(); 90 return b_; 91 } 92 93 } // namespace sfntly 94