home *** CD-ROM | disk | FTP | other *** search
/ PC Extra Super CD 1998 January / PCPLUS131.iso / DJGPP / V2 / DJLSR201.ZIP / src / libc / ansi / stdio / fwrite.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-25  |  1.8 KB  |  88 lines

  1. /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
  2. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <libc/file.h>
  7.  
  8. size_t
  9. fwrite(const void *vptr, size_t size, size_t count, FILE *f)
  10. {
  11.   const char *ptr = (const char *)vptr;
  12.   register int s;
  13.  
  14.   s = size * count;
  15.   if(!__is_text_file(f))
  16.   {
  17.     if (f->_flag & _IOLBF)
  18.       while (s > 0) {
  19.     if (--f->_cnt > -f->_bufsiz && *(const char *)ptr != '\n')
  20.       *f->_ptr++ = *(const char *)ptr++;
  21.     else if (_flsbuf(*(const char *)ptr++, f) == EOF)
  22.       break;
  23.     s--;
  24.       }
  25.     else while (s > 0) {
  26.       if (f->_cnt < s) {
  27.     if (f->_cnt > 0) {
  28.       memcpy(f->_ptr, ptr, f->_cnt);
  29.       ptr += f->_cnt;
  30.       f->_ptr += f->_cnt;
  31.       s -= f->_cnt;
  32.     }
  33.     if (_flsbuf(*(const unsigned char *)ptr++, f) == EOF)
  34.       break;
  35.     s--;
  36.       }
  37.       if (f->_cnt >= s) {
  38.     memcpy(f->_ptr, ptr, s);
  39.     f->_ptr += s;
  40.     f->_cnt -= s;
  41.     return count;
  42.       }
  43.     }
  44.   }
  45.   else
  46.   {
  47.     if (f->_flag & _IOLBF)
  48.     {
  49.       while (s > 0) {
  50.         if (*ptr=='\n')
  51.         {
  52.           if (--f->_cnt > -f->_bufsiz)
  53.             *f->_ptr++ = '\r';
  54.           else
  55.             if (_flsbuf('\r', f) == EOF)
  56.           break;
  57.         }
  58.     if (--f->_cnt > -f->_bufsiz && *ptr != '\n')
  59.       *f->_ptr++ = *ptr++;
  60.     else if (_flsbuf(*(const unsigned char *)ptr++, f) == EOF)
  61.       break;
  62.     s--;
  63.       }
  64.     }
  65.     else
  66.     {
  67.       while (s > 0)
  68.       {
  69.     if (*ptr == '\n')
  70.     {
  71.       if(--f->_cnt >= 0)
  72.         *f->_ptr++ = '\r';
  73.       else
  74.         if (_flsbuf('\r', f) == EOF)
  75.           break;
  76.     }
  77.     if (--f->_cnt >= 0)
  78.       *f->_ptr++ = *ptr++;
  79.     else
  80.       if (_flsbuf(*(const unsigned char *)ptr++, f) == EOF)
  81.         break;
  82.     s--;
  83.       }
  84.     }
  85.   }
  86.   return size != 0 ? count - ((s + size - 1) / size) : 0;
  87. }
  88.