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

buffer_put.c

Go to the documentation of this file.
00001 #include "buffer.h"
00002 #include "str.h"
00003 #include "byte.h"
00004 #include "error.h"
00005 
00006 static int allwrite(int (*op)(),int fd,char *buf,unsigned int len)
00007 {
00008   int w;
00009 
00010   while (len) {
00011     w = op(fd,buf,len);
00012     if (w == -1) {
00013       if (errno == error_intr) continue;
00014       return -1; /* note that some data may have been written */
00015     }
00016     if (w == 0) ; /* luser's fault */
00017     buf += w;
00018     len -= w;
00019   }
00020   return 0;
00021 }
00022 
00023 int buffer_flush(buffer *s)
00024 {
00025   int p;
00026  
00027   p = s->p;
00028   if (!p) return 0;
00029   s->p = 0;
00030   return allwrite(s->op,s->fd,s->x,p);
00031 }
00032 
00033 int buffer_putalign(buffer *s,char *buf,unsigned int len)
00034 {
00035   unsigned int n;
00036  
00037   while (len > (n = s->n - s->p)) {
00038     byte_copy(s->x + s->p,n,buf); s->p += n; buf += n; len -= n;
00039     if (buffer_flush(s) == -1) return -1;
00040   }
00041   /* now len <= s->n - s->p */
00042   byte_copy(s->x + s->p,len,buf);
00043   s->p += len;
00044   return 0;
00045 }
00046 
00047 int buffer_put(buffer *s,char *buf,unsigned int len)
00048 {
00049   unsigned int n;
00050  
00051   n = s->n;
00052   if (len > n - s->p) {
00053     if (buffer_flush(s) == -1) return -1;
00054     /* now s->p == 0 */
00055     if (n < BUFFER_OUTSIZE) n = BUFFER_OUTSIZE;
00056     while (len > s->n) {
00057       if (n > len) n = len;
00058       if (allwrite(s->op,s->fd,buf,n) == -1) return -1;
00059       buf += n;
00060       len -= n;
00061     }
00062   }
00063   /* now len <= s->n - s->p */
00064   byte_copy(s->x + s->p,len,buf);
00065   s->p += len;
00066   return 0;
00067 }
00068 
00069 int buffer_putflush(buffer *s,char *buf,unsigned int len)
00070 {
00071   if (buffer_flush(s) == -1) return -1;
00072   return allwrite(s->op,s->fd,buf,len);
00073 }
00074 
00075 int buffer_putsalign(buffer *s,char *buf)
00076 {
00077   return buffer_putalign(s,buf,str_len(buf));
00078 }
00079 
00080 int buffer_puts(buffer *s,char *buf)
00081 {
00082   return buffer_put(s,buf,str_len(buf));
00083 }
00084 
00085 int buffer_putsflush(buffer *s,char *buf)
00086 {
00087   return buffer_putflush(s,buf,str_len(buf));
00088 }

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