Subversion Repositories Kolibri OS

Rev

Rev 7172 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7172 Rev 7184
Line 1... Line 1...
1
#include 
1
#include 
-
 
2
#include 
-
 
3
#include 
2
#include 
4
#include 
Line 3... Line 5...
3
 
5
 
4
int fread(void *buffer,int size,int count,FILE* file)
6
int fread(void *buffer,int size,int count,FILE* file)
5
{
7
{
6
	dword res;
8
	dword res, readbytes;
Line 7... Line 9...
7
	dword fullsize;
9
	dword fullsize, read4cache, toread, readcount;
8
 
10
 
9
    if(!file || !buffer)
11
    if(!file || !buffer)
10
    {
12
    {
Line 17... Line 19...
17
        errno = E_ACCESS;
19
        errno = E_ACCESS;
18
        return 0;
20
        return 0;
19
    }
21
    }
Line 20... Line 22...
20
 
22
 
21
	fullsize=count*size;
23
	fullsize=count*size;
22
	if ((fullsize+file->filepos)>=(file->filesize))
24
	if (fullsize + file->filepos >= file->filesize)
23
	{
25
	{
24
		fullsize=file->filesize-file->filepos;
26
		fullsize=file->filesize - file->filepos;
25
		if (fullsize<=0) return(0);
27
		if (fullsize <= 0) return 0;
Line -... Line 28...
-
 
28
	}
-
 
29
 
-
 
30
	/***** file buffering strategy, just read forward *****
-
 
31
	if we read small part - read full buffer, but if buffer have this data - dont read again nothing (or partial read forward 4k pages)
-
 
32
	any writes drops buffers as ungetc_buf */
-
 
33
	read4cache = 0;
-
 
34
	readcount = 0;
26
	}
35
	if (file->filepos >= file->buffer_start && file->filepos < file->buffer_end) 
-
 
36
	{
-
 
37
		read4cache = min(file->buffer_end - file->filepos, fullsize);
-
 
38
		memcpy(buffer, file->buffer + file->filepos - file->buffer_start, read4cache);
-
 
39
		file->filepos += read4cache;
-
 
40
		if (file->ungetc_buf != EOF)  // subst ungetc byte
-
 
41
		{	
-
 
42
			*((char*)buffer) = (char)file->ungetc_buf;
-
 
43
			file->ungetc_buf = EOF;	
27
 
44
		}			
-
 
45
		buffer += read4cache;   // ! advance
-
 
46
		fullsize -= read4cache;
-
 
47
		readcount = read4cache / size;
-
 
48
	}
-
 
49
	
28
	res=_ksys_readfile(file->filename,file->filepos,fullsize,buffer);
50
	toread = max(fullsize, file->buffersize); 
29
	if (res==0)
51
	if (toread + file->filepos >= file->filesize)
30
	{
-
 
31
		file->filepos=file->filepos+fullsize;
-
 
32
		fullsize=fullsize/size;
52
	{ 
-
 
53
		toread = file->filesize - file->filepos;
-
 
54
	}
-
 
55
	
33
		return(fullsize);
56
	if (fullsize <= 0 || toread <= 0)
34
	}
57
		res = 0;  // already read or file end
-
 
58
	else
-
 
59
	{
-
 
60
		file->buffer_start = file->filepos;
-
 
61
		if (toread <= fullsize) // read to bigger buffer
-
 
62
		{
-
 
63
			res = _ksys_readfile(file->filename, file->filepos, toread, buffer, &readbytes);
-
 
64
			read4cache = min(readbytes, file->buffersize);
-
 
65
			memcpy(file->buffer, buffer, read4cache);
-
 
66
			file->filepos += readbytes;
-
 
67
		} else
-
 
68
		{
-
 
69
			res = _ksys_readfile(file->filename, file->filepos, toread, file->buffer, &readbytes);
-
 
70
			read4cache = readbytes;
-
 
71
			memcpy(buffer, file->buffer, min(fullsize, read4cache));
-
 
72
			file->filepos += min(fullsize, read4cache);
-
 
73
		}
-
 
74
		file->buffer_end = file->buffer_start + read4cache;
-
 
75
		if (readbytes >= fullsize)
-
 
76
			readcount += fullsize / size;
-
 
77
		else
-
 
78
			readcount += readbytes / size;
-
 
79
	}
-
 
80
 
-
 
81
	if (file->ungetc_buf != EOF)  // subst ungetc byte
-
 
82
	{	
-
 
83
		*((char*)buffer) = (char)file->ungetc_buf;
-
 
84
		file->ungetc_buf = EOF;	
-
 
85
	}			
-
 
86
	
-
 
87
	if (res != 0)
35
	else
88
    {
36
    {
-
 
37
        errno = -res;
89
		file->ungetc_buf = EOF;
-
 
90
        errno = -res;
-
 
91
    }
38
        return 0;
92