/* * Copyright (c) 2004-2005 Sergey Lyubka * 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 #include /* * 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 */