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