Rev 8129 | Rev 8170 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 8129 | Rev 8133 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | #ifndef __MENUET_FILE_H_INCLUDED_ |
1 | #ifndef __KOLIBRI_FILE_H_INCLUDED_ |
2 | #define __MENUET_FILE_H_INCLUDED_ |
2 | #define __KOLIBRI_FILE_H_INCLUDED_ |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | #include |
4 | #include |
Line 5... | Line 5... | ||
5 | #include |
5 | #include |
Line 65... | Line 65... | ||
65 | TFileData FileOpen(const char *name, unsigned int buffer_length) |
65 | TFileData FileOpen(const char *name, unsigned int buffer_length) |
66 | { |
66 | { |
67 | if (!name || !name[0]) return 0; |
67 | if (!name || !name[0]) return 0; |
68 | unsigned int name_len = StrLen(name) + 1; |
68 | unsigned int name_len = StrLen(name) + 1; |
69 | unsigned int data_len = (_FileDataStruct::PosName + name_len + 3) & ~3; |
69 | unsigned int data_len = (_FileDataStruct::PosName + name_len + 3) & ~3; |
70 | buffer_length = (buffer_length / MENUET_FILE_BLOCK_SIZE) * MENUET_FILE_BLOCK_SIZE; |
70 | buffer_length = (buffer_length / KOLIBRI_FILE_BLOCK_SIZE) * KOLIBRI_FILE_BLOCK_SIZE; |
71 | if (buffer_length) data_len += buffer_length + 2*sizeof(unsigned int); |
71 | if (buffer_length) data_len += buffer_length + 2*sizeof(unsigned int); |
72 | TFileData file = (TFileData)Alloc(_FileDataStruct::PosName + data_len); |
72 | TFileData file = (TFileData)Alloc(_FileDataStruct::PosName + data_len); |
73 | if (!file) return 0; |
73 | if (!file) return 0; |
74 | file->length = -1; |
74 | file->length = -1; |
75 | file->position = 0; |
75 | file->position = 0; |
Line 117... | Line 117... | ||
117 | unsigned int *buffer; |
117 | unsigned int *buffer; |
118 | if (!file_data || !mem || size <= 0) return -1; |
118 | if (!file_data || !mem || size <= 0) return -1; |
119 | if (file_data->buffer) buffer = file_data->buffer; |
119 | if (file_data->buffer) buffer = file_data->buffer; |
120 | else if (temp_mem) |
120 | else if (temp_mem) |
121 | { |
121 | { |
122 | buffer = (unsigned int*)((char*)temp_mem + MENUET_FILE_BLOCK_SIZE); |
122 | buffer = (unsigned int*)((char*)temp_mem + KOLIBRI_FILE_BLOCK_SIZE); |
123 | } |
123 | } |
124 | else return 0; |
124 | else return 0; |
125 | if (!buffer[1]) return 0; |
125 | if (!buffer[1]) return 0; |
126 | if (file_data->position >= file_data->length) |
126 | if (file_data->position >= file_data->length) |
127 | { |
127 | { |
Line 140... | Line 140... | ||
140 | 140 | ||
141 | int _FileReadSystem(TFileData file_data, void *mem, int size) |
141 | int _FileReadSystem(TFileData file_data, void *mem, int size) |
142 | { |
142 | { |
143 | int res; |
143 | int res; |
144 | unsigned int len0, len1; |
144 | unsigned int len0, len1; |
145 | size /= MENUET_FILE_BLOCK_SIZE; |
145 | size /= KOLIBRI_FILE_BLOCK_SIZE; |
146 | if (!file_data || !mem || size <= 0) return -1; |
146 | if (!file_data || !mem || size <= 0) return -1; |
147 | file_data->access_param[0] = 0; |
147 | file_data->access_param[0] = 0; |
148 | file_data->access_param[1] = (file_data->position / MENUET_FILE_BLOCK_SIZE) * MENUET_FILE_BLOCK_SIZE; |
148 | file_data->access_param[1] = (file_data->position / KOLIBRI_FILE_BLOCK_SIZE) * KOLIBRI_FILE_BLOCK_SIZE; |
149 | file_data->access_param[2] = 0; |
149 | file_data->access_param[2] = 0; |
150 | file_data->access_param[3] = size * MENUET_FILE_BLOCK_SIZE; |
150 | file_data->access_param[3] = size * KOLIBRI_FILE_BLOCK_SIZE; |
151 | file_data->access_param[4] = (unsigned int)mem; |
151 | file_data->access_param[4] = (unsigned int)mem; |
152 | res = _FileAccess(file_data->access_param); |
152 | res = _FileAccess(file_data->access_param); |
153 | if (res != 0 && res != 6) return (res & 255) - 1024; |
153 | if (res != 0 && res != 6) return (res & 255) - 1024; |
154 | if (file_data->length <= file_data->position) return 0; |
154 | if (file_data->length <= file_data->position) return 0; |
155 | len0 = file_data->length - file_data->position; |
155 | len0 = file_data->length - file_data->position; |
156 | len1 = size * MENUET_FILE_BLOCK_SIZE - (file_data->position % MENUET_FILE_BLOCK_SIZE); |
156 | len1 = size * KOLIBRI_FILE_BLOCK_SIZE - (file_data->position % KOLIBRI_FILE_BLOCK_SIZE); |
157 | return (len0 <= len1) ? len0 : len1; |
157 | return (len0 <= len1) ? len0 : len1; |
Line 158... | Line 158... | ||
158 | } |
158 | } |
159 | 159 | ||
Line 165... | Line 165... | ||
165 | if (file_data->buffer) buffer = file_data->buffer; |
165 | if (file_data->buffer) buffer = file_data->buffer; |
166 | else |
166 | else |
167 | { |
167 | { |
168 | if (!temp_mem) |
168 | if (!temp_mem) |
169 | { |
169 | { |
170 | temp_mem = Alloc(MENUET_FILE_BLOCK_SIZE + 2*sizeof(unsigned int)); |
170 | temp_mem = Alloc(KOLIBRI_FILE_BLOCK_SIZE + 2*sizeof(unsigned int)); |
171 | if (!temp_mem) return -10; |
171 | if (!temp_mem) return -10; |
172 | } |
172 | } |
173 | buffer = (unsigned int*)((char*)temp_mem + MENUET_FILE_BLOCK_SIZE); |
173 | buffer = (unsigned int*)((char*)temp_mem + KOLIBRI_FILE_BLOCK_SIZE); |
174 | buffer[0] = MENUET_FILE_BLOCK_SIZE; |
174 | buffer[0] = KOLIBRI_FILE_BLOCK_SIZE; |
175 | } |
175 | } |
176 | buffer[1] = buffer[0]; |
176 | buffer[1] = buffer[0]; |
177 | res = _FileReadSystem(file_data, (char*)buffer - buffer[1], buffer[1]); |
177 | res = _FileReadSystem(file_data, (char*)buffer - buffer[1], buffer[1]); |
178 | if (res < 0) buffer[1] = 0; |
178 | if (res < 0) buffer[1] = 0; |
179 | else buffer[1] -= file_data->position % MENUET_FILE_BLOCK_SIZE; |
179 | else buffer[1] -= file_data->position % KOLIBRI_FILE_BLOCK_SIZE; |
180 | return res; |
180 | return res; |
181 | } |
181 | } |
Line 182... | Line 182... | ||
182 | 182 | ||
183 | int FileTestRead(TFileData file_data) |
183 | int FileTestRead(TFileData file_data) |
Line 198... | Line 198... | ||
198 | res = _FileReadBuffer(file_data, mem, size); |
198 | res = _FileReadBuffer(file_data, mem, size); |
199 | if (res < 0 || res >= size) return res; |
199 | if (res < 0 || res >= size) return res; |
200 | read_len = res; |
200 | read_len = res; |
201 | mem = (char*)mem + res; |
201 | mem = (char*)mem + res; |
202 | size -= res; |
202 | size -= res; |
203 | tlen = file_data->position % MENUET_FILE_BLOCK_SIZE; |
203 | tlen = file_data->position % KOLIBRI_FILE_BLOCK_SIZE; |
204 | if (tlen) |
204 | if (tlen) |
205 | { |
205 | { |
206 | res = _FileBufferSystem(file_data, temp_mem); |
206 | res = _FileBufferSystem(file_data, temp_mem); |
207 | if (res < 0) |
207 | if (res < 0) |
208 | { |
208 | { |
Line 218... | Line 218... | ||
218 | return read_len; |
218 | return read_len; |
219 | } |
219 | } |
220 | mem = (char*)mem + res; |
220 | mem = (char*)mem + res; |
221 | size -= res; |
221 | size -= res; |
222 | } |
222 | } |
223 | if (size >= (file_data->buffer ? file_data->buffer[0] : MENUET_FILE_BLOCK_SIZE)) |
223 | if (size >= (file_data->buffer ? file_data->buffer[0] : KOLIBRI_FILE_BLOCK_SIZE)) |
224 | { |
224 | { |
225 | res = _FileReadSystem(file_data, mem, size); |
225 | res = _FileReadSystem(file_data, mem, size); |
226 | if (res < 0) |
226 | if (res < 0) |
227 | { |
227 | { |
228 | if (temp_mem) Free(temp_mem); |
228 | if (temp_mem) Free(temp_mem); |
229 | return read_len ? read_len : res; |
229 | return read_len ? read_len : res; |
230 | } |
230 | } |
231 | file_data->position += res; |
231 | file_data->position += res; |
232 | read_len += res; |
232 | read_len += res; |
233 | if (res < (size / MENUET_FILE_BLOCK_SIZE) * MENUET_FILE_BLOCK_SIZE) |
233 | if (res < (size / KOLIBRI_FILE_BLOCK_SIZE) * KOLIBRI_FILE_BLOCK_SIZE) |
234 | { |
234 | { |
235 | if (temp_mem) Free(temp_mem); |
235 | if (temp_mem) Free(temp_mem); |
236 | return read_len; |
236 | return read_len; |
237 | } |
237 | } |
238 | mem = (char*)mem + res; |
238 | mem = (char*)mem + res; |
Line 272... | Line 272... | ||
272 | }; |
272 | }; |
273 | } |
273 | } |
Line 274... | Line 274... | ||
274 | 274 | ||
Line 275... | Line 275... | ||
275 | #endif // else: def __MENUET__ |
275 | #endif // else: def __MENUET__ |