From 97161ed0df99c2759e69cf1dfb57d5fb16fd7861 Mon Sep 17 00:00:00 2001 From: Felix von Leitner Date: Sat, 28 Feb 2009 00:07:55 +0000 Subject: [PATCH] add buffer_tosa (buffer writing to auto-growing stralloc) --- CHANGES | 1 + buffer.h | 6 ++++-- buffer/buffer_feed.c | 4 ++-- buffer/buffer_flush.c | 4 ++-- buffer/buffer_init.c | 1 + buffer/buffer_put.c | 4 ++-- buffer/buffer_stubborn.c | 4 ++-- buffer/buffer_stubborn2.c | 4 ++-- buffer/buffer_tosa.c | 27 +++++++++++++++++++++++++++ t.c | 14 +++++++++++++- 10 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 buffer/buffer_tosa.c diff --git a/CHANGES b/CHANGES index 7ca837b..70008e2 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,6 @@ 0.29: save 8 bytes in taia.h for 64-bit systems + add buffer_tosa (buffer writing to auto-growing stralloc) 0.28: add uint64 pack and unpack routines diff --git a/buffer.h b/buffer.h index 3415d8f..d07d599 100644 --- a/buffer.h +++ b/buffer.h @@ -14,9 +14,10 @@ typedef struct buffer { int fd; /* passed as first argument to op */ ssize_t (*op)(); /* use read(2) or write(2) */ enum { NOTHING, FREE, MUNMAP } todo; + void* cookie; } buffer; -#define BUFFER_INIT(op,fd,buf,len) { (buf), 0, 0, (len), (fd), (op), NOTHING } +#define BUFFER_INIT(op,fd,buf,len) { (buf), 0, 0, (len), (fd), (op), NOTHING, NULL } #define BUFFER_INIT_FREE(op,fd,buf,len) { (buf), 0, 0, (len), (fd), (op), FREE } #define BUFFER_INIT_READ(op,fd,buf,len) BUFFER_INIT(op,fd,buf,len) /*obsolete*/ #define BUFFER_INSIZE 8192 @@ -135,7 +136,8 @@ int buffer_get_new_token_sa_pred(buffer* b,stralloc* sa,sa_predicate p); /* make a buffer from a stralloc. * Do not change the stralloc after this! */ -void buffer_fromsa(buffer* b,stralloc* sa); +void buffer_fromsa(buffer* b,stralloc* sa); /* read from sa */ +int buffer_tosa(buffer*b,stralloc* sa); /* write to sa, auto-growing it */ #endif #endif diff --git a/buffer/buffer_feed.c b/buffer/buffer_feed.c index bbae4a3..4fe06a0 100644 --- a/buffer/buffer_feed.c +++ b/buffer/buffer_feed.c @@ -1,11 +1,11 @@ #include "buffer.h" -extern int buffer_stubborn_read(ssize_t (*op)(),int fd,const char* buf, size_t len); +extern int buffer_stubborn_read(ssize_t (*op)(),int fd,const char* buf, size_t len,void* cookie); int buffer_feed(buffer* b) { if (b->p==b->n) { int w; - if ((w=buffer_stubborn_read(b->op,b->fd,b->x,b->a))<0) + if ((w=buffer_stubborn_read(b->op,b->fd,b->x,b->a,b))<0) return -1; b->n=w; b->p=0; diff --git a/buffer/buffer_flush.c b/buffer/buffer_flush.c index e512f5a..40eae2a 100644 --- a/buffer/buffer_flush.c +++ b/buffer/buffer_flush.c @@ -1,10 +1,10 @@ #include "buffer.h" -extern int buffer_stubborn(ssize_t (*op)(),int fd,const char* buf, size_t len); +extern int buffer_stubborn(ssize_t (*op)(),int fd,const char* buf, size_t len,void* cookie); extern int buffer_flush(buffer* b) { register int p; if (!(p=b->p)) return 0; /* buffer already empty */ b->p=0; - return buffer_stubborn(b->op,b->fd,b->x,p); + return buffer_stubborn(b->op,b->fd,b->x,p,b); } diff --git a/buffer/buffer_init.c b/buffer/buffer_init.c index 2e359d5..ac91687 100644 --- a/buffer/buffer_init.c +++ b/buffer/buffer_init.c @@ -9,4 +9,5 @@ void buffer_init(buffer* b,ssize_t (*op)(),int fd, b->p=0; b->n=0; b->todo=NOTHING; + b->cookie=0; } diff --git a/buffer/buffer_put.c b/buffer/buffer_put.c index 64fe8ec..ec43b57 100644 --- a/buffer/buffer_put.c +++ b/buffer/buffer_put.c @@ -1,13 +1,13 @@ #include "byte.h" #include "buffer.h" -extern int buffer_stubborn(ssize_t (*op)(),int fd,const char* buf, size_t len); +extern int buffer_stubborn(ssize_t (*op)(),int fd,const char* buf, size_t len,void* cookie); int buffer_put(buffer* b,const char* buf,size_t len) { if (len>b->a-b->p) { /* doesn't fit */ if (buffer_flush(b)==-1) return -1; if (len>b->a) { - if (buffer_stubborn(b->op,b->fd,buf,len)<0) return -1; + if (buffer_stubborn(b->op,b->fd,buf,len,b)<0) return -1; return 0; } } diff --git a/buffer/buffer_stubborn.c b/buffer/buffer_stubborn.c index e108cfa..53aa143 100644 --- a/buffer/buffer_stubborn.c +++ b/buffer/buffer_stubborn.c @@ -1,10 +1,10 @@ #include #include "buffer.h" -int buffer_stubborn(ssize_t (*op)(),int fd,const char* buf, size_t len) { +int buffer_stubborn(ssize_t (*op)(),int fd,const char* buf, size_t len,void* cookie) { int w; while (len) { - if ((w=op(fd,buf,len))<0) { + if ((w=op(fd,buf,len,cookie))<0) { if (errno == EINTR) continue; return -1; }; diff --git a/buffer/buffer_stubborn2.c b/buffer/buffer_stubborn2.c index e40a8dd..8feddae 100644 --- a/buffer/buffer_stubborn2.c +++ b/buffer/buffer_stubborn2.c @@ -1,10 +1,10 @@ #include #include "buffer.h" -int buffer_stubborn_read(ssize_t (*op)(),int fd,const char* buf, size_t len) { +int buffer_stubborn_read(ssize_t (*op)(),int fd,const char* buf, size_t len,void* cookie) { int w; for (;;) { - if ((w=op(fd,buf,len))<0) + if ((w=op(fd,buf,len,cookie))<0) if (errno == EINTR) continue; break; } diff --git a/buffer/buffer_tosa.c b/buffer/buffer_tosa.c new file mode 100644 index 0000000..f5e4b5b --- /dev/null +++ b/buffer/buffer_tosa.c @@ -0,0 +1,27 @@ +#include "stralloc.h" +#include "buffer.h" + +static ssize_t strallocwrite(int fd,char* buf,size_t len,void* myself) { + buffer* b=myself; + stralloc* sa=b->cookie; + sa->len+=len; + if (stralloc_readyplus(sa,1024)==0) return 0; + b->x=sa->s+sa->len; + b->p=0; + b->a=1024; + (void)fd; + (void)buf; + return len; +} + +int buffer_tosa(buffer* b,stralloc* sa) { + if (stralloc_ready(sa,1024)==0) return -1; + b->x=sa->s; + b->p=0; + b->n=0; + b->a=1024; + b->fd=0; + b->op=strallocwrite; + b->cookie=sa; + return 0; +} diff --git a/t.c b/t.c index 037a49c..4db485a 100644 --- a/t.c +++ b/t.c @@ -41,13 +41,25 @@ int64 writecb(int64 fd,const void* buf,uint64 n) { } int main(int argc,char* argv[]) { + stralloc a; + buffer b; + int i; + stralloc_init(&a); + buffer_tosa(&b,&a); + + for (i=0; i<100; ++i) + buffer_puts(&b,"foo bar baz!\n"); + buffer_flush(&b); + buffer_putsa(buffer_1,&a); + buffer_flush(buffer_1); +#if 0 char* c=fmt_strm_alloca("foo"," bar","\n"); write(1,c,strlen(c)); (void)argc; (void)argv; - +#endif #if 0 io_batch* b=iob_new(1234); int64 fd=open("t.c",0);