[M85 Dev][EFL] Fix crashes at webview launch
[platform/framework/web/chromium-efl.git] / base / big_endian.cc
1 // Copyright 2014 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 "base/big_endian.h"
6
7 #include <string.h>
8
9 #include "base/numerics/checked_math.h"
10 #include "base/strings/string_piece.h"
11
12 namespace base {
13
14 BigEndianReader::BigEndianReader(const char* buf, size_t len)
15     : ptr_(buf), end_(ptr_ + len) {}
16
17 bool BigEndianReader::Skip(size_t len) {
18   if (ptr_ + len > end_)
19     return false;
20   ptr_ += len;
21   return true;
22 }
23
24 bool BigEndianReader::ReadBytes(void* out, size_t len) {
25   if (ptr_ + len > end_)
26     return false;
27   memcpy(out, ptr_, len);
28   ptr_ += len;
29   return true;
30 }
31
32 bool BigEndianReader::ReadPiece(base::StringPiece* out, size_t len) {
33   if (ptr_ + len > end_)
34     return false;
35   *out = base::StringPiece(ptr_, len);
36   ptr_ += len;
37   return true;
38 }
39
40 template<typename T>
41 bool BigEndianReader::Read(T* value) {
42   if (ptr_ + sizeof(T) > end_)
43     return false;
44   ReadBigEndian<T>(ptr_, value);
45   ptr_ += sizeof(T);
46   return true;
47 }
48
49 bool BigEndianReader::ReadU8(uint8_t* value) {
50   return Read(value);
51 }
52
53 bool BigEndianReader::ReadU16(uint16_t* value) {
54   return Read(value);
55 }
56
57 bool BigEndianReader::ReadU32(uint32_t* value) {
58   return Read(value);
59 }
60
61 bool BigEndianReader::ReadU64(uint64_t* value) {
62   return Read(value);
63 }
64
65 template <typename T>
66 bool BigEndianReader::ReadLengthPrefixed(base::StringPiece* out) {
67   T t_len;
68   if (!Read(&t_len))
69     return false;
70   size_t len = strict_cast<size_t>(t_len);
71   const char* original_ptr = ptr_;
72   if (!Skip(len)) {
73     ptr_ -= sizeof(T);
74     return false;
75   }
76   *out = base::StringPiece(original_ptr, len);
77   return true;
78 }
79
80 bool BigEndianReader::ReadU8LengthPrefixed(base::StringPiece* out) {
81   return ReadLengthPrefixed<uint8_t>(out);
82 }
83
84 bool BigEndianReader::ReadU16LengthPrefixed(base::StringPiece* out) {
85   return ReadLengthPrefixed<uint16_t>(out);
86 }
87
88 BigEndianWriter::BigEndianWriter(char* buf, size_t len)
89     : ptr_(buf), end_(ptr_ + len) {}
90
91 bool BigEndianWriter::Skip(size_t len) {
92   if (ptr_ + len > end_)
93     return false;
94   ptr_ += len;
95   return true;
96 }
97
98 bool BigEndianWriter::WriteBytes(const void* buf, size_t len) {
99   if (ptr_ + len > end_)
100     return false;
101   memcpy(ptr_, buf, len);
102   ptr_ += len;
103   return true;
104 }
105
106 template<typename T>
107 bool BigEndianWriter::Write(T value) {
108   if (ptr_ + sizeof(T) > end_)
109     return false;
110   WriteBigEndian<T>(ptr_, value);
111   ptr_ += sizeof(T);
112   return true;
113 }
114
115 bool BigEndianWriter::WriteU8(uint8_t value) {
116   return Write(value);
117 }
118
119 bool BigEndianWriter::WriteU16(uint16_t value) {
120   return Write(value);
121 }
122
123 bool BigEndianWriter::WriteU32(uint32_t value) {
124   return Write(value);
125 }
126
127 bool BigEndianWriter::WriteU64(uint64_t value) {
128   return Write(value);
129 }
130
131 }  // namespace base