00001 #include "buffer.h"
00002 #include "byte.h"
00003 #include "error.h"
00004
00005 static int oneread(int (*op)(),int fd,char *buf,unsigned int len)
00006 {
00007 int r;
00008
00009 for (;;) {
00010 r = op(fd,buf,len);
00011 if (r == -1) if (errno == error_intr) continue;
00012 return r;
00013 }
00014 }
00015
00016 static int getthis(buffer *s,char *buf,unsigned int len)
00017 {
00018 if (len > s->p) len = s->p;
00019 s->p -= len;
00020 byte_copy(buf,len,s->x + s->n);
00021 s->n += len;
00022 return len;
00023 }
00024
00025 int buffer_feed(buffer *s)
00026 {
00027 int r;
00028
00029 if (s->p) return s->p;
00030 r = oneread(s->op,s->fd,s->x,s->n);
00031 if (r <= 0) return r;
00032 s->p = r;
00033 s->n -= r;
00034 if (s->n > 0) byte_copyr(s->x + s->n,r,s->x);
00035 return r;
00036 }
00037
00038 int buffer_bget(buffer *s,char *buf,unsigned int len)
00039 {
00040 int r;
00041
00042 if (s->p > 0) return getthis(s,buf,len);
00043 if (s->n <= len) return oneread(s->op,s->fd,buf,s->n);
00044 r = buffer_feed(s); if (r <= 0) return r;
00045 return getthis(s,buf,len);
00046 }
00047
00048 int buffer_get(buffer *s,char *buf,unsigned int len)
00049 {
00050 int r;
00051
00052 if (s->p > 0) return getthis(s,buf,len);
00053 if (s->n <= len) return oneread(s->op,s->fd,buf,len);
00054 r = buffer_feed(s); if (r <= 0) return r;
00055 return getthis(s,buf,len);
00056 }
00057
00058 char *buffer_peek(buffer *s)
00059 {
00060 return s->x + s->n;
00061 }
00062
00063 void buffer_seek(buffer *s,unsigned int len)
00064 {
00065 s->n += len;
00066 s->p -= len;
00067 }