xref: /aosp_15_r20/external/grpc-grpc/third_party/upb/upb/mini_descriptor/decode.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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_MINI_TABLE_DECODE_H_
9 #define UPB_MINI_TABLE_DECODE_H_
10 
11 #include "upb/base/status.h"
12 #include "upb/mem/arena.h"
13 #include "upb/mini_table/extension.h"
14 #include "upb/mini_table/sub.h"
15 
16 // Export the newer headers, for legacy users.  New users should include the
17 // more specific headers directly.
18 // IWYU pragma: begin_exports
19 #include "upb/mini_descriptor/build_enum.h"
20 #include "upb/mini_descriptor/link.h"
21 // IWYU pragma: end_exports
22 
23 // Must be last.
24 #include "upb/port/def.inc"
25 
26 typedef enum {
27   kUpb_MiniTablePlatform_32Bit,
28   kUpb_MiniTablePlatform_64Bit,
29   kUpb_MiniTablePlatform_Native =
30       UPB_SIZE(kUpb_MiniTablePlatform_32Bit, kUpb_MiniTablePlatform_64Bit),
31 } upb_MiniTablePlatform;
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 // Builds a mini table from the data encoded in the buffer [data, len]. If any
38 // errors occur, returns NULL and sets a status message. In the success case,
39 // the caller must call upb_MiniTable_SetSub*() for all message or proto2 enum
40 // fields to link the table to the appropriate sub-tables.
41 upb_MiniTable* _upb_MiniTable_Build(const char* data, size_t len,
42                                     upb_MiniTablePlatform platform,
43                                     upb_Arena* arena, upb_Status* status);
44 
upb_MiniTable_Build(const char * data,size_t len,upb_Arena * arena,upb_Status * status)45 UPB_API_INLINE upb_MiniTable* upb_MiniTable_Build(const char* data, size_t len,
46                                                   upb_Arena* arena,
47                                                   upb_Status* status) {
48   return _upb_MiniTable_Build(data, len, kUpb_MiniTablePlatform_Native, arena,
49                               status);
50 }
51 
52 // Initializes a MiniTableExtension buffer that has already been allocated.
53 // This is needed by upb_FileDef and upb_MessageDef, which allocate all of the
54 // extensions together in a single contiguous array.
55 const char* _upb_MiniTableExtension_Init(const char* data, size_t len,
56                                          upb_MiniTableExtension* ext,
57                                          const upb_MiniTable* extendee,
58                                          upb_MiniTableSub sub,
59                                          upb_MiniTablePlatform platform,
60                                          upb_Status* status);
61 
upb_MiniTableExtension_Init(const char * data,size_t len,upb_MiniTableExtension * ext,const upb_MiniTable * extendee,upb_MiniTableSub sub,upb_Status * status)62 UPB_API_INLINE const char* upb_MiniTableExtension_Init(
63     const char* data, size_t len, upb_MiniTableExtension* ext,
64     const upb_MiniTable* extendee, upb_MiniTableSub sub, upb_Status* status) {
65   return _upb_MiniTableExtension_Init(data, len, ext, extendee, sub,
66                                       kUpb_MiniTablePlatform_Native, status);
67 }
68 
69 UPB_API upb_MiniTableExtension* _upb_MiniTableExtension_Build(
70     const char* data, size_t len, const upb_MiniTable* extendee,
71     upb_MiniTableSub sub, upb_MiniTablePlatform platform, upb_Arena* arena,
72     upb_Status* status);
73 
upb_MiniTableExtension_Build(const char * data,size_t len,const upb_MiniTable * extendee,upb_Arena * arena,upb_Status * status)74 UPB_API_INLINE upb_MiniTableExtension* upb_MiniTableExtension_Build(
75     const char* data, size_t len, const upb_MiniTable* extendee,
76     upb_Arena* arena, upb_Status* status) {
77   upb_MiniTableSub sub = upb_MiniTableSub_FromMessage(NULL);
78   return _upb_MiniTableExtension_Build(
79       data, len, extendee, sub, kUpb_MiniTablePlatform_Native, arena, status);
80 }
81 
upb_MiniTableExtension_BuildMessage(const char * data,size_t len,const upb_MiniTable * extendee,upb_MiniTable * submsg,upb_Arena * arena,upb_Status * status)82 UPB_API_INLINE upb_MiniTableExtension* upb_MiniTableExtension_BuildMessage(
83     const char* data, size_t len, const upb_MiniTable* extendee,
84     upb_MiniTable* submsg, upb_Arena* arena, upb_Status* status) {
85   upb_MiniTableSub sub = upb_MiniTableSub_FromMessage(submsg);
86   return _upb_MiniTableExtension_Build(
87       data, len, extendee, sub, kUpb_MiniTablePlatform_Native, arena, status);
88 }
89 
upb_MiniTableExtension_BuildEnum(const char * data,size_t len,const upb_MiniTable * extendee,upb_MiniTableEnum * subenum,upb_Arena * arena,upb_Status * status)90 UPB_API_INLINE upb_MiniTableExtension* upb_MiniTableExtension_BuildEnum(
91     const char* data, size_t len, const upb_MiniTable* extendee,
92     upb_MiniTableEnum* subenum, upb_Arena* arena, upb_Status* status) {
93   upb_MiniTableSub sub = upb_MiniTableSub_FromEnum(subenum);
94   return _upb_MiniTableExtension_Build(
95       data, len, extendee, sub, kUpb_MiniTablePlatform_Native, arena, status);
96 }
97 
98 // Like upb_MiniTable_Build(), but the user provides a buffer of layout data so
99 // it can be reused from call to call, avoiding repeated realloc()/free().
100 //
101 // The caller owns `*buf` both before and after the call, and must free() it
102 // when it is no longer in use.  The function will realloc() `*buf` as
103 // necessary, updating `*size` accordingly.
104 upb_MiniTable* upb_MiniTable_BuildWithBuf(const char* data, size_t len,
105                                           upb_MiniTablePlatform platform,
106                                           upb_Arena* arena, void** buf,
107                                           size_t* buf_size, upb_Status* status);
108 
109 #ifdef __cplusplus
110 } /* extern "C" */
111 #endif
112 
113 #include "upb/port/undef.inc"
114 
115 #endif /* UPB_MINI_TABLE_DECODE_H_ */
116