home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 387b.lha / dice_v2.02 / lib / stdio / fwrite.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-05-30  |  1.0 KB  |  63 lines

  1.  
  2. /*
  3.  *  fwrite.c
  4.  *
  5.  *  (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  6.  */
  7.  
  8. #include <stdio.h>
  9.  
  10. #define buf ((const char *)vbuf)
  11.  
  12. size_t
  13. fwrite(vbuf, elmsize, elms, fi)
  14. const void *vbuf;
  15. size_t elmsize;
  16. size_t elms;
  17. FILE *fi;
  18. {
  19.     int n = EOF;
  20.     int bytes;
  21.  
  22.     if (elmsize == 1)
  23.     bytes = elms;
  24.     else if (elms == 1)
  25.     bytes = elmsize;
  26.     else
  27.     bytes = elms * elmsize;
  28.  
  29.     if (fi && (fi->sd_Flags & __SIF_WRITE)) {
  30.     if (bytes > fi->sd_WLeft)
  31.         fflush(fi);             /*  also puts us into 'write' mode */
  32.  
  33.     if (bytes <= fi->sd_WLeft) {
  34.         movmem(buf, fi->sd_WPtr, bytes);
  35.         fi->sd_WLeft -= bytes;
  36.         fi->sd_WPtr += bytes;
  37.         n = bytes;
  38.  
  39.         if ((fi->sd_Flags & __SIF_IOLBF) && bytes && buf[bytes-1] == '\n')
  40.         fflush(fi);
  41.     } else {
  42.         long w = bytes;
  43.  
  44.         while (w > 0) {
  45.         n = write(fi->sd_Fd, buf, w);
  46.         if (n <= 0)
  47.             break;
  48.         fi->sd_Offset += n;
  49.         buf += n;
  50.         w -= n;
  51.         }
  52.     }
  53.     }
  54.     if (n < 0)
  55.     fi->sd_Error = EOF;
  56.     if (fi->sd_Error)
  57.     return(fi->sd_Error);
  58.     if (n == bytes)
  59.     return(elms);
  60.     return(n / elmsize);
  61. }
  62.  
  63.