Subversion Repositories Kolibri OS

Rev

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

Rev 244 Rev 245
Line 1... Line 1...
1
#include "stdio.h"
1
#include 
2
#include "string.h"
2
#include 
-
 
3
 
-
 
4
 
-
 
5
extern struct{int argc; char** argv;} __ARGS;
-
 
6
 
-
 
7
char* getfullpath(const char* relpath){
-
 
8
    byte prev_is_slash=0;
-
 
9
    int len=0, depth=0, i;
-
 
10
    char* buff;
-
 
11
    buff = malloc(strlen(__ARGS.argv[0]) + strlen(relpath));
-
 
12
    if(*relpath == '/') buff[0] = '\0';
-
 
13
    else {
-
 
14
        len = strrchr(__ARGS.argv[0], '/') - __ARGS.argv[0] + 1;
-
 
15
        strncpy(buff, __ARGS.argv[0], len);
-
 
16
        prev_is_slash = 1;
-
 
17
    	buff[len] = 0;
-
 
18
        for(i=0; buff[i]; i++)
-
 
19
            if(buff[i] == '/' && i < len-1) depth++;
-
 
20
    }
-
 
21
    for (; *relpath; relpath++){
-
 
22
        switch (*relpath){
-
 
23
            case '/':
-
 
24
                prev_is_slash = 1;
-
 
25
                buff[len++] = '/';
-
 
26
                break;
-
 
27
            case '.':
-
 
28
                if(*(relpath+1) == '.' && *(relpath+2) == '/' && prev_is_slash){
-
 
29
                    if(!depth) return 0;
-
 
30
                    buff[len-1] = 0;
-
 
31
                    len = strrchr(buff, '/') + 1 - buff;
-
 
32
                    buff[len] = 0;
-
 
33
                    depth--;
-
 
34
                    relpath += 2;
-
 
35
                } else {
-
 
36
                    depth++;
-
 
37
                    buff[len++] = '.';
-
 
38
                }
-
 
39
                break;
-
 
40
            default:
-
 
41
                if(prev_is_slash){ 
-
 
42
                    depth++;
-
 
43
                    prev_is_slash = 0;
-
 
44
                }
-
 
45
                buff[len++] = *relpath;
-
 
46
                break;
-
 
47
            }
-
 
48
    }
-
 
49
    buff[len]= '\0';
-
 
50
    return buff;
-
 
51
}
-
 
52
 
-
 
53
 
3
FILE* fopen(const char* filename, const char *mode)
54
FILE* fopen(const char* filename, const char *mode)
4
{
55
{
5
	FILE* res;
56
	FILE* res;
6
	int imode;
57
	int imode;
7
	imode=0;
58
	imode=0;
Line 35... Line 86...
35
	res=malloc(sizeof(FILE));
86
	res=malloc(sizeof(FILE));
36
	res->buffer=0;
87
	res->buffer=0;
37
	res->buffersize=0;
88
	res->buffersize=0;
38
	res->filesize=0;
89
	res->filesize=0;
39
	res->filepos=0;
90
	res->filepos=0;
40
	res->filename=0;
-
 
41
	res->mode=imode;
91
	res->mode=imode;
-
 
92
	res->filename=getfullpath(filename);
42
//check if file exists
93
//check if file exists
43
        res=_msys_read_file(filename, 0, 0, 0, &res->filesize);
94
        res=_msys_read_file(res->filename, 0, 0, 0, &res->filesize);
44
        if (res==5)
95
        if (res==5)
45
        {
96
        {
46
          if ((imode & 3) == FILE_OPEN_READ)
97
          if ((imode & 3) == FILE_OPEN_READ)
47
          {
98
          {
-
 
99
            free(res->filename);
48
            free(res);
100
            free(res);
49
            return 0;
101
            return 0;
50
          }
102
          }
51
          res=_msys_create_file(filename);
103
          res=_msys_create_file(res->filename);
52
          if (res!=0)
104
          if (res!=0)
53
          {
105
          {
-
 
106
            free(res->filename);
54
            free(res);
107
            free(res);
55
            return 0;
108
            return 0;
56
          }
109
          }
57
          res->filesize=0;
110
          res->filesize=0;
58
        }
111
        }
Line 60... Line 113...
60
        {
113
        {
61
                res->buffersize=512;
114
                res->buffersize=512;
62
                res->buffer=malloc(res->buffersize);
115
                res->buffer=malloc(res->buffersize);
63
                if (res->buffer=0)
116
                if (res->buffer=0)
64
                {
117
                {
-
 
118
                    free(res->filename);
65
                	free(res);
119
                    free(res);
66
                	return 0;
120
                    return 0;
67
                }
121
                }
68
                res->filesize=0;
122
                res->filesize=0;
69
        }else
123
        }else
Line 73... Line 127...
73
        	if (res->buffer==0)
127
        	if (res->buffer==0)
74
	        {
128
	        {
75
        		free(res);
129
        		free(res);
76
		        return 0;
130
		        return 0;
77
	        }
131
	        }
78
        	res=_msys_read_file(filename,0,res->filesize,res->buffer,0);
132
        	res=_msys_read_file(res->filename,0,res->filesize,res->buffer,0);
79
	        if (res!=0)
133
	        if (res!=0)
80
        	{
134
        	{
81
		        free(res->buffer);
135
		        free(res->buffer);
82
        		free(res);
136
        		free(res);
83
	        }
137
	        }
84
	        if (imode & 3==FILE_OPEN_APPEND)
138
	        if (imode & 3==FILE_OPEN_APPEND)
85
	        	res->filepos=res->filesize;
139
	        	res->filepos=res->filesize;
86
        }
140
        }
87
        res->filename=strdup(filename);
-
 
88
	return res;
141
	return res;
89
}
142
}