xref: /csrg-svn/lib/libc/stdio/fwrite.c (revision 21408)
1 /*
2  * Copyright (c) 1980 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #ifndef lint
8 static char sccsid[] = "@(#)fwrite.c	5.1 (Berkeley) 05/30/85";
9 #endif not lint
10 
11 #include	<stdio.h>
12 
13 fwrite(ptr, size, count, iop)
14 	register char *ptr;
15 	unsigned size, count;
16 	register FILE *iop;
17 {
18 	register int s;
19 
20 	s = size * count;
21 	if (iop->_flag & _IOLBF)
22 		while (s > 0) {
23 			if (--iop->_cnt > -iop->_bufsiz && *ptr != '\n')
24 				*iop->_ptr++ = *ptr++;
25 			else if (_flsbuf(*(unsigned char *)ptr++, iop) == EOF)
26 				break;
27 			s--;
28 		}
29 	else while (s > 0) {
30 		if (iop->_cnt < s) {
31 			if (iop->_cnt > 0) {
32 				bcopy(ptr, iop->_ptr, iop->_cnt);
33 				ptr += iop->_cnt;
34 				iop->_ptr += iop->_cnt;
35 				s -= iop->_cnt;
36 			}
37 			if (_flsbuf(*(unsigned char *)ptr++, iop) == EOF)
38 				break;
39 			s--;
40 		}
41 		if (iop->_cnt >= s) {
42 			bcopy(ptr, iop->_ptr, s);
43 			iop->_ptr += s;
44 			iop->_cnt -= s;
45 			return (count);
46 		}
47 	}
48 	return (size != 0 ? count - ((s + size - 1) / size) : 0);
49 }
50