+/*
+ * write a single character at the current position - grow buffer if
+ * necessary.
+ * (no, we're not usually this anal about our macros, but this one is
+ * next to unreadable without some indentation :)
+ */
+#define odr_putc(o, c) \
+( \
+ ( \
+ (o)->ecb.pos < (o)->ecb.size ? \
+ ( \
+ (o)->ecb.buf[(o)->ecb.pos++] = (c), \
+ 0 \
+ ) : \
+ ( \
+ odr_grow_block(&(o)->ecb, 1) == 0 ? \
+ ( \
+ (o)->ecb.buf[(o)->ecb.pos++] = (c), \
+ 0 \
+ ) : \
+ ( \
+ (o)->error = OSPACE, \
+ -1 \
+ ) \
+ ) \
+ ) == 0 ? \
+ ( \
+ (o)->ecb.pos > (o)->ecb.top ? \
+ ( \
+ (o)->ecb.top = (o)->ecb.pos, \
+ 0 \
+ ) : \
+ 0 \
+ ) : \
+ -1 \
+) \
+
+#define odr_tell(o) ((o)->ecb.pos)
+