Subversion Repositories Kolibri OS

Rev

Rev 7184 | Blame | Last modification | View Log | Download | RSS feed

  1. #include <stdio.h>
  2. #include <kolibrisys.h>
  3.  
  4. // dont support return partial writing when fail
  5. // only 32-bit filesize
  6. int fwrite(void *buffer,int size,int count,FILE* file)
  7. {
  8.         dword res;
  9.         dword fullsize;
  10.  
  11.     if(!file || !buffer)
  12.     {
  13.         errno = E_INVALIDPTR;
  14.         return EOF;
  15.     }
  16.  
  17.  
  18.         if ((file->mode & 3)==FILE_OPEN_READ)
  19.     {
  20.         errno = E_ACCESS;
  21.         return 0;
  22.     }
  23.  
  24.         if ((file->mode &3)==FILE_OPEN_APPEND)
  25.                 file->filepos=file->filesize;
  26.  
  27.     fullsize=count*size;
  28.  
  29.         if ((file->filesize)<(file->filepos+fullsize))  file->filesize=file->filepos+fullsize;
  30.  
  31.         /*
  32.         if (file->mode==FILE_OPEN_APPEND)
  33.         {
  34.                 file->filepos==file->filesize;
  35.                 res=_ksys_appendtofile(file->filename,file->filepos,fullsize,buffer);
  36.                 if (res==0)
  37.                 {
  38.                         file->filepos+=fullsize;
  39.                         fullsize=fullsize/size;
  40.                         return(fullsize);
  41.                 }
  42.                 else return(0);
  43.  
  44.         }
  45.         */
  46.         file->ungetc_buf = EOF;
  47.         if (file->filepos >= file->buffer_start && file->filepos < file->buffer_end) // drop buffer, if change his data
  48.         {
  49.                 file->buffer_start = -1;
  50.                 file->buffer_end = -1;
  51.         }
  52.        
  53.         if ((file->mode &3)==FILE_OPEN_WRITE || (file->mode&3)==FILE_OPEN_APPEND) // always true, as read checked previous
  54.         {
  55.                 if (file->filepos==0)
  56.                 {       //file mot created yet
  57.                         res=_ksys_rewritefile(file->filename,fullsize,buffer);
  58.                         if (res==0)
  59.                         {
  60.                                 file->filepos+=fullsize;
  61.                                 return(count);
  62.                         } else
  63.             {
  64.                 errno = -res;
  65.                 return(0);
  66.             }
  67.                 }
  68.                 else
  69.                 {
  70.                         res=_ksys_appendtofile(file->filename,file->filepos,fullsize,buffer);
  71.                         if (res==0)
  72.                         {
  73.                                 file->filepos+=fullsize;
  74.                                 return(count);
  75.                         } else
  76.             {
  77.                 errno = -res;
  78.                 return(0);
  79.             }
  80.                 }
  81.         }
  82.         else return(0);
  83. }
  84.