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