From 8eb2b2a2169af97e5182a5a758b09a6e0e0caf37 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Wed, 31 Aug 2011 14:57:45 -0700 Subject: Revised upb_bytesink, refactored upb_textprinter (untested). --- upb/bytestream.h | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'upb/bytestream.h') diff --git a/upb/bytestream.h b/upb/bytestream.h index 741b7e7..83976a3 100644 --- a/upb/bytestream.h +++ b/upb/bytestream.h @@ -145,8 +145,8 @@ INLINE void upb_strref_read(struct _upb_strref *r, char *buf) { /* upb_bytesink ***************************************************************/ -typedef bool upb_bytesink_write_func(void*, const char*, size_t); -typedef int32_t upb_bytesink_vprintf_func(void*, const char *fmt, va_list args); +typedef int upb_bytesink_write_func(void*, const void*, int); +typedef int upb_bytesink_vprintf_func(void*, const char *fmt, va_list args); typedef struct { upb_bytesink_write_func *write; @@ -156,22 +156,23 @@ typedef struct { typedef struct { upb_bytesink_vtbl *vtbl; upb_status status; + uint64_t offset; } upb_bytesink; // Should be called by derived classes. void upb_bytesink_init(upb_bytesink *sink, upb_bytesink_vtbl *vtbl); void upb_bytesink_uninit(upb_bytesink *sink); -INLINE bool upb_bytesink_write(upb_bytesink *s, const char *buf, size_t len) { +INLINE int upb_bytesink_write(upb_bytesink *s, const void *buf, int len) { return s->vtbl->write(s, buf, len); } -INLINE bool upb_bytesink_writestr(upb_bytesink *sink, const char *str) { +INLINE int upb_bytesink_writestr(upb_bytesink *sink, const char *str) { return upb_bytesink_write(sink, str, strlen(str)); } // Returns the number of bytes written or -1 on error. -INLINE int32_t upb_bytesink_printf(upb_bytesink *sink, const char *fmt, ...) { +INLINE int upb_bytesink_printf(upb_bytesink *sink, const char *fmt, ...) { va_list args; va_start(args, fmt); uint32_t ret = sink->vtbl->vprintf(sink, fmt, args); @@ -179,6 +180,26 @@ INLINE int32_t upb_bytesink_printf(upb_bytesink *sink, const char *fmt, ...) { return ret; } +INLINE int upb_bytesink_putc(upb_bytesink *sink, char ch) { + return upb_bytesink_write(sink, &ch, 1); +} + +INLINE int upb_bytesink_putrepeated(upb_bytesink *sink, char ch, int len) { + char buf[len]; + memset(buf, ch, len); + return upb_bytesink_write(sink, buf, len); +} + +INLINE uint64_t upb_bytesink_getoffset(upb_bytesink *sink) { + return sink->offset; +} + +INLINE void upb_bytesink_rewind(upb_bytesink *sink, uint64_t offset) { + // TODO + (void)sink; + (void)offset; +} + // OPT: add getappendbuf() // OPT: add writefrombytesrc() // TODO: add flush() -- cgit v1.2.3