// Protocol Buffers - Google's data interchange format // Copyright 2023 Google LLC. All rights reserved. // // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file or at // https://developers.google.com/open-source/licenses/bsd #ifndef UPB_WIRE_INTERNAL_READER_H_ #define UPB_WIRE_INTERNAL_READER_H_ #include #include #include "upb/wire/eps_copy_input_stream.h" // Must be last. #include "upb/port/def.inc" #define kUpb_WireReader_WireTypeBits 3 #define kUpb_WireReader_WireTypeMask 7 typedef struct { const char* ptr; uint64_t val; } UPB_PRIVATE(_upb_WireReader_LongVarint); #ifdef __cplusplus extern "C" { #endif UPB_PRIVATE(_upb_WireReader_LongVarint) UPB_PRIVATE(_upb_WireReader_ReadLongVarint)(const char* ptr, uint64_t val, upb_EpsCopyInputStream* stream); UPB_PRIVATE(_upb_WireReader_LongVarint) UPB_PRIVATE(_upb_WireReader_ReadLongTag)(const char* ptr, uint64_t val, upb_EpsCopyInputStream* stream); UPB_PRIVATE(_upb_WireReader_LongVarint) UPB_PRIVATE(_upb_WireReader_ReadLongSize)(const char* ptr, uint64_t val, upb_EpsCopyInputStream* stream); UPB_FORCEINLINE const char* upb_WireReader_ReadVarint( const char* ptr, uint64_t* val, upb_EpsCopyInputStream* stream) { UPB_PRIVATE(upb_EpsCopyInputStream_ConsumeBytes)(stream, 10); uint8_t byte = *ptr; if (UPB_LIKELY((byte & 0x80) == 0)) { *val = byte; return ptr + 1; } UPB_PRIVATE(_upb_WireReader_LongVarint) res; res = UPB_PRIVATE(_upb_WireReader_ReadLongVarint)(ptr, byte, stream); *val = res.val; return UPB_PRIVATE(upb_EpsCopyInputStream_AssumeResult)(stream, res.ptr); } UPB_FORCEINLINE const char* upb_WireReader_ReadTag( const char* ptr, uint32_t* val, upb_EpsCopyInputStream* stream) { UPB_PRIVATE(upb_EpsCopyInputStream_ConsumeBytes)(stream, 5); uint8_t byte = *ptr; if (UPB_LIKELY((byte & 0x80) == 0)) { *val = byte; return ptr + 1; } UPB_PRIVATE(_upb_WireReader_LongVarint) res; res = UPB_PRIVATE(_upb_WireReader_ReadLongTag)(ptr, byte, stream); *val = res.val; return UPB_PRIVATE(upb_EpsCopyInputStream_AssumeResult)(stream, res.ptr); } UPB_FORCEINLINE const char* upb_WireReader_ReadSize( const char* ptr, int* val, upb_EpsCopyInputStream* stream) { UPB_PRIVATE(upb_EpsCopyInputStream_ConsumeBytes)(stream, 5); uint8_t byte = *ptr; if (UPB_LIKELY((byte & 0x80) == 0)) { *val = byte; return ptr + 1; } UPB_PRIVATE(_upb_WireReader_LongVarint) res; res = UPB_PRIVATE(_upb_WireReader_ReadLongSize)(ptr, byte, stream); *val = res.val; return UPB_PRIVATE(upb_EpsCopyInputStream_AssumeResult)(stream, res.ptr); } UPB_API_INLINE uint32_t upb_WireReader_GetFieldNumber(uint32_t tag) { return tag >> kUpb_WireReader_WireTypeBits; } UPB_API_INLINE uint8_t upb_WireReader_GetWireType(uint32_t tag) { return tag & kUpb_WireReader_WireTypeMask; } #ifdef __cplusplus } /* extern "C" */ #endif #include "upb/port/undef.inc" #endif // UPB_WIRE_INTERNAL_READER_H_