buffer_put.c
changeset 0 eeadadee24f6
equal deleted inserted replaced
-1:000000000000 0:eeadadee24f6
       
     1 #include "buffer.h"
       
     2 #include "str.h"
       
     3 #include "byte.h"
       
     4 #include "error.h"
       
     5 
       
     6 static int allwrite(int (*op)(),int fd,char *buf,unsigned int len)
       
     7 {
       
     8   int w;
       
     9 
       
    10   while (len) {
       
    11     w = op(fd,buf,len);
       
    12     if (w == -1) {
       
    13       if (errno == error_intr) continue;
       
    14       return -1; /* note that some data may have been written */
       
    15     }
       
    16     if (w == 0) ; /* luser's fault */
       
    17     buf += w;
       
    18     len -= w;
       
    19   }
       
    20   return 0;
       
    21 }
       
    22 
       
    23 int buffer_flush(buffer *s)
       
    24 {
       
    25   int p;
       
    26  
       
    27   p = s->p;
       
    28   if (!p) return 0;
       
    29   s->p = 0;
       
    30   return allwrite(s->op,s->fd,s->x,p);
       
    31 }
       
    32 
       
    33 int buffer_putalign(buffer *s,char *buf,unsigned int len)
       
    34 {
       
    35   unsigned int n;
       
    36  
       
    37   while (len > (n = s->n - s->p)) {
       
    38     byte_copy(s->x + s->p,n,buf); s->p += n; buf += n; len -= n;
       
    39     if (buffer_flush(s) == -1) return -1;
       
    40   }
       
    41   /* now len <= s->n - s->p */
       
    42   byte_copy(s->x + s->p,len,buf);
       
    43   s->p += len;
       
    44   return 0;
       
    45 }
       
    46 
       
    47 int buffer_put(buffer *s,char *buf,unsigned int len)
       
    48 {
       
    49   unsigned int n;
       
    50  
       
    51   n = s->n;
       
    52   if (len > n - s->p) {
       
    53     if (buffer_flush(s) == -1) return -1;
       
    54     /* now s->p == 0 */
       
    55     if (n < BUFFER_OUTSIZE) n = BUFFER_OUTSIZE;
       
    56     while (len > s->n) {
       
    57       if (n > len) n = len;
       
    58       if (allwrite(s->op,s->fd,buf,n) == -1) return -1;
       
    59       buf += n;
       
    60       len -= n;
       
    61     }
       
    62   }
       
    63   /* now len <= s->n - s->p */
       
    64   byte_copy(s->x + s->p,len,buf);
       
    65   s->p += len;
       
    66   return 0;
       
    67 }
       
    68 
       
    69 int buffer_putflush(buffer *s,char *buf,unsigned int len)
       
    70 {
       
    71   if (buffer_flush(s) == -1) return -1;
       
    72   return allwrite(s->op,s->fd,buf,len);
       
    73 }
       
    74 
       
    75 int buffer_putsalign(buffer *s,char *buf)
       
    76 {
       
    77   return buffer_putalign(s,buf,str_len(buf));
       
    78 }
       
    79 
       
    80 int buffer_puts(buffer *s,char *buf)
       
    81 {
       
    82   return buffer_put(s,buf,str_len(buf));
       
    83 }
       
    84 
       
    85 int buffer_putsflush(buffer *s,char *buf)
       
    86 {
       
    87   return buffer_putflush(s,buf,str_len(buf));
       
    88 }