Subversion Repositories Kolibri OS

Rev

Rev 145 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
145 halyavin 1
#include "stdio.h"
2
#include "string.h"
3
FILE* fopen(const char* filename, const char *mode)
4
{
5
	FILE* res;
6
	int imode;
7
	imode=0;
8
	if (*mode=='r')
9
	{
10
		imode=FILE_OPEN_READ;
11
		mode++;
12
	}else if (*mode=='w')
13
	{
14
		imode=FILE_OPEN_WRITE;
15
		mode++;
16
	}else if (*mode=='a')
17
	{
18
		imode=FILE_OPEN_APPEND;
19
		mode++;
20
	}else
21
		return 0;
22
	if (*mode=='t')
23
	{
24
		imode|=FILE_OPEN_TEXT;
25
		mode++;
26
	}else if (*mode=='b')
27
		mode++;
28
	if (*mode=='+')
29
	{
30
		imode|=FILE_OPEN_PLUS;
31
		mode++;
32
	}
33
	if (*mode!=0)
34
		return 0;
35
	res=malloc(sizeof(FILE));
36
	res->buffer=0;
37
	res->buffersize=0;
38
	res->filesize=0;
39
	res->filepos=0;
40
	res->filename=0;
41
	res->mode=imode;
42
//check if file exists
244 victor 43
        res=_msys_read_file(filename, 0, 0, 0, &res->filesize);
145 halyavin 44
        if (res==5)
45
        {
46
          if ((imode & 3) == FILE_OPEN_READ)
47
          {
48
            free(res);
49
            return 0;
50
          }
244 victor 51
          res=_msys_create_file(filename);
145 halyavin 52
          if (res!=0)
53
          {
54
            free(res);
55
            return 0;
56
          }
57
          res->filesize=0;
58
        }
59
        if (imode & 3==FILE_OPEN_WRITE)
60
        {
61
                res->buffersize=512;
62
                res->buffer=malloc(res->buffersize);
63
                if (res->buffer=0)
64
                {
65
                	free(res);
66
                	return 0;
67
                }
68
                res->filesize=0;
69
        }else
70
        {
71
        	res->buffersize=(res->filesize & (~511))+512;
72
	        res->buffer=malloc(res->buffersize);
73
        	if (res->buffer==0)
74
	        {
75
        		free(res);
76
		        return 0;
77
	        }
78
        	res=_msys_read_file(filename,0,res->filesize,res->buffer,0);
79
	        if (res!=0)
80
        	{
81
		        free(res->buffer);
82
        		free(res);
83
	        }
84
	        if (imode & 3==FILE_OPEN_APPEND)
85
	        	res->filepos=res->filesize;
86
        }
87
        res->filename=strdup(filename);
88
	return res;
89
}