| OLD | NEW | 
|---|
| (Empty) |  | 
|  | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
|  | 2 // Use of this source code is governed by a BSD-style license that can be | 
|  | 3 // found in the LICENSE file. | 
|  | 4 | 
|  | 5 #include "nacl_io/fifo_char.h" | 
|  | 6 | 
|  | 7 #include <stdlib.h> | 
|  | 8 #include <string.h> | 
|  | 9 | 
|  | 10 #include <algorithm> | 
|  | 11 | 
|  | 12 namespace nacl_io { | 
|  | 13 | 
|  | 14 FIFOChar::FIFOChar(size_t size) | 
|  | 15     : buffer_(NULL), | 
|  | 16       size_(size), | 
|  | 17       avail_(0), | 
|  | 18       tail_(0) { | 
|  | 19   if (size) { | 
|  | 20     buffer_ = new char[size]; | 
|  | 21   } else { | 
|  | 22     buffer_ = NULL; | 
|  | 23   } | 
|  | 24 } | 
|  | 25 | 
|  | 26 FIFOChar::~FIFOChar() { | 
|  | 27   delete[] buffer_; | 
|  | 28 } | 
|  | 29 | 
|  | 30 bool FIFOChar::IsEmpty() { | 
|  | 31   return avail_ == 0; | 
|  | 32 } | 
|  | 33 | 
|  | 34 bool FIFOChar::IsFull() { | 
|  | 35   return avail_ >= size_; | 
|  | 36 } | 
|  | 37 | 
|  | 38 bool FIFOChar::Resize(size_t len) { | 
|  | 39   // Can not resize smaller than the current size | 
|  | 40   if (len < avail_) | 
|  | 41     return false; | 
|  | 42 | 
|  | 43   // Read current data into new buffer | 
|  | 44   char* data = new char[len]; | 
|  | 45   avail_ = Read(data, avail_); | 
|  | 46 | 
|  | 47   // Replace buffer | 
|  | 48   delete[] buffer_; | 
|  | 49   buffer_ = data; | 
|  | 50   size_ = len; | 
|  | 51   return true; | 
|  | 52 } | 
|  | 53 | 
|  | 54 | 
|  | 55 size_t FIFOChar::ReadAvailable() { | 
|  | 56   return avail_; | 
|  | 57 } | 
|  | 58 | 
|  | 59 size_t FIFOChar::WriteAvailable() { | 
|  | 60   return size_ - avail_; | 
|  | 61 } | 
|  | 62 | 
|  | 63 size_t FIFOChar::Peek(void* buf, size_t len) { | 
|  | 64   char* ptr = static_cast<char*>(buf); | 
|  | 65 | 
|  | 66   size_t out = 0; | 
|  | 67   len = std::min(len, avail_); | 
|  | 68 | 
|  | 69   size_t offs = tail_; | 
|  | 70   while (len > 0) { | 
|  | 71     size_t read_len = std::min(len, size_ - offs); | 
|  | 72     memcpy(ptr, &buffer_[offs], read_len); | 
|  | 73 | 
|  | 74     ptr += read_len; | 
|  | 75     offs += read_len; | 
|  | 76     if (static_cast<size_t>(offs) == size_) | 
|  | 77       offs = 0; | 
|  | 78 | 
|  | 79     out += read_len; | 
|  | 80     len -= read_len; | 
|  | 81   } | 
|  | 82 | 
|  | 83   return out; | 
|  | 84 } | 
|  | 85 | 
|  | 86 size_t FIFOChar::Read(void* buf, size_t len) { | 
|  | 87   size_t read_len = Peek(buf, len); | 
|  | 88   if (read_len > 0) { | 
|  | 89     avail_ -= read_len; | 
|  | 90     tail_ = (tail_ + read_len) % size_; | 
|  | 91   } | 
|  | 92   return read_len; | 
|  | 93 } | 
|  | 94 | 
|  | 95 size_t FIFOChar::Write(const void* buf, size_t len) { | 
|  | 96   const char* ptr = static_cast<const char*>(buf); | 
|  | 97   size_t out = 0; | 
|  | 98   size_t room = size_ - avail_; | 
|  | 99   len = std::min(len, room); | 
|  | 100 | 
|  | 101   size_t offs = tail_ + avail_; | 
|  | 102   while (len > 0) { | 
|  | 103     size_t write_len = std::min(len, size_ - offs); | 
|  | 104     memcpy(&buffer_[offs], ptr, write_len); | 
|  | 105 | 
|  | 106     ptr += write_len; | 
|  | 107     offs += write_len; | 
|  | 108     if (offs == size_) | 
|  | 109       offs = 0; | 
|  | 110 | 
|  | 111     out += write_len; | 
|  | 112     len -= write_len; | 
|  | 113   } | 
|  | 114 | 
|  | 115   avail_ += out; | 
|  | 116   return out; | 
|  | 117 } | 
|  | 118 | 
|  | 119 | 
|  | 120 }  // namespace nacl_io | 
| OLD | NEW | 
|---|