Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
668 lines (566 loc) · 17.6 KB

SDL_rwops.c

File metadata and controls

668 lines (566 loc) · 17.6 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
/*
SDL - Simple DirectMedia Layer
Jan 24, 2010
Jan 24, 2010
3
Copyright (C) 1997-2010 Sam Lantinga
Apr 26, 2001
Apr 26, 2001
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
Apr 26, 2001
Apr 26, 2001
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
Apr 26, 2001
Apr 26, 2001
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Apr 26, 2001
Apr 26, 2001
14
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Apr 26, 2001
Apr 26, 2001
18
19
Sam Lantinga
Dec 14, 2001
Dec 14, 2001
20
slouken@libsdl.org
Apr 26, 2001
Apr 26, 2001
21
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Apr 26, 2001
Apr 26, 2001
23
24
25
26
27
/* This file provides a general interface for SDL to read and write
data sources. It can easily be extended to files, memory, etc.
*/
Feb 9, 2006
Feb 9, 2006
28
#include "SDL_endian.h"
Feb 7, 2006
Feb 7, 2006
29
#include "SDL_rwops.h"
Feb 6, 2006
Feb 6, 2006
30
May 8, 2010
May 8, 2010
31
#ifdef __APPLE__
May 9, 2010
May 9, 2010
32
#include "cocoa/SDL_rwopsbundlesupport.h"
May 8, 2010
May 8, 2010
33
34
#endif /* __APPLE__ */
Aug 27, 2008
Aug 27, 2008
35
36
37
38
#ifdef __NDS__
/* include libfat headers for fatInitDefault(). */
#include <fat.h>
#endif /* __NDS__ */
Feb 9, 2006
Feb 9, 2006
39
Jan 24, 2011
Jan 24, 2011
40
#ifdef __WIN32__
Apr 26, 2001
Apr 26, 2001
41
Feb 27, 2006
Feb 27, 2006
42
/* Functions to read/write Win32 API file pointers */
Mar 4, 2006
Mar 4, 2006
43
44
45
/* Will not use it on WinCE because stdio is buffered, it means
faster, and all stdio functions anyway are embedded in coredll.dll -
the main wince dll*/
Apr 26, 2001
Apr 26, 2001
46
Feb 27, 2006
Feb 27, 2006
47
48
49
#define WINDOWS_LEAN_AND_MEAN
#include <windows.h>
Mar 4, 2006
Mar 4, 2006
50
51
52
53
#ifndef INVALID_SET_FILE_POINTER
#define INVALID_SET_FILE_POINTER 0xFFFFFFFF
#endif
Jul 10, 2007
Jul 10, 2007
54
55
#define READAHEAD_BUFFER_SIZE 1024
Jul 10, 2006
Jul 10, 2006
56
static int SDLCALL
Jan 21, 2011
Jan 21, 2011
57
windows_file_open(SDL_RWops * context, const char *filename, const char *mode)
Mar 4, 2006
Mar 4, 2006
58
59
{
#ifndef _WIN32_WCE
Jul 10, 2006
Jul 10, 2006
60
UINT old_error_mode;
Mar 4, 2006
Mar 4, 2006
61
#endif
Jul 10, 2006
Jul 10, 2006
62
63
64
65
66
67
HANDLE h;
DWORD r_right, w_right;
DWORD must_exist, truncate;
int a_mode;
if (!context)
Jul 10, 2007
Jul 10, 2007
68
return -1; /* failed (invalid call) */
Jul 10, 2007
Jul 10, 2007
69
Jan 21, 2011
Jan 21, 2011
70
71
72
73
context->hidden.windowsio.h = INVALID_HANDLE_VALUE; /* mark this as unusable */
context->hidden.windowsio.buffer.data = NULL;
context->hidden.windowsio.buffer.size = 0;
context->hidden.windowsio.buffer.left = 0;
Jul 10, 2007
Jul 10, 2007
74
Jul 10, 2006
Jul 10, 2006
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/* "r" = reading, file must exist */
/* "w" = writing, truncate existing, file may not exist */
/* "r+"= reading or writing, file must exist */
/* "a" = writing, append file may not exist */
/* "a+"= append + read, file may not exist */
/* "w+" = read, write, truncate. file may not exist */
must_exist = (SDL_strchr(mode, 'r') != NULL) ? OPEN_EXISTING : 0;
truncate = (SDL_strchr(mode, 'w') != NULL) ? CREATE_ALWAYS : 0;
r_right = (SDL_strchr(mode, '+') != NULL
|| must_exist) ? GENERIC_READ : 0;
a_mode = (SDL_strchr(mode, 'a') != NULL) ? OPEN_ALWAYS : 0;
w_right = (a_mode || SDL_strchr(mode, '+')
|| truncate) ? GENERIC_WRITE : 0;
if (!r_right && !w_right) /* inconsistent mode */
return -1; /* failed (invalid call) */
Mar 4, 2006
Mar 4, 2006
92
Jan 21, 2011
Jan 21, 2011
93
context->hidden.windowsio.buffer.data =
Jul 11, 2007
Jul 11, 2007
94
(char *) SDL_malloc(READAHEAD_BUFFER_SIZE);
Jan 21, 2011
Jan 21, 2011
95
if (!context->hidden.windowsio.buffer.data) {
Jul 10, 2007
Jul 10, 2007
96
97
98
SDL_OutOfMemory();
return -1;
}
Mar 4, 2006
Mar 4, 2006
99
#ifdef _WIN32_WCE
Jul 10, 2006
Jul 10, 2006
100
101
102
103
104
105
106
{
size_t size = SDL_strlen(filename) + 1;
wchar_t *filenameW = SDL_stack_alloc(wchar_t, size);
if (MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, size) ==
0) {
SDL_stack_free(filenameW);
Jan 21, 2011
Jan 21, 2011
107
108
SDL_free(context->hidden.windowsio.buffer.data);
context->hidden.windowsio.buffer.data = NULL;
Jul 10, 2007
Jul 10, 2007
109
SDL_SetError("Unable to convert filename to Unicode");
Jul 10, 2006
Jul 10, 2006
110
111
112
113
114
115
116
117
return -1;
}
h = CreateFile(filenameW, (w_right | r_right),
(w_right) ? 0 : FILE_SHARE_READ, NULL,
(must_exist | truncate | a_mode),
FILE_ATTRIBUTE_NORMAL, NULL);
SDL_stack_free(filenameW);
}
Mar 4, 2006
Mar 4, 2006
118
#else
Jul 10, 2006
Jul 10, 2006
119
120
121
/* Do not open a dialog box if failure */
old_error_mode =
SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
Mar 4, 2006
Mar 4, 2006
122
Jul 10, 2006
Jul 10, 2006
123
124
125
126
h = CreateFile(filename, (w_right | r_right),
(w_right) ? 0 : FILE_SHARE_READ, NULL,
(must_exist | truncate | a_mode), FILE_ATTRIBUTE_NORMAL,
NULL);
Mar 4, 2006
Mar 4, 2006
127
Jul 10, 2006
Jul 10, 2006
128
129
/* restore old behaviour */
SetErrorMode(old_error_mode);
Mar 4, 2006
Mar 4, 2006
130
#endif /* _WIN32_WCE */
Feb 27, 2006
Feb 27, 2006
131
Jul 10, 2006
Jul 10, 2006
132
if (h == INVALID_HANDLE_VALUE) {
Jan 21, 2011
Jan 21, 2011
133
134
SDL_free(context->hidden.windowsio.buffer.data);
context->hidden.windowsio.buffer.data = NULL;
Jul 10, 2006
Jul 10, 2006
135
136
137
SDL_SetError("Couldn't open %s", filename);
return -2; /* failed (CreateFile) */
}
Jan 21, 2011
Jan 21, 2011
138
139
context->hidden.windowsio.h = h;
context->hidden.windowsio.append = a_mode ? SDL_TRUE : SDL_FALSE;
Jul 10, 2006
Jul 10, 2006
140
141
return 0; /* ok */
Feb 27, 2006
Feb 27, 2006
142
}
Aug 27, 2008
Aug 27, 2008
143
Jul 10, 2007
Jul 10, 2007
144
static long SDLCALL
Jan 21, 2011
Jan 21, 2011
145
windows_file_seek(SDL_RWops * context, long offset, int whence)
Jul 10, 2006
Jul 10, 2006
146
{
Jan 21, 2011
Jan 21, 2011
147
DWORD windowswhence;
Jul 10, 2007
Jul 10, 2007
148
long file_pos;
Feb 27, 2006
Feb 27, 2006
149
Jan 21, 2011
Jan 21, 2011
150
151
if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE) {
SDL_SetError("windows_file_seek: invalid context/file not opened");
Jul 10, 2006
Jul 10, 2006
152
153
return -1;
}
Feb 27, 2006
Feb 27, 2006
154
Jul 10, 2007
Jul 10, 2007
155
/* FIXME: We may be able to satisfy the seek within buffered data */
Jan 21, 2011
Jan 21, 2011
156
157
if (whence == RW_SEEK_CUR && context->hidden.windowsio.buffer.left) {
offset -= (long)context->hidden.windowsio.buffer.left;
Jul 10, 2007
Jul 10, 2007
158
}
Jan 21, 2011
Jan 21, 2011
159
context->hidden.windowsio.buffer.left = 0;
Jul 10, 2007
Jul 10, 2007
160
Jul 10, 2006
Jul 10, 2006
161
162
switch (whence) {
case RW_SEEK_SET:
Jan 21, 2011
Jan 21, 2011
163
windowswhence = FILE_BEGIN;
Jul 10, 2006
Jul 10, 2006
164
165
break;
case RW_SEEK_CUR:
Jan 21, 2011
Jan 21, 2011
166
windowswhence = FILE_CURRENT;
Jul 10, 2006
Jul 10, 2006
167
168
break;
case RW_SEEK_END:
Jan 21, 2011
Jan 21, 2011
169
windowswhence = FILE_END;
Jul 10, 2006
Jul 10, 2006
170
171
break;
default:
Jan 21, 2011
Jan 21, 2011
172
SDL_SetError("windows_file_seek: Unknown value for 'whence'");
Jul 10, 2006
Jul 10, 2006
173
174
return -1;
}
Feb 27, 2006
Feb 27, 2006
175
Jul 10, 2006
Jul 10, 2006
176
file_pos =
Jan 21, 2011
Jan 21, 2011
177
SetFilePointer(context->hidden.windowsio.h, offset, NULL, windowswhence);
Jul 10, 2006
Jul 10, 2006
178
179
180
if (file_pos != INVALID_SET_FILE_POINTER)
return file_pos; /* success */
Feb 27, 2006
Feb 27, 2006
181
Jul 10, 2006
Jul 10, 2006
182
183
SDL_Error(SDL_EFSEEK);
return -1; /* error */
Feb 27, 2006
Feb 27, 2006
184
}
Aug 27, 2008
Aug 27, 2008
185
Jul 10, 2007
Jul 10, 2007
186
static size_t SDLCALL
Jan 21, 2011
Jan 21, 2011
187
windows_file_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
Feb 27, 2006
Feb 27, 2006
188
{
Jul 10, 2007
Jul 10, 2007
189
190
191
size_t total_need;
size_t total_read = 0;
size_t read_ahead;
Jul 10, 2007
Jul 10, 2007
192
DWORD byte_read;
Feb 27, 2006
Feb 27, 2006
193
Jul 10, 2007
Jul 10, 2007
194
total_need = size * maxnum;
Jul 10, 2006
Jul 10, 2006
195
Jan 21, 2011
Jan 21, 2011
196
if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE
Jul 10, 2007
Jul 10, 2007
197
|| !total_need)
Jul 10, 2006
Jul 10, 2006
198
199
return 0;
Jan 21, 2011
Jan 21, 2011
200
201
202
203
if (context->hidden.windowsio.buffer.left > 0) {
void *data = (char *) context->hidden.windowsio.buffer.data +
context->hidden.windowsio.buffer.size -
context->hidden.windowsio.buffer.left;
Jul 12, 2007
Jul 12, 2007
204
read_ahead =
Jan 21, 2011
Jan 21, 2011
205
SDL_min(total_need, context->hidden.windowsio.buffer.left);
Jul 10, 2007
Jul 10, 2007
206
SDL_memcpy(ptr, data, read_ahead);
Jan 21, 2011
Jan 21, 2011
207
context->hidden.windowsio.buffer.left -= read_ahead;
Jul 10, 2007
Jul 10, 2007
208
209
210
211
212
213
214
if (read_ahead == total_need) {
return maxnum;
}
ptr = (char *) ptr + read_ahead;
total_need -= read_ahead;
total_read += read_ahead;
Jul 10, 2006
Jul 10, 2006
215
}
Jul 10, 2007
Jul 10, 2007
216
217
218
if (total_need < READAHEAD_BUFFER_SIZE) {
if (!ReadFile
Jan 21, 2011
Jan 21, 2011
219
(context->hidden.windowsio.h, context->hidden.windowsio.buffer.data,
Jul 10, 2007
Jul 10, 2007
220
221
222
223
224
READAHEAD_BUFFER_SIZE, &byte_read, NULL)) {
SDL_Error(SDL_EFREAD);
return 0;
}
read_ahead = SDL_min(total_need, (int) byte_read);
Jan 21, 2011
Jan 21, 2011
225
226
227
SDL_memcpy(ptr, context->hidden.windowsio.buffer.data, read_ahead);
context->hidden.windowsio.buffer.size = byte_read;
context->hidden.windowsio.buffer.left = byte_read - read_ahead;
Jul 10, 2007
Jul 10, 2007
228
229
230
total_read += read_ahead;
} else {
if (!ReadFile
Jan 21, 2011
Jan 21, 2011
231
(context->hidden.windowsio.h, ptr, (DWORD)total_need, &byte_read, NULL)) {
Jul 10, 2007
Jul 10, 2007
232
233
234
235
236
237
SDL_Error(SDL_EFREAD);
return 0;
}
total_read += byte_read;
}
return (total_read / size);
Feb 27, 2006
Feb 27, 2006
238
}
Aug 27, 2008
Aug 27, 2008
239
Jul 10, 2007
Jul 10, 2007
240
static size_t SDLCALL
Jan 21, 2011
Jan 21, 2011
241
windows_file_write(SDL_RWops * context, const void *ptr, size_t size,
Jul 10, 2007
Jul 10, 2007
242
size_t num)
Feb 27, 2006
Feb 27, 2006
243
{
Feb 6, 2006
Feb 6, 2006
244
Jul 10, 2007
Jul 10, 2007
245
size_t total_bytes;
Sep 5, 2009
Sep 5, 2009
246
247
DWORD byte_written;
size_t nwritten;
Apr 26, 2001
Apr 26, 2001
248
Jul 10, 2006
Jul 10, 2006
249
250
total_bytes = size * num;
Jan 21, 2011
Jan 21, 2011
251
if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE
Jul 10, 2006
Jul 10, 2006
252
253
254
|| total_bytes <= 0 || !size)
return 0;
Jan 21, 2011
Jan 21, 2011
255
256
257
if (context->hidden.windowsio.buffer.left) {
SetFilePointer(context->hidden.windowsio.h,
-(LONG)context->hidden.windowsio.buffer.left, NULL,
Jul 10, 2007
Jul 10, 2007
258
FILE_CURRENT);
Jan 21, 2011
Jan 21, 2011
259
context->hidden.windowsio.buffer.left = 0;
Jul 10, 2007
Jul 10, 2007
260
261
}
Jul 10, 2006
Jul 10, 2006
262
/* if in append mode, we must go to the EOF before write */
Jan 21, 2011
Jan 21, 2011
263
264
if (context->hidden.windowsio.append) {
if (SetFilePointer(context->hidden.windowsio.h, 0L, NULL, FILE_END) ==
Jul 10, 2007
Jul 10, 2007
265
INVALID_SET_FILE_POINTER) {
Jul 10, 2006
Jul 10, 2006
266
267
268
269
SDL_Error(SDL_EFWRITE);
return 0;
}
}
Apr 26, 2001
Apr 26, 2001
270
Jul 10, 2006
Jul 10, 2006
271
if (!WriteFile
Jan 21, 2011
Jan 21, 2011
272
(context->hidden.windowsio.h, ptr, (DWORD)total_bytes, &byte_written, NULL)) {
Jul 10, 2006
Jul 10, 2006
273
274
275
276
277
278
SDL_Error(SDL_EFWRITE);
return 0;
}
nwritten = byte_written / size;
return nwritten;
Apr 26, 2001
Apr 26, 2001
279
}
Aug 27, 2008
Aug 27, 2008
280
Jul 10, 2006
Jul 10, 2006
281
static int SDLCALL
Jan 21, 2011
Jan 21, 2011
282
windows_file_close(SDL_RWops * context)
Apr 26, 2001
Apr 26, 2001
283
284
{
Jul 10, 2006
Jul 10, 2006
285
if (context) {
Jan 21, 2011
Jan 21, 2011
286
287
288
if (context->hidden.windowsio.h != INVALID_HANDLE_VALUE) {
CloseHandle(context->hidden.windowsio.h);
context->hidden.windowsio.h = INVALID_HANDLE_VALUE; /* to be sure */
Jul 10, 2006
Jul 10, 2006
289
}
Jan 21, 2011
Jan 21, 2011
290
291
292
if (context->hidden.windowsio.buffer.data) {
SDL_free(context->hidden.windowsio.buffer.data);
context->hidden.windowsio.buffer.data = NULL;
Jul 10, 2007
Jul 10, 2007
293
}
Jul 10, 2006
Jul 10, 2006
294
295
296
297
SDL_FreeRW(context);
}
return (0);
}
Jan 24, 2011
Jan 24, 2011
298
#endif /* __WIN32__ */
Jun 24, 2005
Jun 24, 2005
299
Jul 10, 2006
Jul 10, 2006
300
#ifdef HAVE_STDIO_H
Jun 24, 2005
Jun 24, 2005
301
Jul 10, 2006
Jul 10, 2006
302
/* Functions to read/write stdio file pointers */
Jun 24, 2005
Jun 24, 2005
303
Jul 10, 2007
Jul 10, 2007
304
305
static long SDLCALL
stdio_seek(SDL_RWops * context, long offset, int whence)
Jul 10, 2006
Jul 10, 2006
306
307
308
309
310
311
312
{
if (fseek(context->hidden.stdio.fp, offset, whence) == 0) {
return (ftell(context->hidden.stdio.fp));
} else {
SDL_Error(SDL_EFSEEK);
return (-1);
}
Apr 26, 2001
Apr 26, 2001
313
}
Aug 27, 2008
Aug 27, 2008
314
Jul 10, 2007
Jul 10, 2007
315
316
static size_t SDLCALL
stdio_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
Apr 26, 2001
Apr 26, 2001
317
{
Jul 10, 2006
Jul 10, 2006
318
319
320
321
322
323
324
size_t nread;
nread = fread(ptr, size, maxnum, context->hidden.stdio.fp);
if (nread == 0 && ferror(context->hidden.stdio.fp)) {
SDL_Error(SDL_EFREAD);
}
return (nread);
Apr 26, 2001
Apr 26, 2001
325
}
Aug 27, 2008
Aug 27, 2008
326
Jul 10, 2007
Jul 10, 2007
327
328
static size_t SDLCALL
stdio_write(SDL_RWops * context, const void *ptr, size_t size, size_t num)
Jan 4, 2004
Jan 4, 2004
329
{
Jul 10, 2006
Jul 10, 2006
330
331
332
333
334
335
336
size_t nwrote;
nwrote = fwrite(ptr, size, num, context->hidden.stdio.fp);
if (nwrote == 0 && ferror(context->hidden.stdio.fp)) {
SDL_Error(SDL_EFWRITE);
}
return (nwrote);
Jan 4, 2004
Jan 4, 2004
337
}
Aug 27, 2008
Aug 27, 2008
338
Jul 10, 2006
Jul 10, 2006
339
340
static int SDLCALL
stdio_close(SDL_RWops * context)
Apr 26, 2001
Apr 26, 2001
341
{
Jul 10, 2007
Jul 10, 2007
342
int status = 0;
Jul 10, 2006
Jul 10, 2006
343
344
345
if (context) {
if (context->hidden.stdio.autoclose) {
/* WARNING: Check the return value here! */
Jul 10, 2007
Jul 10, 2007
346
347
348
349
if (fclose(context->hidden.stdio.fp) != 0) {
SDL_Error(SDL_EFWRITE);
status = -1;
}
Jul 10, 2006
Jul 10, 2006
350
351
352
}
SDL_FreeRW(context);
}
Jul 10, 2007
Jul 10, 2007
353
return status;
Jul 10, 2006
Jul 10, 2006
354
355
356
357
358
}
#endif /* !HAVE_STDIO_H */
/* Functions to read/write memory pointers */
Jul 10, 2007
Jul 10, 2007
359
360
static long SDLCALL
mem_seek(SDL_RWops * context, long offset, int whence)
Jul 10, 2006
Jul 10, 2006
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
{
Uint8 *newpos;
switch (whence) {
case RW_SEEK_SET:
newpos = context->hidden.mem.base + offset;
break;
case RW_SEEK_CUR:
newpos = context->hidden.mem.here + offset;
break;
case RW_SEEK_END:
newpos = context->hidden.mem.stop + offset;
break;
default:
SDL_SetError("Unknown value for 'whence'");
return (-1);
}
if (newpos < context->hidden.mem.base) {
newpos = context->hidden.mem.base;
}
if (newpos > context->hidden.mem.stop) {
newpos = context->hidden.mem.stop;
}
context->hidden.mem.here = newpos;
Sep 5, 2009
Sep 5, 2009
385
return (long)(context->hidden.mem.here - context->hidden.mem.base);
Jul 10, 2006
Jul 10, 2006
386
}
Aug 27, 2008
Aug 27, 2008
387
Jul 10, 2007
Jul 10, 2007
388
389
static size_t SDLCALL
mem_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
Jul 10, 2006
Jul 10, 2006
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
{
size_t total_bytes;
size_t mem_available;
total_bytes = (maxnum * size);
if ((maxnum <= 0) || (size <= 0)
|| ((total_bytes / maxnum) != (size_t) size)) {
return 0;
}
mem_available = (context->hidden.mem.stop - context->hidden.mem.here);
if (total_bytes > mem_available) {
total_bytes = mem_available;
}
SDL_memcpy(ptr, context->hidden.mem.here, total_bytes);
context->hidden.mem.here += total_bytes;
return (total_bytes / size);
}
Aug 27, 2008
Aug 27, 2008
410
Jul 10, 2007
Jul 10, 2007
411
412
static size_t SDLCALL
mem_write(SDL_RWops * context, const void *ptr, size_t size, size_t num)
Jul 10, 2006
Jul 10, 2006
413
414
415
416
417
418
419
420
{
if ((context->hidden.mem.here + (num * size)) > context->hidden.mem.stop) {
num = (context->hidden.mem.stop - context->hidden.mem.here) / size;
}
SDL_memcpy(context->hidden.mem.here, ptr, num * size);
context->hidden.mem.here += num * size;
return (num);
}
Aug 27, 2008
Aug 27, 2008
421
Jul 10, 2007
Jul 10, 2007
422
423
static size_t SDLCALL
mem_writeconst(SDL_RWops * context, const void *ptr, size_t size, size_t num)
Jul 10, 2006
Jul 10, 2006
424
425
426
427
{
SDL_SetError("Can't write to read-only memory");
return (-1);
}
Aug 27, 2008
Aug 27, 2008
428
Jul 10, 2006
Jul 10, 2006
429
430
431
432
433
434
435
static int SDLCALL
mem_close(SDL_RWops * context)
{
if (context) {
SDL_FreeRW(context);
}
return (0);
Apr 26, 2001
Apr 26, 2001
436
437
}
Feb 27, 2006
Feb 27, 2006
438
Apr 26, 2001
Apr 26, 2001
439
440
/* Functions to create SDL_RWops structures from various data sources */
Jul 10, 2006
Jul 10, 2006
441
442
SDL_RWops *
SDL_RWFromFile(const char *file, const char *mode)
Apr 26, 2001
Apr 26, 2001
443
{
Jul 10, 2006
Jul 10, 2006
444
SDL_RWops *rwops = NULL;
Mar 4, 2006
Mar 4, 2006
445
#ifdef HAVE_STDIO_H
Jul 10, 2006
Jul 10, 2006
446
FILE *fp = NULL;
Mar 4, 2006
Mar 4, 2006
447
#endif
Jul 10, 2006
Jul 10, 2006
448
449
450
451
if (!file || !*file || !mode || !*mode) {
SDL_SetError("SDL_RWFromFile(): No file or no mode specified");
return NULL;
}
Jan 24, 2011
Jan 24, 2011
452
#if defined(__WIN32__)
Jul 10, 2006
Jul 10, 2006
453
454
455
rwops = SDL_AllocRW();
if (!rwops)
return NULL; /* SDL_SetError already setup by SDL_AllocRW() */
Jan 21, 2011
Jan 21, 2011
456
if (windows_file_open(rwops, file, mode) < 0) {
Jul 10, 2006
Jul 10, 2006
457
458
459
SDL_FreeRW(rwops);
return NULL;
}
Jan 21, 2011
Jan 21, 2011
460
461
462
463
rwops->seek = windows_file_seek;
rwops->read = windows_file_read;
rwops->write = windows_file_write;
rwops->close = windows_file_close;
Feb 27, 2006
Feb 27, 2006
464
465
#elif HAVE_STDIO_H
May 8, 2010
May 8, 2010
466
467
468
469
470
471
#ifdef __APPLE__
fp = SDL_OpenFPFromBundleOrFallback(file, mode);
#else
fp = fopen(file, mode);
#endif
if (fp == NULL) {
Jul 10, 2006
Jul 10, 2006
472
473
474
475
SDL_SetError("Couldn't open %s", file);
} else {
rwops = SDL_RWFromFP(fp, 1);
}
Feb 27, 2006
Feb 27, 2006
476
#else
Jul 10, 2006
Jul 10, 2006
477
SDL_SetError("SDL not compiled with stdio support");
Feb 27, 2006
Feb 27, 2006
478
#endif /* !HAVE_STDIO_H */
Feb 27, 2006
Feb 27, 2006
479
Jul 10, 2006
Jul 10, 2006
480
return (rwops);
Apr 26, 2001
Apr 26, 2001
481
482
}
Feb 6, 2006
Feb 6, 2006
483
#ifdef HAVE_STDIO_H
Jul 10, 2006
Jul 10, 2006
484
SDL_RWops *
Jul 10, 2007
Jul 10, 2007
485
SDL_RWFromFP(FILE * fp, SDL_bool autoclose)
Jul 10, 2006
Jul 10, 2006
486
487
488
{
SDL_RWops *rwops = NULL;
Aug 27, 2008
Aug 27, 2008
489
490
491
492
493
494
495
#if 0
/*#ifdef __NDS__*/
/* set it up so we can use stdio file function */
fatInitDefault();
printf("called fatInitDefault()");
#endif /* __NDS__ */
Jul 10, 2006
Jul 10, 2006
496
497
498
499
500
501
502
503
504
505
rwops = SDL_AllocRW();
if (rwops != NULL) {
rwops->seek = stdio_seek;
rwops->read = stdio_read;
rwops->write = stdio_write;
rwops->close = stdio_close;
rwops->hidden.stdio.fp = fp;
rwops->hidden.stdio.autoclose = autoclose;
}
return (rwops);
Apr 26, 2001
Apr 26, 2001
506
}
Dec 15, 2009
Dec 15, 2009
507
508
509
510
511
512
513
#else
SDL_RWops *
SDL_RWFromFP(void * fp, SDL_bool autoclose)
{
SDL_SetError("SDL not compiled with stdio support");
return NULL;
}
Feb 6, 2006
Feb 6, 2006
514
#endif /* HAVE_STDIO_H */
Apr 26, 2001
Apr 26, 2001
515
Jul 10, 2006
Jul 10, 2006
516
517
SDL_RWops *
SDL_RWFromMem(void *mem, int size)
Apr 26, 2001
Apr 26, 2001
518
{
Jul 10, 2006
Jul 10, 2006
519
SDL_RWops *rwops;
Apr 26, 2001
Apr 26, 2001
520
Jul 10, 2006
Jul 10, 2006
521
522
523
524
525
526
527
528
529
530
531
rwops = SDL_AllocRW();
if (rwops != NULL) {
rwops->seek = mem_seek;
rwops->read = mem_read;
rwops->write = mem_write;
rwops->close = mem_close;
rwops->hidden.mem.base = (Uint8 *) mem;
rwops->hidden.mem.here = rwops->hidden.mem.base;
rwops->hidden.mem.stop = rwops->hidden.mem.base + size;
}
return (rwops);
Apr 26, 2001
Apr 26, 2001
532
533
}
Jul 10, 2006
Jul 10, 2006
534
535
SDL_RWops *
SDL_RWFromConstMem(const void *mem, int size)
Jan 4, 2004
Jan 4, 2004
536
{
Jul 10, 2006
Jul 10, 2006
537
SDL_RWops *rwops;
Jan 4, 2004
Jan 4, 2004
538
Jul 10, 2006
Jul 10, 2006
539
540
541
542
543
544
545
546
547
548
549
rwops = SDL_AllocRW();
if (rwops != NULL) {
rwops->seek = mem_seek;
rwops->read = mem_read;
rwops->write = mem_writeconst;
rwops->close = mem_close;
rwops->hidden.mem.base = (Uint8 *) mem;
rwops->hidden.mem.here = rwops->hidden.mem.base;
rwops->hidden.mem.stop = rwops->hidden.mem.base + size;
}
return (rwops);
Jan 4, 2004
Jan 4, 2004
550
551
}
Jul 10, 2006
Jul 10, 2006
552
553
SDL_RWops *
SDL_AllocRW(void)
Apr 26, 2001
Apr 26, 2001
554
{
Jul 10, 2006
Jul 10, 2006
555
SDL_RWops *area;
Apr 26, 2001
Apr 26, 2001
556
Jul 10, 2006
Jul 10, 2006
557
558
559
560
561
area = (SDL_RWops *) SDL_malloc(sizeof *area);
if (area == NULL) {
SDL_OutOfMemory();
}
return (area);
Apr 26, 2001
Apr 26, 2001
562
563
}
Jul 10, 2006
Jul 10, 2006
564
565
void
SDL_FreeRW(SDL_RWops * area)
Apr 26, 2001
Apr 26, 2001
566
{
Jul 10, 2006
Jul 10, 2006
567
SDL_free(area);
Apr 26, 2001
Apr 26, 2001
568
}
Feb 9, 2006
Feb 9, 2006
569
570
571
/* Functions for dynamically reading and writing endian-specific values */
Jul 10, 2006
Jul 10, 2006
572
573
Uint16
SDL_ReadLE16(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
574
{
Jul 10, 2006
Jul 10, 2006
575
Uint16 value;
Feb 9, 2006
Feb 9, 2006
576
Jul 10, 2006
Jul 10, 2006
577
578
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapLE16(value));
Feb 9, 2006
Feb 9, 2006
579
}
Jul 10, 2006
Jul 10, 2006
580
581
582
Uint16
SDL_ReadBE16(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
583
{
Jul 10, 2006
Jul 10, 2006
584
Uint16 value;
Feb 9, 2006
Feb 9, 2006
585
Jul 10, 2006
Jul 10, 2006
586
587
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapBE16(value));
Feb 9, 2006
Feb 9, 2006
588
}
Jul 10, 2006
Jul 10, 2006
589
590
591
Uint32
SDL_ReadLE32(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
592
{
Jul 10, 2006
Jul 10, 2006
593
Uint32 value;
Feb 9, 2006
Feb 9, 2006
594
Jul 10, 2006
Jul 10, 2006
595
596
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapLE32(value));
Feb 9, 2006
Feb 9, 2006
597
}
Jul 10, 2006
Jul 10, 2006
598
599
600
Uint32
SDL_ReadBE32(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
601
{
Jul 10, 2006
Jul 10, 2006
602
Uint32 value;
Feb 9, 2006
Feb 9, 2006
603
Jul 10, 2006
Jul 10, 2006
604
605
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapBE32(value));
Feb 9, 2006
Feb 9, 2006
606
}
Jul 10, 2006
Jul 10, 2006
607
608
609
Uint64
SDL_ReadLE64(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
610
{
Jul 10, 2006
Jul 10, 2006
611
Uint64 value;
Feb 9, 2006
Feb 9, 2006
612
Jul 10, 2006
Jul 10, 2006
613
614
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapLE64(value));
Feb 9, 2006
Feb 9, 2006
615
}
Jul 10, 2006
Jul 10, 2006
616
617
618
Uint64
SDL_ReadBE64(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
619
{
Jul 10, 2006
Jul 10, 2006
620
Uint64 value;
Feb 9, 2006
Feb 9, 2006
621
Jul 10, 2006
Jul 10, 2006
622
623
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapBE64(value));
Feb 9, 2006
Feb 9, 2006
624
625
}
Sep 5, 2009
Sep 5, 2009
626
size_t
Jul 10, 2006
Jul 10, 2006
627
SDL_WriteLE16(SDL_RWops * dst, Uint16 value)
Feb 9, 2006
Feb 9, 2006
628
{
Jul 10, 2006
Jul 10, 2006
629
630
value = SDL_SwapLE16(value);
return (SDL_RWwrite(dst, &value, (sizeof value), 1));
Feb 9, 2006
Feb 9, 2006
631
}
Jul 10, 2006
Jul 10, 2006
632
Sep 5, 2009
Sep 5, 2009
633
size_t
Jul 10, 2006
Jul 10, 2006
634
SDL_WriteBE16(SDL_RWops * dst, Uint16 value)
Feb 9, 2006
Feb 9, 2006
635
{
Jul 10, 2006
Jul 10, 2006
636
637
value = SDL_SwapBE16(value);
return (SDL_RWwrite(dst, &value, (sizeof value), 1));
Feb 9, 2006
Feb 9, 2006
638
}
Jul 10, 2006
Jul 10, 2006
639
Sep 5, 2009
Sep 5, 2009
640
size_t
Jul 10, 2006
Jul 10, 2006
641
SDL_WriteLE32(SDL_RWops * dst, Uint32 value)
Feb 9, 2006
Feb 9, 2006
642
{
Jul 10, 2006
Jul 10, 2006
643
644
value = SDL_SwapLE32(value);
return (SDL_RWwrite(dst, &value, (sizeof value), 1));
Feb 9, 2006
Feb 9, 2006
645
}
Jul 10, 2006
Jul 10, 2006
646
Sep 5, 2009
Sep 5, 2009
647
size_t
Jul 10, 2006
Jul 10, 2006
648
SDL_WriteBE32(SDL_RWops * dst, Uint32 value)
Feb 9, 2006
Feb 9, 2006
649
{
Jul 10, 2006
Jul 10, 2006
650
651
value = SDL_SwapBE32(value);
return (SDL_RWwrite(dst, &value, (sizeof value), 1));
Feb 9, 2006
Feb 9, 2006
652
}
Jul 10, 2006
Jul 10, 2006
653
Sep 5, 2009
Sep 5, 2009
654
size_t
Jul 10, 2006
Jul 10, 2006
655
SDL_WriteLE64(SDL_RWops * dst, Uint64 value)
Feb 9, 2006
Feb 9, 2006
656
{
Jul 10, 2006
Jul 10, 2006
657
658
value = SDL_SwapLE64(value);
return (SDL_RWwrite(dst, &value, (sizeof value), 1));
Feb 9, 2006
Feb 9, 2006
659
}
Jul 10, 2006
Jul 10, 2006
660
Sep 5, 2009
Sep 5, 2009
661
size_t
Jul 10, 2006
Jul 10, 2006
662
SDL_WriteBE64(SDL_RWops * dst, Uint64 value)
Feb 9, 2006
Feb 9, 2006
663
{
Jul 10, 2006
Jul 10, 2006
664
665
value = SDL_SwapBE64(value);
return (SDL_RWwrite(dst, &value, (sizeof value), 1));
Feb 9, 2006
Feb 9, 2006
666
}
Jul 10, 2006
Jul 10, 2006
667
668
/* vi: set ts=4 sw=4 expandtab: */