From 3734c2c5dc65f41aa727d9d69201d604eab6e77d Mon Sep 17 00:00:00 2001 From: Henrik Rydberg Date: Thu, 6 Nov 2008 16:00:08 +0100 Subject: event loop works, buffer works, now look at synched event Signed-off-by: Henrik Rydberg --- src/iobuffer.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/iobuffer.c (limited to 'src/iobuffer.c') diff --git a/src/iobuffer.c b/src/iobuffer.c new file mode 100644 index 0000000..8bfcc07 --- /dev/null +++ b/src/iobuffer.c @@ -0,0 +1,39 @@ +#include "iobuffer.h" + +//////////////////////////////////////////////////////// + +void init_iobuf(struct IOBuffer *buf) +{ + memset(buf, 0, sizeof(struct IOBuffer)); + buf->at = buf->begin; + buf->top = buf->at; + buf->end = buf->begin + DIM_BUFFER; +} + +//////////////////////////////////////////////////////// + +const struct input_event* get_iobuf_event(struct IOBuffer *buf, int fd) +{ + const struct input_event *ev; + int n = buf->top - buf->at; + if (n < EVENT_SIZE) { + /* partial event is available: save it */ + if (buf->at != buf->begin && n > 0) + memmove(buf->begin, buf->at, n); + /* start from the beginning */ + buf->at = buf->begin; + buf->top = buf->at + n; + /* read more data */ + SYSCALL(n = read(fd, buf->top, buf->end - buf->top)); + if (n <= 0) + return NULL; + buf->top += n; + } + if (buf->top - buf->at < EVENT_SIZE) + return NULL; + ev = (const struct input_event *)buf->at; + buf->at += EVENT_SIZE; + return ev; +} + +//////////////////////////////////////////////////////// -- cgit v1.2.3