From a50b334f58a8290454693d6357b37d599566ef46 Mon Sep 17 00:00:00 2001 From: leitner Date: Sun, 4 Feb 2001 01:28:45 +0000 Subject: [PATCH] added initial buffer implementation. --- Makefile | 10 +++++++--- buffer/buffer_0.c | 12 ++++++++++++ buffer/buffer_0small.c | 12 ++++++++++++ buffer/buffer_1.c | 7 +++++++ buffer/buffer_1small.c | 7 +++++++ buffer/buffer_feed.c | 14 ++++++++++++++ buffer/buffer_flush.c | 10 ++++++++++ buffer/buffer_get.c | 12 ++++++++++++ buffer/buffer_init.c | 9 +++++++++ buffer/buffer_peek.c | 5 +++++ buffer/buffer_put.c | 17 +++++++++++++++++ buffer/buffer_putalign.c | 16 ++++++++++++++++ buffer/buffer_putflush.c | 7 +++++++ buffer/buffer_puts.c | 6 ++++++ buffer/buffer_putsalign.c | 6 ++++++ buffer/buffer_putsflush.c | 6 ++++++ buffer/buffer_stubborn.c | 15 +++++++++++++++ buffer/buffer_stubborn2.c | 12 ++++++++++++ socket/socket_connect6.c | 7 +++++-- t.c | 5 +++++ 20 files changed, 190 insertions(+), 5 deletions(-) create mode 100644 buffer/buffer_0.c create mode 100644 buffer/buffer_0small.c create mode 100644 buffer/buffer_1.c create mode 100644 buffer/buffer_1small.c create mode 100644 buffer/buffer_feed.c create mode 100644 buffer/buffer_flush.c create mode 100644 buffer/buffer_get.c create mode 100644 buffer/buffer_init.c create mode 100644 buffer/buffer_peek.c create mode 100644 buffer/buffer_put.c create mode 100644 buffer/buffer_putalign.c create mode 100644 buffer/buffer_putflush.c create mode 100644 buffer/buffer_puts.c create mode 100644 buffer/buffer_putsalign.c create mode 100644 buffer/buffer_putsflush.c create mode 100644 buffer/buffer_stubborn.c create mode 100644 buffer/buffer_stubborn2.c diff --git a/Makefile b/Makefile index 9474f98..af20791 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ -all: t byte.a fmt.a scan.a str.a uint.a open.a stralloc.a unix.a socket.a +all: t byte.a fmt.a scan.a str.a uint.a open.a stralloc.a unix.a socket.a buffer.a -VPATH=str:byte:fmt:scan:uint:open:stralloc:unix:socket +VPATH=str:byte:fmt:scan:uint:open:stralloc:unix:socket:buffer CC=egcc #CFLAGS=-I. -pipe -Wall -Os -march=pentiumpro -fomit-frame-pointer -fschedule-insns2 -Wall @@ -17,6 +17,7 @@ OPEN_OBJS=$(patsubst open/%.c,%.o,$(wildcard open/*.c)) STRA_OBJS=$(patsubst stralloc/%.c,%.o,$(wildcard stralloc/*.c)) UNIX_OBJS=$(patsubst unix/%.c,%.o,$(wildcard unix/*.c)) SOCKET_OBJS=$(patsubst socket/%.c,%.o,$(wildcard socket/*.c)) +BUFFER_OBJS=$(patsubst buffer/%.c,%.o,$(wildcard buffer/*.c)) $(BYTE_OBJS): byte.h $(FMT_OBJS): fmt.h @@ -25,6 +26,7 @@ $(STR_OBJS): str.h $(UINT_OBJS): uint16.h uint32.h $(STRA_OBJS): stralloc.h $(SOCKET_OBJS): socket.h +$(BUFFER_OBJS): buffer.h byte.a: $(BYTE_OBJS) fmt.a: $(FMT_OBJS) @@ -35,11 +37,13 @@ open.a: $(OPEN_OBJS) stralloc.a: $(STRA_OBJS) unix.a: $(UNIX_OBJS) socket.a: $(SOCKET_OBJS) +buffer.a: $(BUFFER_OBJS) %.a: ar cr $@ $^ -t: t.o socket.a stralloc.a str.a fmt.a scan.a str.a uint.a open.a byte.a +t: t.o socket.a stralloc.a fmt.a scan.a uint.a open.a buffer.a str.a \ +byte.a gcc -g -o $@ $^ .PHONY: clean tar diff --git a/buffer/buffer_0.c b/buffer/buffer_0.c new file mode 100644 index 0000000..d55dd93 --- /dev/null +++ b/buffer/buffer_0.c @@ -0,0 +1,12 @@ +#include +#include "buffer.h" + +static int b0read(int fd,const char* buf, unsigned int len) { + if (buffer_flush(buffer_1)<0) return -1; + return read(fd,buf,len); +} + +char buffer_0_space[BUFFER_INSIZE]; +static buffer it = BUFFER_INIT(b0read,0,buffer_0_space,sizeof buffer_0_space); +buffer *buffer_0 = ⁢ + diff --git a/buffer/buffer_0small.c b/buffer/buffer_0small.c new file mode 100644 index 0000000..3a326de --- /dev/null +++ b/buffer/buffer_0small.c @@ -0,0 +1,12 @@ +#include +#include "buffer.h" + +static int b0read(int fd,const char* buf, unsigned int len) { + if (buffer_flush(buffer_1small)<0) return -1; + return read(fd,buf,len); +} + +char buffer_0_space[128]; +static buffer it = BUFFER_INIT(b0read,0,buffer_0_space,sizeof buffer_0_space); +buffer *buffer_0small = ⁢ + diff --git a/buffer/buffer_1.c b/buffer/buffer_1.c new file mode 100644 index 0000000..e1d9538 --- /dev/null +++ b/buffer/buffer_1.c @@ -0,0 +1,7 @@ +#include +#include "buffer.h" + +char buffer_1_space[BUFFER_INSIZE]; +static buffer it = BUFFER_INIT(write,1,buffer_1_space,sizeof buffer_1_space); +buffer *buffer_1 = ⁢ + diff --git a/buffer/buffer_1small.c b/buffer/buffer_1small.c new file mode 100644 index 0000000..5e88ea5 --- /dev/null +++ b/buffer/buffer_1small.c @@ -0,0 +1,7 @@ +#include +#include "buffer.h" + +char buffer_1_space[128]; +static buffer it = BUFFER_INIT(write,1,buffer_1_space,sizeof buffer_1_space); +buffer *buffer_1small = ⁢ + diff --git a/buffer/buffer_feed.c b/buffer/buffer_feed.c new file mode 100644 index 0000000..db12301 --- /dev/null +++ b/buffer/buffer_feed.c @@ -0,0 +1,14 @@ +#include "buffer.h" + +extern int buffer_stubborn_read(int (*op)(),int fd,const char* buf, unsigned int len); + +int buffer_feed(buffer* b) { + if (b->p==b->n) { + int w; + if ((w=buffer_stubborn_read(b->op,b->fd,b->x,b->n))<0) + return -1; + b->n=w; + b->p=0; + } + return b->n; +} diff --git a/buffer/buffer_flush.c b/buffer/buffer_flush.c new file mode 100644 index 0000000..6db8c7b --- /dev/null +++ b/buffer/buffer_flush.c @@ -0,0 +1,10 @@ +#include "buffer.h" + +extern int buffer_stubborn(int (*op)(),int fd,const char* buf, unsigned int len); + +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); +} diff --git a/buffer/buffer_get.c b/buffer/buffer_get.c new file mode 100644 index 0000000..905bcdf --- /dev/null +++ b/buffer/buffer_get.c @@ -0,0 +1,12 @@ +#include "byte.h" +#include "buffer.h" + +int buffer_get(buffer* b,char* x,unsigned int len) { + int blen; + if ((blen=buffer_feed(b))>=len) + blen=len; + if (blen<=0) return blen; + byte_copy(x,blen,b->x+b->p); + b->p+=blen; + return blen; +} diff --git a/buffer/buffer_init.c b/buffer/buffer_init.c new file mode 100644 index 0000000..6989936 --- /dev/null +++ b/buffer/buffer_init.c @@ -0,0 +1,9 @@ +#include "buffer.h" + +void buffer_init(buffer* b,int (*op)(),int fd,char* y,unsigned int ylen) { + b->op=op; + b->fd=fd; + b->x=y; + b->n=ylen; + b->p=0; +} diff --git a/buffer/buffer_peek.c b/buffer/buffer_peek.c new file mode 100644 index 0000000..1a1343e --- /dev/null +++ b/buffer/buffer_peek.c @@ -0,0 +1,5 @@ +#include "buffer.h" + +char *buffer_peek(buffer* b) { + return b->x+b->p; +} diff --git a/buffer/buffer_put.c b/buffer/buffer_put.c new file mode 100644 index 0000000..ad16aab --- /dev/null +++ b/buffer/buffer_put.c @@ -0,0 +1,17 @@ +#include "byte.h" +#include "buffer.h" + +extern int buffer_stubborn(int (*op)(),int fd,const char* buf, unsigned int len); + +int buffer_put(buffer* b,const char* buf,unsigned int len) { + if (len>b->n-b->p) { /* doesn't fit */ + if (buffer_flush(b)==-1) return -1; + if (len>b->n) { + if (buffer_stubborn(b->op,b->fd,buf,len)<0) return -1; + return 0; + } + } + byte_copy(b->x+b->p, len, buf); + b->p+=len; + return 0; +} diff --git a/buffer/buffer_putalign.c b/buffer/buffer_putalign.c new file mode 100644 index 0000000..8b901bc --- /dev/null +++ b/buffer/buffer_putalign.c @@ -0,0 +1,16 @@ +#include "byte.h" +#include "buffer.h" + +int buffer_putalign(buffer* b,const char* buf,unsigned int len) { + int tmp; + while (len>(tmp=b->n-b->p)) { + byte_copy(b->x+b->p, tmp, buf); + b->p+=tmp; + buf+=tmp; + len-=tmp; + if (buffer_flush(b)<0) return -1; + } + byte_copy(b->x+b->p, len, buf); + b->p+=len; + return 0; +} diff --git a/buffer/buffer_putflush.c b/buffer/buffer_putflush.c new file mode 100644 index 0000000..9e8e87e --- /dev/null +++ b/buffer/buffer_putflush.c @@ -0,0 +1,7 @@ +#include "buffer.h" + +int buffer_putflush(buffer* b,const char* x,unsigned int len) { + if (buffer_put(b,x,len)<0) return -1; + if (buffer_flush(b)<0) return -1; + return 0; +} diff --git a/buffer/buffer_puts.c b/buffer/buffer_puts.c new file mode 100644 index 0000000..2efb612 --- /dev/null +++ b/buffer/buffer_puts.c @@ -0,0 +1,6 @@ +#include "str.h" +#include "buffer.h" + +int buffer_puts(buffer* b,const char* x) { + buffer_put(b,x,str_len(x)); +} diff --git a/buffer/buffer_putsalign.c b/buffer/buffer_putsalign.c new file mode 100644 index 0000000..a6345e6 --- /dev/null +++ b/buffer/buffer_putsalign.c @@ -0,0 +1,6 @@ +#include "str.h" +#include "buffer.h" + +int buffer_puts(buffer* b,const char* x) { + buffer_putalign(b,x,str_len(x)); +} diff --git a/buffer/buffer_putsflush.c b/buffer/buffer_putsflush.c new file mode 100644 index 0000000..28c6fec --- /dev/null +++ b/buffer/buffer_putsflush.c @@ -0,0 +1,6 @@ +#include "str.h" +#include "buffer.h" + +int buffer_puts(buffer* b,const char* x) { + buffer_putflush(b,x,str_len(x)); +} diff --git a/buffer/buffer_stubborn.c b/buffer/buffer_stubborn.c new file mode 100644 index 0000000..c94a1d0 --- /dev/null +++ b/buffer/buffer_stubborn.c @@ -0,0 +1,15 @@ +#include +#include "buffer.h" + +int buffer_stubborn(int (*op)(),int fd,const char* buf, unsigned int len) { + int w; + while (len) { + if ((w=op(fd,buf,len))<0) { + if (errno == EINTR) continue; + return -1; + }; + buf+=w; + len-=w; + } + return 0; +} diff --git a/buffer/buffer_stubborn2.c b/buffer/buffer_stubborn2.c new file mode 100644 index 0000000..9e553fb --- /dev/null +++ b/buffer/buffer_stubborn2.c @@ -0,0 +1,12 @@ +#include +#include "buffer.h" + +int buffer_stubborn_read(int (*op)(),int fd,const char* buf, unsigned int len) { + int w; + for (;;) { + if ((w=op(fd,buf,len))<0) + if (errno == EINTR) continue; + } + return w; +} + diff --git a/socket/socket_connect6.c b/socket/socket_connect6.c index 40eea76..df428e7 100644 --- a/socket/socket_connect6.c +++ b/socket/socket_connect6.c @@ -1,5 +1,8 @@ #include -#include "sockaddr_in6.h" +#include +#include +#include +#include #include "byte.h" #include "socket.h" #include "ip6.h" @@ -29,7 +32,7 @@ int socket_connect6(int s,const char ip[16],uint16 port,uint32 scope_id) return connect(s,(struct sockaddr *) &sa,sizeof sa); #else - errno=error_proto; + errno=EPROTO; return -1; #endif } diff --git a/t.c b/t.c index be35080..5113775 100644 --- a/t.c +++ b/t.c @@ -5,14 +5,19 @@ #include "uint32.h" #include "stralloc.h" #include "socket.h" +#include "buffer.h" #define rdtscl(low) \ __asm__ __volatile__ ("rdtsc" : "=a" (low) : : "edx") int main(int argc,char* argv[]) { + buffer_puts(buffer_1small,"hello, world\n"); + buffer_flush(buffer_1small); +#if 0 int s=socket_tcp4(); char ip[4]={127,0,0,1}; int t=socket_connect4(s,ip,80); +#endif #if 0 char buf[100]="foo bar baz fnord "; char buf2[100]="foo braz fnord";