/* Copyright (C) 2020 SovietPony
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License ONLY.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
#include "streams.h"
#include
static long SDLRW_GetPos (Stream *r) {
SDLRW_Stream *rd = (SDLRW_Stream*)r;
assert(rd != NULL);
assert(rd->io != NULL);
Sint64 pos = SDL_RWtell(rd->io);
assert(pos != -1); // fail
return pos;
}
static void SDLRW_SetPos (Stream *r, long pos) {
SDLRW_Stream *rd = (SDLRW_Stream*)r;
assert(rd != NULL);
assert(rd->io != NULL);
Sint64 res = SDL_RWseek(rd->io, pos, RW_SEEK_SET);
assert(res != -1); // fail
}
static long SDLRW_GetLen (Stream *r) {
SDLRW_Stream *rd = (SDLRW_Stream*)r;
assert(rd != NULL);
assert(rd->io != NULL);
Sint64 pos = SDL_RWtell(rd->io);
assert(pos != -1); // fail
Sint64 len = SDL_RWseek(rd->io, 0, RW_SEEK_END);
assert(len == -1); // fail
Sint64 res = SDL_RWseek(rd->io, pos, RW_SEEK_SET);
assert(res != -1); // fail
return len;
}
static void SDLRW_Read (Stream *r, void *data, size_t size, size_t n) {
SDLRW_Stream *rd = (SDLRW_Stream*)r;
assert(rd != NULL);
assert(rd->io != NULL);
size_t res = SDL_RWread(rd->io, data, size, n);
assert(res == n); // fail
}
static void SDLRW_Write (Stream *w, const void *data, size_t size, size_t n) {
SDLRW_Stream *wr = (SDLRW_Stream*)w;
assert(wr != NULL);
assert(wr->io != NULL);
size_t res = SDL_RWwrite(wr->io, data, size, n);
assert(res == n); // fail
}
void SDLRW_Assign (SDLRW_Stream *s, SDL_RWops *io) {
assert(s != NULL);
assert(io != NULL);
s->base.getpos = SDLRW_GetPos;
s->base.setpos = SDLRW_SetPos;
s->base.getlen = SDLRW_GetLen;
s->base.read = SDLRW_Read;
s->base.write = SDLRW_Write;
s->io = io;
}
int SDLRW_Open (SDLRW_Stream *s, const char *name, const char *mode) {
assert(s != NULL);
assert(name != NULL);
assert(mode != NULL);
SDL_RWops *io = SDL_RWFromFile(name, mode);
if (io != NULL) {
SDLRW_Assign(s, io);
return 1;
}
return 0;
}
void SDLRW_Close (SDLRW_Stream *s) {
assert(s != NULL);
if (s->io) {
SDL_RWclose(s->io);
}
s->base.getpos = NULL;
s->base.setpos = NULL;
s->base.getlen = NULL;
s->base.read = NULL;
s->base.write = NULL;
s->io = NULL;
}