def.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. /*
  2. * Copyright (c) 2009-2021, Google LLC
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. * * Neither the name of Google LLC nor the
  13. * names of its contributors may be used to endorse or promote products
  14. * derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  17. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY
  20. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  25. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. /*
  28. * Defs are upb's internal representation of the constructs that can appear
  29. * in a .proto file:
  30. *
  31. * - upb_msgdef: describes a "message" construct.
  32. * - upb_fielddef: describes a message field.
  33. * - upb_filedef: describes a .proto file and its defs.
  34. * - upb_enumdef: describes an enum.
  35. * - upb_oneofdef: describes a oneof.
  36. *
  37. * TODO: definitions of services.
  38. */
  39. #ifndef UPB_DEF_H_
  40. #define UPB_DEF_H_
  41. #include "upb/upb.h"
  42. #include "upb/table_internal.h"
  43. #include "google/protobuf/descriptor.upb.h"
  44. /* Must be last. */
  45. #include "upb/port_def.inc"
  46. #ifdef __cplusplus
  47. extern "C" {
  48. #endif /* __cplusplus */
  49. struct upb_enumdef;
  50. typedef struct upb_enumdef upb_enumdef;
  51. struct upb_enumvaldef;
  52. typedef struct upb_enumvaldef upb_enumvaldef;
  53. struct upb_extrange;
  54. typedef struct upb_extrange upb_extrange;
  55. struct upb_fielddef;
  56. typedef struct upb_fielddef upb_fielddef;
  57. struct upb_filedef;
  58. typedef struct upb_filedef upb_filedef;
  59. struct upb_msgdef;
  60. typedef struct upb_msgdef upb_msgdef;
  61. struct upb_oneofdef;
  62. typedef struct upb_oneofdef upb_oneofdef;
  63. struct upb_symtab;
  64. typedef struct upb_symtab upb_symtab;
  65. typedef enum {
  66. UPB_SYNTAX_PROTO2 = 2,
  67. UPB_SYNTAX_PROTO3 = 3
  68. } upb_syntax_t;
  69. /* All the different kind of well known type messages. For simplicity of check,
  70. * number wrappers and string wrappers are grouped together. Make sure the
  71. * order and merber of these groups are not changed.
  72. */
  73. typedef enum {
  74. UPB_WELLKNOWN_UNSPECIFIED,
  75. UPB_WELLKNOWN_ANY,
  76. UPB_WELLKNOWN_FIELDMASK,
  77. UPB_WELLKNOWN_DURATION,
  78. UPB_WELLKNOWN_TIMESTAMP,
  79. /* number wrappers */
  80. UPB_WELLKNOWN_DOUBLEVALUE,
  81. UPB_WELLKNOWN_FLOATVALUE,
  82. UPB_WELLKNOWN_INT64VALUE,
  83. UPB_WELLKNOWN_UINT64VALUE,
  84. UPB_WELLKNOWN_INT32VALUE,
  85. UPB_WELLKNOWN_UINT32VALUE,
  86. /* string wrappers */
  87. UPB_WELLKNOWN_STRINGVALUE,
  88. UPB_WELLKNOWN_BYTESVALUE,
  89. UPB_WELLKNOWN_BOOLVALUE,
  90. UPB_WELLKNOWN_VALUE,
  91. UPB_WELLKNOWN_LISTVALUE,
  92. UPB_WELLKNOWN_STRUCT
  93. } upb_wellknowntype_t;
  94. /* upb_fielddef ***************************************************************/
  95. /* Maximum field number allowed for FieldDefs. This is an inherent limit of the
  96. * protobuf wire format. */
  97. #define UPB_MAX_FIELDNUMBER ((1 << 29) - 1)
  98. const char *upb_fielddef_fullname(const upb_fielddef *f);
  99. upb_fieldtype_t upb_fielddef_type(const upb_fielddef *f);
  100. upb_descriptortype_t upb_fielddef_descriptortype(const upb_fielddef *f);
  101. upb_label_t upb_fielddef_label(const upb_fielddef *f);
  102. uint32_t upb_fielddef_number(const upb_fielddef *f);
  103. const char *upb_fielddef_name(const upb_fielddef *f);
  104. const char *upb_fielddef_jsonname(const upb_fielddef *f);
  105. bool upb_fielddef_isextension(const upb_fielddef *f);
  106. bool upb_fielddef_lazy(const upb_fielddef *f);
  107. bool upb_fielddef_packed(const upb_fielddef *f);
  108. const upb_filedef *upb_fielddef_file(const upb_fielddef *f);
  109. const upb_msgdef *upb_fielddef_containingtype(const upb_fielddef *f);
  110. const upb_oneofdef *upb_fielddef_containingoneof(const upb_fielddef *f);
  111. const upb_oneofdef *upb_fielddef_realcontainingoneof(const upb_fielddef *f);
  112. uint32_t upb_fielddef_index(const upb_fielddef *f);
  113. bool upb_fielddef_issubmsg(const upb_fielddef *f);
  114. bool upb_fielddef_isstring(const upb_fielddef *f);
  115. bool upb_fielddef_isseq(const upb_fielddef *f);
  116. bool upb_fielddef_isprimitive(const upb_fielddef *f);
  117. bool upb_fielddef_ismap(const upb_fielddef *f);
  118. int64_t upb_fielddef_defaultint64(const upb_fielddef *f);
  119. int32_t upb_fielddef_defaultint32(const upb_fielddef *f);
  120. uint64_t upb_fielddef_defaultuint64(const upb_fielddef *f);
  121. uint32_t upb_fielddef_defaultuint32(const upb_fielddef *f);
  122. bool upb_fielddef_defaultbool(const upb_fielddef *f);
  123. float upb_fielddef_defaultfloat(const upb_fielddef *f);
  124. double upb_fielddef_defaultdouble(const upb_fielddef *f);
  125. const char *upb_fielddef_defaultstr(const upb_fielddef *f, size_t *len);
  126. bool upb_fielddef_hassubdef(const upb_fielddef *f);
  127. bool upb_fielddef_haspresence(const upb_fielddef *f);
  128. const upb_msgdef *upb_fielddef_msgsubdef(const upb_fielddef *f);
  129. const upb_enumdef *upb_fielddef_enumsubdef(const upb_fielddef *f);
  130. const upb_msglayout_field *upb_fielddef_layout(const upb_fielddef *f);
  131. const upb_msglayout_ext *_upb_fielddef_extlayout(const upb_fielddef *f);
  132. /* upb_oneofdef ***************************************************************/
  133. typedef upb_inttable_iter upb_oneof_iter;
  134. const char *upb_oneofdef_name(const upb_oneofdef *o);
  135. const upb_msgdef *upb_oneofdef_containingtype(const upb_oneofdef *o);
  136. uint32_t upb_oneofdef_index(const upb_oneofdef *o);
  137. bool upb_oneofdef_issynthetic(const upb_oneofdef *o);
  138. int upb_oneofdef_fieldcount(const upb_oneofdef *o);
  139. const upb_fielddef *upb_oneofdef_field(const upb_oneofdef *o, int i);
  140. /* Oneof lookups:
  141. * - ntof: look up a field by name.
  142. * - ntofz: look up a field by name (as a null-terminated string).
  143. * - itof: look up a field by number. */
  144. const upb_fielddef *upb_oneofdef_ntof(const upb_oneofdef *o,
  145. const char *name, size_t length);
  146. UPB_INLINE const upb_fielddef *upb_oneofdef_ntofz(const upb_oneofdef *o,
  147. const char *name) {
  148. return upb_oneofdef_ntof(o, name, strlen(name));
  149. }
  150. const upb_fielddef *upb_oneofdef_itof(const upb_oneofdef *o, uint32_t num);
  151. /* DEPRECATED, slated for removal. */
  152. int upb_oneofdef_numfields(const upb_oneofdef *o);
  153. void upb_oneof_begin(upb_oneof_iter *iter, const upb_oneofdef *o);
  154. void upb_oneof_next(upb_oneof_iter *iter);
  155. bool upb_oneof_done(upb_oneof_iter *iter);
  156. upb_fielddef *upb_oneof_iter_field(const upb_oneof_iter *iter);
  157. void upb_oneof_iter_setdone(upb_oneof_iter *iter);
  158. bool upb_oneof_iter_isequal(const upb_oneof_iter *iter1,
  159. const upb_oneof_iter *iter2);
  160. /* END DEPRECATED */
  161. /* upb_msgdef *****************************************************************/
  162. typedef upb_inttable_iter upb_msg_field_iter;
  163. typedef upb_strtable_iter upb_msg_oneof_iter;
  164. /* Well-known field tag numbers for map-entry messages. */
  165. #define UPB_MAPENTRY_KEY 1
  166. #define UPB_MAPENTRY_VALUE 2
  167. /* Well-known field tag numbers for Any messages. */
  168. #define UPB_ANY_TYPE 1
  169. #define UPB_ANY_VALUE 2
  170. /* Well-known field tag numbers for timestamp messages. */
  171. #define UPB_DURATION_SECONDS 1
  172. #define UPB_DURATION_NANOS 2
  173. /* Well-known field tag numbers for duration messages. */
  174. #define UPB_TIMESTAMP_SECONDS 1
  175. #define UPB_TIMESTAMP_NANOS 2
  176. const char *upb_msgdef_fullname(const upb_msgdef *m);
  177. const upb_filedef *upb_msgdef_file(const upb_msgdef *m);
  178. const char *upb_msgdef_name(const upb_msgdef *m);
  179. upb_syntax_t upb_msgdef_syntax(const upb_msgdef *m);
  180. bool upb_msgdef_mapentry(const upb_msgdef *m);
  181. upb_wellknowntype_t upb_msgdef_wellknowntype(const upb_msgdef *m);
  182. bool upb_msgdef_iswrapper(const upb_msgdef *m);
  183. bool upb_msgdef_isnumberwrapper(const upb_msgdef *m);
  184. int upb_msgdef_extrangecount(const upb_msgdef *m);
  185. int upb_msgdef_fieldcount(const upb_msgdef *m);
  186. int upb_msgdef_oneofcount(const upb_msgdef *m);
  187. const upb_extrange *upb_msgdef_extrange(const upb_msgdef *m, int i);
  188. const upb_fielddef *upb_msgdef_field(const upb_msgdef *m, int i);
  189. const upb_oneofdef *upb_msgdef_oneof(const upb_msgdef *m, int i);
  190. const upb_fielddef *upb_msgdef_itof(const upb_msgdef *m, uint32_t i);
  191. const upb_fielddef *upb_msgdef_ntof(const upb_msgdef *m, const char *name,
  192. size_t len);
  193. const upb_oneofdef *upb_msgdef_ntoo(const upb_msgdef *m, const char *name,
  194. size_t len);
  195. const upb_msglayout *upb_msgdef_layout(const upb_msgdef *m);
  196. UPB_INLINE const upb_oneofdef *upb_msgdef_ntooz(const upb_msgdef *m,
  197. const char *name) {
  198. return upb_msgdef_ntoo(m, name, strlen(name));
  199. }
  200. UPB_INLINE const upb_fielddef *upb_msgdef_ntofz(const upb_msgdef *m,
  201. const char *name) {
  202. return upb_msgdef_ntof(m, name, strlen(name));
  203. }
  204. /* Lookup of either field or oneof by name. Returns whether either was found.
  205. * If the return is true, then the found def will be set, and the non-found
  206. * one set to NULL. */
  207. bool upb_msgdef_lookupname(const upb_msgdef *m, const char *name, size_t len,
  208. const upb_fielddef **f, const upb_oneofdef **o);
  209. UPB_INLINE bool upb_msgdef_lookupnamez(const upb_msgdef *m, const char *name,
  210. const upb_fielddef **f,
  211. const upb_oneofdef **o) {
  212. return upb_msgdef_lookupname(m, name, strlen(name), f, o);
  213. }
  214. /* Returns a field by either JSON name or regular proto name. */
  215. const upb_fielddef *upb_msgdef_lookupjsonname(const upb_msgdef *m,
  216. const char *name, size_t len);
  217. /* DEPRECATED, slated for removal */
  218. int upb_msgdef_numfields(const upb_msgdef *m);
  219. int upb_msgdef_numoneofs(const upb_msgdef *m);
  220. int upb_msgdef_numrealoneofs(const upb_msgdef *m);
  221. void upb_msg_field_begin(upb_msg_field_iter *iter, const upb_msgdef *m);
  222. void upb_msg_field_next(upb_msg_field_iter *iter);
  223. bool upb_msg_field_done(const upb_msg_field_iter *iter);
  224. upb_fielddef *upb_msg_iter_field(const upb_msg_field_iter *iter);
  225. void upb_msg_field_iter_setdone(upb_msg_field_iter *iter);
  226. bool upb_msg_field_iter_isequal(const upb_msg_field_iter * iter1,
  227. const upb_msg_field_iter * iter2);
  228. void upb_msg_oneof_begin(upb_msg_oneof_iter * iter, const upb_msgdef *m);
  229. void upb_msg_oneof_next(upb_msg_oneof_iter * iter);
  230. bool upb_msg_oneof_done(const upb_msg_oneof_iter *iter);
  231. const upb_oneofdef *upb_msg_iter_oneof(const upb_msg_oneof_iter *iter);
  232. void upb_msg_oneof_iter_setdone(upb_msg_oneof_iter * iter);
  233. bool upb_msg_oneof_iter_isequal(const upb_msg_oneof_iter *iter1,
  234. const upb_msg_oneof_iter *iter2);
  235. /* END DEPRECATED */
  236. /* upb_extrange ***************************************************************/
  237. const google_protobuf_ExtensionRangeOptions *upb_extrange_options(
  238. const upb_extrange *r);
  239. bool upb_extrange_hasoptions(const upb_extrange *r);
  240. int32_t upb_extrange_start(const upb_extrange *r);
  241. int32_t upb_extrange_end(const upb_extrange *r);
  242. /* upb_enumdef ****************************************************************/
  243. typedef upb_strtable_iter upb_enum_iter;
  244. const char *upb_enumdef_fullname(const upb_enumdef *e);
  245. const char *upb_enumdef_name(const upb_enumdef *e);
  246. const upb_filedef *upb_enumdef_file(const upb_enumdef *e);
  247. int32_t upb_enumdef_default(const upb_enumdef *e);
  248. int upb_enumdef_valuecount(const upb_enumdef *e);
  249. const upb_enumvaldef *upb_enumdef_value(const upb_enumdef *e, int i);
  250. const upb_enumvaldef *upb_enumdef_lookupname(const upb_enumdef *e,
  251. const char *name, size_t len);
  252. const upb_enumvaldef *upb_enumdef_lookupnum(const upb_enumdef *e, int32_t num);
  253. /* DEPRECATED, slated for removal */
  254. int upb_enumdef_numvals(const upb_enumdef *e);
  255. void upb_enum_begin(upb_enum_iter *iter, const upb_enumdef *e);
  256. void upb_enum_next(upb_enum_iter *iter);
  257. bool upb_enum_done(upb_enum_iter *iter);
  258. const char *upb_enum_iter_name(upb_enum_iter *iter);
  259. int32_t upb_enum_iter_number(upb_enum_iter *iter);
  260. /* END DEPRECATED */
  261. // Convenience wrapper.
  262. UPB_INLINE const upb_enumvaldef *upb_enumdef_lookupnamez(const upb_enumdef *e,
  263. const char *name) {
  264. return upb_enumdef_lookupname(e, name, strlen(name));
  265. }
  266. /* upb_enumvaldef *************************************************************/
  267. const char *upb_enumvaldef_fullname(const upb_enumvaldef *e);
  268. const char *upb_enumvaldef_name(const upb_enumvaldef *e);
  269. int32_t upb_enumvaldef_number(const upb_enumvaldef *e);
  270. const upb_enumdef *upb_enumvaldef_enum(const upb_enumvaldef *e);
  271. /* upb_filedef ****************************************************************/
  272. const char *upb_filedef_name(const upb_filedef *f);
  273. const char *upb_filedef_package(const upb_filedef *f);
  274. const char *upb_filedef_phpprefix(const upb_filedef *f);
  275. const char *upb_filedef_phpnamespace(const upb_filedef *f);
  276. upb_syntax_t upb_filedef_syntax(const upb_filedef *f);
  277. int upb_filedef_depcount(const upb_filedef *f);
  278. int upb_filedef_msgcount(const upb_filedef *f);
  279. int upb_filedef_enumcount(const upb_filedef *f);
  280. const upb_filedef *upb_filedef_dep(const upb_filedef *f, int i);
  281. const upb_msgdef *upb_filedef_msg(const upb_filedef *f, int i);
  282. const upb_enumdef *upb_filedef_enum(const upb_filedef *f, int i);
  283. const upb_symtab *upb_filedef_symtab(const upb_filedef *f);
  284. /* upb_symtab *****************************************************************/
  285. upb_symtab *upb_symtab_new(void);
  286. void upb_symtab_free(upb_symtab* s);
  287. const upb_msgdef *upb_symtab_lookupmsg(const upb_symtab *s, const char *sym);
  288. const upb_msgdef *upb_symtab_lookupmsg2(
  289. const upb_symtab *s, const char *sym, size_t len);
  290. const upb_enumdef *upb_symtab_lookupenum(const upb_symtab *s, const char *sym);
  291. const upb_enumvaldef *upb_symtab_lookupenumval(const upb_symtab *s,
  292. const char *sym);
  293. const upb_fielddef *upb_symtab_lookupext(const upb_symtab *s, const char *sym);
  294. const upb_fielddef *upb_symtab_lookupext2(const upb_symtab *s, const char *sym,
  295. size_t len);
  296. const upb_filedef *upb_symtab_lookupfile(const upb_symtab *s, const char *name);
  297. const upb_filedef *upb_symtab_lookupfile2(
  298. const upb_symtab *s, const char *name, size_t len);
  299. int upb_symtab_filecount(const upb_symtab *s);
  300. const upb_filedef *upb_symtab_addfile(
  301. upb_symtab *s, const google_protobuf_FileDescriptorProto *file,
  302. upb_status *status);
  303. size_t _upb_symtab_bytesloaded(const upb_symtab *s);
  304. upb_arena *_upb_symtab_arena(const upb_symtab *s);
  305. const upb_fielddef *_upb_symtab_lookupextfield(const upb_symtab *s,
  306. const upb_msglayout_ext *ext);
  307. const upb_extreg *upb_symtab_extreg(const upb_symtab *s);
  308. /* For generated code only: loads a generated descriptor. */
  309. typedef struct upb_def_init {
  310. struct upb_def_init **deps; /* Dependencies of this file. */
  311. const upb_msglayout_file *layout;
  312. const char *filename;
  313. upb_strview descriptor; /* Serialized descriptor. */
  314. } upb_def_init;
  315. bool _upb_symtab_loaddefinit(upb_symtab *s, const upb_def_init *init);
  316. #include "upb/port_undef.inc"
  317. #ifdef __cplusplus
  318. } /* extern "C" */
  319. #endif /* __cplusplus */
  320. #endif /* UPB_DEF_H_ */