Prefer the raw Win32 API over stdio for file RWops
authorSam Lantinga <slouken@libsdl.org>
Mon, 27 Feb 2006 04:16:44 +0000
changeset 1447 515df0086eb7
parent 1446 47bf1767c4ca
child 1448 9a845c7b8b35
Prefer the raw Win32 API over stdio for file RWops
include/SDL_rwops.h
src/file/SDL_rwops.c
--- a/include/SDL_rwops.h	Mon Feb 27 03:48:48 2006 +0000
+++ b/include/SDL_rwops.h	Mon Feb 27 04:16:44 2006 +0000
@@ -62,20 +62,18 @@
 
 	Uint32 type;
 	union {
-
+#ifdef __WIN32__
+		struct {
+		int    autoclose;
+		int    append;
+		void*  h;
+		} win32io;
+#endif
 #ifdef HAVE_STDIO_H 
 	    struct {
 		int autoclose;
 	 	FILE *fp;
 	    } stdio;
-#else
-#ifdef __WIN32__
-		struct {
-			void*  h;
-			int    autoclose;
-			int    append;
-		} win32io;
-#endif
 #endif
 	    struct {
 		Uint8 *base;
--- a/src/file/SDL_rwops.c	Mon Feb 27 03:48:48 2006 +0000
+++ b/src/file/SDL_rwops.c	Mon Feb 27 04:16:44 2006 +0000
@@ -29,53 +29,10 @@
 #include "SDL_rwops.h"
 
 
-#ifdef HAVE_STDIO_H
-
-/* Functions to read/write stdio file pointers */
-
-static int stdio_seek(SDL_RWops *context, int offset, int whence)
-{
-	if ( fseek(context->hidden.stdio.fp, offset, whence) == 0 ) {
-		return(ftell(context->hidden.stdio.fp));
-	} else {
-		SDL_Error(SDL_EFSEEK);
-		return(-1);
-	}
-}
-static int stdio_read(SDL_RWops *context, void *ptr, int size, int maxnum)
-{
-	size_t nread;
+#ifdef __WIN32__
 
-	nread = fread(ptr, size, maxnum, context->hidden.stdio.fp); 
-	if ( nread == 0 && ferror(context->hidden.stdio.fp) ) {
-		SDL_Error(SDL_EFREAD);
-	}
-	return(nread);
-}
-static int stdio_write(SDL_RWops *context, const void *ptr, int size, int num)
-{
-	size_t nwrote;
+/* Functions to read/write Win32 API file pointers */
 
-	nwrote = fwrite(ptr, size, num, context->hidden.stdio.fp);
-	if ( nwrote == 0 && ferror(context->hidden.stdio.fp) ) {
-		SDL_Error(SDL_EFWRITE);
-	}
-	return(nwrote);
-}
-static int stdio_close(SDL_RWops *context)
-{
-	if ( context ) {
-		if ( context->hidden.stdio.autoclose ) {
-			/* WARNING:  Check the return value here! */
-			fclose(context->hidden.stdio.fp);
-		}
-		SDL_FreeRW(context);
-	}
-	return(0);
-}
-#else /* HAVE_STDIO_H */
-
-#ifdef __WIN32__
 #define WINDOWS_LEAN_AND_MEAN
 #include <windows.h>
 
@@ -126,7 +83,6 @@
 	
 	return 0; /* ok */
 }
-
 static int win32_file_seek(SDL_RWops *context, int offset, int whence) {
 	DWORD win32whence;
 	int   file_pos;
@@ -156,7 +112,6 @@
 	SDL_Error(SDL_EFSEEK);
 	return -1; /* error */
 }
-
 static int win32_file_read(SDL_RWops *context, void *ptr, int size, int maxnum) {
 	
 	int		total_bytes; 
@@ -174,7 +129,6 @@
 	nread = byte_read/size;
 	return nread;
 }
-
 static int win32_file_write(SDL_RWops *context, const void *ptr, int size, int num) {
 	
 	int		total_bytes; 
@@ -201,7 +155,6 @@
 	nwritten = byte_written/size;
 	return nwritten;
 }
-
 static int win32_file_close(SDL_RWops *context) {
 	
 	if ( context ) {								
@@ -213,10 +166,52 @@
 	}
 	return(0);
 }
+#endif /* __WIN32__ */
 
+#ifdef HAVE_STDIO_H
+
+/* Functions to read/write stdio file pointers */
+
+static int stdio_seek(SDL_RWops *context, int offset, int whence)
+{
+	if ( fseek(context->hidden.stdio.fp, offset, whence) == 0 ) {
+		return(ftell(context->hidden.stdio.fp));
+	} else {
+		SDL_Error(SDL_EFSEEK);
+		return(-1);
+	}
+}
+static int stdio_read(SDL_RWops *context, void *ptr, int size, int maxnum)
+{
+	size_t nread;
 
+	nread = fread(ptr, size, maxnum, context->hidden.stdio.fp); 
+	if ( nread == 0 && ferror(context->hidden.stdio.fp) ) {
+		SDL_Error(SDL_EFREAD);
+	}
+	return(nread);
+}
+static int stdio_write(SDL_RWops *context, const void *ptr, int size, int num)
+{
+	size_t nwrote;
 
-#endif /* __WIN32__ */
+	nwrote = fwrite(ptr, size, num, context->hidden.stdio.fp);
+	if ( nwrote == 0 && ferror(context->hidden.stdio.fp) ) {
+		SDL_Error(SDL_EFWRITE);
+	}
+	return(nwrote);
+}
+static int stdio_close(SDL_RWops *context)
+{
+	if ( context ) {
+		if ( context->hidden.stdio.autoclose ) {
+			/* WARNING:  Check the return value here! */
+			fclose(context->hidden.stdio.fp);
+		}
+		SDL_FreeRW(context);
+	}
+	return(0);
+}
 #endif /* !HAVE_STDIO_H */
 
 /* Functions to read/write memory pointers */
@@ -290,13 +285,8 @@
 	return(0);
 }
 
