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 | }> |