1 /*
2 * This software is licensed under the terms of the MIT License.
3 * See COPYING for further information.
4 * ---
5 * Copyright (c) 2011-2019, Lukas Weber <laochailan@web.de>.
6 * Copyright (c) 2012-2019, Andrei Alexeyev <akari@taisei-project.org>.
7 */
8
9 #include "taisei.h"
10
11 #include "rwops_dummy.h"
12 #include "util.h"
13
14 #define DUMMY_SOURCE(rw) ((SDL_RWops*)((rw)->hidden.unknown.data1))
15 #define DUMMY_AUTOCLOSE(rw) ((bool)((rw)->hidden.unknown.data2))
16
dummy_close(SDL_RWops * rw)17 static int dummy_close(SDL_RWops *rw) {
18 if(DUMMY_AUTOCLOSE(rw)) {
19 SDL_RWclose(DUMMY_SOURCE(rw));
20 }
21
22 SDL_FreeRW(rw);
23 return 0;
24 }
25
dummy_seek(SDL_RWops * rw,int64_t offset,int whence)26 static int64_t dummy_seek(SDL_RWops *rw, int64_t offset, int whence) {
27 return SDL_RWseek(DUMMY_SOURCE(rw), offset, whence);
28 }
29
dummy_size(SDL_RWops * rw)30 static int64_t dummy_size(SDL_RWops *rw) {
31 return SDL_RWsize(DUMMY_SOURCE(rw));
32 }
33
dummy_read(SDL_RWops * rw,void * ptr,size_t size,size_t maxnum)34 static size_t dummy_read(SDL_RWops *rw, void *ptr, size_t size, size_t maxnum) {
35 return SDL_RWread(DUMMY_SOURCE(rw), ptr, size, maxnum);
36 }
37
dummy_write(SDL_RWops * rw,const void * ptr,size_t size,size_t maxnum)38 static size_t dummy_write(SDL_RWops *rw, const void *ptr, size_t size, size_t maxnum) {
39 return SDL_RWwrite(DUMMY_SOURCE(rw), ptr, size, maxnum);
40 }
41
SDL_RWWrapDummy(SDL_RWops * src,bool autoclose)42 SDL_RWops* SDL_RWWrapDummy(SDL_RWops *src, bool autoclose) {
43 if(!src) {
44 return NULL;
45 }
46
47 SDL_RWops *rw = SDL_AllocRW();
48 memset(rw, 0, sizeof(SDL_RWops));
49
50 rw->hidden.unknown.data1 = src;
51 rw->hidden.unknown.data2 = (void*)(intptr_t)autoclose;
52 rw->type = SDL_RWOPS_UNKNOWN;
53
54 rw->size = dummy_size;
55 rw->seek = dummy_seek;
56 rw->close = dummy_close;
57 rw->read = dummy_read;
58 rw->write = dummy_write;
59
60 return rw;
61 }
62