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

Latest commit

 

History

History
661 lines (560 loc) · 17.2 KB

SDL_rwops.c

File metadata and controls

661 lines (560 loc) · 17.2 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
Jan 25, 2011
Jan 25, 2011
47
#include "../core/windows/SDL_windows.h"
Feb 27, 2006
Feb 27, 2006
48
Mar 4, 2006
Mar 4, 2006
49
50
51
52
#ifndef INVALID_SET_FILE_POINTER
#define INVALID_SET_FILE_POINTER 0xFFFFFFFF
#endif
Jul 10, 2007
Jul 10, 2007
53
54
#define READAHEAD_BUFFER_SIZE 1024
Jul 10, 2006
Jul 10, 2006
55
static int SDLCALL
Jan 21, 2011
Jan 21, 2011
56
windows_file_open(SDL_RWops * context, const char *filename, const char *mode)
Mar 4, 2006
Mar 4, 2006
57
58
{
#ifndef _WIN32_WCE
Jul 10, 2006
Jul 10, 2006
59
UINT old_error_mode;
Mar 4, 2006
Mar 4, 2006
60
#endif
Jul 10, 2006
Jul 10, 2006
61
62
63
64
65
66
HANDLE h;
DWORD r_right, w_right;
DWORD must_exist, truncate;
int a_mode;
if (!context)
Jul 10, 2007
Jul 10, 2007
67
return -1; /* failed (invalid call) */
Jul 10, 2007
Jul 10, 2007
68
Jan 21, 2011
Jan 21, 2011
69
70
71
72
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
73
Jul 10, 2006
Jul 10, 2006
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
/* "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
91
Jan 21, 2011
Jan 21, 2011
92
context->hidden.windowsio.buffer.data =
Jul 11, 2007
Jul 11, 2007
93
(char *) SDL_malloc(READAHEAD_BUFFER_SIZE);
Jan 21, 2011
Jan 21, 2011
94
if (!context->hidden.windowsio.buffer.data) {
Jul 10, 2007
Jul 10, 2007
95
96
97
SDL_OutOfMemory();
return -1;
}
Mar 4, 2006
Mar 4, 2006
98
#ifdef _WIN32_WCE
Jul 10, 2006
Jul 10, 2006
99
{
Jan 25, 2011
Jan 25, 2011
100
101
LPTSTR tstr = WIN_UTF8ToString(filename);
h = CreateFile(tstr, (w_right | r_right),
Jul 10, 2006
Jul 10, 2006
102
103
104
(w_right) ? 0 : FILE_SHARE_READ, NULL,
(must_exist | truncate | a_mode),
FILE_ATTRIBUTE_NORMAL, NULL);
Jan 25, 2011
Jan 25, 2011
105
SDL_free(tstr);
Jul 10, 2006
Jul 10, 2006
106
}
Mar 4, 2006
Mar 4, 2006
107
#else
Jul 10, 2006
Jul 10, 2006
108
109
110
/* Do not open a dialog box if failure */
old_error_mode =
SetErrorMode(SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS);
Mar 4, 2006
Mar 4, 2006
111
Jan 25, 2011
Jan 25, 2011
112
113
114
115
116
117
118
119
{
LPTSTR tstr = WIN_UTF8ToString(filename);
h = CreateFile(tstr, (w_right | r_right),
(w_right) ? 0 : FILE_SHARE_READ, NULL,
(must_exist | truncate | a_mode),
FILE_ATTRIBUTE_NORMAL, NULL);
SDL_free(tstr);
}
Mar 4, 2006
Mar 4, 2006
120
Jan 25, 2011
Jan 25, 2011
121
/* restore old behavior */
Jul 10, 2006
Jul 10, 2006
122
SetErrorMode(old_error_mode);
Mar 4, 2006
Mar 4, 2006
123
#endif /* _WIN32_WCE */
Feb 27, 2006
Feb 27, 2006
124
Jul 10, 2006
Jul 10, 2006
125
if (h == INVALID_HANDLE_VALUE) {
Jan 21, 2011
Jan 21, 2011
126
127
SDL_free(context->hidden.windowsio.buffer.data);
context->hidden.windowsio.buffer.data = NULL;
Jul 10, 2006
Jul 10, 2006
128
129
130
SDL_SetError("Couldn't open %s", filename);
return -2; /* failed (CreateFile) */
}
Jan 21, 2011
Jan 21, 2011
131
132
context->hidden.windowsio.h = h;
context->hidden.windowsio.append = a_mode ? SDL_TRUE : SDL_FALSE;
Jul 10, 2006
Jul 10, 2006
133
134
return 0; /* ok */
Feb 27, 2006
Feb 27, 2006
135
}
Aug 27, 2008
Aug 27, 2008
136
Jul 10, 2007
Jul 10, 2007
137
static long SDLCALL
Jan 21, 2011
Jan 21, 2011
138
windows_file_seek(SDL_RWops * context, long offset, int whence)
Jul 10, 2006
Jul 10, 2006
139
{
Jan 21, 2011
Jan 21, 2011
140
DWORD windowswhence;
Jul 10, 2007
Jul 10, 2007
141
long file_pos;
Feb 27, 2006
Feb 27, 2006
142
Jan 21, 2011
Jan 21, 2011
143
144
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
145
146
return -1;
}
Feb 27, 2006
Feb 27, 2006
147
Jul 10, 2007
Jul 10, 2007
148
/* FIXME: We may be able to satisfy the seek within buffered data */
Jan 21, 2011
Jan 21, 2011
149
150
if (whence == RW_SEEK_CUR && context->hidden.windowsio.buffer.left) {
offset -= (long)context->hidden.windowsio.buffer.left;
Jul 10, 2007
Jul 10, 2007
151
}
Jan 21, 2011
Jan 21, 2011
152
context->hidden.windowsio.buffer.left = 0;
Jul 10, 2007
Jul 10, 2007
153
Jul 10, 2006
Jul 10, 2006
154
155
switch (whence) {
case RW_SEEK_SET:
Jan 21, 2011
Jan 21, 2011
156
windowswhence = FILE_BEGIN;
Jul 10, 2006
Jul 10, 2006
157
158
break;
case RW_SEEK_CUR:
Jan 21, 2011
Jan 21, 2011
159
windowswhence = FILE_CURRENT;
Jul 10, 2006
Jul 10, 2006
160
161
break;
case RW_SEEK_END:
Jan 21, 2011
Jan 21, 2011
162
windowswhence = FILE_END;
Jul 10, 2006
Jul 10, 2006
163
164
break;
default:
Jan 21, 2011
Jan 21, 2011
165
SDL_SetError("windows_file_seek: Unknown value for 'whence'");
Jul 10, 2006
Jul 10, 2006
166
167
return -1;
}
Feb 27, 2006
Feb 27, 2006
168
Jul 10, 2006
Jul 10, 2006
169
file_pos =
Jan 21, 2011
Jan 21, 2011
170
SetFilePointer(context->hidden.windowsio.h, offset, NULL, windowswhence);
Jul 10, 2006
Jul 10, 2006
171
172
173
if (file_pos != INVALID_SET_FILE_POINTER)
return file_pos; /* success */
Feb 27, 2006
Feb 27, 2006
174
Jul 10, 2006
Jul 10, 2006
175
176
SDL_Error(SDL_EFSEEK);
return -1; /* error */
Feb 27, 2006
Feb 27, 2006
177
}
Aug 27, 2008
Aug 27, 2008
178
Jul 10, 2007
Jul 10, 2007
179
static size_t SDLCALL
Jan 21, 2011
Jan 21, 2011
180
windows_file_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
Feb 27, 2006
Feb 27, 2006
181
{
Jul 10, 2007
Jul 10, 2007
182
183
184
size_t total_need;
size_t total_read = 0;
size_t read_ahead;
Jul 10, 2007
Jul 10, 2007
185
DWORD byte_read;
Feb 27, 2006
Feb 27, 2006
186
Jul 10, 2007
Jul 10, 2007
187
total_need = size * maxnum;
Jul 10, 2006
Jul 10, 2006
188
Jan 21, 2011
Jan 21, 2011
189
if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE
Jul 10, 2007
Jul 10, 2007
190
|| !total_need)
Jul 10, 2006
Jul 10, 2006
191
192
return 0;
Jan 21, 2011
Jan 21, 2011
193
194
195
196
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
197
read_ahead =
Jan 21, 2011
Jan 21, 2011
198
SDL_min(total_need, context->hidden.windowsio.buffer.left);
Jul 10, 2007
Jul 10, 2007
199
SDL_memcpy(ptr, data, read_ahead);
Jan 21, 2011
Jan 21, 2011
200
context->hidden.windowsio.buffer.left -= read_ahead;
Jul 10, 2007
Jul 10, 2007
201
202
203
204
205
206
207
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
208
}
Jul 10, 2007
Jul 10, 2007
209
210
211
if (total_need < READAHEAD_BUFFER_SIZE) {
if (!ReadFile
Jan 21, 2011
Jan 21, 2011
212
(context->hidden.windowsio.h, context->hidden.windowsio.buffer.data,
Jul 10, 2007
Jul 10, 2007
213
214
215
216
217
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
218
219
220
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
221
222
223
total_read += read_ahead;
} else {
if (!ReadFile
Jan 21, 2011
Jan 21, 2011
224
(context->hidden.windowsio.h, ptr, (DWORD)total_need, &byte_read, NULL)) {
Jul 10, 2007
Jul 10, 2007
225
226
227
228
229
230
SDL_Error(SDL_EFREAD);
return 0;
}
total_read += byte_read;
}
return (total_read / size);
Feb 27, 2006
Feb 27, 2006
231
}
Aug 27, 2008
Aug 27, 2008
232
Jul 10, 2007
Jul 10, 2007
233
static size_t SDLCALL
Jan 21, 2011
Jan 21, 2011
234
windows_file_write(SDL_RWops * context, const void *ptr, size_t size,
Jul 10, 2007
Jul 10, 2007
235
size_t num)
Feb 27, 2006
Feb 27, 2006
236
{
Feb 6, 2006
Feb 6, 2006
237
Jul 10, 2007
Jul 10, 2007
238
size_t total_bytes;
Sep 5, 2009
Sep 5, 2009
239
240
DWORD byte_written;
size_t nwritten;
Apr 26, 2001
Apr 26, 2001
241
Jul 10, 2006
Jul 10, 2006
242
243
total_bytes = size * num;
Jan 21, 2011
Jan 21, 2011
244
if (!context || context->hidden.windowsio.h == INVALID_HANDLE_VALUE
Jul 10, 2006
Jul 10, 2006
245
246
247
|| total_bytes <= 0 || !size)
return 0;
Jan 21, 2011
Jan 21, 2011
248
249
250
if (context->hidden.windowsio.buffer.left) {
SetFilePointer(context->hidden.windowsio.h,
-(LONG)context->hidden.windowsio.buffer.left, NULL,
Jul 10, 2007
Jul 10, 2007
251
FILE_CURRENT);
Jan 21, 2011
Jan 21, 2011
252
context->hidden.windowsio.buffer.left = 0;
Jul 10, 2007
Jul 10, 2007
253
254
}
Jul 10, 2006
Jul 10, 2006
255
/* if in append mode, we must go to the EOF before write */
Jan 21, 2011
Jan 21, 2011
256
257
if (context->hidden.windowsio.append) {
if (SetFilePointer(context->hidden.windowsio.h, 0L, NULL, FILE_END) ==
Jul 10, 2007
Jul 10, 2007
258
INVALID_SET_FILE_POINTER) {
Jul 10, 2006
Jul 10, 2006
259
260
261
262
SDL_Error(SDL_EFWRITE);
return 0;
}
}
Apr 26, 2001
Apr 26, 2001
263
Jul 10, 2006
Jul 10, 2006
264
if (!WriteFile
Jan 21, 2011
Jan 21, 2011
265
(context->hidden.windowsio.h, ptr, (DWORD)total_bytes, &byte_written, NULL)) {
Jul 10, 2006
Jul 10, 2006
266
267
268
269
270
271
SDL_Error(SDL_EFWRITE);
return 0;
}
nwritten = byte_written / size;
return nwritten;
Apr 26, 2001
Apr 26, 2001
272
}
Aug 27, 2008
Aug 27, 2008
273
Jul 10, 2006
Jul 10, 2006
274
static int SDLCALL
Jan 21, 2011
Jan 21, 2011
275
windows_file_close(SDL_RWops * context)
Apr 26, 2001
Apr 26, 2001
276
277
{
Jul 10, 2006
Jul 10, 2006
278
if (context) {
Jan 21, 2011
Jan 21, 2011
279
280
281
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
282
}
Jan 21, 2011
Jan 21, 2011
283
284
285
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
286
}
Jul 10, 2006
Jul 10, 2006
287
288
289
290
SDL_FreeRW(context);
}
return (0);
}
Jan 24, 2011
Jan 24, 2011
291
#endif /* __WIN32__ */
Jun 24, 2005
Jun 24, 2005
292
Jul 10, 2006
Jul 10, 2006
293
#ifdef HAVE_STDIO_H
Jun 24, 2005
Jun 24, 2005
294
Jul 10, 2006
Jul 10, 2006
295
/* Functions to read/write stdio file pointers */
Jun 24, 2005
Jun 24, 2005
296
Jul 10, 2007
Jul 10, 2007
297
298
static long SDLCALL
stdio_seek(SDL_RWops * context, long offset, int whence)
Jul 10, 2006
Jul 10, 2006
299
300
301
302
303
304
305
{
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
306
}
Aug 27, 2008
Aug 27, 2008
307
Jul 10, 2007
Jul 10, 2007
308
309
static size_t SDLCALL
stdio_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
Apr 26, 2001
Apr 26, 2001
310
{
Jul 10, 2006
Jul 10, 2006
311
312
313
314
315
316
317
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
318
}
Aug 27, 2008
Aug 27, 2008
319
Jul 10, 2007
Jul 10, 2007
320
321
static size_t SDLCALL
stdio_write(SDL_RWops * context, const void *ptr, size_t size, size_t num)
Jan 4, 2004
Jan 4, 2004
322
{
Jul 10, 2006
Jul 10, 2006
323
324
325
326
327
328
329
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
330
}
Aug 27, 2008
Aug 27, 2008
331
Jul 10, 2006
Jul 10, 2006
332
333
static int SDLCALL
stdio_close(SDL_RWops * context)
Apr 26, 2001
Apr 26, 2001
334
{
Jul 10, 2007
Jul 10, 2007
335
int status = 0;
Jul 10, 2006
Jul 10, 2006
336
337
338
if (context) {
if (context->hidden.stdio.autoclose) {
/* WARNING: Check the return value here! */
Jul 10, 2007
Jul 10, 2007
339
340
341
342
if (fclose(context->hidden.stdio.fp) != 0) {
SDL_Error(SDL_EFWRITE);
status = -1;
}
Jul 10, 2006
Jul 10, 2006
343
344
345
}
SDL_FreeRW(context);
}
Jul 10, 2007
Jul 10, 2007
346
return status;
Jul 10, 2006
Jul 10, 2006
347
348
349
350
351
}
#endif /* !HAVE_STDIO_H */
/* Functions to read/write memory pointers */
Jul 10, 2007
Jul 10, 2007
352
353
static long SDLCALL
mem_seek(SDL_RWops * context, long offset, int whence)
Jul 10, 2006
Jul 10, 2006
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
{
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
378
return (long)(context->hidden.mem.here - context->hidden.mem.base);
Jul 10, 2006
Jul 10, 2006
379
}
Aug 27, 2008
Aug 27, 2008
380
Jul 10, 2007
Jul 10, 2007
381
382
static size_t SDLCALL
mem_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
Jul 10, 2006
Jul 10, 2006
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
{
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
403
Jul 10, 2007
Jul 10, 2007
404
405
static size_t SDLCALL
mem_write(SDL_RWops * context, const void *ptr, size_t size, size_t num)
Jul 10, 2006
Jul 10, 2006
406
407
408
409
410
411
412
413
{
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
414
Jul 10, 2007
Jul 10, 2007
415
416
static size_t SDLCALL
mem_writeconst(SDL_RWops * context, const void *ptr, size_t size, size_t num)
Jul 10, 2006
Jul 10, 2006
417
418
419
420
{
SDL_SetError("Can't write to read-only memory");
return (-1);
}
Aug 27, 2008
Aug 27, 2008
421
Jul 10, 2006
Jul 10, 2006
422
423
424
425
426
427
428
static int SDLCALL
mem_close(SDL_RWops * context)
{
if (context) {
SDL_FreeRW(context);
}
return (0);
Apr 26, 2001
Apr 26, 2001
429
430
}
Feb 27, 2006
Feb 27, 2006
431
Apr 26, 2001
Apr 26, 2001
432
433
/* Functions to create SDL_RWops structures from various data sources */
Jul 10, 2006
Jul 10, 2006
434
435
SDL_RWops *
SDL_RWFromFile(const char *file, const char *mode)
Apr 26, 2001
Apr 26, 2001
436
{
Jul 10, 2006
Jul 10, 2006
437
SDL_RWops *rwops = NULL;
Mar 4, 2006
Mar 4, 2006
438
#ifdef HAVE_STDIO_H
Jul 10, 2006
Jul 10, 2006
439
FILE *fp = NULL;
Mar 4, 2006
Mar 4, 2006
440
#endif
Jul 10, 2006
Jul 10, 2006
441
442
443
444
if (!file || !*file || !mode || !*mode) {
SDL_SetError("SDL_RWFromFile(): No file or no mode specified");
return NULL;
}
Jan 24, 2011
Jan 24, 2011
445
#if defined(__WIN32__)
Jul 10, 2006
Jul 10, 2006
446
447
448
rwops = SDL_AllocRW();
if (!rwops)
return NULL; /* SDL_SetError already setup by SDL_AllocRW() */
Jan 21, 2011
Jan 21, 2011
449
if (windows_file_open(rwops, file, mode) < 0) {
Jul 10, 2006
Jul 10, 2006
450
451
452
SDL_FreeRW(rwops);
return NULL;
}
Jan 21, 2011
Jan 21, 2011
453
454
455
456
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
457
458
#elif HAVE_STDIO_H
May 8, 2010
May 8, 2010
459
460
461
462
463
464
#ifdef __APPLE__
fp = SDL_OpenFPFromBundleOrFallback(file, mode);
#else
fp = fopen(file, mode);
#endif
if (fp == NULL) {
Jul 10, 2006
Jul 10, 2006
465
466
467
468
SDL_SetError("Couldn't open %s", file);
} else {
rwops = SDL_RWFromFP(fp, 1);
}
Feb 27, 2006
Feb 27, 2006
469
#else
Jul 10, 2006
Jul 10, 2006
470
SDL_SetError("SDL not compiled with stdio support");
Feb 27, 2006
Feb 27, 2006
471
#endif /* !HAVE_STDIO_H */
Feb 27, 2006
Feb 27, 2006
472
Jul 10, 2006
Jul 10, 2006
473
return (rwops);
Apr 26, 2001
Apr 26, 2001
474
475
}
Feb 6, 2006
Feb 6, 2006
476
#ifdef HAVE_STDIO_H
Jul 10, 2006
Jul 10, 2006
477
SDL_RWops *
Jul 10, 2007
Jul 10, 2007
478
SDL_RWFromFP(FILE * fp, SDL_bool autoclose)
Jul 10, 2006
Jul 10, 2006
479
480
481
{
SDL_RWops *rwops = NULL;
Aug 27, 2008
Aug 27, 2008
482
483
484
485
486
487
488
#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
489
490
491
492
493
494
495
496
497
498
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
499
}
Dec 15, 2009
Dec 15, 2009
500
501
502
503
504
505
506
#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
507
#endif /* HAVE_STDIO_H */
Apr 26, 2001
Apr 26, 2001
508
Jul 10, 2006
Jul 10, 2006
509
510
SDL_RWops *
SDL_RWFromMem(void *mem, int size)
Apr 26, 2001
Apr 26, 2001
511
{
Jul 10, 2006
Jul 10, 2006
512
SDL_RWops *rwops;
Apr 26, 2001
Apr 26, 2001
513
Jul 10, 2006
Jul 10, 2006
514
515
516
517
518
519
520
521
522
523
524
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
525
526
}
Jul 10, 2006
Jul 10, 2006
527
528
SDL_RWops *
SDL_RWFromConstMem(const void *mem, int size)
Jan 4, 2004
Jan 4, 2004
529
{
Jul 10, 2006
Jul 10, 2006
530
SDL_RWops *rwops;
Jan 4, 2004
Jan 4, 2004
531
Jul 10, 2006
Jul 10, 2006
532
533
534
535
536
537
538
539
540
541
542
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
543
544
}
Jul 10, 2006
Jul 10, 2006
545
546
SDL_RWops *
SDL_AllocRW(void)
Apr 26, 2001
Apr 26, 2001
547
{
Jul 10, 2006
Jul 10, 2006
548
SDL_RWops *area;
Apr 26, 2001
Apr 26, 2001
549
Jul 10, 2006
Jul 10, 2006
550
551
552
553
554
area = (SDL_RWops *) SDL_malloc(sizeof *area);
if (area == NULL) {
SDL_OutOfMemory();
}
return (area);
Apr 26, 2001
Apr 26, 2001
555
556
}
Jul 10, 2006
Jul 10, 2006
557
558
void
SDL_FreeRW(SDL_RWops * area)
Apr 26, 2001
Apr 26, 2001
559
{
Jul 10, 2006
Jul 10, 2006
560
SDL_free(area);
Apr 26, 2001
Apr 26, 2001
561
}
Feb 9, 2006
Feb 9, 2006
562
563
564
/* Functions for dynamically reading and writing endian-specific values */
Jul 10, 2006
Jul 10, 2006
565
566
Uint16
SDL_ReadLE16(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
567
{
Jul 10, 2006
Jul 10, 2006
568
Uint16 value;
Feb 9, 2006
Feb 9, 2006
569
Jul 10, 2006
Jul 10, 2006
570
571
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapLE16(value));
Feb 9, 2006
Feb 9, 2006
572
}
Jul 10, 2006
Jul 10, 2006
573
574
575
Uint16
SDL_ReadBE16(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
576
{
Jul 10, 2006
Jul 10, 2006
577
Uint16 value;
Feb 9, 2006
Feb 9, 2006
578
Jul 10, 2006
Jul 10, 2006
579
580
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapBE16(value));
Feb 9, 2006
Feb 9, 2006
581
}
Jul 10, 2006
Jul 10, 2006
582
583
584
Uint32
SDL_ReadLE32(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
585
{
Jul 10, 2006
Jul 10, 2006
586
Uint32 value;
Feb 9, 2006
Feb 9, 2006
587
Jul 10, 2006
Jul 10, 2006
588
589
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapLE32(value));
Feb 9, 2006
Feb 9, 2006
590
}
Jul 10, 2006
Jul 10, 2006
591
592
593
Uint32
SDL_ReadBE32(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
594
{
Jul 10, 2006
Jul 10, 2006
595
Uint32 value;
Feb 9, 2006
Feb 9, 2006
596
Jul 10, 2006
Jul 10, 2006
597
598
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapBE32(value));
Feb 9, 2006
Feb 9, 2006
599
}
Jul 10, 2006
Jul 10, 2006
600
601
602
Uint64
SDL_ReadLE64(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
603
{
Jul 10, 2006
Jul 10, 2006
604
Uint64 value;
Feb 9, 2006
Feb 9, 2006
605
Jul 10, 2006
Jul 10, 2006
606
607
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapLE64(value));
Feb 9, 2006
Feb 9, 2006
608
}
Jul 10, 2006
Jul 10, 2006
609
610
611
Uint64
SDL_ReadBE64(SDL_RWops * src)
Feb 9, 2006
Feb 9, 2006
612
{
Jul 10, 2006
Jul 10, 2006
613
Uint64 value;
Feb 9, 2006
Feb 9, 2006
614
Jul 10, 2006
Jul 10, 2006
615
616
SDL_RWread(src, &value, (sizeof value), 1);
return (SDL_SwapBE64(value));
Feb 9, 2006
Feb 9, 2006
617
618
}
Sep 5, 2009
Sep 5, 2009
619
size_t
Jul 10, 2006
Jul 10, 2006
620
SDL_WriteLE16(SDL_RWops * dst, Uint16 value)
Feb 9, 2006
Feb 9, 2006
621
{
Jul 10, 2006
Jul 10, 2006
622
623
value = SDL_SwapLE16(value);
return (SDL_RWwrite(dst, &value, (sizeof value), 1));
Feb 9, 2006
Feb 9, 2006
624
}
Jul 10, 2006
Jul 10, 2006
625
Sep 5, 2009
Sep 5, 2009
626
size_t
Jul 10, 2006
Jul 10, 2006
627
SDL_WriteBE16(SDL_RWops * dst, Uint16 value)
Feb 9, 2006
Feb 9, 2006
628
{
Jul 10, 2006
Jul 10, 2006
629
630
value = SDL_SwapBE16(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_WriteLE32(SDL_RWops * dst, Uint32 value)
Feb 9, 2006
Feb 9, 2006
635
{
Jul 10, 2006
Jul 10, 2006
636
637
value = SDL_SwapLE32(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_WriteBE32(SDL_RWops * dst, Uint32 value)
Feb 9, 2006
Feb 9, 2006
642
{
Jul 10, 2006
Jul 10, 2006
643
644
value = SDL_SwapBE32(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_WriteLE64(SDL_RWops * dst, Uint64 value)
Feb 9, 2006
Feb 9, 2006
649
{
Jul 10, 2006
Jul 10, 2006
650
651
value = SDL_SwapLE64(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_WriteBE64(SDL_RWops * dst, Uint64 value)
Feb 9, 2006
Feb 9, 2006
656
{
Jul 10, 2006
Jul 10, 2006
657
658
value = SDL_SwapBE64(value);
return (SDL_RWwrite(dst, &value, (sizeof value), 1));
Feb 9, 2006
Feb 9, 2006
659
}
Jul 10, 2006
Jul 10, 2006
660
661
/* vi: set ts=4 sw=4 expandtab: */