Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.6 KiB
61 lines
1.6 KiB
// 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_ |
|
|
|
// 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); |
|
|
|
static UPB_FORCEINLINE const char* UPB_PRIVATE(_upb_WireReader_ReadVarint)( |
|
const char* ptr, uint64_t* val, int maxlen, uint64_t maxval) { |
|
uint64_t byte = (uint8_t)*ptr; |
|
if (UPB_LIKELY((byte & 0x80) == 0)) { |
|
*val = (uint32_t)byte; |
|
return ptr + 1; |
|
} |
|
const char* start = ptr; |
|
UPB_PRIVATE(_upb_WireReader_LongVarint) |
|
res = UPB_PRIVATE(_upb_WireReader_ReadLongVarint)(ptr, byte); |
|
if (!res.ptr || (maxlen < 10 && res.ptr - start > maxlen) || |
|
res.val > maxval) { |
|
return NULL; // Malformed. |
|
} |
|
*val = res.val; |
|
return res.ptr; |
|
} |
|
|
|
UPB_INLINE uint32_t UPB_PRIVATE(_upb_WireReader_GetFieldNumber)(uint32_t tag) { |
|
return tag >> kUpb_WireReader_WireTypeBits; |
|
} |
|
|
|
UPB_INLINE uint8_t UPB_PRIVATE(_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_
|
|
|