summaryrefslogtreecommitdiffstats
path: root/cpukit/shttpd/io.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/shttpd/io.h')
-rw-r--r--cpukit/shttpd/io.h97
1 files changed, 97 insertions, 0 deletions
diff --git a/cpukit/shttpd/io.h b/cpukit/shttpd/io.h
new file mode 100644
index 0000000000..d774cc2724
--- /dev/null
+++ b/cpukit/shttpd/io.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2004-2005 Sergey Lyubka <valenok@gmail.com>
+ * All rights reserved
+ *
+ * "THE BEER-WARE LICENSE" (Revision 42):
+ * Sergey Lyubka wrote this file. As long as you retain this notice you
+ * can do whatever you want with this stuff. If we meet some day, and you think
+ * this stuff is worth it, you can buy me a beer in return.
+ */
+
+#ifndef IO_HEADER_INCLUDED
+#define IO_HEADER_INCLUDED
+
+#include <assert.h>
+#include <stddef.h>
+
+/*
+ * I/O buffer descriptor
+ */
+struct io {
+ char *buf; /* IO Buffer */
+ size_t size; /* IO buffer size */
+ size_t head; /* Bytes read */
+ size_t tail; /* Bytes written */
+ size_t total; /* Total bytes read */
+};
+
+static __inline void
+io_clear(struct io *io)
+{
+ assert(io->buf != NULL);
+ assert(io->size > 0);
+ io->total = io->tail = io->head = 0;
+}
+
+static __inline char *
+io_space(struct io *io)
+{
+ assert(io->buf != NULL);
+ assert(io->size > 0);
+ assert(io->head <= io->size);
+ return (io->buf + io->head);
+}
+
+static __inline char *
+io_data(struct io *io)
+{
+ assert(io->buf != NULL);
+ assert(io->size > 0);
+ assert(io->tail <= io->size);
+ return (io->buf + io->tail);
+}
+
+static __inline size_t
+io_space_len(const struct io *io)
+{
+ assert(io->buf != NULL);
+ assert(io->size > 0);
+ assert(io->head <= io->size);
+ return (io->size - io->head);
+}
+
+static __inline size_t
+io_data_len(const struct io *io)
+{
+ assert(io->buf != NULL);
+ assert(io->size > 0);
+ assert(io->head <= io->size);
+ assert(io->tail <= io->head);
+ return (io->head - io->tail);
+}
+
+static __inline void
+io_inc_tail(struct io *io, size_t n)
+{
+ assert(io->buf != NULL);
+ assert(io->size > 0);
+ assert(io->tail <= io->head);
+ assert(io->head <= io->size);
+ io->tail += n;
+ assert(io->tail <= io->head);
+ if (io->tail == io->head)
+ io->head = io->tail = 0;
+}
+
+static __inline void
+io_inc_head(struct io *io, size_t n)
+{
+ assert(io->buf != NULL);
+ assert(io->size > 0);
+ assert(io->tail <= io->head);
+ io->head += n;
+ io->total += n;
+ assert(io->head <= io->size);
+}
+
+#endif /* IO_HEADER_INCLUDED */