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;
00015 }
00016 if (w == 0) ;
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
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
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
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 }