summaryrefslogtreecommitdiff
path: root/stream/upb_strstream.c
diff options
context:
space:
mode:
authorJoshua Haberman <joshua@reverberate.org>2011-02-03 16:02:35 -0800
committerJoshua Haberman <joshua@reverberate.org>2011-02-03 16:02:35 -0800
commitf07cd8ff1d2a5079a7ce3cc571b40c9e209175c9 (patch)
treea040c23f951328414d9e0160dc1583716292b989 /stream/upb_strstream.c
parent63daaaca4f750d9c1e88b2b3ca258912d58d4120 (diff)
parent8465e5e65014ac080d62855f8abfd44acdf7beb2 (diff)
Merge branch 'src-refactoring'
Diffstat (limited to 'stream/upb_strstream.c')
-rw-r--r--stream/upb_strstream.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/stream/upb_strstream.c b/stream/upb_strstream.c
new file mode 100644
index 0000000..d3fd4e0
--- /dev/null
+++ b/stream/upb_strstream.c
@@ -0,0 +1,71 @@
+/*
+ * upb - a minimalist implementation of protocol buffers.
+ *
+ * Copyright (c) 2010 Joshua Haberman. See LICENSE for details.
+ */
+
+#include "upb_strstream.h"
+
+#include <stdlib.h>
+#include "upb_string.h"
+
+struct upb_stringsrc {
+ upb_bytesrc bytesrc;
+ upb_string *str;
+ upb_strlen_t offset;
+};
+
+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 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_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;
+ }
+}
+
+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, &bytesrc_vtbl);
+ return s;
+}
+
+upb_bytesrc *upb_stringsrc_bytesrc(upb_stringsrc *s) {
+ return &s->bytesrc;
+}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback