Make msgsrc reversable.

pull/13171/head
Joshua Haberman 15 years ago
parent 90e4f08678
commit 088b995c9e
  1. 16
      src/upb_data.c
  2. 3
      src/upb_data.h
  3. 2
      src/upb_serialize.c

@ -301,11 +301,11 @@ void upb_msg_parsestr(upb_msg *msg, struct upb_msgdef *md, upb_strptr str,
/* upb_msgsrc ****************************************************************/
static void _upb_msgsrc_produceval(union upb_value v, struct upb_fielddef *f,
upb_sink *sink)
upb_sink *sink, bool reverse)
{
if(upb_issubmsg(f)) {
upb_sink_onstart(sink, f);
upb_msgsrc_produce(v.msg, upb_downcast_msgdef(f->def), sink);
upb_msgsrc_produce(v.msg, upb_downcast_msgdef(f->def), sink, reverse);
upb_sink_onend(sink, f);
} else if(upb_isstring(f)) {
upb_sink_onstr(sink, f, v.str, 0, upb_strlen(v.str));
@ -314,20 +314,22 @@ static void _upb_msgsrc_produceval(union upb_value v, struct upb_fielddef *f,
}
}
void upb_msgsrc_produce(upb_msg *msg, struct upb_msgdef *md, upb_sink *sink)
void upb_msgsrc_produce(upb_msg *msg, struct upb_msgdef *md, upb_sink *sink,
bool reverse)
{
for(int i = 0; i < md->num_fields; i++) {
struct upb_fielddef *f = &md->fields[i];
struct upb_fielddef *f = &md->fields[reverse ? md->num_fields - i - 1 : i];
if(!upb_msg_has(msg, f)) continue;
union upb_value v = upb_msg_get(msg, f);
if(upb_isarray(f)) {
upb_arrayptr arr = v.arr;
upb_arraylen_t len = upb_array_len(arr);
for(upb_arraylen_t j = 0; j < upb_array_len(arr); j++) {
union upb_value elem = upb_array_get(arr, f, j);
_upb_msgsrc_produceval(elem, f, sink);
union upb_value elem = upb_array_get(arr, f, reverse ? len - j - 1 : j);
_upb_msgsrc_produceval(elem, f, sink, reverse);
}
} else {
_upb_msgsrc_produceval(v, f, sink);
_upb_msgsrc_produceval(v, f, sink, reverse);
}
}
}

@ -524,7 +524,8 @@ void upb_msg_parsestr(upb_msg *msg, struct upb_msgdef *md, upb_strptr str,
// A nonresumable, non-interruptable (but simple and fast) source for pushing
// the data of a upb_msg to a upb_sink.
void upb_msgsrc_produce(upb_msg *msg, struct upb_msgdef *md, upb_sink *sink);
void upb_msgsrc_produce(upb_msg *msg, struct upb_msgdef *md, upb_sink *sink,
bool reverse);
/* upb_msgsink ****************************************************************/

@ -253,7 +253,7 @@ static upb_sink_status _upb_serializersink_strcb(upb_sink *sink, struct upb_fiel
// TODO: properly handle partially consumed strings and partially supplied
// strings.
_upb_serializer_push_buf(s, buf, ptr - buf);
return _upb_serializer_push_buf(s, upb_string_getrobuf(str), end - start);
return _upb_serializer_push_buf(s, (uint8_t*)upb_string_getrobuf(str), end - start);
}
static upb_sink_status _upb_serializersink_startcb(upb_sink *sink,

Loading…
Cancel
Save