Subversion Repositories Kolibri OS

Rev

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

  1. #include "kolibc.h"
  2. #include "kolibri.h"
  3.  
  4. int fill_buff(FILE* f);
  5.  
  6. int fread(void* dst,size_t size,size_t count,FILE* f)
  7. { size_t req;
  8.   size_t cnt;
  9.   char *p = dst;
  10.   if(!((f->mode & FILE_OPEN_READ)|(f->mode & FILE_OPEN_PLUS)))
  11.                 return 0;
  12.   req=count*size;
  13.   if (req+f->filepos+f->strpos > f->filesize)
  14.                 req=f->filesize-f->filepos-f->strpos;
  15.   count=0;             
  16.   while(req)
  17.   {
  18.     if (f->remain)
  19.     { cnt= req > f->remain ? f->remain : req;
  20.           memcpy(p,f->stream,cnt);
  21.           p+=cnt;
  22.           f->stream+=cnt;
  23.           f->strpos+=cnt;
  24.           f->remain-=cnt;
  25.           count+=cnt;
  26.           req-=cnt;
  27.         }
  28.         else
  29.         {
  30.           f->filepos+=4096;
  31.           if(!fill_buff(f))  //eof or error
  32.             break;
  33.         }  
  34.   };
  35.   return count/size;
  36. }
  37.  
  38. int fill_buff(FILE* f)
  39. { int err;
  40.   size_t bytes;
  41.  
  42.   err=read_file(f->filename,f->buffer,f->filepos,
  43.                              4096,&bytes);
  44.   if (err) return 0;
  45.   if(!bytes) return 0;
  46.   f->stream = f->buffer;
  47.   f->remain = 4096;
  48.   f->strpos=0;
  49.   return bytes;
  50. };