X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=libs%2Fshttpd%2Fio.h;fp=libs%2Fshttpd%2Fio.h;h=d774cc272446268f5a66bbb46f619f09c02a4ce4;hb=d8ccfe2b3944adf07d35534459cdda19d15217c8;hp=0000000000000000000000000000000000000000;hpb=21f835f30b4e092c847bf4569a00995774f7330e;p=fms.git diff --git a/libs/shttpd/io.h b/libs/shttpd/io.h new file mode 100644 index 0000000..d774cc2 --- /dev/null +++ b/libs/shttpd/io.h @@ -0,0 +1,97 @@ +/* + * 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 */