xref: /aosp_15_r20/external/libchrome/base/big_endian.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/big_endian.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker namespace base {
10*635a8641SAndroid Build Coastguard Worker 
BigEndianReader(const char * buf,size_t len)11*635a8641SAndroid Build Coastguard Worker BigEndianReader::BigEndianReader(const char* buf, size_t len)
12*635a8641SAndroid Build Coastguard Worker     : ptr_(buf), end_(ptr_ + len) {}
13*635a8641SAndroid Build Coastguard Worker 
Skip(size_t len)14*635a8641SAndroid Build Coastguard Worker bool BigEndianReader::Skip(size_t len) {
15*635a8641SAndroid Build Coastguard Worker   if (ptr_ + len > end_)
16*635a8641SAndroid Build Coastguard Worker     return false;
17*635a8641SAndroid Build Coastguard Worker   ptr_ += len;
18*635a8641SAndroid Build Coastguard Worker   return true;
19*635a8641SAndroid Build Coastguard Worker }
20*635a8641SAndroid Build Coastguard Worker 
ReadBytes(void * out,size_t len)21*635a8641SAndroid Build Coastguard Worker bool BigEndianReader::ReadBytes(void* out, size_t len) {
22*635a8641SAndroid Build Coastguard Worker   if (ptr_ + len > end_)
23*635a8641SAndroid Build Coastguard Worker     return false;
24*635a8641SAndroid Build Coastguard Worker   memcpy(out, ptr_, len);
25*635a8641SAndroid Build Coastguard Worker   ptr_ += len;
26*635a8641SAndroid Build Coastguard Worker   return true;
27*635a8641SAndroid Build Coastguard Worker }
28*635a8641SAndroid Build Coastguard Worker 
ReadPiece(base::StringPiece * out,size_t len)29*635a8641SAndroid Build Coastguard Worker bool BigEndianReader::ReadPiece(base::StringPiece* out, size_t len) {
30*635a8641SAndroid Build Coastguard Worker   if (ptr_ + len > end_)
31*635a8641SAndroid Build Coastguard Worker     return false;
32*635a8641SAndroid Build Coastguard Worker   *out = base::StringPiece(ptr_, len);
33*635a8641SAndroid Build Coastguard Worker   ptr_ += len;
34*635a8641SAndroid Build Coastguard Worker   return true;
35*635a8641SAndroid Build Coastguard Worker }
36*635a8641SAndroid Build Coastguard Worker 
37*635a8641SAndroid Build Coastguard Worker template<typename T>
Read(T * value)38*635a8641SAndroid Build Coastguard Worker bool BigEndianReader::Read(T* value) {
39*635a8641SAndroid Build Coastguard Worker   if (ptr_ + sizeof(T) > end_)
40*635a8641SAndroid Build Coastguard Worker     return false;
41*635a8641SAndroid Build Coastguard Worker   ReadBigEndian<T>(ptr_, value);
42*635a8641SAndroid Build Coastguard Worker   ptr_ += sizeof(T);
43*635a8641SAndroid Build Coastguard Worker   return true;
44*635a8641SAndroid Build Coastguard Worker }
45*635a8641SAndroid Build Coastguard Worker 
ReadU8(uint8_t * value)46*635a8641SAndroid Build Coastguard Worker bool BigEndianReader::ReadU8(uint8_t* value) {
47*635a8641SAndroid Build Coastguard Worker   return Read(value);
48*635a8641SAndroid Build Coastguard Worker }
49*635a8641SAndroid Build Coastguard Worker 
ReadU16(uint16_t * value)50*635a8641SAndroid Build Coastguard Worker bool BigEndianReader::ReadU16(uint16_t* value) {
51*635a8641SAndroid Build Coastguard Worker   return Read(value);
52*635a8641SAndroid Build Coastguard Worker }
53*635a8641SAndroid Build Coastguard Worker 
ReadU32(uint32_t * value)54*635a8641SAndroid Build Coastguard Worker bool BigEndianReader::ReadU32(uint32_t* value) {
55*635a8641SAndroid Build Coastguard Worker   return Read(value);
56*635a8641SAndroid Build Coastguard Worker }
57*635a8641SAndroid Build Coastguard Worker 
ReadU64(uint64_t * value)58*635a8641SAndroid Build Coastguard Worker bool BigEndianReader::ReadU64(uint64_t* value) {
59*635a8641SAndroid Build Coastguard Worker   return Read(value);
60*635a8641SAndroid Build Coastguard Worker }
61*635a8641SAndroid Build Coastguard Worker 
BigEndianWriter(char * buf,size_t len)62*635a8641SAndroid Build Coastguard Worker BigEndianWriter::BigEndianWriter(char* buf, size_t len)
63*635a8641SAndroid Build Coastguard Worker     : ptr_(buf), end_(ptr_ + len) {}
64*635a8641SAndroid Build Coastguard Worker 
Skip(size_t len)65*635a8641SAndroid Build Coastguard Worker bool BigEndianWriter::Skip(size_t len) {
66*635a8641SAndroid Build Coastguard Worker   if (ptr_ + len > end_)
67*635a8641SAndroid Build Coastguard Worker     return false;
68*635a8641SAndroid Build Coastguard Worker   ptr_ += len;
69*635a8641SAndroid Build Coastguard Worker   return true;
70*635a8641SAndroid Build Coastguard Worker }
71*635a8641SAndroid Build Coastguard Worker 
WriteBytes(const void * buf,size_t len)72*635a8641SAndroid Build Coastguard Worker bool BigEndianWriter::WriteBytes(const void* buf, size_t len) {
73*635a8641SAndroid Build Coastguard Worker   if (ptr_ + len > end_)
74*635a8641SAndroid Build Coastguard Worker     return false;
75*635a8641SAndroid Build Coastguard Worker   memcpy(ptr_, buf, len);
76*635a8641SAndroid Build Coastguard Worker   ptr_ += len;
77*635a8641SAndroid Build Coastguard Worker   return true;
78*635a8641SAndroid Build Coastguard Worker }
79*635a8641SAndroid Build Coastguard Worker 
80*635a8641SAndroid Build Coastguard Worker template<typename T>
Write(T value)81*635a8641SAndroid Build Coastguard Worker bool BigEndianWriter::Write(T value) {
82*635a8641SAndroid Build Coastguard Worker   if (ptr_ + sizeof(T) > end_)
83*635a8641SAndroid Build Coastguard Worker     return false;
84*635a8641SAndroid Build Coastguard Worker   WriteBigEndian<T>(ptr_, value);
85*635a8641SAndroid Build Coastguard Worker   ptr_ += sizeof(T);
86*635a8641SAndroid Build Coastguard Worker   return true;
87*635a8641SAndroid Build Coastguard Worker }
88*635a8641SAndroid Build Coastguard Worker 
WriteU8(uint8_t value)89*635a8641SAndroid Build Coastguard Worker bool BigEndianWriter::WriteU8(uint8_t value) {
90*635a8641SAndroid Build Coastguard Worker   return Write(value);
91*635a8641SAndroid Build Coastguard Worker }
92*635a8641SAndroid Build Coastguard Worker 
WriteU16(uint16_t value)93*635a8641SAndroid Build Coastguard Worker bool BigEndianWriter::WriteU16(uint16_t value) {
94*635a8641SAndroid Build Coastguard Worker   return Write(value);
95*635a8641SAndroid Build Coastguard Worker }
96*635a8641SAndroid Build Coastguard Worker 
WriteU32(uint32_t value)97*635a8641SAndroid Build Coastguard Worker bool BigEndianWriter::WriteU32(uint32_t value) {
98*635a8641SAndroid Build Coastguard Worker   return Write(value);
99*635a8641SAndroid Build Coastguard Worker }
100*635a8641SAndroid Build Coastguard Worker 
WriteU64(uint64_t value)101*635a8641SAndroid Build Coastguard Worker bool BigEndianWriter::WriteU64(uint64_t value) {
102*635a8641SAndroid Build Coastguard Worker   return Write(value);
103*635a8641SAndroid Build Coastguard Worker }
104*635a8641SAndroid Build Coastguard Worker 
105*635a8641SAndroid Build Coastguard Worker }  // namespace base
106