Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
300 serge 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
};