| /* |
| ** Defs are upb's internal representation of the constructs that can appear |
| ** in a .proto file: |
| ** |
| ** - upb_msgdef: describes a "message" construct. |
| ** - upb_fielddef: describes a message field. |
| ** - upb_filedef: describes a .proto file and its defs. |
| ** - upb_enumdef: describes an enum. |
| ** - upb_oneofdef: describes a oneof. |
| ** |
| ** TODO: definitions of services. |
| */ |
| |
| #ifndef UPB_DEF_H_ |
| #define UPB_DEF_H_ |
| |
| #include "upb/upb.h" |
| #include "upb/table.int.h" |
| #include "google/protobuf/descriptor.upb.h" |
| |
| #include "upb/port_def.inc" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif /* __cplusplus */ |
| |
| struct upb_enumdef; |
| typedef struct upb_enumdef upb_enumdef; |
| struct upb_fielddef; |
| typedef struct upb_fielddef upb_fielddef; |
| struct upb_filedef; |
| typedef struct upb_filedef upb_filedef; |
| struct upb_msgdef; |
| typedef struct upb_msgdef upb_msgdef; |
| struct upb_oneofdef; |
| typedef struct upb_oneofdef upb_oneofdef; |
| struct upb_symtab; |
| typedef struct upb_symtab upb_symtab; |
| |
| typedef enum { |
| UPB_SYNTAX_PROTO2 = 2, |
| UPB_SYNTAX_PROTO3 = 3 |
| } upb_syntax_t; |
| |
| /* All the different kind of well known type messages. For simplicity of check, |
| * number wrappers and string wrappers are grouped together. Make sure the |
| * order and merber of these groups are not changed. |
| */ |
| typedef enum { |
| UPB_WELLKNOWN_UNSPECIFIED, |
| UPB_WELLKNOWN_ANY, |
| UPB_WELLKNOWN_FIELDMASK, |
| UPB_WELLKNOWN_DURATION, |
| UPB_WELLKNOWN_TIMESTAMP, |
| /* number wrappers */ |
| UPB_WELLKNOWN_DOUBLEVALUE, |
| UPB_WELLKNOWN_FLOATVALUE, |
| UPB_WELLKNOWN_INT64VALUE, |
| UPB_WELLKNOWN_UINT64VALUE, |
| UPB_WELLKNOWN_INT32VALUE, |
| UPB_WELLKNOWN_UINT32VALUE, |
| /* string wrappers */ |
| UPB_WELLKNOWN_STRINGVALUE, |
| UPB_WELLKNOWN_BYTESVALUE, |
| UPB_WELLKNOWN_BOOLVALUE, |
| UPB_WELLKNOWN_VALUE, |
| UPB_WELLKNOWN_LISTVALUE, |
| UPB_WELLKNOWN_STRUCT |
| } upb_wellknowntype_t; |
| |
| /* upb_fielddef ***************************************************************/ |
| |
| /* Maximum field number allowed for FieldDefs. This is an inherent limit of the |
| * protobuf wire format. */ |
| #define UPB_MAX_FIELDNUMBER ((1 << 29) - 1) |
| |
| const char *upb_fielddef_fullname(const upb_fielddef *f); |
| upb_fieldtype_t upb_fielddef_type(const upb_fielddef *f); |
| upb_descriptortype_t upb_fielddef_descriptortype(const upb_fielddef *f); |
| upb_label_t upb_fielddef_label(const upb_fielddef *f); |
| uint32_t upb_fielddef_number(const upb_fielddef *f); |
| const char *upb_fielddef_name(const upb_fielddef *f); |
| const char *upb_fielddef_jsonname(const upb_fielddef *f); |
| bool upb_fielddef_isextension(const upb_fielddef *f); |
| bool upb_fielddef_lazy(const upb_fielddef *f); |
| bool upb_fielddef_packed(const upb_fielddef *f); |
| const upb_filedef *upb_fielddef_file(const upb_fielddef *f); |
| const upb_msgdef *upb_fielddef_containingtype(const upb_fielddef *f); |
| const upb_oneofdef *upb_fielddef_containingoneof(const upb_fielddef *f); |
| const upb_oneofdef *upb_fielddef_realcontainingoneof(const upb_fielddef *f); |
| uint32_t upb_fielddef_index(const upb_fielddef *f); |
| bool upb_fielddef_issubmsg(const upb_fielddef *f); |
| bool upb_fielddef_isstring(const upb_fielddef *f); |
| bool upb_fielddef_isseq(const upb_fielddef *f); |
| bool upb_fielddef_isprimitive(const upb_fielddef *f); |
| bool upb_fielddef_ismap(const upb_fielddef *f); |
| int64_t upb_fielddef_defaultint64(const upb_fielddef *f); |
| int32_t upb_fielddef_defaultint32(const upb_fielddef *f); |
| uint64_t upb_fielddef_defaultuint64(const upb_fielddef *f); |
| uint32_t upb_fielddef_defaultuint32(const upb_fielddef *f); |
| bool upb_fielddef_defaultbool(const upb_fielddef *f); |
| float upb_fielddef_defaultfloat(const upb_fielddef *f); |
| double upb_fielddef_defaultdouble(const upb_fielddef *f); |
| const char *upb_fielddef_defaultstr(const upb_fielddef *f, size_t *len); |
| bool upb_fielddef_hassubdef(const upb_fielddef *f); |
| bool upb_fielddef_haspresence(const upb_fielddef *f); |
| const upb_msgdef *upb_fielddef_msgsubdef(const upb_fielddef *f); |
| const upb_enumdef *upb_fielddef_enumsubdef(const upb_fielddef *f); |
| const upb_msglayout_field *upb_fielddef_layout(const upb_fielddef *f); |
| |
| /* Internal only. */ |
| uint32_t upb_fielddef_selectorbase(const upb_fielddef *f); |
| |
| /* upb_oneofdef ***************************************************************/ |
| |
| typedef upb_inttable_iter upb_oneof_iter; |
| |
| const char *upb_oneofdef_name(const upb_oneofdef *o); |
| const upb_msgdef *upb_oneofdef_containingtype(const upb_oneofdef *o); |
| uint32_t upb_oneofdef_index(const upb_oneofdef *o); |
| bool upb_oneofdef_issynthetic(const upb_oneofdef *o); |
| int upb_oneofdef_fieldcount(const upb_oneofdef *o); |
| const upb_fielddef *upb_oneofdef_field(const upb_oneofdef *o, int i); |
| |
| /* Oneof lookups: |
| * - ntof: look up a field by name. |
| * - ntofz: look up a field by name (as a null-terminated string). |
| * - itof: look up a field by number. */ |
| const upb_fielddef *upb_oneofdef_ntof(const upb_oneofdef *o, |
| const char *name, size_t length); |
| UPB_INLINE const upb_fielddef *upb_oneofdef_ntofz(const upb_oneofdef *o, |
| const char *name) { |
| return upb_oneofdef_ntof(o, name, strlen(name)); |
| } |
| const upb_fielddef *upb_oneofdef_itof(const upb_oneofdef *o, uint32_t num); |
| |
| /* DEPRECATED, slated for removal. */ |
| int upb_oneofdef_numfields(const upb_oneofdef *o); |
| void upb_oneof_begin(upb_oneof_iter *iter, const upb_oneofdef *o); |
| void upb_oneof_next(upb_oneof_iter *iter); |
| bool upb_oneof_done(upb_oneof_iter *iter); |
| upb_fielddef *upb_oneof_iter_field(const upb_oneof_iter *iter); |
| void upb_oneof_iter_setdone(upb_oneof_iter *iter); |
| bool upb_oneof_iter_isequal(const upb_oneof_iter *iter1, |
| const upb_oneof_iter *iter2); |
| /* END DEPRECATED */ |
| |
| /* upb_msgdef *****************************************************************/ |
| |
| typedef upb_inttable_iter upb_msg_field_iter; |
| typedef upb_strtable_iter upb_msg_oneof_iter; |
| |
| /* Well-known field tag numbers for map-entry messages. */ |
| #define UPB_MAPENTRY_KEY 1 |
| #define UPB_MAPENTRY_VALUE 2 |
| |
| /* Well-known field tag numbers for Any messages. */ |
| #define UPB_ANY_TYPE 1 |
| #define UPB_ANY_VALUE 2 |
| |
| /* Well-known field tag numbers for timestamp messages. */ |
| #define UPB_DURATION_SECONDS 1 |
| #define UPB_DURATION_NANOS 2 |
| |
| /* Well-known field tag numbers for duration messages. */ |
| #define UPB_TIMESTAMP_SECONDS 1 |
| #define UPB_TIMESTAMP_NANOS 2 |
| |
| const char *upb_msgdef_fullname(const upb_msgdef *m); |
| const upb_filedef *upb_msgdef_file(const upb_msgdef *m); |
| const char *upb_msgdef_name(const upb_msgdef *m); |
| upb_syntax_t upb_msgdef_syntax(const upb_msgdef *m); |
| bool upb_msgdef_mapentry(const upb_msgdef *m); |
| upb_wellknowntype_t upb_msgdef_wellknowntype(const upb_msgdef *m); |
| bool upb_msgdef_iswrapper(const upb_msgdef *m); |
| bool upb_msgdef_isnumberwrapper(const upb_msgdef *m); |
| int upb_msgdef_fieldcount(const upb_msgdef *m); |
| int upb_msgdef_oneofcount(const upb_msgdef *m); |
| const upb_fielddef *upb_msgdef_field(const upb_msgdef *m, int i); |
| const upb_oneofdef *upb_msgdef_oneof(const upb_msgdef *m, int i); |
| const upb_fielddef *upb_msgdef_itof(const upb_msgdef *m, uint32_t i); |
| const upb_fielddef *upb_msgdef_ntof(const upb_msgdef *m, const char *name, |
| size_t len); |
| const upb_oneofdef *upb_msgdef_ntoo(const upb_msgdef *m, const char *name, |
| size_t len); |
| const upb_msglayout *upb_msgdef_layout(const upb_msgdef *m); |
| |
| UPB_INLINE const upb_oneofdef *upb_msgdef_ntooz(const upb_msgdef *m, |
| const char *name) { |
| return upb_msgdef_ntoo(m, name, strlen(name)); |
| } |
| |
| UPB_INLINE const upb_fielddef *upb_msgdef_ntofz(const upb_msgdef *m, |
| const char *name) { |
| return upb_msgdef_ntof(m, name, strlen(name)); |
| } |
| |
| /* Internal-only. */ |
| size_t upb_msgdef_selectorcount(const upb_msgdef *m); |
| uint32_t upb_msgdef_submsgfieldcount(const upb_msgdef *m); |
| |
| /* Lookup of either field or oneof by name. Returns whether either was found. |
| * If the return is true, then the found def will be set, and the non-found |
| * one set to NULL. */ |
| bool upb_msgdef_lookupname(const upb_msgdef *m, const char *name, size_t len, |
| const upb_fielddef **f, const upb_oneofdef **o); |
| |
| UPB_INLINE bool upb_msgdef_lookupnamez(const upb_msgdef *m, const char *name, |
| const upb_fielddef **f, |
| const upb_oneofdef **o) { |
| return upb_msgdef_lookupname(m, name, strlen(name), f, o); |
| } |
| |
| /* Returns a field by either JSON name or regular proto name. */ |
| const upb_fielddef *upb_msgdef_lookupjsonname(const upb_msgdef *m, |
| const char *name, size_t len); |
| |
| /* DEPRECATED, slated for removal */ |
| int upb_msgdef_numfields(const upb_msgdef *m); |
| int upb_msgdef_numoneofs(const upb_msgdef *m); |
| int upb_msgdef_numrealoneofs(const upb_msgdef *m); |
| void upb_msg_field_begin(upb_msg_field_iter *iter, const upb_msgdef *m); |
| void upb_msg_field_next(upb_msg_field_iter *iter); |
| bool upb_msg_field_done(const upb_msg_field_iter *iter); |
| upb_fielddef *upb_msg_iter_field(const upb_msg_field_iter *iter); |
| void upb_msg_field_iter_setdone(upb_msg_field_iter *iter); |
| bool upb_msg_field_iter_isequal(const upb_msg_field_iter * iter1, |
| const upb_msg_field_iter * iter2); |
| void upb_msg_oneof_begin(upb_msg_oneof_iter * iter, const upb_msgdef *m); |
| void upb_msg_oneof_next(upb_msg_oneof_iter * iter); |
| bool upb_msg_oneof_done(const upb_msg_oneof_iter *iter); |
| const upb_oneofdef *upb_msg_iter_oneof(const upb_msg_oneof_iter *iter); |
| void upb_msg_oneof_iter_setdone(upb_msg_oneof_iter * iter); |
| bool upb_msg_oneof_iter_isequal(const upb_msg_oneof_iter *iter1, |
| const upb_msg_oneof_iter *iter2); |
| /* END DEPRECATED */ |
| |
| /* upb_enumdef ****************************************************************/ |
| |
| typedef upb_strtable_iter upb_enum_iter; |
| |
| const char *upb_enumdef_fullname(const upb_enumdef *e); |
| const char *upb_enumdef_name(const upb_enumdef *e); |
| const upb_filedef *upb_enumdef_file(const upb_enumdef *e); |
| int32_t upb_enumdef_default(const upb_enumdef *e); |
| int upb_enumdef_numvals(const upb_enumdef *e); |
| |
| /* Enum lookups: |
| * - ntoi: look up a name with specified length. |
| * - ntoiz: look up a name provided as a null-terminated string. |
| * - iton: look up an integer, returning the name as a null-terminated |
| * string. */ |
| bool upb_enumdef_ntoi(const upb_enumdef *e, const char *name, size_t len, |
| int32_t *num); |
| UPB_INLINE bool upb_enumdef_ntoiz(const upb_enumdef *e, |
| const char *name, int32_t *num) { |
| return upb_enumdef_ntoi(e, name, strlen(name), num); |
| } |
| const char *upb_enumdef_iton(const upb_enumdef *e, int32_t num); |
| |
| void upb_enum_begin(upb_enum_iter *iter, const upb_enumdef *e); |
| void upb_enum_next(upb_enum_iter *iter); |
| bool upb_enum_done(upb_enum_iter *iter); |
| const char *upb_enum_iter_name(upb_enum_iter *iter); |
| int32_t upb_enum_iter_number(upb_enum_iter *iter); |
| |
| /* upb_filedef ****************************************************************/ |
| |
| const char *upb_filedef_name(const upb_filedef *f); |
| const char *upb_filedef_package(const upb_filedef *f); |
| const char *upb_filedef_phpprefix(const upb_filedef *f); |
| const char *upb_filedef_phpnamespace(const upb_filedef *f); |
| upb_syntax_t upb_filedef_syntax(const upb_filedef *f); |
| int upb_filedef_depcount(const upb_filedef *f); |
| int upb_filedef_msgcount(const upb_filedef *f); |
| int upb_filedef_enumcount(const upb_filedef *f); |
| const upb_filedef *upb_filedef_dep(const upb_filedef *f, int i); |
| const upb_msgdef *upb_filedef_msg(const upb_filedef *f, int i); |
| const upb_enumdef *upb_filedef_enum(const upb_filedef *f, int i); |
| |
| /* upb_symtab *****************************************************************/ |
| |
| upb_symtab *upb_symtab_new(void); |
| void upb_symtab_free(upb_symtab* s); |
| const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym); |
| const upb_msgdef *upb_symtab_lookupmsg2( |
| const upb_symtab *s, const char *sym, size_t len); |
| const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym); |
| const upb_filedef *upb_symtab_lookupfile(const upb_symtab *s, const char *name); |
| const upb_filedef *upb_symtab_lookupfile2( |
| const upb_symtab *s, const char *name, size_t len); |
| int upb_symtab_filecount(const upb_symtab *s); |
| const upb_filedef *upb_symtab_addfile( |
| upb_symtab *s, const google_protobuf_FileDescriptorProto *file, |
| upb_status *status); |
| size_t _upb_symtab_bytesloaded(const upb_symtab *s); |
| |
| /* For generated code only: loads a generated descriptor. */ |
| typedef struct upb_def_init { |
| struct upb_def_init **deps; /* Dependencies of this file. */ |
| const upb_msglayout **layouts; /* Pre-order layouts of all messages. */ |
| const char *filename; |
| upb_strview descriptor; /* Serialized descriptor. */ |
| } upb_def_init; |
| |
| bool _upb_symtab_loaddefinit(upb_symtab *s, const upb_def_init *init); |
| |
| #include "upb/port_undef.inc" |
| |
| #ifdef __cplusplus |
| } /* extern "C" */ |
| #endif /* __cplusplus */ |
| |
| #endif /* UPB_DEF_H_ */ |