From 5482a3e39fad86c5647a103b2180937e72fad5e5 Mon Sep 17 00:00:00 2001 From: q66 Date: Thu, 30 Jul 2020 19:47:33 +0200 Subject: [PATCH] implement rwops inline --- src/shared/rwops.hh | 33 ++++++++++++++++++++++++++++++++- src/shared/stream.cc | 40 ---------------------------------------- 2 files changed, 32 insertions(+), 41 deletions(-) diff --git a/src/shared/rwops.hh b/src/shared/rwops.hh index 31e806d..51fbb08 100644 --- a/src/shared/rwops.hh +++ b/src/shared/rwops.hh @@ -5,6 +5,37 @@ #include "tools.hh" -SDL_RWops *stream_rwops(stream *s); +namespace detail { + inline Sint64 rwopsseek(SDL_RWops *rw, Sint64 pos, int whence) { + stream *f = (stream *)rw->hidden.unknown.data1; + if((!pos && whence==SEEK_CUR) || f->seek(pos, whence)) return (int)f->tell(); + return -1; + } + + inline size_t rwopsread(SDL_RWops *rw, void *buf, size_t size, size_t nmemb) { + stream *f = (stream *)rw->hidden.unknown.data1; + return f->read(buf, size*nmemb)/size; + } + + inline size_t rwopswrite(SDL_RWops *rw, const void *buf, size_t size, size_t nmemb) { + stream *f = (stream *)rw->hidden.unknown.data1; + return f->write(buf, size*nmemb)/size; + } + + inline int rwopsclose(SDL_RWops *rw) { + return 0; + } +} + +inline SDL_RWops *stream_rwops(stream *s) { + SDL_RWops *rw = SDL_AllocRW(); + if(!rw) return nullptr; + rw->hidden.unknown.data1 = s; + rw->seek = detail::rwopsseek; + rw->read = detail::rwopsread; + rw->write = detail::rwopswrite; + rw->close = detail::rwopsclose; + return rw; +} #endif diff --git a/src/shared/stream.cc b/src/shared/stream.cc index 8b7cd82..38eddc5 100644 --- a/src/shared/stream.cc +++ b/src/shared/stream.cc @@ -1,7 +1,5 @@ #include -#include - #include #include "tools.hh" @@ -320,44 +318,6 @@ int listfiles(const char *dir, const char *ext, vector &files) return dirs; } -#ifndef STANDALONE -static Sint64 rwopsseek(SDL_RWops *rw, Sint64 pos, int whence) -{ - stream *f = (stream *)rw->hidden.unknown.data1; - if((!pos && whence==SEEK_CUR) || f->seek(pos, whence)) return (int)f->tell(); - return -1; -} - -static size_t rwopsread(SDL_RWops *rw, void *buf, size_t size, size_t nmemb) -{ - stream *f = (stream *)rw->hidden.unknown.data1; - return f->read(buf, size*nmemb)/size; -} - -static size_t rwopswrite(SDL_RWops *rw, const void *buf, size_t size, size_t nmemb) -{ - stream *f = (stream *)rw->hidden.unknown.data1; - return f->write(buf, size*nmemb)/size; -} - -static int rwopsclose(SDL_RWops *rw) -{ - return 0; -} - -SDL_RWops *stream_rwops(stream *s) -{ - SDL_RWops *rw = SDL_AllocRW(); - if(!rw) return nullptr; - rw->hidden.unknown.data1 = s; - rw->seek = rwopsseek; - rw->read = rwopsread; - rw->write = rwopswrite; - rw->close = rwopsclose; - return rw; -} -#endif - stream::offset stream::size() { offset pos = tell(), endpos;