Rev 300 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
324 | serge | 1 | |
2 | #include |
||
3 | #include |
||
4 | #include "kolibc.h" |
||
300 | serge | 5 | |
6 | |||
324 | serge | 7 | extern int __appcwdlen; |
8 | |||
300 | serge | 9 | |
324 | serge | 10 | { |
11 | int prev_is_slash=0; |
||
12 | int len=0, depth=0, i; |
||
300 | serge | 13 | char* buff; |
14 | char c; |
||
324 | serge | 15 | |
300 | serge | 16 | |
324 | serge | 17 | |
18 | |||
19 | strncpy(buff, __appcwd, __appcwdlen); |
||
20 | |||
21 | |||
22 | { buff[0] = '\0'; |
||
23 | len=0; |
||
24 | } |
||
25 | else |
||
26 | { |
||
27 | prev_is_slash = 1; |
||
28 | buff[len] = 0; |
||
29 | for(i=0; buff[i]; i++) |
||
30 | if(buff[i] == '/' && i < len-1) depth++; |
||
31 | } |
||
300 | serge | 32 | |
324 | serge | 33 | |
34 | { |
||
35 | switch (c) |
||
36 | { |
||
37 | |||
38 | |||
39 | if((*path == '.')&& |
||
40 | (*path+1)== '/') |
||
41 | { if(!depth) |
||
42 | { free(buff); |
||
43 | return 0; |
||
44 | }; |
||
45 | buff[len-1] = 0; |
||
46 | len = strrchr(buff, '/') + 1 - buff; |
||
47 | buff[len] = 0; |
||
48 | depth--; |
||
49 | path +=2; |
||
50 | prev_is_slash = 1; |
||
51 | continue; |
||
52 | } |
||
53 | if(*path == '/') |
||
54 | { |
||
55 | path++; |
||
56 | prev_is_slash = 1; |
||
57 | continue; |
||
58 | } |
||
59 | buff[len++] = c; |
||
60 | continue; |
||
61 | |||
62 | |||
63 | prev_is_slash = 1; |
||
64 | buff[len++] = c; |
||
65 | continue; |
||
66 | |||
67 | |||
68 | prev_is_slash = 0; |
||
69 | buff[len++] = c; |
||
70 | continue; |
||
71 | }; |
||
72 | }; |
||
73 | buff[len]= '\0'; |
||
300 | serge | 74 | return buff; |
75 | } |
||
76 | |||
77 | |||
78 | { |
||
79 | FILEINFO fileinfo; |
||
324 | serge | 80 | FILE* res; |
81 | char *path; |
||
300 | serge | 82 | int err; |
324 | serge | 83 | int imode; |
84 | size_t bytes; |
||
85 | |||
300 | serge | 86 | |
324 | serge | 87 | if (*mode=='r') |
88 | { |
||
89 | imode=FILE_OPEN_READ; |
||
90 | mode++; |
||
91 | } |
||
92 | else |
||
93 | if (*mode=='w') |
||
94 | { |
||
95 | imode=FILE_OPEN_WRITE; |
||
96 | mode++; |
||
97 | } |
||
98 | else |
||
99 | if (*mode=='a') |
||
100 | { |
||
101 | imode=FILE_OPEN_APPEND; |
||
102 | mode++; |
||
103 | } |
||
104 | else |
||
105 | return 0; |
||
106 | if (*mode=='t') |
||
107 | { |
||
108 | imode|=FILE_OPEN_TEXT; |
||
109 | mode++; |
||
110 | } |
||
111 | else |
||
112 | if (*mode=='b') |
||
113 | mode++; |
||
114 | if (*mode=='+') |
||
115 | { |
||
116 | imode|=FILE_OPEN_PLUS; |
||
117 | mode++; |
||
118 | } |
||
119 | if (*mode!=0) |
||
120 | return 0; |
||
121 | |||
122 | |||
123 | err=get_fileinfo(path, &fileinfo); |
||
300 | serge | 124 | if(err) |
125 | { |
||
126 | if ((imode & 7)== 0) |
||
127 | { free(path); |
||
128 | return 0; |
||
129 | }; |
||
130 | // err=_msys_create_file(path); |
||
131 | if (err) |
||
132 | { free(path); |
||
133 | return 0; |
||
134 | } |
||
135 | fileinfo.size=0; |
||
136 | }; |
||
137 | |||
324 | serge | 138 | |
139 | if(!res) |
||
140 | { free(path); |
||
141 | return 0; |
||
142 | }; |
||
143 | |||
144 | |||
145 | res->stream=res->buffer; |
||
146 | res->strpos=0; |
||
147 | res->remain=8192; |
||
148 | res->buffersize=8192; |
||
149 | res->filesize=fileinfo.size; |
||
300 | serge | 150 | res->filename=path; |
151 | res->mode=imode; |
||
152 | |||
324 | serge | 153 | |
300 | serge | 154 | { size_t bytes; |
155 | res->strpos= res->filesize & 8191; |
||
324 | serge | 156 | if (res->strpos) //not align |
300 | serge | 157 | { |
158 | res->filepos=res->filesize & -8192; // align buffer |
||
324 | serge | 159 | res->remain=8192-res->strpos; |
160 | err=read_file(res->filename,res->buffer, |
||
300 | serge | 161 | res->filesize,res->remain,&bytes); |
162 | res->stream=res->buffer+res->strpos; |
||
163 | }; |
||
324 | serge | 164 | } |
165 | else |
||
300 | serge | 166 | { size_t bytes; |
167 | |||
168 | |||
324 | serge | 169 | 0,8192,&bytes); |
170 | res->filepos=0; |
||
171 | }; |
||
300 | serge | 172 | return res; |
324 | serge | 173 | } |
300 | serge | 174 | |
324 | serge | 175 | |
176 | { |
||
177 | return handle->filesize; |
||
178 | |||
179 | |||
180 |