13e12c5d1SDavid du Colombier /* 23e12c5d1SDavid du Colombier * pANS stdio -- fwrite 33e12c5d1SDavid du Colombier */ 43e12c5d1SDavid du Colombier #include "iolib.h" 53e12c5d1SDavid du Colombier #include <string.h> 63e12c5d1SDavid du Colombier 73e12c5d1SDavid du Colombier #define BIGN (BUFSIZ/2) 83e12c5d1SDavid du Colombier 93e12c5d1SDavid du Colombier size_t fwrite(const void *p, size_t recl, size_t nrec, FILE *f){ 103e12c5d1SDavid du Colombier char *s; 113e12c5d1SDavid du Colombier int n, d; 123e12c5d1SDavid du Colombier 133e12c5d1SDavid du Colombier s=(char *)p; 143e12c5d1SDavid du Colombier n=recl*nrec; 153e12c5d1SDavid du Colombier while(n>0){ 163e12c5d1SDavid du Colombier d=f->rp-f->wp; 173e12c5d1SDavid du Colombier if(d>0){ 183e12c5d1SDavid du Colombier if(d>n) 193e12c5d1SDavid du Colombier d=n; 203e12c5d1SDavid du Colombier memcpy(f->wp, s, d); 213e12c5d1SDavid du Colombier f->wp+=d; 223e12c5d1SDavid du Colombier }else{ 233e12c5d1SDavid du Colombier if(n>=BIGN && f->state==WR && !(f->flags&(STRING|LINEBUF)) && f->buf!=f->unbuf){ 243e12c5d1SDavid du Colombier d=f->wp-f->buf; 253e12c5d1SDavid du Colombier if(d>0){ 263e12c5d1SDavid du Colombier if(f->flags&APPEND) 273e12c5d1SDavid du Colombier lseek(f->fd, 0L, SEEK_END); 283e12c5d1SDavid du Colombier if(write(f->fd, f->buf, d)!=d){ 293e12c5d1SDavid du Colombier f->state=ERR; 303e12c5d1SDavid du Colombier goto ret; 313e12c5d1SDavid du Colombier } 323e12c5d1SDavid du Colombier f->wp=f->rp=f->buf; 333e12c5d1SDavid du Colombier } 343e12c5d1SDavid du Colombier if(f->flags&APPEND) 353e12c5d1SDavid du Colombier lseek(f->fd, 0L, SEEK_END); 363e12c5d1SDavid du Colombier d=write(f->fd, s, n); 373e12c5d1SDavid du Colombier if(d<=0){ 383e12c5d1SDavid du Colombier f->state=ERR; 393e12c5d1SDavid du Colombier goto ret; 403e12c5d1SDavid du Colombier } 413e12c5d1SDavid du Colombier }else{ 423e12c5d1SDavid du Colombier if(_IO_putc(*s, f)==EOF) 433e12c5d1SDavid du Colombier goto ret; 443e12c5d1SDavid du Colombier d=1; 453e12c5d1SDavid du Colombier } 463e12c5d1SDavid du Colombier } 473e12c5d1SDavid du Colombier s+=d; 483e12c5d1SDavid du Colombier n-=d; 493e12c5d1SDavid du Colombier } 503e12c5d1SDavid du Colombier ret: 51*d9306527SDavid du Colombier if(recl) 52*d9306527SDavid du Colombier return (s-(char*)p)/recl; 53*d9306527SDavid du Colombier else 54*d9306527SDavid du Colombier return s-(char*)p; 553e12c5d1SDavid du Colombier } 56