1 // Protocol Buffers - Google's data interchange format 2 // Copyright 2023 Google LLC. All rights reserved. 3 // 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file or at 6 // https://developers.google.com/open-source/licenses/bsd 7 8 #ifndef UPB_WIRE_INTERNAL_READER_H_ 9 #define UPB_WIRE_INTERNAL_READER_H_ 10 11 // Must be last. 12 #include "upb/port/def.inc" 13 14 #define kUpb_WireReader_WireTypeBits 3 15 #define kUpb_WireReader_WireTypeMask 7 16 17 typedef struct { 18 const char* ptr; 19 uint64_t val; 20 } UPB_PRIVATE(_upb_WireReader_LongVarint); 21 22 #ifdef __cplusplus 23 extern "C" { 24 #endif 25 26 UPB_PRIVATE(_upb_WireReader_LongVarint) 27 UPB_PRIVATE(_upb_WireReader_ReadLongVarint)(const char* ptr, uint64_t val); 28 UPB_PRIVATE(_upb_WireReader_ReadVarint)29static UPB_FORCEINLINE const char* UPB_PRIVATE(_upb_WireReader_ReadVarint)( 30 const char* ptr, uint64_t* val, int maxlen, uint64_t maxval) { 31 uint64_t byte = (uint8_t)*ptr; 32 if (UPB_LIKELY((byte & 0x80) == 0)) { 33 *val = (uint32_t)byte; 34 return ptr + 1; 35 } 36 const char* start = ptr; 37 UPB_PRIVATE(_upb_WireReader_LongVarint) 38 res = UPB_PRIVATE(_upb_WireReader_ReadLongVarint)(ptr, byte); 39 if (!res.ptr || (maxlen < 10 && res.ptr - start > maxlen) || 40 res.val > maxval) { 41 return NULL; // Malformed. 42 } 43 *val = res.val; 44 return res.ptr; 45 } 46 UPB_PRIVATE(_upb_WireReader_GetFieldNumber)47UPB_INLINE uint32_t UPB_PRIVATE(_upb_WireReader_GetFieldNumber)(uint32_t tag) { 48 return tag >> kUpb_WireReader_WireTypeBits; 49 } 50 UPB_PRIVATE(_upb_WireReader_GetWireType)51UPB_INLINE uint8_t UPB_PRIVATE(_upb_WireReader_GetWireType)(uint32_t tag) { 52 return tag & kUpb_WireReader_WireTypeMask; 53 } 54 55 #ifdef __cplusplus 56 } /* extern "C" */ 57 #endif 58 59 #include "upb/port/undef.inc" 60 61 #endif // UPB_WIRE_INTERNAL_READER_H_ 62