Patch from Antonio SJ Musumeci:
authorRyan C. Gordon <icculus@icculus.org>
Fri, 24 Jun 2005 12:48:38 +0000
changeset 1078 e2ef6b7001fd
parent 1077 f122afdfa025
child 1079 39b5606fa543
Patch from Antonio SJ Musumeci: " This code with SDL-1.2.8 and CVS: #include <stdio.h> #include <stdlib.h> #include <SDL.h> int main(int argc, char** argv) { char alphabet[26] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char buffer_file[27] = {0}; char buffer_mem[27] = {0}; int rv_file; int rv_mem; FILE* file_ptr; SDL_RWops* rwop_file; SDL_RWops* rwop_mem; file_ptr = fopen("./blah", "w"); fwrite(alphabet, 1, sizeof(alphabet), file_ptr); fclose(file_ptr); rwop_mem = SDL_RWFromMem(alphabet, sizeof(alphabet)); rwop_file = SDL_RWFromFile("./blah", "r"); rv_mem = SDL_RWread(rwop_mem , buffer_mem, 5, 6); rv_file = SDL_RWread(rwop_file, buffer_file, 5, 6); printf("From File: %d %s\n" "From Mem: %d %s\n", rv_file, buffer_file, rv_mem, buffer_mem); printf("Seek end of File: %d\n" "Seek end of Mem: %d\n", SDL_RWseek(rwop_file, 0, SEEK_END), SDL_RWseek(rwop_mem , 0, SEEK_END)); SDL_RWclose(rwop_file); SDL_RWclose(rwop_mem); return 0; } Produces this output: From File: 5 ABCDEFGHIJKLMNOPQRSTUVWXYZ From Mem: 5 ABCDEFGHIJKLMNOPQRSTUVWXY Seek end of File: 26 Seek end of Mem: 26 " --ryan.
src/file/SDL_rwops.c
--- a/src/file/SDL_rwops.c	Wed Jun 15 23:41:57 2005 +0000
+++ b/src/file/SDL_rwops.c	Fri Jun 24 12:48:38 2005 +0000
@@ -110,15 +110,23 @@
 }
 static int mem_read(SDL_RWops *context, void *ptr, int size, int maxnum)
 {
-	int num;
+	int total_bytes;
+	int mem_available;
+
+	total_bytes = (maxnum * size);
+	if ( (maxnum <= 0) || (size <= 0) || ((total_bytes / maxnum) != size) ) {
+		return 0;
+	}
 
-	num = maxnum;
-	if ( (context->hidden.mem.here + (num*size)) > context->hidden.mem.stop ) {
-		num = (context->hidden.mem.stop-context->hidden.mem.here)/size;
+	mem_available = (context->hidden.mem.stop - context->hidden.mem.here);
+	if (total_bytes > mem_available) {
+		total_bytes = mem_available;
 	}
-	memcpy(ptr, context->hidden.mem.here, num*size);
-	context->hidden.mem.here += num*size;
-	return(num);
+
+	memcpy(ptr, context->hidden.mem.here, total_bytes);
+	context->hidden.mem.here += total_bytes;
+
+	return (total_bytes / size);
 }
 static int mem_write(SDL_RWops *context, const void *ptr, int size, int num)
 {