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

Latest commit

 

History

History
651 lines (551 loc) · 17.1 KB

SDL_rwops.c

File metadata and controls

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