fwrite.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       fwrite.c (783B)
       ---
            1 
            2 #include <string.h>
            3 
            4 #include "ioprivate.h"
            5 
            6 
            7 size_t fwrite(const void *restrict buf, size_t eltsize, size_t nelts,
            8                 FILE *restrict f)
            9 {
           10         size_t totsize = eltsize * nelts;
           11 
           12         // Check for space in the output buffer.
           13         if (f->opos + totsize > f->omax) {
           14 
           15                 // Create/flush the output buffer.
           16                 if (__getospace(f) < 0)
           17                         return EOF;
           18 
           19                 if (totsize >= f->omax) {
           20 
           21                         // Bigger than the buffer - just write it directly.
           22                         if (__writebuf(f, buf, totsize) < 0)
           23                                 return 0;
           24                         return nelts;
           25                 }
           26         }
           27 
           28         // Copy the data to the output buffer.
           29         memcpy(&f->obuf[f->opos], buf, totsize);
           30         f->opos += totsize;
           31 
           32         // Flush the buffer if appropriate.
           33         if ((f->bufmode == _IOLBF && memchr(buf, '\n', totsize)) ||
           34                         (f->bufmode == _IONBF)) {
           35                 if (fflush(f) < 0)
           36                         return 0;
           37         }
           38 
           39         return nelts;
           40 }
           41