:pserver:cvsanon@mok.lvcm.com:/CVS/ReactOS reactos
[reactos.git] / lib / crtdll / stdio / fwrite.c
1 #include <crtdll/stdio.h>
2 #include <crtdll/stdlib.h>
3 #include <crtdll/string.h>
4 #include <crtdll/errno.h>
5 #include <crtdll/internal/file.h>
6
7 #if 0
8 size_t
9 fwrite(const void *p, size_t size, size_t count, FILE *iop)
10 {
11   char *ptr = (char *)p;
12   size_t to_write;
13
14
15   to_write = size * count;
16  
17
18
19   while ( to_write > 0 ) {
20         if ( putc(*ptr,iop) == EOF )
21                 break;
22         to_write--;
23         ptr++;
24   }
25         
26
27
28   return count -to_write/size;
29  
30 }
31
32
33 #else
34 size_t fwrite(const void *vptr, size_t size, size_t count, FILE *iop)
35  {
36         size_t to_write, n_written;
37         char *ptr = (char *)vptr;
38         
39         to_write = size*count;
40         if (!OPEN4WRITING(iop) )
41         {
42                 __set_errno (EINVAL);
43                 return 0;
44         }
45
46
47         if (iop == NULL  )
48         {
49                 __set_errno (EINVAL);
50                 return 0;
51         }
52
53         if (ferror (iop))
54                 return 0;
55         if (vptr == NULL || to_write == 0)
56                 return 0;
57
58         
59         while(iop->_cnt > 0 && to_write > 0 ) {     
60                 to_write--;
61                 putc(*ptr++,iop);
62         }
63
64         // if the buffer is dirty it will have to be written now
65         // otherwise the file pointer won't match anymore.
66   
67         fflush(iop);       
68       
69         n_written = _write(fileno(iop), ptr,to_write);
70         if ( n_written != -1 )
71                 to_write -= n_written;
72         
73         // check to see if this will work with in combination with ungetc
74
75
76         // the file buffer is empty and there is no read ahead information anymore.
77         
78         iop->_flag &= ~_IOAHEAD;
79         
80         return count - (to_write/size);      
81   
82 }
83
84 #endif