home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / CLIPPER / MISC / EMXLIB8F.ZIP / EMX / LIB / IO / FWRITE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-02  |  2.3 KB  |  95 lines

  1. /* fwrite.c (emx+gcc) -- Copyright (c) 1990-1993 by Eberhard Mattes */
  2.  
  3. #include <sys/emx.h>
  4. #include <stdio.h>
  5. #include <io.h>
  6. #include <errno.h>
  7. #include <string.h>
  8.  
  9. size_t fwrite (const void *buffer, size_t size, size_t count, FILE *stream)
  10. {
  11.   size_t total, left, n;
  12.   int w;   /* signed! */
  13.   const char *src;
  14.   int fh;
  15.  
  16.   if (size == 0 || count == 0)
  17.     return (0);
  18.   total = size * count;
  19.   if (total / count != size)
  20.     {
  21.       errno = ERANGE;
  22.       return (0);
  23.     }
  24.   if (stream->flags & _IOREAD)    /* File in read mode? */
  25.     {
  26.       stream->flags |= _IOERR;
  27.       errno = EACCES;
  28.       return (0);
  29.     }
  30.   if (nbuf (stream))
  31.     _fbuf (stream);
  32.   left = total;
  33.   src = buffer;
  34.   fh = fileno (stream);
  35.   stream->flags |= _IOWRT;
  36.   if (bbuf (stream))
  37.     {
  38.       if (stream->wcount == 0 && stream->ptr == stream->buffer)
  39.         stream->wcount = stream->buf_size;
  40.       while (left != 0)
  41.         {
  42.           if (left <= stream->wcount)
  43.             {
  44.               memcpy (stream->ptr, src, left);
  45.               stream->ptr += left;
  46.               stream->wcount -= left;
  47.               src += left;
  48.               left = 0;
  49.             }
  50.           else if (stream->ptr != stream->buffer) /* Buffer non-empty */
  51.             {
  52.               n = stream->ptr - stream->buffer;
  53.               stream->ptr = stream->buffer;
  54.               while (n != 0)
  55.                 {
  56.                   w = write (fh, stream->ptr, n);
  57.                   if (w <= 0)
  58.                     {
  59.                       stream->flags |= _IOERR;
  60.                       goto done;
  61.                     }
  62.                   n -= w; stream->ptr += w;
  63.                 }
  64.               stream->ptr = stream->buffer;
  65.               stream->wcount = stream->buf_size;
  66.             }
  67.           else
  68.             {
  69.               w = write (fh, src, left);
  70.               if (w <= 0)
  71.                 {
  72.                   stream->flags |= _IOERR;
  73.                   goto done;
  74.                 }
  75.               src += w;
  76.               left -= w;
  77.             }
  78.         }
  79.     }
  80.   else
  81.     while (left != 0)
  82.       {
  83.         w = write (fh, src, left);
  84.         if (w <= 0)
  85.           {
  86.             stream->flags |= _IOERR;
  87.             goto done;
  88.           }
  89.         src += w;
  90.         left -= w;
  91.       }
  92. done:
  93.   return ((total - left) / size);
  94. }
  95.