xref: /plan9/sys/src/ape/lib/ap/stdio/fwrite.c (revision d9306527b4a7229dcf0cf3c58aed36bb9da82854)
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