int send_file_fd (int out_fd, int in_fd, uint64 offset, uint64 size, uint64 *sent) { char data_in[BUFFER_INSIZE]; char data_out[BUFFER_OUTSIZE]; struct buffer buf_in; struct buffer buf_out; int64 r; int64 w; uint64 r_sent = 0; char *x; buffer_init (&buf_in, (buffer_op) read, in_fd, data_in, sizeof (data_in)); buffer_init (&buf_out, (buffer_op) write, out_fd, data_out, sizeof (data_out)); for (;;) { r = buffer_feed (&buf_in); if (r == 0) break; if (r == -1) goto FAIL; x = buffer_peek (&buf_in); w = buffer_put (&buf_out, x, r); if (w == -1) goto FAIL; buffer_seek (&buf_in, r); r_sent += w; } *sent = r_sent; return 0; FAIL: *sent = r_sent; return -1; }
ssize_t buffer_get_token(buffer* b,char* x,size_t len,const char* charset,size_t setlen) { size_t blen; if ((ssize_t)len<0) len=(ssize_t)(((size_t)-1)>>1); if (setlen==1) { for (blen=0; blen<len; ) { ssize_t n=buffer_feed(b); char* d; if (n<=0) return blen; if (n>(ssize_t)(len-blen)) n=len-blen; if ((d=memccpy(x+blen,b->x+b->p,(unsigned char)charset[0],n))) { /* memccpy returns a pointer to the next char after matching * char or NULL if it copied all bytes it was asked for */ b->p+=(d-(x+blen)); return d-x-1; } blen+=n; b->p+=n; } } else { for (blen=0;blen<len;++blen) { register ssize_t r; if ((r=buffer_getc(b,x))<0) return r; if (r==0) { *x=0; break; } if (byte_chr(charset,setlen,*x)<setlen) break; ++x; } } return (ssize_t)blen; }
ssize_t buffer_getc(buffer* b,char* x) { if (b->p==b->n) { register ssize_t blen; if ((blen=buffer_feed(b))<=0) return blen; } *x=b->x[b->p]; ++b->p; return 1; }
int buffer_get(buffer *s,char *buf,unsigned int len) { int r; if (s->p > 0) return getthis(s,buf,len); if (s->n <= len) return oneread(s->op,s->fd,buf,len); r = buffer_feed(s); if (r <= 0) return r; return getthis(s,buf,len); }
/* skips bytes in buffer until a char in charset occurs, the char itself will be skipped also */ int buffer_skip_until(buffer* b, const char* charset, unsigned long int setlen) { int r; int n = 0; for (;;) { if(b->p == b->n) if((r = buffer_feed(b)) <= 0) return r; n++; if(byte_chr(charset, setlen, b->x[b->p++]) < setlen) break; } return n; }
ssize_t buffer_get(buffer* b, char* x, size_t len) { ssize_t blen, r = 0; if((ssize_t)len < 0) len = (ssize_t)(((size_t)-1) >> 1); while(len) { if((blen = buffer_feed(b)) < 0) return blen; if(blen == 0) break; if(blen >= (ssize_t)len) blen = (ssize_t)len; byte_copy(x, (size_t)blen, b->x + b->p); b->p += (size_t)blen; len -= (size_t)blen; x += blen; r += blen; } return r; }
main() { register int n; register char *x; char ch; for (;;) { n = buffer_feed(buffer_0); if (n < 0) _exit(111); if (!n) _exit(0); x = buffer_PEEK(buffer_0); buffer_SEEK(buffer_0,n); while (n > 0) { ch = *x++; --n; if (ch == '\n') buffer_PUTC(buffer_1,"\r"[0]); buffer_PUTC(buffer_1,ch); } } }
int buffer_copyline(buffer *out,buffer *in,char eol) { int n; char *x; int i; for (;;) { n = buffer_feed(in); if (n < 0) return -2; if (!n) break; x = buffer_PEEK(in); i = byte_chr(x,n,eol); if (buffer_put(out,x,i) < 0) return -3; buffer_SEEK(in,i); if (i < in->p) { buffer_PUTC(out,eol); buffer_SEEK(in,1); break; } } return 0; }
int getln2(buffer *ss,stralloc *sa,char **cont,unsigned int *clen,int sep) { register char *x; register unsigned int i; int n; if (!stralloc_ready(sa,0)) return -1; sa->len = 0; for (;;) { n = buffer_feed(ss); if (n < 0) return -1; if (n == 0) { *clen = 0; return 0; } x = buffer_PEEK(ss); i = byte_chr(x,n,sep); if (i < n) { buffer_SEEK(ss,*clen = i + 1); *cont = x; return 0; } if (!stralloc_readyplus(sa,n)) return -1; i = sa->len; sa->len = i + buffer_get(ss,sa->s + i,n); } }
int getln2(buffer *buf,stralloc *sa, /*@out@*/char **cont,/*@out@*/unsigned int *clen,int sep) { char *x; unsigned int i; int n; if (!stralloc_ready(sa,0)) return -1; sa->len = 0; for (;;) { n = buffer_feed(buf); if (n < 0) return -1; if (n == 0) { *clen = 0; return 0; } x = buffer_PEEK(buf); i = byte_chr(x,n,sep); if (i < n) { buffer_SEEK(buf,*clen = i + 1); *cont = x; return 0; } if (!stralloc_readyplus(sa,n)) return -1; i = sa->len; sa->len = i + buffer_get(buf,sa->s + i,n); } }