OctaCore/src/shared/rwops.hh

42 lines
1.1 KiB
C++

#ifndef SHARED_RWOPS_HH
#define SHARED_RWOPS_HH
#include <SDL.h>
#include "tools.hh"
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