SDL_RWops* SDL_AllocRW(void)
#include "stdlib.h"
#include "SDL.h"
/* これらの関数はSDL_RWops内のポインタ以外で使ってはならない */
static Sint64 mysizefunc(SDL_RWops * context)
{
return -1;
}
static Sint64 myseekfunc(SDL_RWops *context, Sint64 offset, int whence)
{
return SDL_SetError("この種類のSDL_RWopsはシークできない");
}
static size_t myreadfunc(SDL_RWops *context, void *ptr, size_t size, size_t maxnum)
{
SDL_memset(ptr,0,size*maxnum);
return maxnum;
}
static size_t mywritefunc(SDL_RWops *context, const void *ptr, size_t size, size_t num)
{
return num;
}
static int myclosefunc(SDL_RWops *context)
{
if(context->type != 0xdeadbeef)
{
return SDL_SetError("myclosefunc()で処理できない不正なSDL_RWops");
}
free(context->hidden.unknown.data1);
SDL_FreeRW(context);
return 0;
}
SDL_RWops *MyCustomRWop()
{
SDL_RWops *c=SDL_AllocRW();
if(c==NULL) return NULL;
c->size =mysizefunc;
c->seek =myseekfunc;
c->read =myreadfunc;
c->write=mywritefunc;
c->close=myclosefunc;
c->type =0xdeadbeef;
c->hidden.unknown.data1=malloc(256);
return c;
}
自分でSDL_RWopsの実装を提供するのでなければ, この関数を使う必要はない. 単に共通のデータ元の読込/書込を行うSDL_RWopsが必要なのであれば, SDL_RWFromFile()やSDL_RWFromMem()などのSDLに組み込まれた実装を使うべきである.
戻り値のポインタはSDL_FreeRW()で解放するべきである. あなたのプログラムが使うmalloc()/free()と, SDLが内部で使うmalloc()/free()は, OSやコンパイラによる違いがあるかもしれない. これらを混合して使うとセグメンテーション違反などのエラーを引き起こす可能性がある. SDL_RWopsはcloseメソッドが呼ばれたとき自分自身を解放しなければならない. 全てのSDL_RWopsはこの関数で確保するべきである. そうすれば, SDL_FreeRW()で正しく解放できる.