From e30260bb0af98fa1d6d829fa9ad2fbd95d7dff95 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Sat, 24 Jul 2010 16:25:57 -0700 Subject: upb_stringsrc: upb_bytesrc for strings. --- stream/upb_strstream.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 stream/upb_strstream.c (limited to 'stream/upb_strstream.c') diff --git a/stream/upb_strstream.c b/stream/upb_strstream.c new file mode 100644 index 0000000..65f33d9 --- /dev/null +++ b/stream/upb_strstream.c @@ -0,0 +1,62 @@ +/* + * upb - a minimalist implementation of protocol buffers. + * + * Copyright (c) 2010 Joshua Haberman. See LICENSE for details. + */ + +#include "upb_strstream.h" + +#include +#include "upb_string.h" + +struct upb_stringsrc { + upb_bytesrc bytesrc; + upb_string *str; +}; + +void upb_stringsrc_reset(upb_stringsrc *s, upb_string *str) { + if (str != s->str) { + if (s->str) upb_string_unref(s->str); + s->str = upb_string_getref(str); + } + s->bytesrc.eof = false; +} + +void upb_stringsrc_free(upb_stringsrc *s) { + if (s->str) upb_string_unref(s->str); + free(s); +} + +static bool upb_stringsrc_get(upb_stringsrc *src, upb_string *str, + upb_strlen_t minlen) { + // We ignore "minlen" since we always return the entire string. + (void)minlen; + upb_string_substr(str, src->str, 0, upb_string_len(src->str)); + src->bytesrc.eof = true; + return true; +} + +static bool upb_stringsrc_append(upb_stringsrc *src, upb_string *str, + upb_strlen_t len) { + // Unimplemented; since we return the string via "get" all in one go, + // this method probably isn't very useful. + (void)src; + (void)str; + (void)len; + return false; +} + +static upb_bytesrc_vtable upb_stringsrc_vtbl = { + (upb_bytesrc_get_fptr)upb_stringsrc_get, + (upb_bytesrc_append_fptr)upb_stringsrc_append, +}; + +upb_stringsrc *upb_stringsrc_new() { + upb_stringsrc *s = malloc(sizeof(*s)); + upb_bytesrc_init(&s->bytesrc, &upb_stringsrc_vtbl); + return s; +} + +upb_bytesrc *upb_stringsrc_bytesrc(upb_stringsrc *s) { + return &s->bytesrc; +} -- cgit v1.2.3 From 372c8f0487a666c3fb36edc18accba0fba9a2680 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Sat, 24 Jul 2010 17:01:45 -0700 Subject: Fixes to benchmark. --- benchmarks/parsestream.upb_table.c | 8 ++++++-- core/upb_def.c | 2 ++ stream/upb_decoder.c | 12 +++++++++--- stream/upb_strstream.c | 1 + 4 files changed, 18 insertions(+), 5 deletions(-) (limited to 'stream/upb_strstream.c') diff --git a/benchmarks/parsestream.upb_table.c b/benchmarks/parsestream.upb_table.c index c6acad9..1e18119 100644 --- a/benchmarks/parsestream.upb_table.c +++ b/benchmarks/parsestream.upb_table.c @@ -17,6 +17,12 @@ static bool initialize() upb_status status = UPB_STATUS_INIT; upb_symtab *s = upb_symtab_new(); upb_symtab_add_descriptorproto(s); + upb_def *fds_def = upb_symtab_lookup( + s, UPB_STRLIT("google.protobuf.FileDescriptorSet")); + if (!fds_def) { + fprintf(stderr, "Couldn't load FileDescriptorSet def"); + } + upb_string *fds_str = upb_strreadfile(MESSAGE_DESCRIPTOR_FILE); if(fds_str == NULL) { fprintf(stderr, "Couldn't read " MESSAGE_DESCRIPTOR_FILE ":"), @@ -26,8 +32,6 @@ static bool initialize() upb_stringsrc *ssrc = upb_stringsrc_new(); upb_stringsrc_reset(ssrc, fds_str); - upb_def *fds_def = upb_symtab_lookup( - s, UPB_STRLIT("google.protobuf.FileDescriptorSet")); upb_decoder *d = upb_decoder_new(upb_downcast_msgdef(fds_def)); upb_decoder_reset(d, upb_stringsrc_bytesrc(ssrc)); diff --git a/core/upb_def.c b/core/upb_def.c index e40e1f0..e117455 100644 --- a/core/upb_def.c +++ b/core/upb_def.c @@ -384,6 +384,8 @@ static bool upb_addfield(upb_src *src, upb_msgdef *m, upb_status *status) f->owned = true; break; } + default: + upb_src_skipval(src); } } CHECKSRC(upb_src_eof(src)); diff --git a/stream/upb_decoder.c b/stream/upb_decoder.c index 74ef5c5..46cfb3f 100644 --- a/stream/upb_decoder.c +++ b/stream/upb_decoder.c @@ -318,7 +318,9 @@ upb_fielddef *upb_decoder_getdef(upb_decoder *d) } // Handles the packed field case. - if(d->field) return d->field; + if(d->field) { + return d->field; + } uint32_t key = 0; again: @@ -457,12 +459,15 @@ bool upb_decoder_startmsg(upb_decoder *d) { return false; } upb_decoder_frame *frame = d->top; - frame->msgdef = upb_downcast_msgdef(d->field->def); if(d->field->type == UPB_TYPE(GROUP)) { frame->end_offset = UPB_GROUP_END_OFFSET; - } else { + } else if (d->field->type == UPB_TYPE(MESSAGE)) { frame->end_offset = upb_decoder_offset(d) + d->delimited_len; + } else { + upb_seterr(&d->src.status, UPB_STATUS_ERROR, + "Tried to startmsg a non-msg field."); } + frame->msgdef = upb_downcast_msgdef(d->field->def); d->field = NULL; return true; } @@ -485,6 +490,7 @@ bool upb_decoder_endmsg(upb_decoder *d) { bool upb_decoder_skipval(upb_decoder *d) { upb_strlen_t bytes_to_skip; + d->field = NULL; switch(d->wire_type) { case UPB_WIRE_TYPE_VARINT: { return upb_decoder_skipv64(d); diff --git a/stream/upb_strstream.c b/stream/upb_strstream.c index 65f33d9..7ed761b 100644 --- a/stream/upb_strstream.c +++ b/stream/upb_strstream.c @@ -53,6 +53,7 @@ static upb_bytesrc_vtable upb_stringsrc_vtbl = { upb_stringsrc *upb_stringsrc_new() { upb_stringsrc *s = malloc(sizeof(*s)); + s->str = NULL; upb_bytesrc_init(&s->bytesrc, &upb_stringsrc_vtbl); return s; } -- cgit v1.2.3 From 93099cccd1e6428d6be45553c7dd7746bbd65e93 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Sat, 29 Jan 2011 20:16:34 -0800 Subject: upb_strstream compiles again. That covers all source files except upb_msg! --- Makefile | 4 ++-- stream/upb_strstream.c | 50 +++++++++++++++++++++++++++++--------------------- 2 files changed, 31 insertions(+), 23 deletions(-) (limited to 'stream/upb_strstream.c') diff --git a/Makefile b/Makefile index 1dfd79d..26e036e 100644 --- a/Makefile +++ b/Makefile @@ -64,9 +64,9 @@ SRC=core/upb.c \ core/upb_def.c \ stream/upb_decoder.c \ stream/upb_stdio.c \ - stream/upb_textprinter.c + stream/upb_textprinter.c \ + stream/upb_strstream.c \ # core/upb_msg.c \ -# stream/upb_strstream.c \ $(SRC): perf-cppflags # Parts of core that are yet to be converted. diff --git a/stream/upb_strstream.c b/stream/upb_strstream.c index 7ed761b..d3fd4e0 100644 --- a/stream/upb_strstream.c +++ b/stream/upb_strstream.c @@ -12,6 +12,7 @@ struct upb_stringsrc { upb_bytesrc bytesrc; upb_string *str; + upb_strlen_t offset; }; void upb_stringsrc_reset(upb_stringsrc *s, upb_string *str) { @@ -27,34 +28,41 @@ void upb_stringsrc_free(upb_stringsrc *s) { free(s); } -static bool upb_stringsrc_get(upb_stringsrc *src, upb_string *str, - upb_strlen_t minlen) { - // We ignore "minlen" since we always return the entire string. - (void)minlen; - upb_string_substr(str, src->str, 0, upb_string_len(src->str)); - src->bytesrc.eof = true; - return true; +static upb_strlen_t upb_stringsrc_read(upb_bytesrc *_src, void *buf, + upb_strlen_t count, upb_status *status) { + upb_stringsrc *src = (upb_stringsrc*)_src; + if (src->offset == upb_string_len(src->str)) { + upb_seterr(status, UPB_EOF, ""); + return -1; + } else { + upb_strlen_t to_read = UPB_MIN(count, upb_string_len(src->str) - src->offset); + memcpy(buf, upb_string_getrobuf(src->str) + src->offset, to_read); + src->offset += to_read; + return to_read; + } } -static bool upb_stringsrc_append(upb_stringsrc *src, upb_string *str, - upb_strlen_t len) { - // Unimplemented; since we return the string via "get" all in one go, - // this method probably isn't very useful. - (void)src; - (void)str; - (void)len; - return false; +static bool upb_stringsrc_getstr(upb_bytesrc *_src, upb_string *str, + upb_status *status) { + upb_stringsrc *src = (upb_stringsrc*)_src; + if (src->offset == upb_string_len(str)) { + upb_seterr(status, UPB_EOF, ""); + return false; + } else { + upb_string_substr(str, src->str, 0, upb_string_len(src->str)); + return true; + } } -static upb_bytesrc_vtable upb_stringsrc_vtbl = { - (upb_bytesrc_get_fptr)upb_stringsrc_get, - (upb_bytesrc_append_fptr)upb_stringsrc_append, -}; - upb_stringsrc *upb_stringsrc_new() { + static upb_bytesrc_vtbl bytesrc_vtbl = { + upb_stringsrc_read, + upb_stringsrc_getstr, + }; + upb_stringsrc *s = malloc(sizeof(*s)); s->str = NULL; - upb_bytesrc_init(&s->bytesrc, &upb_stringsrc_vtbl); + upb_bytesrc_init(&s->bytesrc, &bytesrc_vtbl); return s; } -- cgit v1.2.3