From e2673d3782b926a72f2775169a260d964e0da3ef Mon Sep 17 00:00:00 2001 From: leitner Date: Sun, 3 Jan 2021 23:15:28 +0000 Subject: [PATCH] add buffer_init_allocbuf, buffer_init_read, buffer_init_write, buffer_init_read_allocbuf, buffer_init_write_allocbuf --- CHANGES | 1 + buffer.h | 28 ++++++++++++++++++++++++++-- buffer/buffer_init_allocbuf.c | 13 +++++++++++++ buffer/buffer_init_read.c | 9 +++++++++ buffer/buffer_init_read_allocbuf.c | 7 +++++++ buffer/buffer_init_write.c | 9 +++++++++ buffer/buffer_init_write_allocbuf.c | 7 +++++++ 7 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 buffer/buffer_init_allocbuf.c create mode 100644 buffer/buffer_init_read.c create mode 100644 buffer/buffer_init_read_allocbuf.c create mode 100644 buffer/buffer_init_write.c create mode 100644 buffer/buffer_init_write_allocbuf.c diff --git a/CHANGES b/CHANGES index af9d2ff..c1b840b 100644 --- a/CHANGES +++ b/CHANGES @@ -9,6 +9,7 @@ add fmt_strm_malloc add cross references to open_* and mmap_* man pages add fmt_strm_alloca and fmt_strm_malloc man pages + add buffer_init_allocbuf, buffer_init_read, buffer_init_write, buffer_init_read_allocbuf, buffer_init_write_allocbuf 0.32: remove OpenBSD #warning (obsd maintainer says no longer needed) diff --git a/buffer.h b/buffer.h index 6705792..d35acc2 100644 --- a/buffer.h +++ b/buffer.h @@ -44,15 +44,39 @@ typedef struct buffer { #define BUFFER_OUTSIZE 8192 /* Initialize a buffer with an existing memory area, which the buffer - * will NOT take ownership of (i.e. won't free the memory when it's done */ + * will NOT take ownership of (i.e. won't free the memory when it's done) */ att_writen(4,5) -void buffer_init(buffer* b,ssize_t (*op)(),int fd,char* y,size_t ylen); +void buffer_init(buffer* b, ssize_t (*op)(), int fd, char* y, size_t ylen); /* Initialize a buffer with an existing memory area, which the buffer * WILL take ownership of (it will call free() on it when it's done) */ att_writen(4,5) void buffer_init_free(buffer* b,ssize_t (*op)(),int fd,char* y,size_t ylen); +/* Call buffer_init with op=read(), return 0. + * If fd==-1, return -1 instead, leaving b untouched. */ +att_writen(3,4) +int buffer_init_read(buffer* b, int fd, char* y, size_t ylen); + +/* Call buffer_init with op=write(), return 0. + * If fd==-1, return -1 instead, leaving b untouched. */ +att_writen(3,4) +int buffer_init_write(buffer* b, int fd, char* y, size_t ylen); + +/* Will allocate a buffer of size ylen and then call + * buffer_init_free(b, op, fd, thebuffer, ylen) on it. + * Returns 0 on success, -1 on error (setting errno). + * Passing fd==-1 is treated as error (so you can pass open*() for fd). */ +int buffer_init_allocbuf(buffer* b, ssize_t (*op)(), int fd, size_t ylen); + +/* Call buffer_init_allocbuf with op=read */ +int buffer_init_read_allocbuf(buffer* b, int fd, size_t ylen); + +/* Call buffer_init_allocbuf with op=read */ +int buffer_init_write_allocbuf(buffer* b, int fd, size_t ylen); + + + /* Initialize a buffer without actual I/O. * You give it a pre-existing memory area. * When reading from this buffer, it will simply return the data from diff --git a/buffer/buffer_init_allocbuf.c b/buffer/buffer_init_allocbuf.c new file mode 100644 index 0000000..55d0efc --- /dev/null +++ b/buffer/buffer_init_allocbuf.c @@ -0,0 +1,13 @@ +#include +#include +#include "buffer.h" + +int buffer_init_allocbuf(buffer* b, ssize_t (*op)(), int fd, size_t ylen) { + if (fd==-1) return -1; + char* thebuffer; + if (!(thebuffer=malloc(ylen))) + return -1; + buffer_init_free(b, op, fd, thebuffer, ylen); + return 0; +} + diff --git a/buffer/buffer_init_read.c b/buffer/buffer_init_read.c new file mode 100644 index 0000000..d9c378b --- /dev/null +++ b/buffer/buffer_init_read.c @@ -0,0 +1,9 @@ +#include +#include + +int buffer_init_read(buffer* b, int fd, char* y,size_t ylen) { + if (fd==-1) return -1; + buffer_init(b, read, fd, y, ylen); + return 0; +} + diff --git a/buffer/buffer_init_read_allocbuf.c b/buffer/buffer_init_read_allocbuf.c new file mode 100644 index 0000000..78df5aa --- /dev/null +++ b/buffer/buffer_init_read_allocbuf.c @@ -0,0 +1,7 @@ +#include +#include "buffer.h" + +int buffer_init_read_allocbuf(buffer* b, int fd, size_t ylen) { + return buffer_init_allocbuf(b, read, fd, ylen); +} + diff --git a/buffer/buffer_init_write.c b/buffer/buffer_init_write.c new file mode 100644 index 0000000..48195ba --- /dev/null +++ b/buffer/buffer_init_write.c @@ -0,0 +1,9 @@ +#include +#include + +int buffer_init_write(buffer* b, int fd, char* y,size_t ylen) { + if (fd==-1) return -1; + buffer_init(b, write, fd, y, ylen); + return 0; +} + diff --git a/buffer/buffer_init_write_allocbuf.c b/buffer/buffer_init_write_allocbuf.c new file mode 100644 index 0000000..a005b6c --- /dev/null +++ b/buffer/buffer_init_write_allocbuf.c @@ -0,0 +1,7 @@ +#include +#include "buffer.h" + +int buffer_init_write_allocbuf(buffer* b, int fd, size_t ylen) { + return buffer_init_allocbuf(b, write, fd, ylen); +} +