1 /*
2 * pANS stdio -- fwrite
3 */
4 #include "iolib.h"
5 #include <string.h>
6
7 #define BIGN (BUFSIZ/2)
8
fwrite(const void * p,size_t recl,size_t nrec,FILE * f)9 size_t fwrite(const void *p, size_t recl, size_t nrec, FILE *f){
10 char *s;
11 int n, d;
12
13 s=(char *)p;
14 n=recl*nrec;
15 while(n>0){
16 d=f->rp-f->wp;
17 if(d>0){
18 if(d>n)
19 d=n;
20 memcpy(f->wp, s, d);
21 f->wp+=d;
22 }else{
23 if(n>=BIGN && f->state==WR && !(f->flags&(STRING|LINEBUF)) && f->buf!=f->unbuf){
24 d=f->wp-f->buf;
25 if(d>0){
26 if(f->flags&APPEND)
27 lseek(f->fd, 0L, SEEK_END);
28 if(write(f->fd, f->buf, d)!=d){
29 f->state=ERR;
30 goto ret;
31 }
32 f->wp=f->rp=f->buf;
33 }
34 if(f->flags&APPEND)
35 lseek(f->fd, 0L, SEEK_END);
36 d=write(f->fd, s, n);
37 if(d<=0){
38 f->state=ERR;
39 goto ret;
40 }
41 }else{
42 if(_IO_putc(*s, f)==EOF)
43 goto ret;
44 d=1;
45 }
46 }
47 s+=d;
48 n-=d;
49 }
50 ret:
51 if(recl)
52 return (s-(char*)p)/recl;
53 else
54 return s-(char*)p;
55 }
56