summaryrefslogtreecommitdiff
path: root/src/runtime/c/gu/in.h
diff options
context:
space:
mode:
authorkr.angelov <kr.angelov@gmail.com>2012-01-20 13:41:10 +0000
committerkr.angelov <kr.angelov@gmail.com>2012-01-20 13:41:10 +0000
commit2eee382a62a909d5a3f2f5eda94f30fe68fd5335 (patch)
treeb0b0d513535895f244214aebf6358e172b8dce6d /src/runtime/c/gu/in.h
parentb9728357126f8b9a6311cca17d9f0dcc2a7bfb9b (diff)
initial import of the C runtime
Diffstat (limited to 'src/runtime/c/gu/in.h')
-rw-r--r--src/runtime/c/gu/in.h146
1 files changed, 146 insertions, 0 deletions
diff --git a/src/runtime/c/gu/in.h b/src/runtime/c/gu/in.h
new file mode 100644
index 000000000..c85a6581b
--- /dev/null
+++ b/src/runtime/c/gu/in.h
@@ -0,0 +1,146 @@
+#ifndef GU_IN_H_
+#define GU_IN_H_
+
+#include <gu/defs.h>
+#include <gu/exn.h>
+#include <gu/assert.h>
+
+typedef struct GuInStream GuInStream;
+
+struct GuInStream {
+ const uint8_t* (*begin_buffer)(GuInStream* self, size_t* sz_out,
+ GuExn* err);
+ void (*end_buffer)(GuInStream* self, size_t consumed, GuExn* err);
+ size_t (*input)(GuInStream* self, uint8_t* buf, size_t max_sz,
+ GuExn* err);
+};
+
+typedef struct GuIn GuIn;
+
+struct GuIn {
+ const uint8_t* restrict buf_end;
+ ptrdiff_t buf_curr;
+ size_t buf_size;
+ GuInStream* stream;
+ GuFinalizer fini;
+};
+
+
+GuIn
+gu_init_in(GuInStream* stream);
+
+GuIn*
+gu_new_in(GuInStream* stream, GuPool* pool);
+
+GuInStream*
+gu_in_proxy_stream(GuIn* in, GuPool* pool);
+
+const uint8_t*
+gu_in_begin_span(GuIn* in, size_t *sz_out, GuExn* err);
+
+void
+gu_in_end_span(GuIn* in, size_t consumed);
+
+size_t
+gu_in_some(GuIn* in, uint8_t* buf, size_t max_len, GuExn* err);
+
+inline void
+gu_in_bytes(GuIn* in, uint8_t* buf, size_t sz, GuExn* err)
+{
+ gu_require(sz < PTRDIFF_MAX);
+ ptrdiff_t curr = in->buf_curr;
+ ptrdiff_t new_curr = curr + (ptrdiff_t) sz;
+ if (GU_UNLIKELY(new_curr > 0)) {
+ extern void gu_in_bytes_(GuIn* in, uint8_t* buf, size_t sz,
+ GuExn* err);
+ gu_in_bytes_(in, buf, sz, err);
+ return;
+ }
+ memcpy(buf, &in->buf_end[curr], sz);
+ in->buf_curr = new_curr;
+}
+
+inline int
+gu_in_peek_u8(GuIn* restrict in)
+{
+ if (GU_UNLIKELY(in->buf_curr == 0)) {
+ return -1;
+ }
+ return in->buf_end[in->buf_curr];
+}
+
+inline void
+gu_in_consume(GuIn* restrict in, size_t sz)
+{
+ gu_require((ptrdiff_t) sz + in->buf_curr <= 0);
+ in->buf_curr += sz;
+}
+
+
+inline uint8_t
+gu_in_u8(GuIn* restrict in, GuExn* err)
+{
+ if (GU_UNLIKELY(in->buf_curr == 0)) {
+ extern uint8_t gu_in_u8_(GuIn* restrict in, GuExn* err);
+ return gu_in_u8_(in, err);
+ }
+ return in->buf_end[in->buf_curr++];
+}
+
+int8_t
+gu_in_s8(GuIn* in, GuExn* err);
+
+uint16_t
+gu_in_u16le(GuIn* in, GuExn* err);
+
+uint16_t
+gu_in_u16be(GuIn* in, GuExn* err);
+
+int16_t
+gu_in_s16le(GuIn* in, GuExn* err);
+
+int16_t
+gu_in_s16be(GuIn* in, GuExn* err);
+
+uint32_t
+gu_in_u32le(GuIn* in, GuExn* err);
+
+uint32_t
+gu_in_u32be(GuIn* in, GuExn* err);
+
+int32_t
+gu_in_s32le(GuIn* in, GuExn* err);
+
+int32_t
+gu_in_s32be(GuIn* in, GuExn* err);
+
+uint64_t
+gu_in_u64le(GuIn* in, GuExn* err);
+
+uint64_t
+gu_in_u64be(GuIn* in, GuExn* err);
+
+int64_t
+gu_in_s64le(GuIn* in, GuExn* err);
+
+int64_t
+gu_in_s64be(GuIn* in, GuExn* err);
+
+double
+gu_in_f64le(GuIn* in, GuExn* err);
+
+double
+gu_in_f64be(GuIn* in, GuExn* err);
+
+GuIn*
+gu_buffered_in(GuIn* in, size_t sz, GuPool* pool);
+
+GuIn*
+gu_data_in(const uint8_t* buf, size_t size, GuPool* pool);
+
+
+extern GU_DECLARE_TYPE(GuEOF, abstract);
+
+#include <gu/type.h>
+
+#endif // GU_IN_H_