Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <libc/file.h>
  6.  
  7. size_t
  8. fwrite(const void *vptr, size_t size, size_t count, FILE *f)
  9. {
  10.   const char *ptr = (const char *)vptr;
  11.   register int s;
  12.  
  13.   s = size * count;
  14.  
  15. //  __libclog_printf("fwrite(%x,%u,%u,%u)\n",vptr,size,count,f->_file);
  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.   return size != 0 ? count - ((s + size - 1) / size) : 0;
  45. }
  46.