diff options
Diffstat (limited to 'djb/buffer_put.c')
| -rw-r--r-- | djb/buffer_put.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/djb/buffer_put.c b/djb/buffer_put.c new file mode 100644 index 0000000..f67e98d --- /dev/null +++ b/djb/buffer_put.c @@ -0,0 +1,37 @@ +#include <errno.h> +#include "buffer.h" + +#ifdef USE_BUFFER_LARGE_WRITE +#define X(a) (a>0xffffff)?0xffffff:a +#else +#define X(a) a +#endif + +static int allwrite(buffer *b, const char *buf, unsigned int len) { + int w; + b->p = 0; + while (len) { + w = b->op(b->fd, buf, X(len)); + if (w == -1) { + if (errno == EINTR) continue; + return -1; + } + buf += w; + len -= w; + } + return 0; +} + +int buffer_flush(buffer *b) /*EXTRACT_INCL*/ { + return allwrite(b,b->x,b->p); +} + +int buffer_put(buffer *b, const char* s, unsigned int len) /*EXTRACT_INCL*/ { + if (b->a-b->p < len) { + if (buffer_flush(b)==-1) return -1; + if (b->a < len) return allwrite(b, s, len); + } + byte_copy(b->x + b->p, len, s); + b->p += len; + return 0; +} |
