Main Page | Namespace List | Class List | File List | Class Members | File Members | Related Pages

buffer_get.c

Go to the documentation of this file.
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 }

Generated on Mon Apr 26 09:49:22 2004 for ConstantDataStore by doxygen 1.3.6-20040222