From 8bce08f1026b6e30e9ada6e291a115a260dba682 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 4 Jan 2004 15:18:08 +0000 Subject: [PATCH] Added function to create RWops from const memory: SDL_RWFromConstMem() --- WhatsNew | 1 + include/SDL_rwops.h | 1 + src/file/SDL_rwops.c | 22 ++++++++++++++++++++++ src/main/beos/exports/SDL.exp | 1 + src/main/macos/exports/SDL.x | 1 + src/main/macosx/exports/SDL.x | 1 + src/main/win32/exports/SDL.def | 1 + 7 files changed, 28 insertions(+) diff --git a/WhatsNew b/WhatsNew index 1ba280924..0421260da 100644 --- a/WhatsNew +++ b/WhatsNew @@ -6,6 +6,7 @@ Version 1.0: 1.2.7: Added CPU feature detection functions to SDL_cpuinfo.h: SDL_HasRDTSC(), SDL_HasMMX(), SDL_Has3DNow(), SDL_HasSSE() + Added function to create RWops from const memory: SDL_RWFromConstMem() 1.2.6: Added SDL_LoadObject(), SDL_LoadFunction(), and SDL_UnloadObject() diff --git a/include/SDL_rwops.h b/include/SDL_rwops.h index b8ac438b8..036cd2b5d 100644 --- a/include/SDL_rwops.h +++ b/include/SDL_rwops.h @@ -92,6 +92,7 @@ extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFile(const char *file, const char extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFP(FILE *fp, int autoclose); extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromMem(void *mem, int size); +extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromConstMem(const void *mem, int size); extern DECLSPEC SDL_RWops * SDLCALL SDL_AllocRW(void); extern DECLSPEC void SDLCALL SDL_FreeRW(SDL_RWops *area); diff --git a/src/file/SDL_rwops.c b/src/file/SDL_rwops.c index 285557882..d39f16480 100644 --- a/src/file/SDL_rwops.c +++ b/src/file/SDL_rwops.c @@ -129,6 +129,11 @@ static int mem_write(SDL_RWops *context, const void *ptr, int size, int num) context->hidden.mem.here += num*size; return(num); } +static int mem_writeconst(SDL_RWops *context, const void *ptr, int size, int num) +{ + SDL_SetError("Can't write to read-only memory"); + return(-1); +} static int mem_close(SDL_RWops *context) { if ( context ) { @@ -258,6 +263,23 @@ SDL_RWops *SDL_RWFromMem(void *mem, int size) return(rwops); } +SDL_RWops *SDL_RWFromConstMem(const void *mem, int size) +{ + SDL_RWops *rwops; + + rwops = SDL_AllocRW(); + if ( rwops != NULL ) { + rwops->seek = mem_seek; + rwops->read = mem_read; + rwops->write = mem_writeconst; + rwops->close = mem_close; + rwops->hidden.mem.base = (Uint8 *)mem; + rwops->hidden.mem.here = rwops->hidden.mem.base; + rwops->hidden.mem.stop = rwops->hidden.mem.base+size; + } + return(rwops); +} + SDL_RWops *SDL_AllocRW(void) { SDL_RWops *area; diff --git a/src/main/beos/exports/SDL.exp b/src/main/beos/exports/SDL.exp index 46dc94bfc..591b9f94f 100644 --- a/src/main/beos/exports/SDL.exp +++ b/src/main/beos/exports/SDL.exp @@ -112,6 +112,7 @@ _SDL_CondWaitTimeout _SDL_RWFromFile _SDL_RWFromFP _SDL_RWFromMem +_SDL_RWFromConstMem _SDL_AllocRW _SDL_FreeRW _SDL_GetWMInfo diff --git a/src/main/macos/exports/SDL.x b/src/main/macos/exports/SDL.x index ee4579ade..40d1a8cc4 100644 --- a/src/main/macos/exports/SDL.x +++ b/src/main/macos/exports/SDL.x @@ -111,6 +111,7 @@ SDL_RWFromFile SDL_RWFromFP SDL_RWFromMem + SDL_RWFromConstMem SDL_AllocRW SDL_FreeRW SDL_GetWMInfo diff --git a/src/main/macosx/exports/SDL.x b/src/main/macosx/exports/SDL.x index 7785b90d5..37a25b989 100644 --- a/src/main/macosx/exports/SDL.x +++ b/src/main/macosx/exports/SDL.x @@ -112,6 +112,7 @@ _SDL_RWFromFile _SDL_RWFromFP _SDL_RWFromMem + _SDL_RWFromConstMem _SDL_AllocRW _SDL_FreeRW _SDL_GetWMInfo diff --git a/src/main/win32/exports/SDL.def b/src/main/win32/exports/SDL.def index 61f458cbe..8cb3f9aed 100644 --- a/src/main/win32/exports/SDL.def +++ b/src/main/win32/exports/SDL.def @@ -112,6 +112,7 @@ SDL_RWFromFile SDL_RWFromFP SDL_RWFromMem + SDL_RWFromConstMem SDL_AllocRW SDL_FreeRW SDL_GetWMInfo