Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
/*
2
 * pANS stdio -- fwrite
3
 */
4
#include "iolib.h"
5
#include <string.h>
6
 
7
#define BIGN (BUFSIZ/2)
8
 
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
}