From 2eee382a62a909d5a3f2f5eda94f30fe68fd5335 Mon Sep 17 00:00:00 2001 From: "kr.angelov" Date: Fri, 20 Jan 2012 13:41:10 +0000 Subject: initial import of the C runtime --- src/runtime/c/gu/in.h | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 src/runtime/c/gu/in.h (limited to 'src/runtime/c/gu/in.h') 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 +#include +#include + +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 + +#endif // GU_IN_H_ -- cgit v1.2.3