version 0.1.6
[fms.git] / libs / shttpd / io.h
diff --git a/libs/shttpd/io.h b/libs/shttpd/io.h
new file mode 100644 (file)
index 0000000..d774cc2
--- /dev/null
@@ -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 */