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 (559 loc) · 17.3 KB

SDL_rwops.c

File metadata and controls

661 lines (559 loc) · 17.3 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
/*
SDL - Simple DirectMedia Layer
Dec 8, 2008
Dec 8, 2008
3
Copyright (C) 1997-2009 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
Aug 27, 2008
Aug 27, 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
/* FIXME: We may be able to satisfy the seek within buffered data */
if (whence == RW_SEEK_CUR && context->hidden.win32io.buffer.left) {
Sep 5, 2009
Sep 5, 2009
153
offset -= (long)context->hidden.win32io.buffer.left;
Jul 10, 2007
Jul 10, 2007
154
155
156
}
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
read_ahead =
Sep 5, 2009
Sep 5, 2009
201
SDL_min(total_need, 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
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
Sep 5, 2009
Sep 5, 2009
227
(context->hidden.win32io.h, ptr, (DWORD)total_need, &byte_read, NULL)) {
Jul 10, 2007
Jul 10, 2007
228
229
230
231
232
233
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;
Sep 5, 2009
Sep 5, 2009
242
243
DWORD byte_written;
size_t nwritten;
Apr 26, 2001
Apr 26, 2001
244
Jul 10, 2006
Jul 10, 2006
245
246
247
248
249
250
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
251
252
if (context->hidden.win32io.buffer.left) {
SetFilePointer(context->hidden.win32io.h,
Sep 5, 2009
Sep 5, 2009
253
-(LONG)context->hidden.win32io.buffer.left, NULL,
Jul 10, 2007
Jul 10, 2007
254
255
256
257
FILE_CURRENT);
context->hidden.win32io.buffer.left = 0;
}
Jul 10, 2006
Jul 10, 2006
258
259
/* if in append mode, we must go to the EOF before write */
if (context->hidden.win32io.append) {
Jul 10, 2007
Jul 10, 2007
260
261
if (SetFilePointer(context->hidden.win32io.h, 0L, NULL, FILE_END) ==
INVALID_SET_FILE_POINTER) {
Jul 10, 2006
Jul 10, 2006
262
263
264
265
SDL_Error(SDL_EFWRITE);
return 0;
}
}
Apr 26, 2001
Apr 26, 2001
266
Jul 10, 2006
Jul 10, 2006
267
if (!WriteFile
Sep 5, 2009
Sep 5, 2009
268
(context->hidden.win32io.h, ptr, (DWORD)total_bytes, &byte_written, NULL)) {
Jul 10, 2006
Jul 10, 2006
269
270
271
272
273
274
SDL_Error(SDL_EFWRITE);
return 0;
}
nwritten = byte_written / size;
return nwritten;
Apr 26, 2001
Apr 26, 2001
275
}
Aug 27, 2008
Aug 27, 2008
276
Jul 10, 2006
Jul 10, 2006
277
278
static int SDLCALL
win32_file_close(SDL_RWops * context)
Apr 26, 2001
Apr 26, 2001
279
280
{
Jul 10, 2006
Jul 10, 2006
281
282
283
284
285
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
286
287
288
289
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
290
291
292
293
294
SDL_FreeRW(context);
}
return (0);
}
#endif /* __WIN32__ */
Jun 24, 2005
Jun 24, 2005
295
Jul 10, 2006
Jul 10, 2006
296
#ifdef HAVE_STDIO_H
Jun 24, 2005
Jun 24, 2005
297
Jul 10, 2006
Jul 10, 2006
298
/* Functions to read/write stdio file pointers */
Jun 24, 2005
Jun 24, 2005
299
Jul 10, 2007
Jul 10, 2007
300
301
static long SDLCALL
stdio_seek(SDL_RWops * context, long offset, int whence)
Jul 10, 2006
Jul 10, 2006
302
303
304
305
306
307
308
{
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
309
}
Aug 27, 2008
Aug 27, 2008
310
Jul 10, 2007
Jul 10, 2007
311
312
static size_t SDLCALL
stdio_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
Apr 26, 2001
Apr 26, 2001
313
{
Jul 10, 2006
Jul 10, 2006
314
315
316
317
318
319
320
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
321
}
Aug 27, 2008
Aug 27, 2008
322
Jul 10, 2007
Jul 10, 2007
323
324
static size_t SDLCALL
stdio_write(SDL_RWops * context, const void *ptr, size_t size, size_t num)
Jan 4, 2004
Jan 4, 2004
325
{
Jul 10, 2006
Jul 10, 2006
326
327
328
329
330
331
332
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
333
}
Aug 27, 2008
Aug 27, 2008
334
Jul 10, 2006
Jul 10, 2006
335
336
static int SDLCALL
stdio_close(SDL_RWops * context)
Apr 26, 2001
Apr 26, 2001
337
{
Jul 10, 2007
Jul 10, 2007
338
int status = 0;
Jul 10, 2006
Jul 10, 2006
339
340
341
if (context) {
if (context->hidden.stdio.autoclose) {
/* WARNING: Check the return value here! */
Jul 10, 2007
Jul 10, 2007
342
343
344
345
if (fclose(context->hidden.stdio.fp) != 0) {
SDL_Error(SDL_EFWRITE);
status = -1;
}
Jul 10, 2006
Jul 10, 2006
346
347
348
}
SDL_FreeRW(context);
}
Jul 10, 2007
Jul 10, 2007
349
return status;
Jul 10, 2006
Jul 10, 2006
350
351
352
353
354
}
#endif /* !HAVE_STDIO_H */
/* Functions to read/write memory pointers */
Jul 10, 2007
Jul 10, 2007
355
356
static long SDLCALL
mem_seek(SDL_RWops * context, long offset, int whence)
Jul 10, 2006
Jul 10, 2006
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
{
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
381
return (long)(context->hidden.mem.here - context->hidden.mem.base);
Jul 10, 2006
Jul 10, 2006
382
}
Aug 27, 2008
Aug 27, 2008
383
Jul 10, 2007
Jul 10, 2007
384
385
static size_t SDLCALL
mem_read(SDL_RWops * context, void *ptr, size_t size, size_t maxnum)
Jul 10, 2006
Jul 10, 2006
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
{
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
406
Jul 10, 2007
Jul 10, 2007
407
408
static size_t SDLCALL
mem_write(SDL_RWops * context, const void *ptr, size_t size, size_t num)
Jul 10, 2006
Jul 10, 2006
409
410
411
412
413
414
415
416
{
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
417
Jul 10, 2007
Jul 10, 2007
418
419
static size_t SDLCALL
mem_writeconst(SDL_RWops * context, const void *ptr, size_t size, size_t num)
Jul 10, 2006
Jul 10, 2006
420
421
422
423
{
SDL_SetError("Can't write to read-only memory");
return (-1);
}
Aug 27, 2008
Aug 27, 2008
424
Jul 10, 2006
Jul 10, 2006
425
426
427
428
429
430
431
static int SDLCALL
mem_close(SDL_RWops * context)
{
if (context) {
SDL_FreeRW(context);
}
return (0);
Apr 26, 2001
Apr 26, 2001
432
433
}
Feb 27, 2006
Feb 27, 2006
434
Apr 26, 2001
Apr 26, 2001
435
436
/* Functions to create SDL_RWops structures from various data sources */
Jul 10, 2006
Jul 10, 2006
437
438
SDL_RWops *
SDL_RWFromFile(const char *file, const char *mode)
Apr 26, 2001
Apr 26, 2001
439
{
Jul 10, 2006
Jul 10, 2006
440
SDL_RWops *rwops = NULL;
Mar 4, 2006
Mar 4, 2006
441
#ifdef HAVE_STDIO_H
Jul 10, 2006
Jul 10, 2006
442
FILE *fp = NULL;
Mar 4, 2006
Mar 4, 2006
443
#endif
Jul 10, 2006
Jul 10, 2006
444
445
446
447
if (!file || !*file || !mode || !*mode) {
SDL_SetError("SDL_RWFromFile(): No file or no mode specified");
return NULL;
}
Mar 4, 2006
Mar 4, 2006
448
#if defined(__WIN32__)
Jul 10, 2006
Jul 10, 2006
449
450
451
rwops = SDL_AllocRW();
if (!rwops)
return NULL; /* SDL_SetError already setup by SDL_AllocRW() */
Jul 10, 2007
Jul 10, 2007
452
if (win32_file_open(rwops, file, mode) < 0) {
Jul 10, 2006
Jul 10, 2006
453
454
455
456
457
458
459
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
460
461
#elif HAVE_STDIO_H
Apr 26, 2001
Apr 26, 2001
462
Jul 10, 2006
Jul 10, 2006
463
464
465
466
467
468
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
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: */