substdo.c
changeset 0 c045670f36e9
equal deleted inserted replaced
-1:000000000000 0:c045670f36e9
       
     1 #include "substdio.h"
       
     2 #include "str.h"
       
     3 #include "byte.h"
       
     4 #include "error.h"
       
     5 
       
     6 static int allwrite(op,fd,buf,len)
       
     7 register int (*op)();
       
     8 register int fd;
       
     9 register char *buf;
       
    10 register int len;
       
    11 {
       
    12   register int w;
       
    13 
       
    14   while (len) {
       
    15     w = op(fd,buf,len);
       
    16     if (w == -1) {
       
    17       if (errno == error_intr) continue;
       
    18       return -1; /* note that some data may have been written */
       
    19     }
       
    20     if (w == 0) ; /* luser's fault */
       
    21     buf += w;
       
    22     len -= w;
       
    23   }
       
    24   return 0;
       
    25 }
       
    26 
       
    27 int substdio_flush(s)
       
    28 register substdio *s;
       
    29 {
       
    30   register int p;
       
    31  
       
    32   p = s->p;
       
    33   if (!p) return 0;
       
    34   s->p = 0;
       
    35   return allwrite(s->op,s->fd,s->x,p);
       
    36 }
       
    37 
       
    38 int substdio_bput(s,buf,len)
       
    39 register substdio *s;
       
    40 register char *buf;
       
    41 register int len;
       
    42 {
       
    43   register int n;
       
    44  
       
    45   while (len > (n = s->n - s->p)) {
       
    46     byte_copy(s->x + s->p,n,buf); s->p += n; buf += n; len -= n;
       
    47     if (substdio_flush(s) == -1) return -1;
       
    48   }
       
    49   /* now len <= s->n - s->p */
       
    50   byte_copy(s->x + s->p,len,buf);
       
    51   s->p += len;
       
    52   return 0;
       
    53 }
       
    54 
       
    55 int substdio_put(s,buf,len)
       
    56 register substdio *s;
       
    57 register char *buf;
       
    58 register int len;
       
    59 {
       
    60   register int n;
       
    61  
       
    62   n = s->n;
       
    63   if (len > n - s->p) {
       
    64     if (substdio_flush(s) == -1) return -1;
       
    65     /* now s->p == 0 */
       
    66     if (n < SUBSTDIO_OUTSIZE) n = SUBSTDIO_OUTSIZE;
       
    67     while (len > s->n) {
       
    68       if (n > len) n = len;
       
    69       if (allwrite(s->op,s->fd,buf,n) == -1) return -1;
       
    70       buf += n;
       
    71       len -= n;
       
    72     }
       
    73   }
       
    74   /* now len <= s->n - s->p */
       
    75   byte_copy(s->x + s->p,len,buf);
       
    76   s->p += len;
       
    77   return 0;
       
    78 }
       
    79 
       
    80 int substdio_putflush(s,buf,len)
       
    81 register substdio *s;
       
    82 register char *buf;
       
    83 register int len;
       
    84 {
       
    85   if (substdio_flush(s) == -1) return -1;
       
    86   return allwrite(s->op,s->fd,buf,len);
       
    87 }
       
    88 
       
    89 int substdio_bputs(s,buf)
       
    90 register substdio *s;
       
    91 register char *buf;
       
    92 {
       
    93   return substdio_bput(s,buf,str_len(buf));
       
    94 }
       
    95 
       
    96 int substdio_puts(s,buf)
       
    97 register substdio *s;
       
    98 register char *buf;
       
    99 {
       
   100   return substdio_put(s,buf,str_len(buf));
       
   101 }
       
   102 
       
   103 int substdio_putsflush(s,buf)
       
   104 register substdio *s;
       
   105 register char *buf;
       
   106 {
       
   107   return substdio_putflush(s,buf,str_len(buf));
       
   108 }