Protocol Buffers - Google's data interchange format (grpc依赖)
https://developers.google.com/protocol-buffers/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
44 lines
1.1 KiB
44 lines
1.1 KiB
/* |
|
* upb - a minimalist implementation of protocol buffers. |
|
* |
|
* Copyright (c) 2010 Joshua Haberman. See LICENSE for details. |
|
*/ |
|
|
|
#include "upb_stream.h" |
|
|
|
#include "upb_def.h" |
|
|
|
#define CHECKSRC(x) if(!x) goto src_err |
|
#define CHECKSINK(x) if(!x) goto sink_err |
|
|
|
void upb_streamdata(upb_src *src, upb_sink *sink, upb_status *status) { |
|
upb_fielddef *f; |
|
upb_string *str = NULL; |
|
while((f = upb_src_getdef(src)) != NULL) { |
|
CHECKSINK(upb_sink_putdef(sink, f)); |
|
if(upb_issubmsg(f)) { |
|
// We always recurse into submessages, but the putdef above already told |
|
// the sink that. |
|
} else if(upb_isstring(f)) { |
|
str = upb_string_tryrecycle(str); |
|
CHECKSRC(upb_src_getstr(src, str)); |
|
CHECKSINK(upb_sink_putstr(sink, str)); |
|
} else { |
|
// Primitive type. |
|
upb_value val; |
|
CHECKSRC(upb_src_getval(src, upb_value_addrof(&val))); |
|
CHECKSINK(upb_sink_putval(sink, val)); |
|
} |
|
} |
|
// If we're not EOF now, the loop terminated due to an error. |
|
CHECKSRC(upb_src_eof(src)); |
|
return; |
|
|
|
src_err: |
|
upb_copyerr(status, upb_src_status(src)); |
|
return; |
|
|
|
sink_err: |
|
upb_copyerr(status, upb_sink_status(sink)); |
|
return; |
|
}
|
|
|