+
 /* Functions to create SDL_RWops structures from various data sources */
-#ifdef __WIN32__
-/* Aggh.  You can't (apparently) open a file in an application and
-   read from it in a DLL.
-*/
-static int in_sdl = 0;
-#endif
 
 #ifdef __MACOS__
 /*
@@ -345,7 +335,20 @@
 SDL_RWops *SDL_RWFromFile(const char *file, const char *mode)
 {
 	SDL_RWops *rwops = NULL;
-#ifdef HAVE_STDIO_H
+
+#ifdef __WIN32__
+	rwops = SDL_AllocRW();
+	rwops->hidden.win32io.h = INVALID_HANDLE_VALUE;
+	if (win32_file_open(rwops,file,mode)) {
+		SDL_FreeRW(rwops);
+		return NULL;
+	}	
+	rwops->seek  = win32_file_seek;
+	rwops->read  = win32_file_read;
+	rwops->write = win32_file_write;
+	rwops->close = win32_file_close;
+
+#elif HAVE_STDIO_H
 	FILE *fp;
 
 #ifdef __MACOS__
@@ -360,28 +363,12 @@
 	if ( fp == NULL ) {
 		SDL_SetError("Couldn't open %s", file);
 	} else {
-#ifdef __WIN32__
-		in_sdl = 1;
 		rwops = SDL_RWFromFP(fp, 1);
-		in_sdl = 0;
-#else
-		rwops = SDL_RWFromFP(fp, 1);
-#endif
 	}
-#else  /* HAVE_STDIO_H */
-#ifdef __WIN32__
-	rwops = SDL_AllocRW();
-	rwops->hidden.win32io.h = INVALID_HANDLE_VALUE;
-	if (win32_file_open(rwops,file,mode)) {
-		SDL_FreeRW(rwops);
-		return NULL;
-	}	
-	rwops->seek  = win32_file_seek;
-	rwops->read  = win32_file_read;
-	rwops->write = win32_file_write;
-	rwops->close = win32_file_close;
-#endif /* __WIN32__ */
+#else
+	SDL_SetError("SDL not compiled with stdio support");
 #endif /* !HAVE_STDIO_H */
+
 	return(rwops);
 }
 
@@ -390,13 +377,6 @@
 {
 	SDL_RWops *rwops = NULL;
 
-#ifdef __WIN32__
-	if ( ! in_sdl ) {
-		/* It's when SDL and the app are compiled with different C runtimes */
-		SDL_SetError("You can't pass a FILE pointer to a DLL (?)");
-		/*return(NULL);*/
-	}
-#endif
 	rwops = SDL_AllocRW();
 	if ( rwops != NULL ) {
 		rwops->seek = stdio_seek;