summaryrefslogtreecommitdiff
path: root/upb_msg.c
diff options
context:
space:
mode:
Diffstat (limited to 'upb_msg.c')
-rw-r--r--upb_msg.c31
1 files changed, 29 insertions, 2 deletions
diff --git a/upb_msg.c b/upb_msg.c
index 1c79f57..d508b6d 100644
--- a/upb_msg.c
+++ b/upb_msg.c
@@ -10,8 +10,6 @@
#define ALIGN_UP(p, t) (t + ((p - 1) & (~t - 1)))
-static uint32_t max(uint32_t a, uint32_t b) { return a > b ? a : b; }
-
static int div_round_up(int numerator, int denominator) {
/* cf. http://stackoverflow.com/questions/17944/how-to-round-up-the-result-of-integer-division */
return numerator > 0 ? (numerator - 1) / denominator + 1 : 0;
@@ -101,6 +99,20 @@ void *upb_msg_new(struct upb_msg *m)
//void upb_msg_free(void *msg, struct upb_msg *m, bool free_submsgs);
+void upb_msg_ref(struct upb_msg *m, struct upb_msg_field *f,
+ union upb_symbol_ref ref) {
+ struct google_protobuf_FieldDescriptorProto *d =
+ upb_msg_field_descriptor(f, m);
+ struct upb_fieldsbynum_entry *int_e = upb_inttable_lookup(
+ &m->fields_by_num, d->number, sizeof(struct upb_fieldsbynum_entry));
+ struct upb_fieldsbyname_entry *str_e =
+ upb_strtable_lookup(&m->fields_by_name, d->name);
+ assert(int_e && str_e);
+ f->ref = ref;
+ int_e->f.ref = ref;
+ str_e->f.ref = ref;
+}
+
struct mm_upb_string {
struct upb_string s;
uint32_t size;
@@ -262,3 +274,18 @@ upb_status_t upb_msg_parse(struct upb_msg_parse_state *s,
{
return upb_parse(&s->s, data, len, read);
}
+
+void *upb_alloc_and_parse(struct upb_msg *m, struct upb_string *str, bool byref)
+{
+ struct upb_msg_parse_state s;
+ void *msg = upb_msg_new(m);
+ upb_msg_parse_init(&s, msg, m, false, byref);
+ size_t read;
+ upb_status_t status = upb_msg_parse(&s, str->ptr, str->byte_len, &read);
+ if(status == UPB_STATUS_OK && read == str->byte_len) {
+ return msg;
+ } else {
+ upb_msg_free(msg);
+ return NULL;
+ }
+}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback